• u-boot-2010.09移植(A)


    第一阶段

    1.开发环境

    系统:centOS6.5           linux版本:2.6.32         交叉编译器:buildroot-2012.08

    以上工具已经准备好,具体安装步骤不再赘述,将着重介绍u-boot-2010.09移植到fl2440开发板的全过程。

     

    2.从http://ftp.denx.de/pub/u-boot/下载u-boot-2010.09的源码包,注意不要下u-boot-2010.09-rc1.tar.bz2或u-boot-2010.09-rc2.tar.bz2 版本的 ,因为带rc的为测试版本,我们下载u-boot-2010.09.tar.bz2

     

    3.新建u-boot-2010.09用于存放我们下载的源码包

    [weishusheng@centos]$ mkdir u-boot-2010.09

     

     

    4.进入u-boot-2010.09目录,上传u-boot源码包

     [weishusheng@centos]$cd u-boot-2010.09

     

     

    5.解压源码包

    [weishusheng@centos u-boot-2010.09]$ tar -xjf u-boot-2010.09.tar.bz2

     

     

    6.打开U-boot-2010.09解压目录下的boards.cfg在241行smdk2410后添加fl2440的配置选项:

    fl2440          arm arm920t     fl2440      -       s3c24x0

    (注意这里不能写错,我曾经就把s3c24x0写成s3c2440,编译会报错)

     

    7.在/board子目录中建立自己的开发板fl2440目录,并以smdk2410为模板,建立文件

    [weishusheng@centos u-boot-2010.09]$ cd board

    [weishusheng@centos board]$ mkdir fl2440
    [weishusheng@centos board]$ cp -arf samsung/smdk2410/* fl2440
    [weishusheng@centos board]$ mv fl2440/smdk2410.c fl2440/fl2440.c

     

    修改fl2440目录下的Makefile中的28行

    COBJS  := smdk2410.o flash.o为

    COBJS  := fl2440.o flash.o

     

    8.在include/configs/中建立开发板的配置头文件

    [weishusheng@centos u-boot-2010.09]$ cp include/configs/smdk2410.h include/configs/fl2440.h

     

    9.测试编译是否成功(成功)

    [weishusheng@centos u-boot-2010.09]$ make fl2440_config
    Configuring for fl2440 board...

     

    添加串口打印启动信息部分

    1.修改文件arch/arm/cpu/arm920t/start.S

    将117,118两行注释掉,这个是用于LED跳转的,没什么用,也没有程序可跳

    117 @   bl  coloured_LED_init
    118 @   bl  red_LED_on

    2.将134-170 行注释掉,这个代码是定义特殊寄存器和屏蔽中断的,我们将在后面的程序中操作

    3.进入board/fl2440/lowlevel_init.S

    在128行,添加以下寄存器定义

    #define S3C24X0_INTERRUPT_BASE      0x4A000000

    #define S3C24X0_CLOCK_POWER_BASE    0x4C000000

    #define S3C2410_NAND_BASE           0x4E000000

    #define S3C24X0_WATCHDOG_BASE       0x53000000

    #define S3C24X0_GPIO_BASE           0x56000000

    #define GPBCON                      0x56000010

    #define GPBDAT                      0x56000014

    #define GPBUP                       0x56000018

     

    #define INTMSK_OFFSET               0x08

    #define INTSUBMSK_OFFSET            0x1c

    #define MPLLCON_OFFSET              0x04

    #define CLKDIVN_OFFSET              0x14

    #define NFCONF_OFFSET               0x00

    #define NFCONT_OFFSET               0x04

    #define NFCMD_OFFSET                0x08

    #define NFSTAT_OFFSET               0x20

     

    #define MDIV_405                    0x7f << 12

    #define PSDIV_405                   0x21

    #define MDIV_200                    0xa1 << 12

    #define PSDIV_200                   0x31

     

    在155行lowlevel_init:后面添加

    关闭看门狗

     /****** Disable Watchdog ******/

        ldr r0, =S3C24X0_WATCHDOG_BASE

        mov r1, #0

       str r1, [r0]

    接着屏蔽所有中断

    /****** Disable interrupt by mask all IRQ mask ******/

        ldr r0, =S3C24X0_INTERRUPT_BASE

        mvn r1, #0x0

        str r1, [r0, #INTMSK_OFFSET]

       str r1, [r0, #INTSUBMSK_OFFSET]

    接着初始化系统时钟,总线时钟

    /****** Initialize System Clock, FCLK:HCLK:PCLK = 1:4:8,default FCLK is 120MHz ******/

        ldr r0, =S3C24X0_CLOCK_POWER_BASE

        mov r1, #5

        str r1, [r0, #CLKDIVN_OFFSET]

        mrc p15, 0, r1, c1, c0, 0

        orr r1, r1, #0xc0000000

        mcr p15, 0, r1, c1, c0, 0

        mov r2, #MDIV_405

        add r2, r2, #PSDIV_405

       str r2, [r0, #MPLLCON_OFFSET]

    接着初始化nandflash

    /***** Initialize Nandflash controller ******/
         mov r1, #S3C2410_NAND_BASE
        ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
         str r2, [r1, #NFCONF_OFFSET]
     
         ldr r2, =( (1<<4)|(0<<1)|(1<<0) )   @ Active low CE controller
         str r2, [r1, #NFCONT_OFFSET]
         ldr r2, =(0x6)                      @ RnB Clear
         str r2, [r1, #NFSTAT_OFFSET]
         mov r2, #0xff                       @ Reset Nandflash
         strb    r2, [r1, #NFCMD_OFFSET]
         mov r3, #0       @ Delay for a while

     delay:
         add r3, r3, #0x1
         cmp r3, #0xa
         blt delay

     wait:
         ldr r2, [r1, #NFSTAT_OFFSET]  @ wait ready
         tst r2, #0x4
         beq wait

     

    4.修改include/asm/arch-s3c24x0/s3c24x0.h 

    将该文件中所有的#if defined(CONFIG_S3C2410)

    都修改为#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

    支持s3c2440开发板

     

    在160行左右修改nandflash的寄存器定义,修改s3c2410_nand结构体为如下

    #if defined (CONFIG_S3C2440)

    /*   NAND FLASH (see S3C2440 manual chapter 6) */

    struct s3c2410_nand

    {

       u32 NFCONF;
        u32 NFCONT;
        u32 NFCMD;
        u32 NFADDR;
        u32 NFDATA;
        u32 NFMECCD0;
        u32 NFMECCD1;
        u32 NFSECCD;
        u32 NFSTAT;
        u32 NFESTAT0;
        u32 NFESTAT1;
        u32 NFMECC0;                
        u32 NFMECC1;
        u32 NFSECC;
        u32 NFSBLK;
        u32 NFEBLK;

    };

    #endif

    124行左右修改s3c24x0_clock_power结构体如下

    struct s3c24x0_clock_power

    {

       u32 LOCKTIME;

        u32 MPLLCON;

        u32 UPLLCON;

        u32 CLKCON;

        u32 CLKSLOW;

        u32 CLKDIVN;

    #if defined (CONFIG_S3C2440)

        u32 CAMDIVN;

    #endif

    };

     

    5.include/asm/arch/s3c24x0_cpu.h,补充对s3c2440的支持

    23行,修改#elif defined (CONFIG_S3C2410)为

    #elif defined (CONFIG_S3C2410) || (CONFIG_S3C2440)

     

    6.修改arch/arm/cpu/arm920t/s3c24x0/timer.c文件

    184行添加支持s3c2440

    defined(CONFIG_S3C2440) ||

     

    7.修改arch/arm/cpu/arm920t/s3c24x0/speed.c

    在static ulong get_PLLCLK(int pllreg)函数里大概66行(return (CONFIG_SYS_CLK_FREQ * m) / (p << s);的上一行)添加

    #if defined(CONFIG_S3C2440) /* add by weishusheng */

        if(pllreg == MPLL)

            return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));

        else if(pllreg == UPLL)

    #endif

     

     

    80行左右修改get_HCLK()函数如下

    ulong get_HCLK(void)

    {

        struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();

        //return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();

       #if defined(CONFIG_S3C2440) /* Modify by hurryliu*/

            if (readl(&clk_power->CLKDIVN) & 0x6)

            {

                if ((readl(&clk_power->CLKDIVN) & 0x6)==2)

                          return(get_FCLK()/2);

               if ((readl(&clk_power->CLKDIVN) & 0x6)==6)

                         return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3);

               if ((readl(&clk_power->CLKDIVN) & 0x6)==4)

                         return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);

                          return(get_FCLK());

              }

            else

                          return(get_FCLK());

    #else

                 return((readl(&clk_power->CLKDIVN) & 0x2) ? get_FCLK()/2 : get_FCLK());

    #endif /* Modify end*/

    }

    8.修改lowlevel_init.S  修改各个bank寄存器数值

    [weishusheng@centos u-boot-2010.09]$ vim board/fl2440/lowlevel_init.S

    54行的#define B1_BWSCON       (DW32)    改为#define B1_BWSCON       (DW16)

     

    88行左右B3_改为如下(前面的数字是我的行号)

    88 #define B3_Tacs         0xc 

     89 #define B3_Tcos         0x7 
     90 #define B3_Tacc         0xf 
     91 #define B3_Tcoh         0x1 
     92 #define B3_Tah          0x0 
     93 #define B3_Tacp         0x0     
     94 #define B3_PMC          0x0

     

    144行左右修改为如下

    104 #define B5_Tacs         0xc 
    105 #define B5_Tcos         0x7 
    106 #define B5_Tacc         0xf 
    107 #define B5_Tcoh         0x1 
    108 #define B5_Tah          0x0 
    109 #define B5_Tacp         0x0
    110 #define B5_PMC          0x0

     

    120行左右 /* REFRESH parameter */改为如下

    120 /* REFRESH parameter */
    121 #define REFEN           0x1 /* Refresh enable */
    122 #define TREFMD          0x0 /* CBR(CAS before RAS)/Auto refresh */
    123 #define Trc             0x3 /* 7clk     add by wei*/
    124 #define Tchr            0x2 /* 3clk */
    125 
    126 
    127 #if defined(CONFIG_S3C2440)
    128 #define Trp         0x2 /* 4clk */
    129 #define REFCNT          1012
    130 #else
    131 #define Trp         0x0 /* 2clk */
    132 #define REFCNT      0x0459
    133 #endif
    134 /**************************************/

    9.修改include/configs/fl2440.h

    在38行添加#define CONFIG_S3C2440     1  

    在31行定义在内存中运行的宏,支持在内存中运行(当需下载到nandflash时把以下这个宏去掉)

     #define  CONFIG_SKIP_LOWLEVEL_INIT     1

     

    在120行,修改为自己的开发板启动信息

     #define CONFIG_SYS_PROMPT       "[fl2440@wss]# "

     

     

    这些工作做完后,下载到内存中运行,连接串口,就可以看到打印的信息了(如下)

     

    U-Boot 2010.09 (Aug 18 2014 - 11:17:12)

     

    DRAM:  64 MiB

    Flash: 512 KiB

    *** Warning - bad CRC, using default environment

    In:    serial

    Out:   serial

    Err:   serial

    Net:   CS8900-0

    [fl2440@wss]#

    [fl2440@wss]#

    [fl2440@wss]#

  • 相关阅读:
    sql 内连接外链接
    深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
    mysql关闭以及重启密码
    学习---书籍
    volatile修饰符
    System.out.println和System.err.println的区别
    懒加载和急加载(lazy/eager)
    load与get在hiberate中的区别
    html
    js
  • 原文地址:https://www.cnblogs.com/thinkinglife/p/3919681.html
Copyright © 2020-2023  润新知