Chinaunix首页 | 论坛 | 博客
  • 博客访问: 667783
  • 博文数量: 237
  • 博客积分: 4285
  • 博客等级: 上校
  • 技术积分: 2701
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-15 14:05
文章分类

全部博文(237)

文章存档

2014年(2)

2013年(3)

2012年(47)

2011年(15)

2010年(68)

2009年(102)

我的朋友

分类: 嵌入式

2009-11-15 14:47:34

uboot移植到S3C44B0X开发板的经历2007年04月02日 12:44(1) 事情来由
几个月前从朋友那里拿到了一块参考Micetek EV44b0-II开发板设计的板子,对其bootloader MBL感觉很不错. 朋友说可能是移植u-boot的.但Micetek并没有提供MBL的源代码, 因此当时没有仔细去研究. 最近公司准备想做基于S3C44B0X CPU的产品,因此购买了杭州立宇泰公司()的armsys-c及armsys-b开发板和.armsys提供的 bootloader是其公司自己开发的bootloader,觉得其USB这一块做的还可以,但利用USB下载调试uclinux是非常麻烦的,操作很 不爽,其bootloader也不提供网络下载调试.因此自己计划移植u-boot.
(2) 开始
由于没有接触过u-boot,因此第一步要做的就是google一些资料.
u-boot官方网站:(比较慢)
这个快一些.
DENX U-Boot及Linux使用手册: http://coosign.blogchina.com/coosign/1318487.html, 这是一遍翻译的文档.主要介绍了u-boot编译及使用的命令.但没有涉及新板子的移植流程.
根据上面手册中的说明,下载了最新的u-boot代码,命令:
#cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot
到board目录查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
结果是:
./dave/B2/B2.c
B2网站是: ,初初看了B2开发板的介绍,但不详细.包括使用的网络芯片等都没有介绍.
google "u-boot 移植"后查到一篇文章:
"收集了一些关于U-BOOT的文章"
http://www.bloghome.cn/index.php?op=ViewArticle&articleId=2111&blogId=390
里面搜集了不少关于u-boot移植的问题.
里面介绍了"U-Boot 在44B0X 开发板上的移植以及代码分析"的内容,仔细看了看.发现其移植的版本比较低,但对了解u-boot结构是满不错的,因为这个版本不支持44B0X,因此完 全是支持新CPU的移植.了解到make XX_config是在Makefile中定义的.
另外"MPC8xx的U-Boot移植体会(ZT) "这一篇对u-boot介绍满详细的.但对移植工作只做了理论性和经验性介绍,没有具体的操作步骤.
"基于Atmel at91rm9200的armlinux的bootloader启动代码分析 "

