U-BOOT-1.1.6 移植SMDK2440

本文详细介绍U-Boot在Smdk2440开发板上的移植步骤,包括硬件资源配置、时钟调整、NANDFlash支持、网络功能增强及菜单定制。涵盖从底层驱动到上层应用的完整移植流程。

  在u-boot-1.1.6基础上,把smdk2410移植为适合smdk2440的开发板。Smdk2440开发板使用的是100ask网的JZ2440 V3开发板,硬件资源:CPU:ARM920T; SOC:S3C2440A; SDRAM——2块EM63A165TS-6G组成64M/32位; NOR FLASH ——MX29LV160DBTI, 2M/16位; NAND FLASH ——K9F2G08U0C,256M/32位;网卡DM9000x 16位; 虽然u-boot-1.1.6已经过时,但是不影响我们的入门学习,也可以知道u-boot的发展历史,等熟练了再移植高版本的u-boot也是事半功倍的事情。

 

一、新建开发板源文件smdk2440,开发板头文件smdk2440.h,makefile相关内容:

1.1新建开发板源文件smkd2440:

把board/smdk2410复制,重命名为smdk2440,同时把board/smdk2440目录下的smdk2410重命名为smdk2440。

1.2新建开发板头文件smkd2440.h:

把include/configs/smdk2410.h复制,重命名为smdk2440.h.

1.3修改两个Makefile文件:

1.3.1修改顶层Makefile,增加两行:

smdk2440_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 NULL s3c24x0

1.3.2修改board/smdk2440/makefile,修改成如下内容:

COBJS := smdk2440.o flash.o

二、修改时钟有关的文件:

2.1修改board/smdk2440/lowlevel_init.S关于SDRAM的时钟配置参数:

//#define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */

#define REFCNT 0x4f4 /* period=7.8125us, HCLK=100Mhz, (2048+1-7.8125*100) */

2.2修改其他bank的参数:跟频率有关的,比如网卡,原来的参数刚刚好匹配,这里不需要修改。

2.3修改系统时钟,MPLL,UPLL,HCLK,FCLK,PCLK:

对于S3C2410开发板,将FCLK设为200MHz,分频比为FCLK:HCLK:PCLK=1:2:4.对于S3C2440开发板,将FCLK设为400MHz,分频比为FCLK:HCLK:PCLK=1:4:8.  还将UPLL设为48MHz,即UCLK=48MHz,以便于在内核中支持USB控制器。

2.3.1首先修改board/smdk2440/smdk2440.c中的board_init()函数,如下:

 

 

也可以在start.S文件中用汇编语言配置时钟,效果是一样的。

2.3.2再修改获取系统时钟函数get_PLLCLK(),get_HCLK(),get_PCLK(),他们定义在cpu/arm920t/s3c24x0/speed.c文件中,这些函数,在串口初始化的时候需要使用到,比如:arm_linux/board.c -> start_armboot() -> serial_init() -> get_PCLK()。

2.3.3修改CPU头文件,include/s3c24x0.h

三、选择nor flash 类型

在include/configs/smdk2440.h中选择nor flash的型号:

如果不是上面两种类型的nor flash,但是是符合cfi 接口标准的nor flash,需要使用符合cfi flash 接口的驱动。大致过程如下:

3.1在drivers/增加cfi_flash.c, 修改当前目录的Makefile文件,增加cfi_flash.o依赖,同时,把cpu/arm920t/目录下Makefile文件中的flash.o去除;

 

 

 

 

 

 

 

 

3.2在include/configs/smdk2440/目录下,修改头文件,增加cfi_flash宏:

 

 

 

3.3在目录drivers/增加jedec_flash.c,及修改当前目录的Makefile文件;

3.4修改inculde/flash.h相关内容;

3.5在board/smdk2440/smdk2440.c增加board_flash_get_legacy函数的实现;

3.6增加include/asm-arm/types.h文件中两个数据类型phys_addr_t,phys_size_t。

 

四、重新编译,烧录,验证

  1. u-boot文件移植好后,拷贝到Ubuntu虚拟机,在Linux环境下使用交叉编译器arm-linux-gcc编译生成u-boot.bin文件。
  2. 编译顺序: make clean, make smdk2440_config (如果报错127,chmod 764 mkconfig),    make all.
  3. 移植到这里,用jtag工具烧录u-boot.bin到开发板的nor flash . u-boot 就可以启动了,并且用串口也可以打印出信息出来。但是无法引导内核文件,还需要查询下原因。

因为:引导内核启动的工作主是从NAND FLASH读取kernel和文件系统到SDRAM中运行,所以还需要做这些工作:1.配置bootcmd环境变量;2.需要支持对NAND FLASH的读写功能;3.支持文件系统jffs2,yaffs;4.设置分区,支持mtdparts命令;5.增加mtdparts_default命令;

3.1配置bootcmd环境变量对应的宏,在头文件include/configs/smdk2440.h中增加内容:

#define CONFIG_BOOTCOMMAND "nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0"。这个命令的意思是先执行nand read.jffs2 0x30007FC0 kernel,把内核从kernel分区复制到SDRAM的 0x30007FC0 ,然后执行命令bootm 0x30007FC0, bootm命令从地址0x30007FC0开始执行程序。另外,bootcmd环境变量是保存在NAND FLASH中,所以还需要在头文件中修改配置把环境变量值储存在NAND FLASH中。奇怪,如果按默认配置保存环境变量到nor flash不起作用,引导kernel失败,认为没有bootcmd这个环境变量值。(应该是nor flash的型号配置错了,mx29lv1600BTI需要使用 CFI_flash).

3.2在u-boot中支持NAND FLASH操作,见后面第七部分;

