为了将映像文件烧进NANDFlash中,我必须要分析ucl.xml文件,并能自己照着画一个符合项目要求的。唉。
分析的时候需要参考MFG的工具提供的Document:《Manufacturing Tool UCL usermanual.doc》
找到<LISTname=”MX53SMD-Android-eMMC4.4”这一条,开始分析了:
首先有一段注释意思是:该条目用于将Android编程到eMMC4.4存储设备上。如果使用默认设置请不要插入SD卡。如果插入了SD卡,eMMC4.4的块号码就变成1了。
噢,此处我明白了,为什么要mmc read 1,而不是mmc read 0。
1、<CMD type=”boot” body=”BootStrap” file=”u-boot-mx53-smd.bin”>Readfrom DDR script from u-boot to init DDR memory.</CMD>
这一条的注释奇怪啊。搞不明白什么意思。这条命令应该是下载uboot.bin文件到内存中。不过从手册中并没有发现boot和BootStrap可以一起使用啊。奇怪!
2、<CMD type=”load” file=”uImage” address=”0x70800000” loadSection=”OTH”setSection=”OTH” HasFlashHeader=”FALSE”> Doing Kernel.</CMD>
这条的意思就是下载uImage文件到内存的0x70800000地址处。
3、<CMD type=”load” file=”initramfs.cpio.gz.uboot” address=”0x70B00000”loadSection=”OTH” setSection=”OTH” HasFlashHeader=”FALSE”>DoingInitramfs.</CMD>
这条的意思是下载initramfs.cpio.uz.uboot文件到内存的0x70B00000地址处。
4、<CMD type=”jump”>Jumping to OS image.</CMD>
这条看来是通知内嵌ROM代码跳转到内存中的映像执行。但是跳到哪里呢?跳到uboot?跳到kernel还是rootfs?此处不明白?
5、<CMD type=”find” body=’Updater” timeout=”180/>
这条是在180秒内导找处于引导模式的设备。
6、<CMD type=”push” body=”mknod block,mmcblk0,/dev/mmcblk0,block”/>
因为命令类型为push,所以此句在目标机上执行。感觉这句是创建设备节点。目标机的linux系统运行起来了吗?
7、<CMDtype="push" body="$ mknod /dev/zero c 1 5">Create zerodevice node</CMD>
这句是在目标机上创建zero字符设备
8、<CMDtype="push" body="$ dd if=/dev/zero of=/dev/mmcblk0 bs=512seek=1536 count=16">clean up u-boot parameter</CMD>
从意思上来看是清除uboot参数,即将/dev/mmcblk0从1536地址开始共计16个字节的信息清零。
这句话的具体意思还不明确,查一下dd的用法,为什么偏移是1536?估计还是跟NandFlash分区有关系!
9、<CMDtype="push" body="send"file="mksdcard-android.sh.tar">Sending partition shell</CMD>
这句将本机的脚本发送到目标机
10、<CMDtype="push" body="$ tar xf $FILE ">Partitioning...</CMD>
解压文件
11、<CMDtype="push" body="$ sh mksdcard-android.sh/dev/mmcblk0"> Partitioning...</CMD>
执行脚本文件
12、<CMDtype="push" body="$ mknod /dev/mmcblk0p1 b 179 1"/>
<CMD type="push"body="$ mknod /dev/mmcblk0p2 b 179 2"/>
<CMD type="push"body="$ mknod /dev/mmcblk0p3 b 179 3"/>
<CMD type="push"body="$ mknod /dev/mmcblk0p4 b 179 4"/>
<CMD type="push"body="$ mknod /dev/mmcblk0p5 b 179 5"/>
<CMD type="push"body="$ mknod /dev/mmcblk0p6 b 179 6"/>
创建块设备文件,为什么要创建6个?难道NANDFlash被分了6个分区?
13、<CMD type="push" body="$ echo 1> /sys/devices/platform/mxsdhci.2/mmc_host/mmc2/mmc2:0001/boot_config">accessboot partition 1</CMD>
有一句注释:如果只是为了烧录bootloader则可以注释掉这一行。
14、<CMDtype="push" body="send"file="files/android/u-boot.bin">Sending U-Boot</CMD>
将uboot发送到目标机。现在看来,是先在目标机的内存里运行一个ramfs的微内核,这个微操作系统里面包括一些诸如NAND驱动什么的。用于支持烧录操作。哈哈。现在开始才是烧录我们自己的uboot啊。
15、<CMD type="push" body="$ ddif=/dev/zero of=/dev/mmcblk0 bs=512 seek=2 count=2000">Clean U-Bootenvironment</CMD>
清除uboot环境信息,说白了就是擦除NANDFlash.
16、<CMD type="push" body="$ ddif=$FILE of=/dev/mmcblk0 bs=512 seek=2 skip=2">write U-Boot to sdcard</CMD>
将刚才发送过来的uboot烧写进NandFlash.
17、<CMD type="push" body="$ echo8 >/sys/devices/platform/mxsdhci.2/mmc_host/mmc2/mmc2:0001/boot_config">accessuser partition,and enable boot partion1 to boot</CMD>
<CMD type="push" body="$ echo 2> /sys/devices/platform/mxsdhci.2/mmc_host/mmc2/mmc2:0001/boot_bus_config">Setboot width is 8bits</CMD>
这些比较奇怪,好像是使能启动选项。有一个注释说:如果只烧bootloader的话可以注释掉这两行。
18、<CMD type="push"body="send" file="files/android/uImage">Sending kerneluImage</CMD>
这句的意思是将uImage发送到目标机
19、<CMD type="push" body="$ ddif=$FILE of=/dev/mmcblk0 bs=512 seek=2048">write kernel image to sdcard</CMD>
将内核文件写到nandflash中。从开始处偏移2048个字节(2MB)开始写。
20、<CMD type="push"body="send" file="files/android/uramdisk.img">Sendingkernel uImage</CMD>
将ramdisk发送到目标机
21、<CMD type="push" body="$ ddif=$FILE of=/dev/mmcblk0 bs=6M seek=1">write kernel image to sdcard</CMD>
将ramdisk写到nandflash中,以6MB的单位偏移1个单位。
22、<CMD type="push" body="$mkfs.vfat /dev/mmcblk0p1">Formatting sd partition</CMD>
将目标nandflash的第一个分区格式化成vfat文件系统
23、<CMD type="push" body="$mkfs.ext4 /dev/mmcblk0p2">Formatting system partition</CMD>
将目标nandflash的第二个分区格式化成ext4文件系统
24、<CMD type="push" body="$mkfs.ext4 -O^extent /dev/mmcblk0p4">Formatting recoverypartition</CMD>
<CMD type="push"body="$ mkfs.ext4 /dev/mmcblk0p5">Formatting datapartition</CMD>
<CMD type="push"body="$ mkfs.ext4 -O^extent /dev/mmcblk0p6">Formatting cachepartition</CMD>
这些都是执行一些分区格式化操作。
-O^extent 这句什么意思不清楚?
25、<CMD type="push" body="pipedd of=/dev/mmcblk0p2 bs=512" file="files/android/system.img">Sendingand writting system.img</CMD>
利用pipe传输大数据文件。将system.img写到第二分区中。
26、<CMD type="push" body="pipedd of=/dev/mmcblk0p4 bs=512"file="files/android/recovery.img">Sending and writtingsystem.img</CMD>
利用pipe传输大数据文件。将recovery.imag写到第四分区中。
27、<CMD type="push"body="frf">Finishing rootfs write</CMD>
执行flush刷新操作,等待所有数据传输完毕
28、<CMD type="push" body="$ echoUpdate Complete!">Done</CMD>
显示执行完毕信息
以上就是烧录固件时所有的命令,以下做一下总结:
1、下载uboot.bin到目标机内存,应该是内存地址0x0处
2、下载uImage到目标机内存,内存地址是0x70800000
3、下载initramfs到目标机内存,内存地址是0x70B00000
4、利用以上下载的文件在目标机的内存中运行起一个简易的操作系统
5、通过向目标机发送命令在目标机上创建设备节点,用于对nand flash进行操作
6、向目标机发送脚本文件执行nand flash分区操作
7、向目标机发送uboot.bin(这次是自己编译的需要烧写的)并烧写进nand flash中。
8、向目标机发送uImage(这里是自己编译的需要烧写的)并烧写进nand flash中。
9、向目标机发送ramdisk(这里是自己编译的需要烧写的)并烧写进nand flash中。
10、刷新操作flush
11、烧录结束
从文件分析上来看就是这样,但我觉得真够复杂的,freescale搞了个非常复杂的东东。唉。真应该跟人家三星学学,直接使用工具烧写nandflash多简单啊。无语了。
既然分析完了,下一步就是编写自己的控制文件,来烧录自己的程序啦。
原文链接:https://www.f2er.com/xml/297290.html