- 论坛徽章:
- 0
|
from http://www.cnitblog.com/luofuchong/archive/2007/01/10/21726.aspx
1)
在网上下载一个
u-boot
源代码,我用的是
1.1.2
版本的,最新的应该是
1.1.4的吧,其实差不多,那就像我那样下载一个
1.1.2
版本的吧。把源文件解压,这个应该不用说了吧,学过
linux
的人应该会,不会的话我想你继续做下去也困难,那就先装个linux
用下吧(我用的是
RedHat
的,哦对了,编译程序是需要
gcc
编译器的,所以安装方式一定要选择工作站哦
^_^
)。好了,解压后你发现在
u-boot.1.1.2
目录下有
Makefile
这个文件吧?让我们看看它里面的内容,最简单的方法就是
vi Makefile
了。我们要看的是它选择的是哪一个交叉编译器。可以看到这一项:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
看到吧,也就是说这里所用的交叉编译器是
arm-linux-gcc
了,(
u-boot
默认是用这个的,也有用
arm-elf-gcc
的,网上有个工具包arm-elf-tools-20030314.sh,
我试过用它来编译,没有问题,顺便提一下,arm-elf-gcc
是用来编译
uClinux
内核的工具来的)那你就下载一个arm-linux-
的交叉编译器吧,我是在网上下载
cross-2.95.3.tar.bz2
这个文件,然后解压得到
2.95.3
版本的交叉编译工具的,具体设置如下(参考网上资料):
2
)在宿主机上建立
arm-linux-gcc
交叉编译环境
在
RedHat Linux
系统下以
root
用户登录,
将
cross-2.95.3.tar.bz2
文件复制到
/
目录下,
安装:
# tar jxvf cross-2.95.3.tar.bz2
这个命令会在你的
/usr/local/arm/2.95.3
目录下安装
arm-linux-gcc 交叉编译程序,
然后在
PATH
变量中添加一项:
/usr/local/arm/2.95.3/bin.
[root@localhost root]# export ATH=/usr/local/arm/2.95.3/bin:$PATH
或
把
PATH=/usr/local/arm/2.95.3/bin:$PATH
添加到
/ETC/bash_profile文件中
或者
在
/etc/bashrc
文件中添加一项
:
export PATH=/usr/local/arm/2.95.3/bin:$PATH
测试:
把终端关闭,重新打开后执行如下命令:
# arm-linux-gcc –v
好了,建立好交叉编译环境后可以试着编译
u-boot
了
这里提几个注意点:
1.
不可用
winRAR
解压
u-boot-1.1.2.tar.bz2
或
u-boot-1.1.2.tar.gz这种文件(就个可能新手会犯,一般熟悉
linux
命令的人应该都不会这样做吧,在此还是要提一下)
2.
可能下载的文件有一些中间文件会阻碍编译的运行,所以在编译前最好来个彻底清除,在
u-boot.1.1.2
目录下运行命令:
make distclean (其实这个命令在Makefile
文件下就有)我当时为这个问题郁闷了很久,希望你们不会像我这样
^_^
)
;
3
,有些人为了方便想在
cygwin
下编译,但是经常在网上看到在这个虚拟平台下编译有很多的问题,要配置的东西也多,而且好像我用过那个
vi
没有
linux
环境下的好用,所以最好还是不要用这个软件了吧,如果你真的离不开
windows
的话可以像我这样装个虚拟机,在虚拟机下再装
linux
的系统,具体参考这个网站):
http://fedora.linuxsir.org/doc/vmware/
3
)好了,现在开始测试你的交叉编译器搞好没有。在u-boot.1.1.2目录下执行如下命令:
1)
Make distclean (
再次强调)
2)
Make B2_config(
随便再个现成的试试^_^)
3)
Make (
没错的话应该会生成u-boot.bin文件,发生错误的话也不怕,只要细心看一下哪里错就行了,gcc碰到错误后会退出编译,所以可以一个个错误来改,一般的问题都是没找到编译器(可能你没装或者装的不对,例如人家用的是arm-linux-而你装的是arm-elf-,如果你装了的话看看你的环境变量设好了没有,前面有讲,如果不关编译器的事的话那就再看看,一般是文件的后缀不对,有些文件后缀是大写的,例如start.S但是如果你的是start.s小写的话那当然找不到(解决方法很,把它改成大写就行了)。细心看吧,不用怕,它都有注明路径,很容易可以找到的))
如果以上步骤都无误的话那么恭喜你,你的交叉编译环境可以用来编译你的u-boot源代码了,可以开始以下阶段。
3.
移植
:
说时迟那时快,现在开始移植工作(以下是我一步步重新做一遍,力求说得详细点,感谢我吧^_^)
我以B2板子的程序做为模板来做.
#cd u-boot-1.1.2
#cd board
#cp -R dave myboard (
这是我取的板子名字,可以换上你的,但是后面的也要跟着来换哦^_^)
#cd myboard
#mv B2 myboards3c44b0 (
自己取个板子名
)
#cd myboards3c44b0
# mv B2.c myboards3c44b0.c
修改
myboards3c44b0
里面的
Makefile, 把
B2
改成
myboards3c44b0
,编译时如果报的其它类似找不到
B2
的错误也是把相应的
B2
改成
myboards3c44b0
来处理。
1
)其中的
myboards3c44b0.c
文件是板的初始化代码,看一下就知道,根据你的板上自带的
44binit.s
来修改吧。
memsetup.S
文件主要是存储器的初始化设置,其实也是44binit.s
里面的一部分。
2
)其实
board
这里要修改的不多,先跳过
flash
部分吧,我们来看一下
cpu
设置部分吧。
u-boot-1.1.2
里面已经加入了对
s3c44b0
的支持,让我们来看一下
cpu/s3c44b0
里面的部分吧。
看到
start.S
这个文件了吗?要修改的其实并不多,按照你的板设置一下中断跳转矢量就行了,或者上网查一下吧,应该很容易看明的。其中
cpu.c
这个文件简直不用修改,再来看一下
serial.c这个文件吧,改一下波特率的设置就行,就是你用多少
M
的
CPU
频率的话对应的波特率参数设置问题,其实
B2
已经做得不错的了,很多子程序都不用自己写的了
^_^
,在我的板上是这样设置的
,参考一下吧
:
#if CONFIG_S3C44B0_CLOCK_SPEED==66 ,把所有的这些
66
改成
60
,原因,我的实验板上用的频率是
60
(
44B0
最高频率为
64M
)。然后其它分频系数,寄存器初始化设置,可以参考一下
44blib.c
,在这里我给出我的设置出来吧,可以参考一下。
case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 32;
UFCON0 = 0x0;
ULCON0 = 0x03;
UCON0 = 0x245;
UBRDIV0 = divisor;
我在这方面算术不好,所以都是参考人家的。
3
)好,再加上个头文件:
cd u-boot-1.1.2/include/configs
cp B2.h myboards3c44b0.h
这个头文件其实要改的地方还挺多的,我等下再说怎样修改。先回到
u-boot.1.1.2
目录,
4
)在
Makefile
里面加上这部分,不会的话就模仿
B2
来写吧
^_^
在
B2
的这部分文件
B2_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave
后面加上这部分:
myboards3c44b0_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard
切记在
@./mkconfig $(@:_config=) arm s3c44b0 myboard3c44b0 myboard
前面的是
Tab
来的,万万不能用空格代替,因为它是靠这个来识别命令的!
5
)好,现在可以在
u-boot-1.1.2
目录下执行如下命令:
Make distclean
(还是用这个吧,比较彻底)
Make myboards3c44b0_config
Make
看看有没有错,有错的话按着提示来改,如果没错的话应该就能生成
u-boot.bin
这个文件,现在还不能用哦,因为这几是
B2
的一个仿制品而已(注:在我的机上到这一步可没有报错哦,你一步步按着来做的话应该也不会有什么错误吧
^_^
)。
6
)好,现在继续修改
u-boot-1.1.2/include/configs/myboards3c44b0.h
这个文件。
#define CONFIG_INIT_CRITICAL 1 这个在
cpu/s3c44b0/start.S里面用到,如果你的
u-boot
程序不是在
sdram
中调试而是固化到
flash
中运行的话,这个必不可少。
找到
#define CONFIG_B2 1
把
B2
改成
myboards3c44b0
吧(不然就不会编译你的板了)
找到
#define CONFIG_S3C44B0_CLOCK_SPEED 75
你的
44b0x
应该没有
75M吧
我的是改成
60
的
找到
Size of malloc() pool
这部分设置,改成这样吧,反正我是照着人家来做的,你自己研究下吧
^_^
。
#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Monitor */
#define CFG_ENV_SIZE (64*1024) /* 1024 bytes may be used for env vars*/
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024 )
#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
#define CFG_ENV_IS_IN_FLASH 1 这个必不可少,如果你想把你的参数保存到flash
的话(有些板是保存到
EEPRAM
中去的,但是
s3c44b0
的话还是保存到
flash
吧)
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x40000) 这个就是你的参数保存在
flash里的起始地址了
#define CFG_ENV_OFFSET0x40000
这个我后来看它源程序发现如果你上一步没有设置它的起始地址的话就会用它来作默认地址的了
#define CONFIG_AUTO_COMPLETE
其它地方没有深究哦,有些好像不要也行,你就试试吧。
找到
Hardware drivers
部分,这应该是网络芯片设置吧,参考一下这个吧(要看芯片的):
#define CONFIG_DRIVER_RTL8019 这个就要看你的板上用的是什么网卡了(这个是台湾出的,有
10M
)
#define RTL8019_BASE 0x06000000
这个是网卡相就寄存器的起始地址
以下部分我试过不要也行,你试下吧
#define RTL8019_BUS32 0
#define CONFIG_SMC_USE_16_BIT
#undef CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT 10 应该是重试的次数吧
#define CONFIG_BAUDRATE 115200 设置波特率
#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \
CFG_CMD_DATE | \
CFG_CMD_ELF | \
CFG_CMD_NET | \
CFG_CMD_EEPROM | \
CFG_CMD_I2C | \
CFG_CMD_FAT | \
CFG_CMD_JFFS2)
把
CFG_CMD_EEPROM
改成
CFG_CMD_FLASH
吧,虽然不改也是可以的,具体没考究。
以下是板上
env
参数设置,看一下吧,其实我觉得了解一下就行的了,只是一些初始设置值,以后可以用命令
setenv saveenv
来修改的。
#define CONFIG_BOOTDELAY 3 这个就是运行
bootcmd
之前的等待时间
#define CONFIG_BOOTARGS "devfs=mount root=ramfs console=ttyS0,115200" 引导
uClinux
的时候传递的参数,不会就先不用管它也行。
#define CONFIG_ETHADDR 00:50:c2:1e:af:fb 网卡的物理地址
MAC
#define CONFIG_NETMASK 255.255.255.0 掩码地址,设置过
ip
的人都应该知道吧
#define CONFIG_IPADDR 192.168.0.30 这是你板上网卡
8019
的
ip
地址
#define CONFIG_SERVERIP 192.168.0.10 这是你宿主机的
ip
地址,以后用
tftp
下载的时候用到,一定要跟你的宿主机一致才行。
#define CONFIG_BOOTFILE "u-boot.bin" 这个就是你要下载文件的默认名字
#define CONFIG_BOOTCOMMAND "bootm 0x50000" 这是
bootdelay
后运行的命令
Miscellaneous configurable options
部分,参考一下吧:
#define CFG_LONGHELP /* undef to save memory */
#define CFG_PROMPT "s3c44b0=>" 这是进入命令模式下的提示符,改个帅一点的吧
#define CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */
#define CFG_MAXARGS 100 /* max number of command args */
#define CFG_BARGSIZE CFG_CBSIZE/* Boot Argument Buffer Size */
#define CFG_MEMTEST_START 0x0C400000 /* memtest works on */
#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM */
#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
#define CFG_LOAD_ADDR 0x0c008000 默认的下载地址
#define CFG_HZ 1000 /* 1 kHz */
#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } 可供选择的波特率
Physical Memory Map
部分,比较重要,修改你的
sdram
和
flash
的地址和容量。
#define CONFIG_NR_DRAM_BANKS1 我们只占用了一个
Bank
用来映射
sdram
#define PHYS_SDRAM_1 0x0c000000 sdram
的起始地址
#define PHYS_SDRAM_1_SIZE 0x00800000 sdram
的容量(
8M
)
#define PHYS_FLASH_1 0x00000000 flash
的起始地址
#define PHYS_FLASH_SIZE flash
的容量(
2M
)
#define CFG_FLASH_BASE PHYS_FLASH_1 定义多个名字而已,其它地方会用到
FLASH organization
部分,看注释应该知道了吧,参考一下:
#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms) */
#define CFG_FLASH_WRITE_TOUT 4000 /* Timeout for Flash Write (in ms) */
按着来一步步的做应该不难,这里提一下
vi
程序的用法,其实在
google
一搜就找到了,不过为了方便大家,还是说一声吧,
在命令模式下:
按
/ xxx
再回车即可搜索到你所需要的内容(
xxx
),再按
n
搜索下一个,按
shift+n
搜索上一个
按
:
xxx
即可跟到你想要的行
按
:
set nu
显示行号
其它查书都可以找到就不说了。
做到这个时候,你可以再编译一下,看有没有错,这一步我就没有帮你们做了,不过我觉得应该不会有问题吧,下载到
ram
中运行,看看效果。
7
)终于到了
flash
的设置部分了,这完全是我个人悟出来的,网上资料好像讲得不是先清楚。
首先介绍一下
flash
的识别吧,每块
flash
都有一个
id
,前部分用来说明生产厂家,后部分用来说明它的容量,类型,位数等。它们的定义是在
u-boot-1.1.2/include/flash.h中,就以我的
ssts9vf1601
为例:
#define SST_MANUFACT 0x00BF00BF 这是生产厂家
id
#define SST_ID_xF1601 0x234B234B 这是它的型号,容量,位数等
id
#define FLASH_SST160A 0x0046 这个我还说不清楚,有个要注意的问题是像
sst160
是不能用奇地址的,我做的过程中是把
SST160A
改成
SST1601
的,懒得帮它创一个
好了,相信你已经找到你的板上所用的
flash
对应的
id
号了吧?现在就来谈谈怎么改。
先进入
u-boot-1.1.2/board/myboards3c44b0/common/flash.c
它里面已经帮
SST160A
设置好了,我的做法是把
SST
公司的
160A
都改成
1601
,是不是很简单,当然你也可以帮
1601
再写一分,但是我是个懒人,所以我就样做了
^_^
到这里还有个问题没提到的,就是如果你重新用
setenv saveenv
设置了参数,但是复位后会发现怎么没有保存到的(不信你试试看)。其实我是故意留到这里讲的,应该它不会报错,可以说是比较隐秘的问题,所以我故意放到这里来说,以引起你的重视。
解决方法:
vi u-boot-1.1.2/board/myboard/common/flash.c
找到这个函数:
write_buff
里面有这句话:
#ifdef CONFIG_B2
要把
B2
改了,因为我们的板不叫
B2
,那叫什么呢?原来是在这里定义的:u-boot-1.1.2/include/configs/myboards3c44b0.h
里面有这句话:
#define CONFIG_HFRK 你不喜欢
HFRK
这个名字也行,可以改成别的名字,只不过相应地前面的
B2
也要改成这个名字而已。
4.
后记:
本来是想刚做好的时候写的,但是后来发现有些功能实现不了,所以就停住了笔,等我搞好了以后,又急着去学习
uClinux
的移植,真的很忙,现在终于抽空把它写完。虽然有些地方还没说清楚(毕竟我对它的了解还不是很深,但我相信在我以后移植系统的过程中会逐步加深对它的了解),我还是希望它能成为最详尽的
u-boot
移植新手指导,对
u-boot
移植的初学者起到实质性的作用,这样就不枉我花了这么多的心思来写这个文档。
参考资料:
http://blog.21ic.com/more.asp?name=sockit&id=8509
我所认为的最有奉献精神,写得最详细的记录,在此表示我深深的敬意!
(2) 开始
由于没有接触过u-boot,因此第一步要做的就是google一些资料.
u-boot官方网站:http://sourceforge.net/projects/u-boot(比较慢)
http://u-boot.sourceforge.net/这个快一些.
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网站是:
http://www.dave-tech.it
,初初看了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启动代码分析 "
http://www.linuxfans.org/nuke/modules.php?name=News&file=print&sid=2765
里面介绍了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 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) 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:::::eth0:off 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
ip=192.168.1.100:::::eth0:off 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 0c0dfc08
In: serial
Out: serial
Err: serial
rtl8019 MAC: 2a:2a:2a:2a:2a:2a
Hit any key to stop autoboot: 0
=>
正
常!因此最好是用arm-elf编译.
我在看网上查资料时记得有人说过"用arm-linux编译时,malloc返回0,而改成arm-elf编译时就好了".有个印象,具体帖子不记得在哪
里了.所以后来我就一直使用arm-elf编译,没有再去试arm-linux编译.
(12) 网卡调试
剩下来的事情就是调网络了.根据上面配置rtl8019as后,网络仍然不同,然后参考uclinux驱动中的寄存器定义修改,网络就可以了.具体修改是:
drivers/rtl8019.h
36 #define ETH_ADDR_SFT (8)
37 #define EI_SHIFT(x) ((x) tftpboot
eth_init...00:50:c2:1e:af:fb
TFTP from server 192.168.1.25; our IP address is 192.168.1.100
Filename 'image.bin'.
Load address: 0xc008000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
###############################
死机!
原因是我们现在的u-boot入口地址是C100000,而uclinux内核大约2M,因此load过来就冲突了.因此我们把u-boot的入口地址改成C300000,具体修改在board/wx/wx20/config.mk:
TEXT_BASE = 0x0C300000
重新编译运行就可以了.
(14) 设置自动运行uclinux
刚才我们是用命令load uclinux并执行的.自动运行需要设置bootcmd环境变量:
=> setenv bootcmd "tftpboot; go 0xc008000" ==》设置错误
## Starting application at 0x0C008000 ...
=> setenv bootcmd "tftpboot\; go 0xc008000" ==》需要有个\
=> saveenv
重新开机运行u-boot:
Hit any key to stop autoboot: 0
Unknown command '"tftpboot' - try 'help'
## Starting application at 0x0C008000 ...
结果还是不能自动下载uclinux和运行.经过调试才发现在设置bootcmd时多加了引号造成的!正确的设法是:
=> setenv bootcmd tftpboot \; go 0xc008000 ==》正确的设置
此时可以成功自动下载uclinux和运行了.
(15) flash运行
刻录到flash后,运行uclinux出现问题,运行到:uclinux 开中断后就死机,提示:
Linux version 2.4.24-uc0 (root@samfei) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux
XIP and shared lib patches from
http://www.snapgear.com/))
#46 Áù 7ÔÂ 2 15:52:55 CST 2005
Processor: Samsung S3C44B0X revision 0
Architecture: S3C44B0X
On node 0 totalpages: 2048
zone(0): 0 pages.
zone(1): 2048 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/rom0 init=/linuxrc
前
面一直用armsys的bootloader,将u-boot下载到0xc300000运行,然后再load
linux到0xc0080000运行,正常.而将u-boot刻录到flash后运行不正常,经过调试uclinux,到init/main.c中
sti()函数后出现死机.因此怀疑中断向量设置问题.
将cpu/s3c44b0/start.S中代码修改成;
40 .globl _start
41 _start: b reset
42 /*
43 add pc, pc, #0x0c000000
44 add pc, pc, #0x0c000000
45 add pc, pc, #0x0c000000
46 add pc, pc, #0x0c000000
47 add pc, pc, #0x0c000000
48 add pc, pc, #0x0c000000
49 add pc, pc, #0x0c000000
50 */
51 LDR PC, Undefined_Addr
52 LDR PC, SWI_Addr
53 LDR PC, Prefetch_Addr
54 LDR PC, Abort_Addr
55 LDR PC,RESERVE_Addr
56 LDR PC, IRQ_Addr
57 /* subs pc,lr,#4*/
58 LDR PC, IRQ_Addr
59 /* subs pc,lr,#4*/
114 Undefined_Addr:
115 .word 0x0c000004
116 SWI_Addr:
117 .word 0x0c000008
118 Prefetch_Addr:
119 .word 0x0c00000C
120 Abort_Addr:
121 .word 0x0c000010
122 RESERVE_Addr:
123 .word 0x0c000014
124 IRQ_Addr:
125 .word 0x0c000018
126 FIQ_Addr:
127 .word 0x0c00001C
128
129 /*
130 * the actual reset code
131 */
132
133 reset:
后编译,刻录,然后运行.正常了!!!
(16) 补丁制作和测试
[root@samfei u-boot]# make distclean
[root@samfei 44b0]# mv u-boot u-boot.wx
[root@samfei 44b0]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
Logging in to
![]()
server:anonymous@cvs.sourceforge.net:2401/cvsroot/u-boot
CVS password:
[root@samfei 44b0]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot
cvs checkout: Updating u-boot
U u-boot/CHANGELOG
U u-boot/COPYING
U u-boot/CREDITS
U u-boot/MAINTAINERS
。。。。。。
[root@samfei 44b0]# diff -Naur u-boot u-boot.wx > uboot-wx-20050703.patch
[root@samfei 44b0]# vi uboot-wx-20050703.patch
去掉没有用的文件.做补丁的好处就是自己可以很清楚的知道哪些文件修改了!做完了,别忘了测试一下.
[root@samfei 44b0]# cd u-boot
[root@samfei u-boot]# patch -p1
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/45211/showart_403849.html |
|