基于S3C2440的u-boot的移植
需要对下载的u-boot-1.1.6 进行编译。u-boot的编译一般在Linux系统下进行,可用arm-linux-gcc进行编译。一步一步建立交叉编译环境通常比较复杂,最简单的方法是使用别人编译好的交叉编译工具,方法如下:
(1)在http//handhelds.org/download/toolchai下载arm-linux-gcc-3.4.5.tar.bz2
(2)以用户名root登录,将arm-linux-gcc-3.4.5.tar.bz2解压到 /root目录下
#tar jxvf arm-linux-gcc-3.4.5.tar.bz2
(3)在http//handhelds.org/download/toolchai下载arm-linux-toolchain-post-2.2.13.tar.gz只是用了它的头文件而已,主要来自内核/linux-x.x/include下
(4)将arm-linux-toolchain-post-2.2.13.tar.gz解压到/skiff/local/下
#tar zxvf arm-linux-toolchain-post-2.2.13.tar.gz
(5)拷贝头文件到/root/usr/3.4.5/arm-linux/下 然后删除/skiff
#cp –dR/skiff/local/arm-linux/include/root/usr/3.3.2/arm-linux#rm -fr/skiff
这样就建立了arm-linux交叉编译环境。
(6)增加/root/usr/local/arm/3.4.5/bin到路径环境变量
Path=$path:/root/usr/local/arm/3.4.5/bin可以检查路径变量是否设置正确。#echo $path
3.4 移植的预先编译
移植u-boot到新的开发板上仅需要修改与硬件相关的部分即可。主要包括两个层面的移植,第一层是针对cpu的移植,第二层是针对Board的移植。由于u-boot-1.1.6里面已经包含S3C2410的移植,而S3C2410与 S3C2440的寄存器基本一样,所以我对板子QQ2440的移植主要是针对board的移植。移植之前需要仔细阅读u-boot目录下的readme文件,其中对如何移植做了简要的介绍。为了减少移植的工作量,可以在include/config目录下选一个和要移植的硬件相似的开发板,以便于我手上的 QQ2440V3开发板参数基本匹配,我选的是smdk2410开发板。具体步骤如下:
3.4.1 u-boot-1.1.6下的CPU文件夹里已经包括了/arm920t/s3c24x0的目录,其下已经有start.s 、 interrupts.c以及cpu.c、serial.c几个文件,因而不需要建立与CPU相关的目录。
而在后面设置串口波特率时需要获取系统时钟,在U-Boot的第二阶段,lib_arm/board.c中start_armboot函数调用serial_init函数是,会调用到在cpu/arm920t /s3c24x0/speed.c中定义的get_PCLK,get_HCLK,get_PLLCLK等函数,所以要对speed.c做修改。(过程略)
3.4.2 在board目录下创建QQ2440目录以及QQ2440.c、flash.c、memsetup.s和u-boot.lds等文件。不需要从零开始创建,只需选择一个相似的目录(smdk2410)直接复制过来,然后修改文件名及内容即可。我在移植u-boot过程中选择的是u-boot- 1.1.6/board/smdk2410目录。
3.4.2_1 修改makefile(/board/QQ2440/makefile)目标文件名
line28:COBJS := smdk2410.o flash.o
改为:
line28:COBJS := QQ2440.o flash.o //中间代码文件名
3.4.2_2 修改lowlevel_init.s(/board/QQ2440/lowlevel_init.s)
line126:#define REFCNT 1113
改为:
line126:#define REFCNT 0x4f4 //SDRAM的时钟频率不同
3.4.2_3 修改QQ2440.c(/board/QQ2440/QQ2440.c)中board_init函数
#define S3C2440_MPLL_400MHZ ((0x5c<12)|(0x01<4)|(0x01))
#define S3C2440_UPLL_48MHZ ((0x38<12)|(0x02<4)|(0x02))
#define S3C2440_CLKdiv 0x05
#define S3C2410_MPLL_200MHZ ((0x5c<12)|(0x04<4)|(0x00))
#define S3C2410_UPLL_48MHZ ((0x28<12)|(0x01<4)|(0x02))
#define S3C2410_CLKdiv 0x03
so:
方案1:直接在原来的基础上修改寄存器地址和相应的公式。
方案2:通过读取GSTATUS1的值来判断当前的SOC,并同时调用条件子程序。(推荐,过程略)
3.4.2_4 因为QQ2440V3的板子nor flash是AM29LV160DB,而u-boot1.1.6的/board/QQ2440/flash.c下只有AM29LV400DB和 AM29LV800DB的支持,欲开flash容量,不可避免的要对flash.c文件做些小修改。(修改ID,shell输出信息,CFG_MAX_FLASH_BANKS等)
3.4.3在include/configs目录下添加QQ2440.h,在这里可放入全局的宏定义等也不需要从头创建,可以在include/configs目录下寻找相似的CPU的头文件进行复制,这里俺用的是smdk2410.h文件来进行相关的修改。
3.4.3_1修改/include/configs/QQ2440.h以调用3.4.2_4,这里直接把AM29LV400DB的参数改为AM29LV160的参数,并在flash.c中做相应的修改即可。
注意:在/include/flash.h中有相应的宏定义要修改;在/include/configs/QQ2440.h中有对CONFIG_AMD_LV400等一些具体参数(sector,ID,address)的设置
3.4.4 修改u-boot根目录下的makefile文件,加入对板子的申明。
Line1881:QQ2440_config : unconfig
@./(MKCONFIG) $(@:_config=) arm arm920t QQ2440 N
S3C2440u-boot移 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)