u-boot-1.1.6在GT2440开发板上的移植

来源:互联网 发布:电影种子搜索软件 编辑:程序博客网 时间:2024/05/16 19:35

笔者使用的是GT2440开发板,ARM型号为S3C2440。在移植之前要安装必要的软件,我在这里就不详细介绍了,相信网上有很多关于这方面的资料。以下是我移植u-boot之前准备安装的软件:

1.VMware 6.5虚拟机;

2.RedHat Linux9.0操作系统;

3. Windows下安装NotePad++;

4.Linux下安装VMware Tools用于两操作系统间共享文件;

5.Linux下安装arm-linux-gcc3.4.1。

在Linux系统中打开终端,进入编译器目录,用tar xjvf命令解压arm-linux-gcc3.4.1到C盘(tar xjvf arm-linux-gcc-3.4.1.tar.bz2 –C/);解压完成后修改交叉编译器环境变量,在终端中使用“vim/etc/profile”命令打开配置文件;移动光标至“export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC”下面,点击“i”进入插入界面,添加“exportPATH=/usr/local/arm/3.4.1/bin:$PATH”后按“ESC”键退出插入界面,输入“:wq”回车后返回终端,“/usr/local/arm/3.4.1/bin”为编译器路径;在终端中使用“source /etc/profile”命令使设置生效;查看交叉编译工具的版本,在终端中使用“arm-linux-gcc-v”命令,到此为止,gcc3.4.1交叉编译环境安装完毕!

一、移植前检查

1.检查arm-linux-gcc3.4.1是否安装成功:

在Linux下超级终端中输入“arm-linux-gcc –v”后击回车,出现如下信息时说明arm-linux-gcc3.4.1安装成功。

 

否则,确保arm-linux-gcc3.4.1解压到Linux文件系统后在超级终端中输入“vim /etc/bash.bashrc”回车后,点击“i”进入编辑模式,加入程序路径如下:


    上图中,/usr/local/arm/3.4.1/bin是笔者解压的文件路径。

1. 检查要移植的u-boot-1.1.6源码是否正确

笔者把u-boot-1.1.6.tar.bz2解压到了Linux下的/usr目录下并更名为GT2440,由于笔者使用的开发板上的ARM是S3C2440,与u-boot-1.1.6中的smdk2410相似,这样更改的内容不会太多。先编译一下smdk2410是否通过:

a.在超级终端中输入命令“cd /usr/GT2440”进入该目录下;

b.输入命令“make smdk2410_config”,若出现“Configuring for smdk2410 board…”信息说明smdk2410配置正确;

c.输入命令“make”开始编译,若编译成功,会生成两个文件如下:

arm-linux-objcopy --gap-fill=0xff -O srecu-boot u-boot.srec

arm-linux-objcopy --gap-fill=0xff -O binaryu-boot u-boot.bin

现在可以开始u-boot-1.1.6的移植工作了。

二、 uboot移植步骤

1.      修改Makefile:

在smdk2410_config:       unconfig

       @$(MKCONFIG)$(@:_config=) arm arm920t smdk2410 NULL s3c24x0(大约在1879行)

后面加上

GT2440_config :    unconfig

@$(MKCONFIG) $(@:_config=) arm arm920tGT2440 NULL s3c24x0

注意:在“@$(MKCONFIG)$(@:_config=) arm arm920t GT2440 NULL s3c24x0”之前要加一个“Tab”键,否则编译时会出错。

各项的意思如下:
            arm: CPU的架构(ARCH)
            arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录。
            GT2440: 开发板的型号(BOARD),对应于board/GT2440目录。
            NULL: 开发者/或经销商(vender)。
            s3c24x0: 片上系统(SOC)。

然后指定交叉编译器:在第128行,

        ifeq($(ARCH),arm)

        CROSS_COMPILE= arm-linux-。

2.      在board目录下,新建自己的开发板目录GT2440,把smdk2410目录下的所有文件拷到GT2440,把smdk2410.c改为GT2440.c。 将board目录下所有文件夹全部删除,只留GT2440;

3.      修改board下GT2440目录下面的Makefile文件

 COBJS  := GT2440.o flash.o

4.      在include/configs目录下创建板子的配置头文件,把smdk2410.h改名为GT2440.h,再把所有的文件全部删除,只留GT2440.h;

5.      返回当前目录为GT2440,然后执行make GT2440_config ,测试能否编译成功:

出现“Configuringfor GT2440 board..”字样的话标志配置成功。此时再执行“make”也应该能编译通过的。

注意:待编译的文件夹不能是Linux和Windows的共享文件夹且必须制定权限。

6.      修改SDRAM配置,在board/GT2440/lowlevel_init.S中,检查

      #defineB6_BWSCON     (DW32) 位宽为32

      把B1_BWSCON 改为(DW16)

