u-boot-2011.09在ST2410上的移植之在RAM中运行
作者:mutes
u-boot版本:u-boot-2011.09
运行环境:Window7 Vmware workstation7.1 CentOS6.0 交叉编译环境:Arm-linux-gcc-4.3.2 with EABI
硬件环境:
ST2410X开发板(CPU:S3C2410X,64M SDRAM: 2片HY57V561620FTP-H,2M norflash: 39VF1601,64M nandflash:K9F1208U0M,网卡:cs8900a)
移植时间:2011.10.27 源码下载地址:ftp://ftp.denx.de/pub/u-boot/u-boot-2011.09.tar.bz2
参考文献: http://blog.csdn.net/csuwzc/article/details/6453623 使用JLink间接烧写S3C2410、S3C2440开发板Nor、Nand Flash的方法:http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=3228953
一、创建板子文件夹和配置文件
1、解压源码包并进入源码目录
[just@just study]$ tar jxvf u-boot-2011.09.tar.bz2
[just@just study]$ cd u-boot-2011.09
[just@just u-boot-2011.09]$
2、在boards.cfg中的smdk2410后加入
[just@just u-boot-2011.09]$ vim boards.cfg //在旧版本中是直接在当前目录下Makefile文件中添加的
smdk2410 arm arm920t - samsung s3c24x0
后增加一行
mutes2410 arm arm920t - samsung s3c24x0
st2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t st2410 NULL s3c24x0我把我的板子起名叫st2410,可以依自己的喜好修改,注意@前用tab键空格。
各项的意思如下:
mutes2410: 开发板的目标板型号(BOARD),对应于board/samsung/mutes2410目录。
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
- :开发板名称,没有就用‘-’表示
samsung: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
最后为Options项,也可不填写
3、建立board/samsung/mutes2410目录,拷贝board/samsung/smdk2410下的文件到board/samsung/mutes2410目录,将smdk2410.c更名为mutes2410.c //这里比版本多了一级目录samsung
[just@just u-boot-2011.09]$ cp -ar board/samsung/smdk2410 board/samsung/mutes2410
mv board/samsung/mutes2410/smdk2410.c board/samsung/mutes2410/mutes2410.c
4、在board/samsung/mutes2410/Makefile中,如下修改(因为前面将smdk2410.c文件改名为mutes2410.c了):
COBJS:= smdk2410.o //在新版本中没有flash.o了
改为:
COBJS:= mutes2410.o
5、cp include/configs/smdk2410.h include/configs/mutes2410.h
首先将mutes2410.h中的
131 #define CONFIG_SYS_PROMPT "SMDK2410 # " //早期版本为CFG_PROMPT
修改为
131 #define CONFIG_SYS_PROMPT "MUTES2410 # "
6、测试编译能否成功:
[just@just u-boot-2011.09]$ make mutes2410_config awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg > .boards.depend Configuring for mutes2410 board...
[just@just u-boot-2011.09]$ make Generating include/autoconf.mk Generating include/autoconf.mk.dep arm-linux-gcc -DDO_DEPS_ONLY \
。。。。。。。。。。。。。。。 然后会生成二进制文件u-boot.bin, 这个时候把程序放到开发板上是运行不了的,因为通过tftp下载的程序,它会指定下载地址,然后从指定下载位置运行,而u-boot默认代码地址为0。
下面修改相关文件,开启调试配置
1)、修改u-boot默认代码地址为0x33e00000(st2410的SDRAM空间是0x30000000~0x34000000,共64M),然后修改mutes2410.h:
vim include/configs/mutes2410.h
将
#define CONFIG_SYS_TEXT_BASE 0x0
修改为
#define CONFIG_SYS_TEXT_BASE 0x33e00000
2)、在mutes2410.h文件最后#endif前一行添加下面一行
#define CONFIG_SKIP_LOWLEVEL_INIT
CONFIG_SKIP_LOWLEVEL_INIT这个宏用于cpu/arm920t/start.S里,主要是对CPU和存储控制器的初始化,因为我要在RAM中运行,所以调试阶段跳过初始化。
然后重新生成u-boot.bin,通过tftp将uboot.bin下载到开发板运行了,当然运行会出错的。
ST2410 # tftp 0x32000000 u-boot.bin TFTP from server 192.168.1.91; our IP address is 192.168.1.200 Filename 'u-boot.bin'. Load address: 0x32000000 Loading: ################################################################# ########################### done Bytes transferred = 468028 (7243c hex) ST2410 # go 0x32000000 ## Starting application at 0x32000000 ...¡ø
U-Boot 2011.09 (Oct 27 2011 - 18:42:31)
DRAM: 64 MiB WARNING: Caches not enabled Flash: *** failed *** ### ERROR ### Please RESET the board ###
运行到这里死了。从串口输出信息可以看到u-boot-2011.09默认是不支持39VF1601的norflash,在后面我们先去掉对norflash的支持,先让它只在内存运行。
3)、去掉对norflash、网卡的支持
在include/configs/mutes2410.h文件中可以看到
54 /* 55 * Hardware drivers 56 */ 57 #define CONFIG_NET_MULTI 58 #define CONFIG_CS8900 /* we have a CS8900 on-board */ 59 #define CONFIG_CS8900_BASE 0x19000300 60 #define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
我们注释掉第58行
在include/configs/mutes2410.h文件中找到“FLASH and environment organization”项,可以看到
179 /*----------------------------------------------------------------------- 180 * FLASH and environment organization 181 */ 182 183 #define CONFIG_SYS_FLASH_CFI 184 #define CONFIG_FLASH_CFI_DRIVER 185 #define CONFIG_FLASH_CFI_LEGACY 186 #define CONFIG_SYS_FLASH_LEGACY_512Kx16 187 #define CONFIG_FLASH_SHOW_PROGRESS 45 188 189 #define CONFIG_SYS_MAX_FLASH_BANKS 1 190 #define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE } 191 #define CONFIG_SYS_MAX_FLASH_SECT (19) 192 193 #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000) 194 #define CONFIG_ENV_IS_IN_FLASH 195 #define CONFIG_ENV_SIZE 0x10000 196 /* allow to overwrite serial and ethaddr */ 197 #define CONFIG_ENV_OVERWRITE
我们注释掉第183到194行,在后面添加宏定义#define CONFIG_SYS_NO_FLASH 及加上宏定义#undef CONFIG_CMD_IMLS
CONFIG_CMD_IMLS是在include/config_cmd_all.h中定义的,这里要把它取消掉,否则将出现如下错误:
In file included from cmd_bootm.c:35: /home/just/study/u-boot-2011.09/include/environment.h:152: error: 'CONFIG_ENV_SIZE' undeclared here (not in a function) In file included from cmd_bootm.c:80: /home/just/study/u-boot-2011.09/include/mtd/cfi_flash.h:174: error: expected ')' before '*' token cmd_bootm.c:81: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'flash_info' cmd_bootm.c: In function 'do_imls': cmd_bootm.c:1164: error: 'flash_info_t' undeclared (first use in this function) cmd_bootm.c:1164: error: (Each undeclared identifier is reported only once cmd_bootm.c:1164: error: for each function it appears in.) cmd_bootm.c:1164: error: 'info' undeclared (first use in this function) cmd_bootm.c:1168: error: 'flash_info' undeclared (first use in this function) cmd_bootm.c:1169: error: 'CONFIG_SYS_MAX_FLASH_BANKS' undeclared (first use in this function) cmd_bootm.c:1171: error: 'FLASH_UNKNOWN' undeclared (first use in this function) make[1]: *** [cmd_bootm.o] 错误 1 make[1]: Leaving directory `/home/just/study/u-boot-2011.09/common' make: *** [common/libcommon.o] 错误 2
取消宏定义后就不会出现了
修改后如下:
183 /*#define CONFIG_SYS_FLASH_CFI 184 #define CONFIG_FLASH_CFI_DRIVER 185 #define CONFIG_FLASH_CFI_LEGACY 186 #define CONFIG_SYS_FLASH_LEGACY_512Kx16 187 #define CONFIG_FLASH_SHOW_PROGRESS 45 188 189 #define CONFIG_SYS_MAX_FLASH_BANKS 1 190 #define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE } 191 #define CONFIG_SYS_MAX_FLASH_SECT (19) 192 193 #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000) 194 #define CONFIG_ENV_IS_IN_FLASH*/ 195 196 #define CONFIG_SYS_NO_FLASH 197 #undef CONFIG_CMD_IMLS 198 #define CONFIG_ENV_ADDR (PHYS_SDRAM_1) 199 #define CONFIG_ENV_IS_IN_NVRAM 200 #define CONFIG_ENV_SIZE 0x10000 201 /* allow to overwrite serial and ethaddr */ 202 #define CONFIG_ENV_OVERWRITE
因为在RAM中运行,环境参数也要做相应修改,如198,199行。默认环境参数是在flash中的。
修改后编译出错如下:
mutes2410.c:149: error: expected declaration specifiers or '...' before 'flash_info_t' mutes2410.c: In function 'board_flash_get_legacy': mutes2410.c:151: error: 'info' undeclared (first use in this function) mutes2410.c:151: error: (Each undeclared identifier is reported only once mutes2410.c:151: error: for each function it appears in.) mutes2410.c:151: error: 'FLASH_CFI_16BIT' undeclared (first use in this function) mutes2410.c:152: error: 'FLASH_CFI_BY16' undeclared (first use in this function) mutes2410.c:153: error: 'FLASH_CFI_X16' undeclared (first use in this function)
在mutes2410.h中我已经添加了CONFIG_SYS_NO_FLASH并取消了CONFIG_SYS_FLASH_CFI的宏定义不知道为什么新版u-boot的board/samsung/mutes2410/mutes2410.c文件中对board_flash_get_legacy函数没加宏开关,在这里我们在对'board_flash_get_legacy'函数添加一个宏开关如下:(添加第149和157行)
149 #ifdef CONFIG_SYS_FLASH_CFI 150 ulong board_flash_get_legacy(ulong base, int banknum, flash_info_t *info) 151 { 152 info->portwidth = FLASH_CFI_16BIT; 153 info->chipwidth = FLASH_CFI_BY16; 154 info->interface = FLASH_CFI_X16; 155 return 1; 156 } 157 #endif
编译下载运行如下:
ST2410 # tftp 0x32000000 u-boot.bin TFTP from server 192.168.1.91; our IP address is 192.168.1.200 Filename 'u-boot.bin'. Load address: 0x32000000 Loading: ################################################################# ######################## done Bytes transferred = 451816 (6e4e8 hex) ST2410 # go 0x32000000 ## Starting application at 0x32000000 ...¡ø
U-Boot 2011.09 (Oct 28 2011 - 06:51:39)
DRAM: 64 MiB WARNING: Caches not enabled
到这里然后自动重启了。
4)、开启u-boot打印调试信息的功能
为了查找原因,在这里我又开启了u-boot打印调试信息的功能
在mutes2410.h文件最后#endif前一行再添加“#define DEBUG 1 ”添加后的结果如下:
244 #define CONFIG_SKIP_LOWLEVEL_INIT 245 #define DEBUG 1 246 #endif /* __CONFIG_H */
为什么添加这个宏定义,我们在include/common.h文件中可以看到以下代码
119 #ifdef DEBUG 120 #define debug(fmt,args...) printf (fmt ,##args) 121 #define debugX(level,fmt,args...) if (DEBUG>=level) printf(fmt,##args); 122 #else 123 #define debug(fmt,args...) 124 #define debugX(level,fmt,args...) 125 #endif /* DEBUG */ 126 127 #ifdef DEBUG 128 # define _DEBUG 1 129 #else 130 # define _DEBUG 0 131 #endif
显然需要我们开启DEBUG宏定义,源码中的debug函数才生效,而要debugX函数生效,这里我定义了DEBUG为1 保存编译下载运行如下:
ST2410 # tftp 0x32000000 u-boot.bin TFTP from server 192.168.1.91; our IP address is 192.168.1.200 Filename 'u-boot.bin'. Load address: 0x32000000 Loading: ################################################################# ############################ done Bytes transferred = 474184 (73c48 hex) ST2410 # go 0x32000000 ## Starting application at 0x32000000 ...¡ø
U-Boot 2011.09 (Oct 28 2011 - 06:54:53)
U-Boot code: 32000000 -> 3206B4E0 BSS: -> 320AEBE4 monitor len: 000AEBE4 ramsize: 04000000 TLB table at: 33ff0000 Top of RAM usable for U-Boot at: 33ff0000 Reserving 698k for U-Boot at: 33f41000 Reserving 4160k for malloc() at: 33b31000 Reserving 24 Bytes for Board Info at: 33b30fe8 Reserving 120 Bytes for Global Data at: 33b30f70 New Stack Pointer is: 33b30f60 RAM Configuration: Bank #0: 30000000 64 MiB relocation Offset is: 01f41000 WARNING: Caches not enabled monitor flash len: 00073C48 dram_bank_mmu_setup: bank: 0 Now running in RAM - U-Boot at: 33f41000 NAND: board_nand_init() end of nand_init hwcontrol(): 0xff 0x83 hwcontrol(): 0xffffffff 0x81 raise: Signal # 8 caught raise: Signal # 8 caught dev_ready hwcontrol(): 0x90 0x83 hwcontrol(): 0x00 0x85 hwcontrol(): 0xffffffff 0x81 raise: Signal # 8 caught raise: Signal # 8 caught dev_ready hwcontrol(): 0x90 0x83 hwcontrol(): 0x00 0x85 hwcontrol(): 0xffffffff 0x81 raise: Signal # 8 caught raise: Signal # 8 caught dev_ready hwcontrol(): 0xffffffff 0x80 64 MiB *** Warning - bad CRC, using default environment
Destroy Hash Table: 33fae068 table = (null) Create Hash Table: N=75 INSERT: table 33fae068, filled 1/79 rv 33b32418 ==> name="bootdelay" value="5" INSERT: table 33fae068, filled 2/79 rv 33b32358 ==> name="baudrate" value="115200" INSERT: table 33fae068, filled 3/79 rv 33b32328 ==> name="ipaddr" value="10.0.0.110" INSERT: table 33fae068, filled 4/79 rv 33b32430 ==> name="serverip" value="10.0.0.1" INSERT: table 33fae068, filled 5/79 rv 33b325bc ==> name="netmask" value="255.255.255.0" INSERT: free(data = 33b322a0) INSERT: done In: serial Out: serial Err: serial Net: raise: Signal # 8 caught CS8900-0Warning: failed to set MAC address 原来在启动网卡时出现了问题,这个问题我们留到实现CS8900网卡时再来解决,在这里我们先去掉对CS8900网卡的支持,在include/configs/mutes2410.h 文件中去掉第58行CONFIG_CS8900宏定义 58 //#define CONFIG_CS8900 编译运行OK
ST2410 # tftp 0x32000000 u-boot.bin TFTP from server 192.168.1.91; our IP address is 192.168.1.200 Filename 'u-boot.bin'. Load address: 0x32000000 Loading: ################################################################# ############################ done Bytes transferred = 474176 (73c40 hex) ST2410 # go 0x32000000 ## Starting application at 0x32000000 ...¡ø
U-Boot 2011.09 (Oct 28 2011 - 06:59:50)
U-Boot code: 32000000 -> 3206B4D8 BSS: -> 320AEBE4 monitor len: 000AEBE4 ramsize: 04000000 TLB table at: 33ff0000 Top of RAM usable for U-Boot at: 33ff0000 Reserving 698k for U-Boot at: 33f41000 Reserving 4160k for malloc() at: 33b31000 Reserving 24 Bytes for Board Info at: 33b30fe8 Reserving 120 Bytes for Global Data at: 33b30f70 New Stack Pointer is: 33b30f60 RAM Configuration: Bank #0: 30000000 64 MiB relocation Offset is: 01f41000 WARNING: Caches not enabled monitor flash len: 00073C40 dram_bank_mmu_setup: bank: 0 Now running in RAM - U-Boot at: 33f41000 NAND: board_nand_init() end of nand_init hwcontrol(): 0xff 0x83 hwcontrol(): 0xffffffff 0x81 raise: Signal # 8 caught raise: Signal # 8 caught dev_ready hwcontrol(): 0x90 0x83 hwcontrol(): 0x00 0x85 hwcontrol(): 0xffffffff 0x81 raise: Signal # 8 caught raise: Signal # 8 caught dev_ready hwcontrol(): 0x90 0x83 hwcontrol(): 0x00 0x85 hwcontrol(): 0xffffffff 0x81 raise: Signal # 8 caught raise: Signal # 8 caught dev_ready hwcontrol(): 0xffffffff 0x80 64 MiB *** Warning - bad CRC, using default environment
Destroy Hash Table: 33fae068 table = (null) Create Hash Table: N=75 INSERT: table 33fae068, filled 1/79 rv 33b32418 ==> name="bootdelay" value="5" INSERT: table 33fae068, filled 2/79 rv 33b32358 ==> name="baudrate" value="115200" INSERT: table 33fae068, filled 3/79 rv 33b32328 ==> name="ipaddr" value="10.0.0.110" INSERT: table 33fae068, filled 4/79 rv 33b32430 ==> name="serverip" value="10.0.0.1" INSERT: table 33fae068, filled 5/79 rv 33b325bc ==> name="netmask" value="255.255.255.0" INSERT: free(data = 33b322a0) INSERT: done In: serial Out: serial Err: serial Net: No ethernet found. ### main_loop entered: bootdelay=5
### main_loop: bootcmd="<UNDEFINED>" MUTES2410 #
|