这里总结一些移植过程中零碎的问题。
解决 WARNING: Caches not enabled 提示
启动过程中会有一条提示”WARNING: Caches not enabled”,警告未开启Cache。搜索这句提示,找到如下代码:
1 | /* |
向上追踪函数的调用关系,可以找到是initr_caches()
函数调用了enable_caches()
。然而在/board/samsung/smdk2440/smdk2440.c
中可以看到,board_init()
函数会开启Cache的:
1 | int board_init(void) |
这就涉及到初始化顺序了,找到初始化序列:
1 | init_fnc_t init_sequence_r[] = { |
可以很清楚的看到,board_init()
函数会在initr_caches()
函数后执行。这里有两种解决方案,一种是直接忽略enable_caches()
;另一种是将board_init()
中的缓存使能代码移到enable_caches()
中,这里我采用了后一种方法。注释掉board_init()
中的那两行代码,在board/samsung/smdk2440/smdk2440.c
文件中加入以下代码:
1 | void enable_caches(void) |
因为原来那个enable_caches()
函数是使用__weak
定义的,此处直接定义此函数即可,会覆盖掉原代码中的定义。修改完成后,编译运行,可以看到这个警告不再出现了。
配置环境变量保存位置
U-boot中使用saveenv
命令可以保存设置的环境变量,存储位置可以在NOR Flash、NAND Flash或EEPROM中,此处我选择保存在NOR Flash中。具体的存储地址和空间大小由smdk2440.h
文件中这几个宏决定:
1 |
|
CONFIG_ENV_IS_IN_FLASH
表明使用NOR Flash,CONFIG_ENV_ADDR
和CONFIG_ENV_SIZE
即是起始地址和大小,这里选择了NOR Flash的最后一个扇区。设置的时候要注意不要把其他数据(如U-Boot本身的代码)给覆盖了就行。
配置启动参数
为了实现上电自动引导Linux内核,需要正确设置以下3个环境变量:bootcmd
、bootargs
、machid
。
machid
为U-Boot传给Linux Kernel的机器ID,内核会根据这个ID选取对应的初始化文件对开发板进行初始化,在Linux Kernel的源代码include/generated/mach-types.h
中可以找到Mini2440开发板的机器ID为1999(0x7CF)。所以将machid
设置为7CF即可。
bootcmd
为使用boot或bootd命令引导系统时实际调用的命令,这个根据实际情况设定,比如:
1 | bootcmd=nand read 30008000 100000 300000;bootm 30008000 |
当设置了bootcmd
后,启动时就会有读秒了,超过一段时间没有按键输入自动引导系统。环境变量bootdelay
用于指定这段延迟时间的长度,单位是秒。
bootargs
为启动参数,具体的设置值有待之后研究Linux内核时再来分析,目前使用的设置是:
1 | bootargs=noinitrd console=ttySAC0,115200 root=/dev/mtdblock3 rw rootfstype=jffs2 init=/linuxrc |
移植好的U-Boot见我的Github项目。