里面介绍了u-boot移植到at91rm9200上的情况,可以参考一下.
另外就是仔细阅读u-boot下的README文件.
(3) 编译一把
看了相关的资料,心动不如行动.先编译一把看看情况.既然只有B2开发板是S3C44B0X CPU的,因此先编译一下B2开发板看看. 具体:
#cd u-boot
#make B2_config
#make
结果顺利,成功编译.
(4) 开始动手移植
我以B2板子的程序做为模板来做.
#cd board
#cp -r dave wx (自己取个公司名wx)
#cd wx
#mv B2 wx20 (自己取个板子名wx20)
#cd wx20
# mv B2.c wx20.c
修改Makefile及wx20.c, 主要是B2改成wx20.
增加配置文件:
#cd include/configs
#cp B2.h wx20.h
修改Makefile配置文件,增加wx20_config.
1432 wx20_config : unconfig
1433 @./mkconfig $(@:_config=) arm s3c44b0 wx20 wx
[注:前面的数字是文件行号,以下一样].
将board/wx目录下和wx20.h文件中的B2改成wx20或WX20.
这里其实是最重要的步骤,就是根据硬件的情况来修改相关的参数.由于对硬件板子的情况不是太了解,因此此时最需要的就是耐心地看看硬件资料.主要修改的地方有:
include/configs/wx20.h ---- 配置文件,大部分参数是这里配置的.
board/wx/wx20/lowlevel_init.S -- 内存参数配置
cpu/s3c44b0/serial.c -- 串口配置
cpu/s3c44b0/start.S -- 程序入口
如果此时配置全部正确了,那么我们就简单的很了.(如果你用我的patch的话,就是如此了!)那么我也就不会仔细再去研究u-boot其他部分了. 困难就是你学习的最好机会!
(5) 开始编译
经过简单的参数修改,编译成功.然后下载u-boot.bin(二进制格式). 此时你可以用nm看一下u-boot(elf格式)的内容,会有所收获的.
然后用armsys的bootloader将u-boot.bin调入到内存0xc100000运行.结果可想而知,串口没有任何显示,而且死机.bootloader也必须断电重起.
(6) u-boot流程
原因是比较明显的,就是参数和硬件没有符合.因此接下来做的事情就是仔细阅读S3C44B0 CPU的硬件资料,包括内存配置,串口配置这些.我觉得要让串口出信息,最主要的就是CPU的初始化,内存配置和串口配置.另外就是了解u-boot程序 运行流程,这个对了解需要设置的参数是非常有帮助的.我这里大致说一下u-boot运行流程.
入口: cpu/s3c44b0/start.S
主要是CPU初始化( cpu_init_crit ), 调内存配置函数( lowlevel_init ), 然后判断u-boot是否从flash运行,如果是就把u-boot代码拷贝到TEXT_BASE定义的地方.然后转到start_armboot.
start_armboot: lib_arm/board.c
进行各种初始化设置,主要有:
cpu_init CPU相关的设置, 具体在./cpu/s3c44b0/cpu.c中.
board_init 板子相关的设置, 具体在board/wx/wx20/wx20.c 中
interrupt_init中断设置,我们没有用,具体在./cpu/s3c44b0/interrupts.c中
env_init 初始化环境变量, 具体要看用什么介质来存储环境变量,如果用flash来存贮, 程序在common/env_flash.c中.
init_baudrate 设置baud参数
serial_init 串口初始化, 具体在cpu/s3c44b0/serial.c.
console_init_f 控制台设置, 具体在./common/console.c
display_banner 显示标题.
dram_init 可用内存配置, 具体在./board/wx/wx20/wx20.c.
flash_init flash初始化,具体./drivers/cfi_flash.c.
接下来就是环境变量初始化, 网络初始化,最后到main_loop,可以运行各种命令.
(7) 主要参数修改
经过一段时间调试,终于串口出东西了,这段时间犯了一个小错误,走了一段冤枉路.其实配置参数可能早已正确,但串口老是乱码,原因是自己的u-boot.bin传下来时目录搞错了,结果老是运行错误的u-boot.bin.这段时间里主要改的参数有:
include/configs/wx20.h:
#define CONFIG_S3C44B0_CLOCK_SPEED 64
CPU主频,armsys板的是64M
#define PHYS_SDRAM_1 0x0c000000 /* SDRAM Bank #1 */
B2板子里的定义是错误的.还有RAM大小,flash大小需要修改,跟B2板不同.
#define CONFIG_DRIVER_RTL8019
#define RTL8019_BASE 0x08000000
配置rtl8019AS网络芯片.
#define CFG_LOAD_ADDR 0x0c008000 /* default load address */
uclinux运行入口地址
lowlevel_init.S:
MEMORY_CONFIG:
.long 0x11010102
.long 0x600
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x2610
.long 0x18000
.long 0x18000
.long 0x960459
.long 0x10
.long 0x20
.long 0x20
由于对armsys硬件不是太了解,没有办法,只得看armsys bootloader程序,但每个版本又有差别.因此是用AXD调试看bootlaoder启动后0x1c80000中的值定的.
cpu/s3c44b0/serial.c:
#elif CONFIG_S3C44B0_CLOCK_SPEED==64
divisor = 34;
串口设置,这个也是根据bootloader里的公式计算出来的.这里只定义了115200得值,其他没有去设置.
cpu/s3c44b0/start.S:
ldr r1, =PLLCON
#if CONFIG_S3C44B0_CLOCK_SPEED==66
ldr r0, =0x34031 /* 66MHz (Quartz=11MHz) */
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0x610c1 /*B2: Xtal=20mhz Fclk=75MHz */
#elif CONFIG_S3C44B0_CLOCK_SPEED==64
ldr r0, =((M_DIV<<12)+(P_DIV<<4)+S_DIV) //Fin=8MHz,Fout=64MHz
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
PLLCON的值,也是根据bootlaoder的公式.
board/wx/wx20/wx20.c
主要是PORT配置,具体我不知道有没有影响.

(8) 关于u-boot入口的疑问
由于开始串口没有出内容,因此对u-boot入口产生怀疑.在网上也找到一个帖子,碰到同样疑问的人:
=
"链接得到的起始地址为什么是TEXT_BASE,而不是0呢,所以现在只能够下载到ram中运行,但是无法烧写道flash中跑,这是怎么回事 呢?u-boot中应该是start.S中的这段代码在flash中运行吧,后面就把自身拷贝到ram中TEXT_BASE地址处,为什么在链接文件中指 定的_start的起始地址为0x00000000呢? "
后来我理解了:
“链接得到的起始地址为什么是TEXT_BASE,而不是0呢,”
因为u_boot如果从flash运行的话,那么它会将自己的代码拷贝到RAM中,然后运行。u-boot开始部分代码与编译的入口没有关系,而主要的代 码是在RAM中运行,因此编译的入口地址是TEXT_BASE.因此u-boot既可以flash运行,也可以ram运行。
“为什么在链接文件中指定的_start的起始地址为0x00000000呢?”
lds文件中的起始地址为0x00000000是不起作用的,由-TTEXT_BASE参数替代的。
刚开始比较疑惑的原因是对:
126 relocate: /* relocate U-Boot to RAM */
127 adr r0, _start /* r0 <- current position of code */
adr这条指令没有理解正确,因为把它想成mv r0,_start了,实际上adr这里的_start是相对的,如果从flash运行的话,r0就是0, 如果从ram运行的话,r0就是C100000。
(9) u-boot显示信息
经过上面的努力,我们终于可以看到u-boot的庐山真面目了.当然这还不是最终的结果.但至少离胜利不远了.现在我们可以用printf来调试了.此时全部是通过armsys bootloader下载u-boot.bin到0xc100000运行.
现在显示信息是:
Plese wait a moment to start running...i am samfei!
iamsam!

