uboot->eboot->NK.bin

本文详细阐述了在s5pv210平台上,uboot引导eboot过程中遇到的内存配置问题及解决方法。重点在于理解uboot与eboot的环境配置差异,尤其是MMU的开关状态对内存访问的影响。通过调整内存映射和关闭MMU,最终实现了eboot的正常加载。同时,文章还讨论了双系统环境下,如何实现android和wince系统的共享以及如何避免互斥启动的问题。
摘要由CSDN通过智能技术生成

最近在s5pv210平台上,尝试uboot去引导eboot,然后由eboot加载内核镜像NK(xip.bin)。


储备知识: samsung 平台上电启动到执行uboot的流程;uboot的流程;


        关于s5pv210 CPU上电启动,《S5PV210_iROM_ApplicationNote_Preliminary_20091126》讲了IROM如何引导bootloader的过程。

        按照三星《S5PV210_UM_REV1.1》手册上说明的启动流程,S5PV210上电将从IROM处执行固化的启动代码,对时钟等初始化、对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(0xd002_0000处,其中0xd002_0010之前的16个字节储存的BL1的校验信息和BL1尺寸)中,并对BL1进行校验,校验OK转入BL1进行执行;BL1继续初始化,并将BL2复制到IRAM中并对其校验,OK后转入BL2;BL2则要进行比较复杂的初始化,包括DRAM的初始化,完成后将OS代码复制到DRAM中,并转入到OS中执行并完成启动引导。

        但是,上述的IRAM只有96K大小,对于日益复杂的uboot来说,肯定是不够的,所以使用UBOOT启动引导的时候,也没全按三星手册上说的执行,具体如下:     
        首先解释一下我认为的BL0、BL1、BL2:
        BL0:是指S5PV210的IROM中固化的启动代码;
        BL1:是指在IRAM中执行的UBOOT的部分代码;
        BL2:是指在内存中执行的的UBOOT的完整代码;

参考http://blog.csdn.net/s5pv210_devboard/article/details/7936405; 这是tiny210的。 s5pv210平台的详细过程参考uboot源码,

第一阶段的代码看下/board/samsung/***/u-boot.lds的文本段就可以知道拉。


        uboot启动流程,网上资料一大堆。这里不在赘述。


======  wince6.0启动

        wince开发经验为零。wince启动流程大概只知道其大概,主要参考《SMDKV210_WinCE60_BSP_InstallationGuide》

stepldr.nb0:由IROM加载到SRAM中,主要初始化硬件,加载eboot。  类似uboot的BL1.

eboot.nb0: 也会初始化些;加载OS镜像,boot image...

bootimage.nb0:  stepldr + eboot

OS iamge: single-XIP  multiple-XIP   这个其实不用我们知道啦。我的工作只负责引导eboot,让eboot正常工作就ok。


调试过程:

1,wince文件:boot.nb0  logo.bmp xip.bin

       boot.nb0就是上述的bootimage.nb0, 我引导的是eboot,所以要知道boot.nb0的分布: 0x32 sector stepldr + 0x400 sector eboot.

.nb0文件是data文件,可直接在内存中运行。

2,   确定uboot,eboot在各自的系统环境下能够单独的正常工作。

3,确定eboot加载的内存地址:0x47700000, 大小0x8000(0x400 * 512); 物理地址。

       uboot下载模式下,可以通过movi read eboot 47700000 8000从sd/mmc设备中读取 到内存;也可fatload mmc 0:1 47700000 eboot来实现,从sd卡vfat分区中将eboot文件搬到内存。

       头疼的开始啦。 思路很清晰,也很简单。 当信誓旦旦go 47700000时,发现啥log都没有。

悲剧了...  期间各种不懂,各种调试,各种失望阿...  现总结下:

        1)要花时间了解uboot的第一阶段,特别汇编部分代码。  u-boot.lds 发起, cpu/s5pc11x/start.S -> 

./lib_arm/board.c:start_armboot() 的详细过程。 硬件初始化:I/D cache、MMU、DDR、PLL...

      2)学会调试手段。虽然条件有限,但是要学会创造条件...

       

       首先,确保PC指针指向了0x47700000处,搬移到该处的内容是不是正确的。

        run_command搬移指令流程中,最基本的打印出搬移后0x47700000出的内容;和eboot源数据比较。 由于没有硬件仿真器,跟踪不了PC指针,CPSR等ARM寄存器的值;用了点灯法,跳转eboot后,控制GPIO口输出跟踪代码执行。 <uboot中能有啥方法打印trace,跟踪PC呢?>

       发现,点灯法没效果;串口仍然没有打印(anroid,wince的uart debuger相同,也初始化了串口)。那原因估计是uboot和eboot的环境配置不同。  查吧 ...  这个首先要做好1)部分 工作。做此工作时参考链接的一些思路和方向 http://social.msdn.microsoft.com/Forums/en-US/winembplatdev/thread/4810a3c0-4362-46a8-b57b-80e12ca8ba9d          