B5_BWSCON 改为(DW8)

      将  #define REFCNT   1113  改为  #define REFCNT  0x4f4。

7.      对S3C2440的支持,将FCLK设为400MHz,分频比为FCLK:HCLK:PCLK=1:4:8,修改board/GT2440/GT2440.c中的board_init函数。

 

#define S3C2440_MPLL_400MHZ     ((0x7f<<12)|(0x02<<4)|(0x01))

#define S3C2440_UPLL_48MHZ      ((0x38<<12)|(0x02<<4)|(0x02))

#define S3C2440_CLKDIV          0x05   

 

int board_init (void)

{

S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();

                    S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO(); 

                   

                    gpio->GPACON= 0x007FFFFF;

                     gpio->GPBCON= 0x00044555;

                    gpio->GPBUP= 0x000007FF;

                    gpio->GPCCON= 0xAAAAAAAA;

                    gpio->GPCUP= 0x0000FFFF;

                     gpio->GPDCON= 0xAAAAAAAA; 

                     gpio->GPDUP= 0x0000FFFF; 

                     gpio->GPECON= 0xAAAAAAAA;

                     gpio->GPEUP= 0x0000FFFF;

                     gpio->GPFCON= 0x000055AA;

                     gpio->GPFUP= 0x000000FF;

                     gpio->GPGCON= 0xFF95FFBA;

                     gpio->GPGUP= 0x0000FFFF;

                     gpio->GPHCON= 0x002AFAAA;

                     gpio->GPHUP= 0x000007FF;

 

                    

                   

                    clk_power->CLKDIVN= S3C2440_CLKDIV;

                    

__asm__(    "mrc    p15,0, r1, c1, c0, 0\n"     

                     "orr    r1,r1, #0xc0000000\n"      

                    "mcr    p15,0, r1, c1, c0, 0\n"     

                    :::"r1" 

                    );

 

                    

                    clk_power->LOCKTIME= 0xFFFFFF;

 

                    

                    clk_power->MPLLCON= S3C2440_MPLL_400MHZ;

 

                   

                    delay(4000);

 

                   

                    clk_power->UPLLCON= S3C2440_UPLL_48MHZ;

 

                   

                    delay(8000);

 

                   

                    gd->bd->bi_arch_number= MACH_TYPE_S3C2440;

 

 

gd->bd->bi_boot_params = 0x30000100;

      icache_enable(); 

dcache_enable();

 

return 0;

}

8.      在cpu/arm920t/s3c24X0/speed.c中修改:

在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量

修改get_PLLCLK函数:

static ulong get_PLLCLK(int pllreg)

{

S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();

                    ulongr, m, p, s;

                    if(pllreg == MPLL)

                           r= clk_power->MPLLCON;

                    elseif (pllreg == UPLL)

                           r= clk_power->UPLLCON; 

                    else

                           hang();

 

                    m= ((r & 0xFF000) >> 12) + 8;

                    p= ((r & 0x003F0)>> 4) + 2;

                    s= r & 0x3;

 

                   

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

}

 

修改get_HCLK,get_PCLK:

 

#define S3C2440_CLKDIVN_PDIVN        (1<<0)

#define S3C2440_CLKDIVN_HDIVN_MASK   (3<<1)

#define S3C2440_CLKDIVN_HDIVN_1      (0<<1)

#define S3C2440_CLKDIVN_HDIVN_2      (1<<1)

#define S3C2440_CLKDIVN_HDIVN_4_8    (2<<1)

#define S3C2440_CLKDIVN_HDIVN_3_6    (3<<1)

#define S3C2440_CLKDIVN_UCLK         (1<<3)

 

#define S3C2440_CAMDIVN_CAMCLK_MASK  (0xf<<0)

#define S3C2440_CAMDIVN_CAMCLK_SEL   (1<<4)

#define S3C2440_CAMDIVN_HCLK3_HALF   (1<<8)

#define S3C2440_CAMDIVN_HCLK4_HALF   (1<<9)

#define S3C2440_CAMDIVN_DVSEN        (1<<12)

 

 

ulong get_HCLK(void)

{

S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();

                    unsignedlong clkdiv;

                    unsignedlong camdiv;

                    inthdiv = 1;

 

                   

                    clkdiv= clk_power->CLKDIVN;

                    camdiv= clk_power->CAMDIVN;

 

                   

 

                    switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK){

                    caseS3C2440_CLKDIVN_HDIVN_1:

                           hdiv= 1;

                           break;

 

                    caseS3C2440_CLKDIVN_HDIVN_2:

                           hdiv= 2;

                           break;

 

                    caseS3C2440_CLKDIVN_HDIVN_4_8:

                           hdiv= (camdiv & S3C2440_CAMDIVN_HCLK4_HALF)? 8 : 4;

                           break;

 

                    caseS3C2440_CLKDIVN_HDIVN_3_6:

                           hdiv= (camdiv & S3C2440_CAMDIVN_HCLK3_HALF)? 6 : 3;

                           break;

                    }

 

                    returnget_FCLK() / hdiv;

}

 

 

