|
转载请注明原作者:[email protected]
本文参考了两篇文章
一篇是shang79的HelloWorld on Skyeye,这是一篇很好的供初学者入门的文章,地址为
http://www.linuxfans.org/nuke/mo ... ewtopic&t=82187
另一篇是hhq0216关于在skyeye下仿真2410开发板上运行u-boot的文章,地址为
http://www.linuxfans.org/nuke/mo ... 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发送缓冲区寄存器。
从结果来看,实验完全成功。 |
|