值得一提的是,期间怀疑的地方很多(DDR,mmu,PLL,power...)在修改时,组合的可能性太多了。这种“愚蠢”的不停尝试行为,为无经验和技术不扎实买了单了。 这看似体力劳动的行为成了最好的办法;每次看到没有log,失望;但总感觉离成功不远。

        就这样,一直比较wince bootloader中 stepldr和uboot的环境配置有何区别。后来... 剩下的也只有成功引导eboot了。

原因: 

          uboot中必须要关闭MMU; 虽然之前搬移的0x47700000是物理地址。 eboot中,重新开启MMU,它的内存映射不同uboot了。

为什么?http://blog.csdn.net/xxblinux/article/details/6281295 看了这个能懂些。MMU即使打开,但要确保虚拟地址映射的物理地址和0x47700000内存的物理地址一致!

屏蔽include/configs/smdkv210single_wincalcd_android.h   //#define CONFIG_ENABLE_MMU

还要注意 board/samsung/wicalcd/config.mk 文件里 TEXT_BASE = 0xC3e00000 
0xC开始表示是虚地址,如果关掉了MMU要改成 0x2 开始,在顶层目录Makefile中将c3e00000改成23e00000即可。
因为uboot会用这个地址和pc寄存器比较,如果不匹配,就拷贝程序到SDRAM,如果匹配就跑程序。


         既然是双系统,关闭MMU的uboot又要能够引导android的kernel。笔者认为在uboot开启MMU没啥作用,在以后内核中会重新初始化MMU的 http://celinux.wikidot.com/linuxboot            在uboot代码中将虚拟地址对应改成物理地址。

#define CONFIG_BOOTCOMMAND"movi read kernel C0008000; movi read rootfs 20A00000 180000; bootm C0008000 20A00000"

中的C0008000改成20008000;  同样,对于recovery模式,改成“fatload mmc 2:1 20008000 zImage ” "bootm 20008000"


         eboot引导xip.bin:

    需求: 

1,wince kernel会把其image之后的inand空间当作用户空间,重新格式化成FAT32,这样下次启动后android系统启动不了了。

2,要实现android,wince共享inand的hard-disk分区。

      android: vfat; wince: fat32 (fat32兼容vfat文件系统)


         双系统镜像在iNand中的分布:

init_raw_area_table:  1block = 512Byte

                 开始(块为单位)    大小(块)            名称
image[0]:   -  -                       eFuse
image[1]:   1  8KB(16)            BL1
image[2]:   17  16KB(32)          ENV
image[3]:   49  512KB(1024)    BL2
image[4]:   1073  4MB(8192)       Kernel
image[5]:   9265  26MB(53248)   RFS
image[6]:   62513  xMB()               Eboot(wince)

剩下的空间是android的系统分区。






















1、包内包含所需的工具和源文件 2、电脑网线接路由器,设置电脑网口为静态ip:192.168.1.2 子网掩码 255.255.255.0 其余为空 3、断开路由器电源,按住reset键,插上电源,等待10s左右黄色指示灯开始缓慢闪即可松开reset键。 4、电脑浏览器打开192.168.1.1, 出现上传rom页面 5、选择openwrt-r47884-ar71xx-generic-qihoo-c301-flash1-squashfs-factory.bin点击upload 不想装双系统、只想用openwrt的到此OK,可以不往下看了。想装双系统的继续。 6、重启后,打开wincsp软件,打开选择scp,输入主机名192.168.1.1端口默认,用户名 root 密码 admin ,点击登录 7、右侧找到并打开tmp文件夹(注意不是tmp/tmp),把uboot.bin文件复制到这里面。 8、打开putty软件,填上192.168.1.1,login as输入root 9、成功登陆进去后可以看到openwrt字样,这时候输入cd /tmp 10、然后输入 mtd -r write uboot.bin u-boot 路由会在3秒左右失去连接即是刷uboot成功, 11、等十几秒后拔掉电源,按住reset接通电源10秒左右松开,在电脑打开网页192.168.1.1就进入uboot了 12、uboot中选择固件更新”固件“选项点选择文件选择360-301_0.8.3.0.bin,选择并在闪存布局里选择306安全路由C301,点击上传>更新,自动重启,360的固件就刷上去了,192.168.36.1验证一下吧。 13、拔掉电源,老方法进入uboot,uboot中选择固件更新,”固件“选项点选择文件选择openwrt-r47884-ar71xx-generic-qihoo-c301-flash2-squashfs-factory.bin”,”ART“选项点选择文件选择360art.bin,选择并在闪存布局里选择306安全路由C301(第二闪存),刷入openwrt。 14、在uboot中选择启动系统,打开uboot(11老方法进入)在C301设置中选择1或者2点启动,重启即可。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值