在skyeye模拟的2410开发板上使用u-boot引导Hello4Skyeye
转载请注明原作者:[email protected]本文参考了两篇文章
一篇是shang79的HelloWorld on Skyeye,这是一篇很好的供初学者入门的文章,地址为
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=82187
另一篇是hhq0216关于在skyeye下仿真2410开发板上运行u-boot的文章,地址为
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=173591&postdays=0&postorder=asc&highlight=u-boot&start=15
一. 安装skyeye
1. 先安装binutils-dev,其中包含skyeye编译用到的bfd.h
2. 直接make,应该就不会报错了
3. 打上skyeye_mach_s3c2410x.patch,这个patch是针对哪个版本的skyeye的我没有仔细考察,
如果熟悉patch文件格式的话可根据实际情况手工修改
这个patch主要是添加了几个寄存器的定义和操作。
如果不打的话,没有太大问题,只是后边会有几个ERROR看上去不是很舒服。
4. 再make
5. cd ~/local/bin
ln -s ~/skyeye/src/skyeye_1_2_2_Rel/binary/skyeye skyeye,便于以后执行
6. 此时可解压原版的Hello4Skyeye试验一下
二. 安装交叉编译工具
1. mount arm-2004-11-09.iso
2. ./install -d ~/local/eldk
3. 将~/local/bin和~/local/eldk/usr/bin加入PATH中
三. 将Hello4Skyeye从at91修改为s3c2410x
1. 修改源码
begin.S中
注释掉ldr sp, =irq_stack和irq_stack的定义,
在.data段加入
.globl string
string:
.ascii "helloworld"
这里不使用堆栈,而使用全局数据段
hello.c中
加入声明 extern char string;
hellostr赋值改为 char *hellostr = &string;
修改端口地址为 long *paddr = (long *)0x50000020; 这是2410的UTXH0端口地址
hello.lds中
将入口地址改为
. = 0x31000000; 我把它放到了BANK6的有效地址范围内,其实这个地址是任意的。
makefile中
注释掉arm-elf-objdump,arm-elf-readelf和arm-elf-nm
将剩下所有的arm-elf改为arm-linux
在LD下加入
arm-linux-objcopy --gap-file=0xff -O binary hello hello.bin 生成没有elf头的执行文件
2. make
3. 试验一下
skyeye.conf改为是用2410的配置
cpu: arm920t
mach: s3c2410x
mem_bank: map=M, type=RW, addr=0x31000000, size=0x01000000, file=hello.bin, boot=yes
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
执行skyeye应该可以打印出很多helloworld
或者使用如下配置
cpu: arm920t
mach: s3c2410x
mem_bank: map=M, type=RW, addr=0x30000000, size=0x08000000
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
执行skyeye -e hello运行elf格式的执行文件,效果应该是相同的
区别是前者使用skyeye的配置文件将RAW执行文件设置到0x31000000运行
而后者由elf格式的文件信息将相应的段定位到正确的位置再运行
四. u-boot的编译
参照hhq0216的文章修改u-boot-1.1.6/include/configs/smdk2410.h的flash设置相关部分
然后make distclean; make smdk2410_config; make
生成elf格式的u-boot和RAW的u-boot.bin
五. 试验修改的结果
1. 配置文件skyeye.conf
cpu: arm920t
mach: s3c2410x
mem_bank: map=M, type=RW, addr=0x31000000, size=0x01000000, file=hello.bin
mem_bank: map=M, type=RW, addr=0x33f00000, size=0x01000000, file=u-boot.bin, boot=yes
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
2. 运行skyeye
u-boot的信息完成后出现SMDK2410 #的提示符
go 31000000就跳转到hello.bin定位的内存去运行,可以发现这一串串helloworld又冒出来了
结论.
设计这个小实验的主要目的是把bootloader和后端要运行的执行程序结合起来。
同时还能够接触到2410硬件寄存器的操作,虽然只是一个很简单的UART发送缓冲区寄存器。
从结果来看,实验完全成功。 顶 ! 不过lz连接的两篇文章已经消失了... 好贴!
按此方法成功! uboot:http://www.linuxfans.org/bbs/viewthread.php?tid=173591&extra=&highlight=%2Bhhq0216&page=2
helloworld:http://www.linuxfans.org/bbs/thread-82187-1-1.html 我在 make hello4world 时 显示 arm-linux-gcccannot found?
这是什么原因啊? 我安装 交叉编译器了。谢谢了!
我不用u-boot也成功了
我的目的是把HelloWorld不需要u-boot移植到2410上,尝试过几次,发现需要把HelloWorld中的代码作如下修改才能成功运行。skyeye:1.2.8
OS:Fedora 11
1,hello.lds 起始地址为0x33f000000
2,串口地址照本帖子 long* paddr=(long*)0x50000020;
3,skyeye.conf
#skyeye config file sample
cpu: arm920t
mach: s3c2410x
mem_bank: map=M, type=RW, addr=0x33f00000, size=0x01000000
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
使用skyeye -e hello 就可以看到很多很多的helloworld了。
这样一个简单的实验就算完成了。
[ 本帖最后由 codefish 于 2009-9-16 20:53 编辑 ] 可以做的更复杂一点,比如添加一个 timer的驱动到这个例子里面,在timer的中断处理函数中打印 hello, 然后前台死循环打印world 关于2410的初始化设置,还没有研究,相关的寄存器设置和开关中断都还没找相关的资料。至于串口发送,从51到44b0都做过,原理都是一样的。
现在倒是对0x33f00000,这个地址很感兴趣,不知道2410的存储管理是怎么样的,我尝试使用0x40000000也是可以的,但是地址太大或者太小 就不可以了。还请高手解释下。THX
页:
[1]