wuyage

I.MX6之程序下载

0
阅读(1016) 评论(0)

    从过去的单片机转到处理器+Linux,变化真是挺大的。 没有基础的,单是编译和下载就得折腾一段时间。为了加快入门步伐,我出血花了1千多大洋买了一个开发板来学习。选的是米尔科技的IMX6ULL 开发板。

    本以为直接用人家现成的工具下载进去就可以运行,没想到也没那么顺利,我遇到的问题,下载后出现了

Booting from mmc ...
reading myd-y6ull-gpmi-weim.dtb
** Unable to read file myd-y6ull-gpmi-weim.dtb **

无法启动的问题。后来经过一番学习找到了问题。通过这个问题我也大概了解了IMX6的下载流程。

     原因是在Uboot工程的include/configs/myd_y6ull.h 中的

"setenv fdt_file myd-y6ull-gpmi-weim.dtb; fi; " \

    这句话出现了问题,将其改为

"setenv fdt_file myd-y6ull-emmc.dtb; fi; " \

重新编译再下载就可以了。


  http://blog.csdn.net/hbk320/article/details/49975841 和 https://www.cnblogs.com/helloworldtoyou/p/6053195.html

  介绍了Mfgtools的下载原理。


   我遇到的问题是Uboot寻找dtb文件时指定的文件名不对。Uboot里dtb的文件名应该和

<!-- burn dtb -->
<CMD state="Updater" type="push" body="send" file="files/zImage-myd-y6ul-%6uldtb%-emmc.dtb" ifdev="MX6UL">Sending Device Tree file</CMD>
<CMD state="Updater" type="push" body="send" file="files/zImage-myd-y6ul%lite%-%6uldtb%-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>


<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/myd-y6ul-emmc.dtb" ifdev="MX6UL">write device tree to sd card</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/myd-y6ul%lite%-emmc.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>

 写入到emmc中的名字一致(下面两条语句)。注意不是上面寻找路径中的文件名。

    


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2018-4-22 重新整理

1) 打开 core-image-base-myd-y6ulx-emmc.vbs


Set wshShell = CreateObject("WScript.shell")

wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC""  -s ""mmc=1"" -s ""board=sabreauto"" -s ""lite=l"" -s ""6uluboot=14x14"" -s ""6uldtb=14x14"" -s ""myd_y6ull_rootfs=core-image-base-myd-y6ull14x14.rootfs.tar.bz2"" -s ""myd_y6ul_rootfs=core-image-base-myd-y6ul14x14.rootfs.tar.bz2"""

Set wshShell = Nothing


参数的含义: 

-c: 芯片配置文件夹名称 linux 

-l: list名称,对应ucl2.xml文件中的LIST标签的name,后面会说明。 

-s: 变量名称, cfg.ini以及ucl2.xml中会用到。


cfg.ini


脚本运行, mfgtool工具启动,解读cfg.ini文件,上面的vbs脚本中的参数会覆盖cfg.ini文件中的参数。

[profiles]

chip = Linux


[platform]

board = SabreSD


[LIST]

name = SDCard


[variable]

board = sabresd

mmc = 0

sxuboot=sabresd

sxdtb=sdb

7duboot=sabresd

7ddtb=sdb

6uluboot=14x14ddr3arm2

6uldtb=14x14-ddr3-arm2

6ulldtb=14x14-ddr3-arm2

ldo=

plus=

lite=l

initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot

seek = 1

sxnor=qspi2

7dnor=qspi1

6ulnor=qspi1

nor_part=0

ucl2.xml


根据 vbs和cfg.ini文件中的参数指定的LIST名称,选择正确的操作进行进行烧录。

这个目录里面有很多文件,烧录的时候要用到的uboot,内核,文件系统到RAM中,运行

  • 首先烧录Profiles/Linux/OS Firmware/firmware文件夹的镜像到RAM中运行系统。

  • 系统运行之后烧录Profiles/Linux/OS Firmware/files/中的镜像到emmc中


将两个%号之间的参数使用vbs脚本和cfg.ini文件中的值进行替换


<!-- 下载镜像到CPU的RAM中直接运行,当系统跑起来之后再烧录镜像到EMMC中。不同的CPU型号下载的地址不同 -->

<LIST name="eMMC" desc="Choose eMMC as media">

<!-- 烧录镜像到EMMC中 -->    <!-- create partition --><!-- 先对EMMC进行分区 -->

<!-- create partition -->

<CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD>

<CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>

<CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>


<!-- burn dtb -->

<CMD state="Updater" type="push" body="send" file="files/zImage-myd-y6ul-%6uldtb%-emmc.dtb" ifdev="MX6UL">Sending Device Tree file</CMD>

<CMD state="Updater" type="push" body="send" file="files/zImage-myd-y6ul%lite%-%6uldtb%-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>


<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/myd-y6ul-emmc.dtb" ifdev="MX6UL">write device tree to sd card</CMD>

<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblk%mmc%p1/myd-y6ul%lite%-emmc.dtb" ifdev="MX6ULL">write device tree to sd card</CMD>


这里:

uboot:寻找file/u-boot-myd-y6ull14x14_emmc.imx , 写入dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2"


内核:寻找file/ zImage-myd-y6ull, 写入emmc   /mnt/mmcblk%mmc%p1/zImage


设备树:寻找file/ zImage-myd-y6ull-14x14-emmc.dtb ,写入emmc  /mnt/mmcblk%mmc%p1/myd-y6ul%lite%-emmc.dtb 名字为 myd-y6ull-emmc.dtb