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

时间:2022-01-06 16:46:20

笔者使用的是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”进入插入界面,添加“export PATH=/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安装成功。

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

 

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

u-boot-1.1.6在GT2440开发板(S3C2440)上的移植
    上图中,/usr/local/arm/3.4.1/bin是笔者解压的文件路径。

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

笔者把u-boot-1.1.6.tar.bz2解压到了Linux下的/usr目录下并更名为GT2440,由于笔者使用的开发板上的ARMS3C2440,与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 srec u-boot u-boot.srec

arm-linux-objcopy --gap-fill=0xff -O binary u-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 arm920t GT2440 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.      修改boardGT2440目录下面的Makefile文件

 COBJS  := GT2440.o flash.o

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

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

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

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

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

      #define B6_BWSCON     (DW32) 位宽为32

      B1_BWSCON 改为(DW16

B5_BWSCON 改为(DW8

        #define REFCNT   1113  改为  #define REFCNT  0x4f4

7.      S3C2440的支持,将FCLK设为400MHz,分频比为FCLKHCLKPCLK=148,修改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();

                    ulong r, m, p, s;

                    if (pllreg == MPLL)

                           r = clk_power->MPLLCON;

                    else if (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();

                    unsigned long clkdiv;

                    unsigned long camdiv;

                    int hdiv = 1;

 

                   

                    clkdiv = clk_power->CLKDIVN;

                    camdiv = clk_power->CAMDIVN;

 

                   

 

                    switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {

                    case S3C2440_CLKDIVN_HDIVN_1:

                           hdiv = 1;

                           break;

 

                    case S3C2440_CLKDIVN_HDIVN_2:

                           hdiv = 2;

                           break;

 

                    case S3C2440_CLKDIVN_HDIVN_4_8:

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

                           break;

 

                    case S3C2440_CLKDIVN_HDIVN_3_6:

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

                           break;

                    }

 

                    return get_FCLK() / hdiv;

}

 

 

ulong get_PCLK(void)

{

S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

           unsigned long clkdiv;

           unsigned long camdiv;

 int hdiv = 1;

 

                   

                    clkdiv = clk_power->CLKDIVN;

                    camdiv = clk_power->CAMDIVN;

 

                   

 

                    switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {

                    case S3C2440_CLKDIVN_HDIVN_1:

                           hdiv = 1;

                           break;

 

                    case S3C2440_CLKDIVN_HDIVN_2:

                           hdiv = 2;

                           break;

 

                    case S3C2440_CLKDIVN_HDIVN_4_8:

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

                           break;

 

                    case S3C2440_CLKDIVN_HDIVN_3_6:

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

                           break;

                    }

 

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

             }       

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

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

但是显示的“Flash512 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   //NAND Flash设备数目为1

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

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

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

 

typedef struct {

          S3C24X0_REG32 NFCONF;

S3C24X0_REG32 NFCONT;

          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机串口,打开PCWindows下的超级终端程序,设置好参数并打开串口,开发板启动模式选择Nor Flash启动,开发板上电后在串口终端中打印如下信息说明uboot已经移植成功了。

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