imx6q烧写程序的方法

在对同一件事情的处理方式上,效率和优雅总是互损的。—— R.W

mfgtools的介绍

mfgtools是NXP提供的可以给imx系列烧写程序的工具。我们可以到NXP的官网去下载一个mfgtools的工具,我下载的版本是L4.9.88_2.0.0_mfg-tool

mfgtools的烧写原理

在下载的模式下,通过imx6q出厂就带有的固化在芯片里面的程序,往内存里面下载uboot和支持UTP的内核,然后让已经下载好的内存里的系统程序运行起来,同时也可以在串口里面看到系统启动输出的log。
然后,通过UTP协议把需要的文件和固件传到内存,把需要的烧写的image通过dd写入相应的分区,rootfs则直接解压到格式化好的分区上即可。
切换到eMMC启动模式,即可将烧写好的系统启动起来。

mfgtools烧写过程

  • UICfg.ini文件,这个文件是用来指定可以同时烧写几块板子,取值范围是1~4,开发的时候当然都是选择1了。
[UICfg]
PortMgrDlg=1
  • cfg.ini文件里面的profiles/chip的内容和mfgtools\Profiles下面的下载目标的文件夹保持一致;platform/board现在已经没有用了;LIST/name指向你想要在ucl2.xml里面执行的操作列表。
[profiles]
chip = Linux

[platform]
board = Itop

[LIST]
name = Linux-Itop-eMMC
  • ucl2.xml文件里面包含了很多操作列表,我们也可以定义自己的操作列表。操作列表分两个阶段。第一个阶段是BootStrap阶段,第二阶段是Updater阶段。
    可以分别来看一下,第一个阶段的操作列表如下
<CMD state="BootStrap" type="boot" body="BootStrap" file="firmware/u-boot.imx" ifdev="MX6Q">Loading U-boot.CMD>

<CMD state="BootStrap" type="load" file="firmware/zImage_mfgtool" address="0x12000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.CMD>

<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.CMD>

<CMD state="BootStrap" type="load" file="firmware/imx6q-sabresd.dtb" address="0x18000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.CMD>

<CMD state="BootStrap" type="jump" > Jumping to OS image. CMD>

把firmware下面的uboot、kernel和initramfs传输到对应的内存地址上去,然后通过jump命令告诉bootstrap程序去运行uboot。
这个阶段是为了后面烧写固件到eMMC做铺垫,其过程有点类似于OTA升级。其实,我们也可以利用这个过程验证我们开发中的程序或者固件。
第二阶段是Updater阶段,就是升级程序的意思。这个阶段会把每个分区=依次烧写,这里只摘取前面的过程看一下,后面的其他分区烧写也是类似的。

  	
	<CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shellCMD>
	<CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...CMD>
	<CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk3"> Partitioning...CMD>
	
	
	<CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk3 bs=1k seek=384 conv=fsync count=129">clear u-boot argCMD>
	<CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk3boot0/force_ro">access boot partition 1CMD>
	<CMD state="Updater" type="push" body="send" file="files/linux/u-boot.imx" >Sending u-boot.binCMD>
	<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk3boot0 bs=512 seek=2">write U-Boot to sd cardCMD>
	<CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk3boot0/force_ro"> re-enable read-only access CMD>
	<CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk3">enable boot partion 1 to bootCMD>

上面的过程是先将mksdcard.sh.tar放入文件系统,然后解压执行,主要是创建分区表用的。然后还有就是清除uboot的arg,将mmcblk3boot0设置成可更改的模式,然后把传进去的uboot的镜像dd到mmcblk3boot0分区,再把mmcblk3boot0分区恢复成只读的模式,然后设置设备从eMMC的第一个bootpart(也就是mmcblk3boot0)启动。
上面大致介绍了一下imx6q的烧写过程,但烧写过程较其他平台稍显繁琐,期望官方可以改进,使烧录过程简单化。

你可能感兴趣的:(#,嵌入式Linux之旅--启动篇)