3.3在u-boot中支持jffs2,yaffs,见后面第八部分。

3.4设置分区,支持mtdparts命令:

 

3.5要在lib_arm/board.c ->start_armboot()函数中增加mtdparts_default命令,否则MTDPARTS_DEFAULT环境变量的值不会写入到NAND FLASH中,导致执行mtdparts命令会报错——没有环境变量值。

五、支持网卡DM9000X功能

5.1在include/configs/smdk2440.h配置宏:

5.2在board/smdk2440/lowlevel_init.S中修改网卡对应的bank4的时序,带宽:

 

 

5.3更新drivers/dm9000x.c文件,直接从100ask移植过来,重要,一定要更新;

5.4更新net/eth.c, net/net.c文件,直接从100ask移植过来,重要,一定要更新;

六、移植菜单且支持USB slave 功能

移植自己的菜单,在u-boot中通过USB/网络下载更新内核,文件系统等功能。

6.1在common/main.c 文件的main_loop()函数中增加调用菜单命令代码:

6.2在common/目录增加菜单命令文件cmd_menu.c,实现各种菜单功能,我们可以直接把100ask做好的文件复制过来,稍微修改,定制成自己的菜单文件。

6.3在common/Makefile中增加cmd_menu.o依赖关系,把cmd_menu.c编译进去。

6.4由于cmd_menu.c文件中需要使用USB功能,我们还需要在u-boot中增加对USB,的支持。

6.5增加USB的支持

6.5.1在drivers/目录下增加usb文件,直接从100ask移植过来。

6.5.2在common/目录下增加cmd_usbslave.c文件,直接从100ask移植过来;

6.5.3在common/makefile中增加cmd_usbslave.o依赖关系;

6.5.4把drivers/usb文件添加到顶层Makefile中编译。

 

 

6.5.5在include/目录增加def.h头文件。

6.5.6修改include/s3c24x0.h,include/s3c2410.h直接从100ask移植,主要增加了

USB相关的寄存器;

6.5.7修改cpu/arm920t/s3c24x0/interrupts.c,直接从100ask移植过来,主要增加了

     函数定时器相关的初始化函数;

6.5.5在lib_ram/board.c的starm_armboot()函数中增加USB的初始化:

6.5.7在开发板头文件增加USB宏:

6.5.8增加变量FREE_RAM_SIZE,FREE_RAM_END:

Dir:cpu/arm920t/cpu.c -> cpu_init()

Dir:include/asm-arm/u-boot-asm.h

Dir: cpu/arm920t/start.S

 

6.5.9.在目录board/smdk2440/移植过来boot_init.c,并且修改Makefile,这个

100ask增加了的一些boot初始化的函数和变量,我们把它加进来。

6.5.10更新lib_arm/board.c文件的内容,跟100ask的文件通过beyondcompare

获取不同的地方,确认后更新内容。

6.5.11更新lib_arm/armlinux.c文件的内容,跟100ask的文件通过beyondcompare

获取不同的地方,确认后更新内容。

6.5.12移植完成,down!

七、支持NAND FLASH

默认的u-boot是不支持NAND FLASH功能的,我们需要通过移植,来实现对NAND FLASH的支持,这样才可以在u-boot中更新内核和文件系统到NAND FLASH中。

7.1在开发板头文件include/configs/smdk2440.h中对宏CONFIG_COMMAND增加命令CFG_CMD_NAND:

7.2在开发板头文件include/configs/smdk2440.h中增加三个宏:

7.3实现函数board_nand_init(), 调用过程:start_armboot( )(dir:lib_arm/board.c) -> nand_init( ) ( dir: drivers/nand/nand.c)

  -> nand_init_chip( ) ( dir: drivers/nand/nand.c)  

  -> board_nand_init( ) (初始化NAND FLASH 设备)

 新建文件cpu/arm920t/s3c24x0/nand_flash.c ,实现board_nand_init()函数。

 这个文件nand_flash.c 从u-boot-2.6.12移植而来。

  7.3.1先在include/s3c24x0.h头文件中增加S3C2440_NAND数据结构:

7.3.2在include/s3c2410.h中增加函数S3C2440_GetBase_NAND():

7.3.3把文件nand_flash.c复制到cpu/arm920t/s3c24x0/, 这个文件里面实现了board_nand_init()函数,封装了对NAND FLASH初始化有关的所有函数。

7.3.4修改Makefile把新增加的文件nand_flash.c编译进去:

到此,NAND FLASH的移植完成。

八、支持烧写yaffs文件系统映像

增加NAND FLASH功能后,可以通过nand write......., nand write.jffs2...来烧写内核,烧写cramfs,jffs2文件系统映像文件。 现在增加nand write.yaffs... 命令支持yaffs文件系统的烧写。

8.1对common/cmd_nand.c 的nand命令进行修改,如下:

8.2在common/cmd_nand.c文件中,对do_nand()函数增加对nand write.yaffs的支持:

8.3在include/nand.h 结构体nand_write_options_t增加成员skipfirstblk,

Nocheckbadblk,如图:

8.4在drivers/nand/nand_util.c文件中,增加对skipfirstblk的支持:

 

8.5取消ECC校验报警,修改drivers/nand/nand_base.c文件中的nand_write_page():

注释掉这一句就可以了。 在make的时候就不会报警了。 到此, 移植yaffs的功能就完成了。

 

  这样,u-boot就算移植完成了,基本的功能都有了,所有的移植代码都是参考100ask的jz2440,依葫芦画瓢,大概了解了整个u-boot的工作原理,还无法理解透。回看整个过程,还是挺复杂的,补丁文件都有2万多行,可以看出,早期的u-boot移植,还是一件相当辛苦的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值