yuanlii 发表于 2007-6-29 08:30:56

在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发送缓冲区寄存器。
    从结果来看,实验完全成功。

RogueBear 发表于 2007-8-20 16:59:14

顶 ! 不过lz连接的两篇文章已经消失了...

beyondany 发表于 2007-11-2 16:46:38

好贴!
按此方法成功!

hover_sky 发表于 2007-12-28 23:50:02

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

thx02334 发表于 2008-12-11 10:44:47

我在 make hello4world 时 显示 arm-linux-gcccannot found?
这是什么原因啊? 我安装 交叉编译器了。谢谢了!

codefish 发表于 2009-9-16 20:46:46

我不用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 编辑 ]

ksh 发表于 2009-9-17 15:18:17

可以做的更复杂一点,比如添加一个 timer的驱动到这个例子里面,在timer的中断处理函数中打印 hello, 然后前台死循环打印world

codefish 发表于 2009-9-18 15:50:00

关于2410的初始化设置,还没有研究,相关的寄存器设置和开关中断都还没找相关的资料。至于串口发送,从51到44b0都做过,原理都是一样的。

现在倒是对0x33f00000,这个地址很感兴趣,不知道2410的存储管理是怎么样的,我尝试使用0x40000000也是可以的,但是地址太大或者太小 就不可以了。还请高手解释下。THX
页: [1]
查看完整版本: 在skyeye模拟的2410开发板上使用u-boot引导Hello4Skyeye