完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 江口kk 于 2014-8-12 22:43 编辑
转一个贴子,让UBOOT爱好者能了解一下. Cubieboard开发环境与Uboot的SD启动卡制作 拿到Cubieboard已经1周多了,平时上班比较忙,只能晚上玩一会,年关将近,周末都要加班呀.... 拿到一个板,若只刷别人给的Image学不到太多东西,于是自己一点一点来 首先是Uboot 移植,所谓移植,其实别人都做好了,我只不过是做了一个启动卡 系统环境:电脑二台,台式机XP;笔记本RHEL5,平时就用这个,懒得整ubuntu 代码工具:XP上: Source Insight 3.5 RHEL5上: Vim,编译工具链ARM-2009q3,这个应该有更高版本;串口工具minicom,我的版本是2.1 资源: 支持Cubieboard的U-boot下载网址:https://github.com/linux-sunxi/u-boot-sunxi ,我直接从网页按zip格式下载到XP下 制作方法参考网站:https://github.com/linux-sunxi/u-boot-sunxi/wiki 硬件: 串口线,淘宝Cubieboard自带USB串口线,RHEL5下不用装驱动就能使用,XP下可以用驱动精灵自动安装 microSD卡一枚,2G,读卡器一只,华强北出品,居然比淘宝贵... 开工: 首先观察Cubiebord预装的U-Boot,设置好minicom(具体方法请自己百度),连接串口(使用淘宝配的线),连线顺序如下图: 黑色 ---- GND 绿色 ---- RX 白色 ---- TX 将串口USB端插入笔记本,打开终端输入命令“minicom”,启动minicom之后,再将电源线插入笔记本USB,启动过程中按键盘任意键,进入U-boot,可以看到: HELLO! BOOT0 is starting! boot0 version : 1.5.1 dram size =1024 Succeed in opening nand flash. Succeed in reading Boot1 file head. The size of Boot1 is 0x0003c000. The file stored in 0X00000000 of block 2 is perfect. Check is correct. Ready to disable icache. Succeed in loading Boot1. //第1阶段bootloader Jump to Boot1. [ 0.133] boot1 version : 1.4.0 [ 0.133] pmu type = 3 [ 0.135] bat vol = 0 [ 0.161] axi:ahb:apb=3:2:2 [ 0.161] set dcdc2=1400, clock=1008 successed [ 0.163] key [ 0.175] no key found [ 0.175] flash init start [ 0.227] flash init finish [ 0.228] fs init ok [ 0.229] fattype FAT16 [ 0.229] fs mount ok [ 0.236] script finish [ 0.238] power finish [ 0.245] BootMain start [ 0.245] 0 [ 0.264] key value = 0 [ 0.264] recovery key high 6, low 4 [ 0.265] unable to find fastboot_key key_max value [ 0.274] test for multi os boot with display [ 0.275] show pic finish [ 0.278] load kernel start [ 0.302] load kernel successed [ 0.302] start address = 0x4a00000 U-Boot 2011.09-rc1 (Nov 26 2012 - 14:01:52) Allwinner Technology //第2阶段bootloader CPU: SUNXI Family Board: A10-EVB DRAM: 512 MiB NAND: 3776 MiB In: serial Out: serial Err: serial --------fastboot partitions-------- -total partitions:11- -name- -start- -size- bootloader : 1000000 1000000 env : 2000000 1000000 boot : 3000000 2000000 system : 5000000 14000000 data : 19000000 20000000 misc : 39000000 1000000 recovery : 3a000000 2000000 cache : 3c000000 8000000 private : 44000000 1000000 sysrecovery : 45000000 14000000 UDISK : 59000000 93000000 ----------------------------------- Hit any key to stop autoboot: 0 sunxi# 输入命令 version,可以看到: sunxi#version U-Boot 2011.09-rc1 (Nov 26 2012 - 14:01:52) Allwinner Technology arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2010.09-50) 4.5.1 GNU ld (Sourcery G++ Lite 2010.09-50) 2.20.51.20100809 sunxi# 使用的编译器是arm-none-linux-gnueabi-gcc,版本4.5.1,但是俺的是4.3.2版本,为此我费了了老大劲,换成4.4.1时才编译成功 有了上面的基本情况,开始编译制作,在XP下解压下载的u-boot-sunxi-sunxi.zip,删除board文件夹下除了allwinner文件的其他文件,board/allwinner文件夹内只需要保留common和Cubieboard两个文件夹,其他不需要;删除arch文件夹内除了arm文件的其他文件,arch/arm/cpu文件夹下只保留armv7和u-boot.lds,arch/arm/cpu/armv7内文件和sunxi文件夹保留,其他文件夹删除。这样做可以在Source Insight关联时减少关联项目,便于查阅,若还想更进一步,将include目录下与A10无关的头文件一并删除,关联时更加清晰。使用Source Insight 3.5建立一个工程,添加文件时选择u-boot解压文件夹,选择“add tree”,将全部文件加入工程,再选Project->Rebuilt Project...,如此一来,XP下的代码查阅工程就建立啦。 linux下解压U-boot到自己工作目录,不需要删除操作。 安装arm-2009q3.tar.bz2,在arm-2009q3.tar.bz2目录下输入命令:tar -jxvf arm-2009q3.tar.bz2 -C /usr/local/arm/ 将编译器设置为默认arm编译器: vim /etc/profile 在末尾增加一行: export=$PATH:/usr/local/arm/arm-2009q3/bin 保存退出之后执行:source /etc/profile 或者重启,或者logoout一下,使设置生效。以上设置适合RHEL5,其他linux系统请百度解决。 编译U-boot: make cubieboard CROSS_COMPILE=arm-none-linux-gnueabi- 等待......... 生成三个.bin文件,分别是u-boot.bin和spl目录下的sunxi-spl.bin、u-boot-spl.bin 第1阶段bootloader:sunxi-spl.bin 第2阶段bootloader:u-boot.bin u-boot-spl.bin我没试过,应该也是第一阶段的bootloader SD卡准备(我机器上是/dev/sdb),linux下操作: 前面1M给bootloader使用(为什么?要仔细查查资料,目前我还不明白,望高人指点),先清零: dd if=/dev/zero of=/dev/sdb bs=1M count=1 后面剩余的可以不管,也可分区,具体做法请百度 将u-boot写入,只写入第1阶段bootloader,在u-boot目录操作: dd if=spl/sunxi-spl.bin of=/dev/sdb bs=1024 seek=8 取下SD卡,插到板子上,上电,minicom有输出如下: U-Boot SPL 2012.10 (Jan 23 2013 - 21:18:42) DRAM: 1024MB SUNXI SD/MMC : 0 U-Boot SPL 2012.10 (Jan 23 2013 - 21:18:42) 然后就死掉了,那是因为没有写入第2阶段,即u-boot.bin。 从这一段输出,可以获得一些有用的信息,从打印信息入手,以便获取u-boot第一阶段代码运行轨迹。比较有特征的是“SUNXI SD/MMC”,在XP工程中搜索“SUNXI SD”(有斜杠就搜索不到,不知道为啥),可以定位到文件到..driversmmcsunxi_mmc.C的函数int sunxi_mmc_init(int sdc_no); 同样搜索“sunxi_mmc_init”.....最后得出调用关系如下,注意代码片段红色部分: 文件..u-boot-sunxi-sunxiarcharmcpuarmv7 start.S, 调用函数 board_init_f : ...... /* Set stackpointer in internal RAM to call board_init_f */ call_board_init_f: ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ ldr r0,=0x00000000 bl board_init_f //..u-boot-sunxi-sunxiarcharmlibboard.c ...... ..u-boot-sunxi-sunxiarcharmlibboard.c文件的board_init_f对全局变量gd进行设置 void board_init_f(ulong bootflag) { bd_t *bd; init_fnc_t **init_fnc_ptr; gd_t *id; ulong addr, addr_sp; #ifdef CONFIG_PRAM ulong reg; #endif bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_F, "board_init_f"); /* Pointer is writable since we allocated a register for it */ gd = (gd_t *) ((CONFIG_SYS_INIT_SP_ADDR) & ~0x07); |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 10:56 , Processed in 0.661206 second(s), Total 62, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号