看到了吧!六根线全部用到了,典型的sd模式。
想想也能理解,sd里面存放的可是咱们的引导程序和操作系统啊!如果采用spi,那速度上说不过去。
硬件攻城狮还不得被嘲笑死了!
知道这个干什么?当然是为了分析sd卡上的文件做准备啊!
那么问题来了,SD卡上到底存放了什么东西呢?
要先知道这个问题,我们看看友善的攻城狮都对我们可怜的小SD干了些什么?
友善的攻城狮在下载好android的镜像后,他们干了这些事:
> tar xzvf android-lollipop-images.tgz-C android
boot.img
system.img
userdata.img
cache.img
partmap.txt
---------------------------------
2ndboot fusing
记录了32+0 的读入
记录了32+0 的写出
16384字节(16 kB)已复制,0.0733637 秒,223 kB/秒
---------------------------------
bootloader fusing
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.0610677 秒,8.4 kB/秒
记录了479+1 的读入
记录了479+1 的写出
245580字节(246 kB)已复制,0.508966 秒,483 kB/秒
---------------------------------
Bootloader image is fused successfully.
---------------------------------
Android filesystem fusing
Image root: ./android
Writing environment to /dev/sdb...
Done
-----------------------------------------------------------------------------
[/dev/sdb] capacity = 7580MB, 7948206080bytes
current /dev/sdb partition:
MBR.0 start : 0x0000100000 size0x0004000000 kB
MBR.1 start : 0x0004100000 size0x00e4654400 kB
-----------------------------------------------------------------------------
parsing ./android/partmap.txt:
part.0flash=mmc,0:2ndboot:2nd:0x200,0x8e00::[RAW]
part.1flash=mmc,0:bootloader:boot:0x8000,0x77000::[RAW]
part.2flash=mmc,0:boot:fat:0x100000,0x4000000:boot.img:[MBR] ./android/boot.img
part.3flash=mmc,0:system:ext4:0x4100000,0x2f200000:system.img:[MBR]./android/system.img
part.4flash=mmc,0:cache:ext4:0x33300000,0x1ac00000:cache.img:[MBR]./android/cache.img
part.5flash=mmc,0:misc:emmc:0x4e000000,0x800000::[MBR]
part.6flash=mmc,0:recovery:emmc:0x4e900000,0x1600000::[MBR]
part.7flash=mmc,0:userdata:ext4:0x50000000,0x0:userdata.img:[MBR]./android/userdata.img
-----------------------------------------------------------------------------
create new MBR 6:
[MBR.0] start : 0x0000100000 size0x0004000000
[MBR.1] start : 0x0004100000 size0x002f200000
[MBR.2] start : 0x0033300000 size0x001ac00000
[MBR.3] start : 0x004e000000 size0x0000800000
[MBR.4] start : 0x004e900000 size0x0001600000
[MBR.5] start : 0x0050000000 size0x0000000000
-----------------------------------------------------------------------------
copy from: ./android to /dev/sdb
[MBR.0] part.2 start : 0x100000 size0x4000000 (0xcc80dc) : ./android/boot.img : done.
[MBR.1] part.3 start : 0x4100000 size0x2f200000 (0x1d7c2450) : ./android/system.img : done.
[MBR.2] part.4 start : 0x33300000 size0x1ac00000 (0x88c130) : ./android/cache.img : done.
[MBR.5] part.7 start : 0x50000000 size0x189c00000 (0x27a6328) : ./android/userdata.img : done.
-----------------------------------------------------------------------------
/dev/sdb: msdos partitions 1 2 3 4 <5 67>
Update ext4fs for Android on/dev/sdb...
==> Executing: 'tune2fs /dev/sdb1 -U86086767-8164-4be2-ae49-540c967fc0bb -L boot'
tune2fs 1.42.9 (4-Feb-2014)
==> Executing: 'tune2fs /dev/sdb2 -U97d5a066-38c4-4f76-a2c4-c6549b111764 -L system'
tune2fs 1.42.9 (4-Feb-2014)
==> Executing: 'tune2fs /dev/sdb3 -U2e69d9ef-0a95-417d-a05c-23b3c5a3481e -L cache'
tune2fs 1.42.9 (4-Feb-2014)
==> Executing: 'resize2fs /dev/sdb7 -f'
resize2fs 1.42.9 (4-Feb-2014)
Resizing the filesystem on /dev/sdb7 to1612800 (4k) blocks.
The filesystem on /dev/sdb7 is now 1612800blocks long.
==> Executing: 'tune2fs /dev/sdb7 -U9eaee93a-85cf-4a93-a946-8f09e5a4e3a4 -L userdata'
tune2fs 1.42.9 (4-Feb-2014)
...done.
---------------------------------
Android is fused successfully.
All done.
看到好色标记的部分了吧,
sd
卡上的镜像分布图:
按照先后顺序执行了
2ndboot fusing
bootloader fusing
Android filesystem fusing
由此产生的结果是:
镜像分布是:
part.0 flash=mmc,0:2ndboot:2nd: 0x200, 0x8e00: : [RAW]
part.1 flash=mmc,0:bootloader:boot: 0x8000, 0x77000: : [RAW]
part.2 flash=mmc,0:boot:fat: 0x100000, 0x4000000: boot.img : [MBR] ./android/boot.img
part.3 flash=mmc,0:system:ext4: 0x4100000, 0x2f200000: system.img: [MBR] ./android/system.img
part.4 flash=mmc,0:cache:ext4: 0x33300000, 0x1ac00000: cache.img : [MBR]./android/cache.img
part.5 flash=mmc,0:misc:emmc: 0x4e000000, 0x800000: : [MBR]
part.6 flash=mmc,0:recovery:emmc: 0x4e900000, 0x1600000: : [MBR]
part.7 flash=mmc,0:userdata:ext4: 0x50000000, 0x0 : userdata.img : [MBR] ./android/userdata.img
|( 留下这些红色的记忆吧!将来有用。)
由此可知,sd卡上第 2块的位置上存放的是2ndboot。
那细心的人要问了为什么不是第一个块的位置啊?
你别忘了,SD卡是一个存储设备,根据以往的经验,存储设备一定要有个存放本身如何分区等信息的地方,这个地方最方便的位置就是第1个块,它存放的是sd卡的分区信息,类似硬盘分区表的信息。别问我为什么这样搞,这是专家定的。
还记得前面第二个图中的说明吗?就是关于sector#1的那一段,忘了的翻回去看看。
由于它是三星官方未公开源码的引导程序,所以我们无从知道他的源代码。
我们知道它的作用是把Iternal ROM中的程序加载到Internal SRAMM中并执行就够了。
在我们的小pi2方案中,2ndboot程序将SD卡里的数据从Block1开始拷贝到Internal SRAM并执行。
执行后把我们的u_boot在加载到ram中,然后把控制权交给u_boot.在由uboot来装载OS,并把控制权交给os。
完事了,折腾真么半天,就几句话就完事了。好无聊啊。
有细细读者可能会说,喂喂,说好的分析datasheet呢?
嘿嘿!没有拿datasheet讲解的真实原因是:我在datashaeet里面就没有找到关于引导更详细的资料,不知道是三星没放出来,还是什么原因。
想想友善的攻城狮比我聪明,另外小pi2明明白白的在那里运行着呢!
所以直接看他们的分析成果不是更省事吗?
哎哎!你说啥呢?这怎么能叫投机取巧呢?
这叫站在巨人的肩膀上,爬得更高而已!
好了,有了这些分析,我们就有可以为所欲为了!
悟空,你又淘气了!这怎么能叫胡来呢?
到底咱想干什么,且下先回分解!