From: http://blog.csdn.net/linuxaxis/article/details/8769722html
好吧,折腾了两三个星期,USB的问题没搞定,看来功夫还不到家,看了下efuse中有不少的位能够配置相关的参数,linux
也许智器在那里面作了不少的工做,使我一直都不能有所突破,这个问题暂时就放放吧,之后有时间再来研究研究。android
其实话又说回来,国内的公司仍是真垃圾,自己就是用开源的东西,不开源就算了,还搞这么多恶心的东西,真垃圾...测试
以前说的一块儿作这个事情的哥们也一直不见动静,看来只有本身来作了。这样的话,不得不修改策略,先用最少的spa
时间,最少的资源,最快的速度完成最主要的功能。干脆底层的驱动就用现成的kernel镜像了,把主要精力放在上层功能.net
的修改和定制上吧。若是要用原始的android源码,必需要能用x7的kernel启动android系统,这中间就有不少的问题须要code
处理了,也就是清明三天+今天全部作的工做。htm
智器仍是很恶心的,把andriod的ramdisk的原始目录静态编译到zImage中,这样就很难把这个initramfs剔除出来。blog
一开始想了不少的启动配置参数来修改启动的路径,可否绕过initramfs,从而从sd卡启动android系统,结果不行,主要ip
测试了以下的相关启动参数:
rdinit, 一开始发现这个参数感受一阵惊喜,觉得有所突破。将这个值设置为:rdinit=/init1,这样,若是在ramdisk中找不到
init1的话,就跳出ramdisk启动,走其余的路径,经过设置root=/dev/mmcblk1p2来修改root的路径,结果不行。一样,还有
其余的不少,如:rootfstype=ext4, rootdelay=5, noinitrd等等,结果都没有任何效果,因而就放弃了这条路。
因而就把更多的精力放在了如何把编译到zImage中的initramfs剔除出来,或者换成我从android源码里面编译出来的root.
结果,在苦思冥想了好几天,再加今天上班时候的灵感触发,和今天下班回家以后,老婆作的饭香熏陶下,终于成功了,小小
兴奋了一阵。流程以下:
1:从uImage中提取zImage
dd if=uImage of=zImage bs=64 skip=1
这步以后,就获得了没有uboot头得zImage镜像
2:从zImage中提取没有解压缩的头程序
先将zImage dump成十六进制的文本显示:
hexdump -C zImage > zImage.txt
在这个文本文件中,能够看到一个LZO的字符,这个是lzo压缩文件的头标识符。其实内核也就支持了那几种压缩格式,我也是
一个个的对出来的,没有什么好办法。
只要从这个头开始,后面的数据就是linux Image用lzo压缩的数据。好提取从.lzo开始的部分
dd if=zImage of=Image.lzo bs=6212 skip=1
3: 获得Image
lzop -d Image.lzo -o Image
这个Image就是不包含解压的程序,原始的Linux编译的二进制结果
4: 找到image中的initramfs的起点和终点
这个能够看原始的linux编译出来的initramfs_data.cpio,把这个文件dump出来,能够看到cpio问题的头和结束的标识符。
kernel作出来的cpio文件头和尾标识,根据这两个特色,就能在image中直接找到哪一个区间段是initramfs了。其实这是没有压缩的initramfs的特色,若是是压缩了的话,
就根据压缩格式所用问的标识符。智器之因此以前zImage用lzo格式的压缩,以及在这里的initramfs不用压缩,还有不少不少别的,一切的一切只是为了加快开机时间,
其实这块他们仍是作了挺多工做的。
对于 这个文件提取,我用了下面两步,获得两个文件:
dd if=image bs=141392 of=new/head count=1
dd if=image of=new/end bs=472144 skip=1
head为initramfs以前的image镜像,end为initramfs以后的image镜像。
这里有点要补充的是:kernel的cpio文件的大小是512对齐的。
5:获得与原始zImage中initramfs等大小的ramdisk文件
根据第四点中相关的信息 获得原始zImage中的initramfs大小为:330752字节,
将android编译出来的root设置到Linux的INITRAMFS_SOURCE中,编译,将会生成一个initramfs_data.cpio文件,
我这里的到得这个文件大小为:292352字节,利用这个文件来制做一个与以前在zimage中的initramfs等大的initramfs:
dd if=/dev/zeor of=pad bs=512 count=75
cat initramfs_data.cpio > panda.ramdisk
cat pad >> panda.ramdisk
这样就获得了一个能够用的ramdisk了,
6:从新生成Image
cat head > new_image
cat panda.ramdisk >> new_image
cat end >> new_image
7: 制做u-Image
mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n linux-2.6.13 -d new_image u_image
这样,就能够经过uboot将u_image拷贝到内存中,再经过bootm来启动。其实,new_image也能够直接启动了,只是uboot的
参数没法传递了。
地址的选择:这时用的地址已经不是平时作uImage的地址了,这个地址是一个绝对地址,不在须要作任何拷贝动做,CPU直接跳转
到这个地址直接执行内核代码,不须要搬移,不须要解压。这个地址能够在arch/arm/mach-oma2/Makefile.boot中找到。对于咱们
从SD卡拷贝到内存中的地址选择能够是任意的。
以前遇到一个比较想固然的错误,觉得把initramfs从image中去掉,就能够直接当成一个没有编译进initramfs那样直接能够启动
的镜像,结果倒是在启动的时候没有任何反应,今天研究了下相关的代码才有所领悟:
initrafs_data.S