ulong get_PCLK(void)

{

S3C24X0_CLOCK_POWER* const clk_power = S3C24X0_GetBase_CLOCK_POWER();

           unsignedlong clkdiv;

           unsignedlong camdiv;

 int hdiv = 1;

 

                   

                    clkdiv= clk_power->CLKDIVN;

                    camdiv= clk_power->CAMDIVN;

 

                   

 

                    switch(clkdiv & S3C2440_CLKDIVN_HDIVN_MASK){

                    caseS3C2440_CLKDIVN_HDIVN_1:

                           hdiv= 1;

                           break;

 

                    caseS3C2440_CLKDIVN_HDIVN_2:

                           hdiv= 2;

                           break;

 

                    caseS3C2440_CLKDIVN_HDIVN_4_8:

                           hdiv= (camdiv & S3C2440_CAMDIVN_HCLK4_HALF)? 8 : 4;

                           break;

 

                    caseS3C2440_CLKDIVN_HDIVN_3_6:

                           hdiv= (camdiv & S3C2440_CAMDIVN_HCLK3_HALF)? 6 : 3;

                           break;

                    }

 

             returnget_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)?2:1);

             }       

在include/s3c24x0.h中定义,在129行S3C24X0_CLOCK_POWER结构体中增加:S3C24X0_REG32    CAMDIVN;    ,然后重新make all编译。编译成功后会生成uboot.bin文件,将该文件下载到GT2440开发板的Nor Flash中,连接开发板串口和PC机串口,打开PC机Windows下的超级终端程序,设置好参数并打开串口,开发板启动模式选择NorFlash启动,开发板上电后在串口终端中打印如下信息说明uboot已经移植成功了。




但是显示的“Flash:512 kB”并不是实际的Nor Flash大小,这是因为源码包里并没有与GT2440开发板Nor Flash同型号的宏定义,需要在源码中加入型号的宏文件并修改存储器容量的计算方法,在这里就不多说了;也并没有显示Nand Flash的大小,这是因为现在还不支持Nand Flash的读写,接下来具体以操作说明。

1.      支持NAND Flash

a.首先在配置文件include/configs/GT2440.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND (大概在82行);

b.在include/configs/GT2440.h的最后面增加3个宏:

 

#define CFG_NAND_BASE        0      //无实际意义:基地址,在board_nand_init中重新定义

#define CFG_MAX_NAND_DEVICE     1   //NANDFlash设备数目为1

#define NAND_MAX_CHIPS          1   //每个NAND设备由1个NADN芯片组成

c.在cpu/arm920t/s3c24x0下新建nand_flash.c

d.在include/s3c24x0.h中增加S3C2440_NAND数据结构(168行)

 

typedef struct {

          S3C24X0_REG32 NFCONF;

S3C24X0_REG32NFCONT;

          S3C24X0_REG32 NFCMD;

          S3C24X0_REG32 NFADDR;

          S3C24X0_REG32 NFDATA;

          S3C24X0_REG32 NFMECCD0;

          S3C24X0_REG32 NFMECCD1;

          S3C24X0_REG32 NFSECCD;

          S3C24X0_REG32 NFSTAT;

          S3C24X0_REG32 NFESTAT0;

          S3C24X0_REG32 NFESTAT1;

          S3C24X0_REG32 NFMECC0;

          S3C24X0_REG32 NFMECC1;

          S3C24X0_REG32 NFSECC;

          S3C24X0_REG32 NFSBLK;

            }S3C2440_NAND;

 

d.在include/s3c2410.h中仿照S3C2410_GetBase_NAND函数(96行)

定义2440的函数:

static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)

{

          return(S3C2440_NAND * const)S3C2410_NAND_BASE;

}

e.在cpu/arm920t/s3c24x0/nand_flash.c中添加代码,是从Linux-2.6.13中/drivers/mtd/nand/s3c2410.c中移植过来的,代码略。

f.修改cpu/arm920t/s3c24x0/Makefile:

COBJS  =  加上一项nand_flash.o

编译后生成uboot镜像,但这里注意,现在还不支持NAND FLASH启动,只能烧到NOR FLASH中。要支持NAND FLASH启动,要修改cpu/arm920t/start.S,还要编写nand启动函数。

三、                     u-boot调试

编译成功后会生成uboot.bin文件,将该文件下载到GT2440开发板的Nor Flash中,连接开发板串口和PC机串口,打开PC机Windows下的超级终端程序,设置好参数并打开串口,开发板启动模式选择NorFlash启动,开发板上电后在串口终端中打印如下信息说明uboot已经移植成功了。

 

0 0
原创粉丝点击