U-Boot 1.1.3 (Jul 1 2005 - 13:46:03)
U-Boot code: 0C100000 -> 0C11A73C BSS: -> 0C11ECF4
RAM Configuration:
Bank #0: 0c000000 8 MB
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
MAC: 26:26:26:26:26:26
Hit any key to stop autoboot: 0
=>
(10) 希望环境变量存贮到flash
B2板缺省的定义是把环境变量存贮到EEPROM上,虽然armsys上也有,但我也搞不清楚它的硬件配置,因此希望把环境变量存贮到flash上.
增加配置: include/configs/wx20.h (从evb4510.h中学来!)
79 #define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
80 CFG_CMD_DATE | \
81 CFG_CMD_ELF | \
82 CFG_CMD_NET | \
83 CFG_CMD_ENV|CFG_CMD_FLASH )
173 #define CFG_ENV_IS_IN_FLASH
174 #undef CFG_ENV_IS_NOWHERE
175
176 #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x20000) /* environment start address */
177 #define CFG_ENV_SECT_SIZE 0x10000 /* Total Size of Environment Sector */
编译运行, 并操作setenv, saveenv, printenv. 看起来正常.
=> setenv ipaddr 192.168.1.100
=> saveenv
Saving Environment to Flash...
Un-Protected 1 sectors
Erasing Flash...
done
Erased 1 sectors
Writing to Flash... done
Protected 1 sectors
ð printenv
但重新启动机器后,参数没有起作用,还是缺省的.仔细看了环境变量的程序,发现是由于ENV_IS_EMBEDDED定义造成的,而此变量定义是在./tools/envcrc.c中:
# if (CFG_ENV_ADDR >= CFG_MONITOR_BASE) && \
((CFG_ENV_ADDR + CFG_ENV_SIZE) <= (CFG_MONITOR_BASE + CFG_MONITOR_LEN))
# define ENV_IS_EMBEDDED 1
# endif
因此在wx20.h中增加了:
#define CFG_MONITOR_BASE PHYS_SDRAM_1 (我还没搞清楚这个变量干啥的.)
主要是去除ENV_IS_EMBEDDED的定义。
结果确实准备使用flash的环境变量,但每次总是说标志头错误,经过仔细调试,最终发现flash写出现错误,原因是我忘了修改wx/common/flash.c中的CONFIG_B2为CONFIG_WX20. 修改后就正常了.
(11) arm-linux和arm-elf
上面调试一直是arm-elf,原因是以前有问题时怀疑编译器问题而修改了,因此没有改变。改用arm-linux编译后:
U-Boot 1.1.3 (Jul 3 2005 - 07:01:36)
U-Boot code: 0C100000 -> 0C117DA0 BSS: -> 0C11C0F0
RAM Configuration:
Bank #0: 0c000000 8 MB
env_init flash_addr=20000
flash_addr=20000 env_ptr=20000 env_ptr->data=bootargs=setenv bootargs root=/dev/ram ip=192.168.1.100:::::eth0ff ether=25,0,0,0,eth0 ethaddr=00:50:c2:1e:af:fb
envptr->crc=1470de2 1470de2
buffer->crc=1470de2
[flash_get_size, 224] Entering ...
[flash_get_size, 232] value=bf
[flash_get_size, 255] value=234b
Flash: 2 MB
env_ptr=20000
gd->env_addr=20004 gd->env_valid=1
env_relocate[211] offset = 0x0
env_relocate[229] malloced ENV at 00000000
In:
Out:
Err:
死机!!!
然后改回arm-elf编译:
U-Boot 1.1.3 (Jul 3 2005 - 07:04:48)
U-Boot code: 0C100000 -> 0C119B98 BSS: -> 0C11DCD8
RAM Configuration:
Bank #0: 0c000000 8 MB
env_init flash_addr=20000
flash_addr=20000 env_ptr=20000 env_ptr->data=bootargs=setenv bootargs root=/dev/ram i

文章出处:学习笔记/u-boot学习笔记/uboot移植到S3C44B0X开发板,有关参数设置.mht
阅读(884) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~