对于Freescale MFG编程工具控制文件ucl.xml的分析
为了将映像文件烧进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多简单啊。无语了。 既然分析完了,下一步就是编写自己的控制文件,来烧录自己的程序啦。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |