对于Freescale MFG编程工具控制文件ucl.xml的分析

来源:互联网 发布:手机推广软件赚钱 编辑:程序博客网 时间:2024/05/17 07:05


为了将映像文件烧进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文件到内存中。不过从手册中并没有发现bootBootStrap可以一起使用啊。奇怪!

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/mmcblk01536地址开始共计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多简单啊。无语了。

既然分析完了,下一步就是编写自己的控制文件,来烧录自己的程序啦。

0 0