OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5013|回复: 0

【正点原子Linux连载】第三十九章系统烧写--摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

[复制链接]

1118

主题

1129

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4671
金钱
4671
注册时间
2019-5-8
在线时间
1224 小时
发表于 2019-12-31 16:47:54 | 显示全部楼层 |阅读模式
本帖最后由 正点原子01 于 2019-12-31 16:45 编辑

1)实验平台:正点原子阿尔法Linux开发板
2)平台购买地址::https://item.taobao.com/item.htm?id=603672744434
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html
4)对正点原子Linux感兴趣的同学可以加群讨论:935446741
5)关注正点原子公众号,获取最新资料更新
QQ图片20191129104007.png

第三十九章系统烧写


       前面我们已经移植好了ubootlinuxkernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中肯定不可能通过网络来运行,否则没网的时候产品岂不是就歇菜了。因此我们需要将ubootlinuxkernel.dtb(设备树)rootfs这四个文件烧写到板子上的EMMCNANDQSPI Flash等其他存储设备上,这样不管有没有网络我们的产品都可以正常运行。本章我们就来学习一下如何使用NXP官方提供的MfgTool工具通过USB OTG口来烧写系统。



39.1 MfgTool工具简介
       MfgTool工具是NXP提供的专门用于给I.MX系列CPU烧写系统的软件,可以在NXP官网下载到。此工具已经放到了开发板光盘中,路劲为:5、开发工具->3NXP官方原版MFG_TOOL烧写工具->L4.1.15_2.0.0-ga_mfg-tools.tar.gz。此软件在Windows下使用,对于我们来说太友好了。将此压缩包进行解压,解压完成以后会出现一个名为L4.1.15_2.0.0-ga_mfg-tools的文件夹,进入此文件夹,此文件夹的内容如图39.1.1所示:
image002.jpg
39.1.1 mfg_tools工具目录
       从图39.1.1可以看出,有两个.txt文件和两个.gz压缩包。.txt文档就不去看了,重点是这两个.gz压缩包,这两个压缩包的区别在名字上已经写的很详细了。“without-rootfs”和“with-rootfs”,一个是带rootfs和一个是不带rootfsmfg_tools这个工具本意是给NXP自己的开发板设计的烧写软件,所以肯定带有自家开发板对应的ubootlinuxkernelrootfs的文件。我们肯定是要烧写文件系统的,所以选择mfgtools-with-rootfs.tar.gz这个压缩包,继续对其解压,解压出一个名为mfgtools-with-rootfs的文件夹,此文件夹就包含有我们需要的烧写工具。
       进入目录mfgtools-with-rootfs\mfgtools中,在此目录下有几个文件夹和很多的.vbs文件,如图39.1.2所示:
image004.jpg
39.1.2 mfgtools目录内容
       我们只关心图39.1.2Profiles这个文件夹,因为后面要烧写文件就放到这个文件夹中。MfgTool2.exe就是烧写软件,但是我们不会直接打开这个软件烧写,mfg_tools不仅能烧写I.MX6U,而且也能给I.MX7I.MX6Q等芯片烧写,所以在烧写之前必须要进行配置,指定烧写的是什么芯片,烧写到哪里去?下面的这些众多的.vbs文件就是配置脚本,烧写的时候通过双击这些.vbs文件来打开烧写工具。这些.vbs烧写脚本既可以根据处理器的不同,由用户选择向I.MX6DI.MX6QI.MX6SI.MX7I.MX6ULI.MX6ULL等的哪一款芯片烧写系统。也可以根据存储芯片的不同,选择向EMMCNANDQSPI Flash等的哪一种存储设备烧写,功能非常强大!!我们现在需要向I.MX6U烧写系统,因此需要参考表39.1.1所示的5个烧写脚本:
D158CD42-A624-4034-BECE-EE8810A117D9.png
39.1.1 I.MX6U使用的烧写脚本
       其他的.vbs烧写脚本用不到,因此可以删除掉,防止干扰我们的视线。本书用的是正点原子的EMMC版核心板,因此只会用到mfgtool2-yocto-mx-evk-emmc.vbs这个烧写脚本,如果用其他的核心板请参考相应的烧写脚本。
39.2 MfgTool工作原理简介
       MfgTool只是个工具,具体的原理不需要去深入研究,大概来了解一下其工作原理就行了,知道它的工作流程就行了。
39.2.1 烧写方式
1、连接USB线
       MfgTool是通过USB OTG接口将系统烧写进EMMC中的,正点原子I.MX6U-ALPHA开发板上的USB OTG口如图39.2.1.1所示:
image006.gif
39.2.2.1 USB OTG1接口
       在烧写之前,需要先用USB线将图39.2.2.1中的USB_OTG1接口与电脑连接起来。
       2、拨码开关拨到USB下载模式
       将图39.2.2.1中的拨码开关拨到“USB”模式,如图39.2.2.2所示:
image008.jpg
39.2.2.2 USB下载模式
       如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!
       如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!
如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!
       一切准备就绪以后,按一下开发板的复位键,此时就会进入到USB模式,如果是第一次进入USB模式的话可能会久一点,这个是免驱的,因此不需要安装驱动。第一次进入USB模式会在电脑右下角有如图39.2.2.3所示提示:
image010.jpg
39.2.2.3 第一次进入USB模式
       一旦第一次设置好设备以后,后面每次连接都不会有任何提示了。到这里,我们的开发板已经和电脑连接好了,可以开始烧写系统了。
39.2.2 系统烧写原理
       开发板连接电脑以后双击“mfgtool2-yocto-mx-evk-emmc.vbs”,打开下载对话框,如图39.2.2.1所示:
image012.gif
39.2.2.1 MfgTool工具界面
       如果出现“符合 HID 标准的供应商定义设备”就说明连接正常,可以进行烧写,如果出现其他的字符那么就要检查连接是否正确。点击“Start”按钮即可开始烧写,烧写什么东西呢?肯定是烧写ubootLinuxkernel.dtbrootfs,那么这四个应该放到哪里MfgTool才能访问到呢?进入如下目录中:
L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware
       此目录中的文件如图39.2.2.2所示:
image014.jpg
39.2.2.2 OS Firmware文件夹内容
       文件夹“OS Firmware”看名字就知道是存放系统固件的,我们重点关注filesfirmware这两个文件夹,以及ucl2.xml这个文件。在具体看这三个文件和文件夹之前,我们先来简单了解一下MfgTool烧写的原理,MfgTool其实是先通过USB OTG先将ubootkernel.dtb(设备树)这是三个文件下载到开发板的DDR中,注意不需要下载rootfs。就相当于直接在开发板的DDR上启动Linux系统,等Linux系统启动以后再向EMMC中烧写完整的系统,包括ubootlinuxkernel.dtb(设备树)rootfs,因此MfgTool工作过程主要分两个阶段:
       ①、将firmware目录中的ubootlinuxkernel.dtb(设备树),然后通过USB OTG将这个文件下载到开发板的DDR中,目的就是在DDR中启动Linux系统,为后面的烧写做准备。
       ②、经过第①步的操作,此时Linux系统已经运行起来了,系统运行起来以后就可以很方便的完成对EMMC的格式化、分区等操作。EMMC分区建立好以后就可以从firmware中读取要烧写的ubootlinux kernel.dtb(设备树)rootfs4个文件,然后将其烧写到EMMC中,这个就是MfgTool的大概工作流程。
1、firmeare文件夹
打开firmware文件夹,里面有很多的.imx结尾的uboot文件、一个zImage镜像文件、很多.dtb结尾的设备树文件。这些文件都是NXP官方开发板使用的,不同的板子使用不同的文件,其中我们需要关心的只有表39.2.2.1中的这三个文件:
CFC1B027-4E98-4b97-A977-D0796B912CE9.png

39.2.2.1 I.MX6ULL EVK开发板使用的系统文件
       39.2.2.1中的这三个文件就是I.MX6ULL EVK开发板烧写系统的时候第一阶段所需的文件。如果要烧写我们的系统,就需要用我们编译出来的zImageu-boot.imximx6ull-alientek-emmc.dtb这三个文件替换掉表39.2.2.1中这三个文件。但是名字要和表39.2.2.1中的一致,因此需要将u-boot.imx重命名为u-boot-imx6ull14x14evk_emmc.imx,将imx6ull-alientek-emmc.dtb重命名为zImage-imx6ull-14x14-evk-emmc.dtb
       2、files文件夹
       将表39.2.2.1中的这三个文件下载到开发板的DDR上以后烧写的第一阶段就完成了,第二阶段就是从files目录中读取整个系统文件,并将其烧写到EMMC中。files目录中的文件和firmware目录中的基本差不多,都是不同板子对应的uboot、设备树文件,同样,我们只关心表39.2.2.2中的四个文件:
2267D9AC-A9FE-4852-A7F6-48622939D0D2.png
39.2.2.2 I.MX6ULL EVK开发板烧写文件
       如果要烧写我们自己编译出来的系统,就需要用我们编译出来的zImageu-boot.imximx6ull-alientek-emmc.dtbrootfs这四个文件替换掉表39.2.2.2中这四个文件。
       3、ucl2.xml文件
       filesfirmware目录下有众多的uboot和设备树,那么烧写的时候究竟选择哪一个呢?这个工作就是由ucl2.xml文件来完成的。ucl2.xml以“<UCL>”开始,以“</UCL>”结束。“<CFG>”和“</CFG>”之间是配置相关内容,主要是判断当前是给I.MX系列的哪个芯片烧写系统。“<LIST>”和“</LIST>”之间的是针对不同存储芯片的烧写命令。整体框架如下:
示例代码39.2.2.1 ucl2.xml框架
  1. <UCL>
  2. <CFG>
  3.     ......
  4. <!-- 判断向I.MX系列的哪个芯片烧写系统 -->
  5.     ......
  6. </CFG>
  7. <LISTname="SDCard"desc="Choose SD Card as media">
  8. <!-- 向SD卡烧写Linux系统 -->
  9. </LIST>
  10. <LISTname="eMMC"desc="Choose eMMC as media">
  11. <!-- 向EMMC烧写Linux系统 -->
  12. </LIST>
  13. <LISTname="NorFlash"desc="Choose Nor flash as media">
  14. <!-- 向Nor Flash烧写Linux系统 -->
  15. </LIST>
  16. <LISTname="Quad NorFlash"desc="Choose Quad Nor flash as media">
  17. <!-- 向Quad Nor Flash烧写Linux系统 -->
  18. </LIST>
  19. <LISTname="NANDFlash"desc="Choose NAND as media">
  20. <!-- 向NAND Flash烧写Linux系统 -->
  21. </LIST>
  22. <LISTname="SDCard-Android"desc="Choose SD Card as media">
  23. <!-- 向SD卡烧写Android系统 -->
  24. </LIST>
  25. <LISTname="eMMC-Android"desc="Choose eMMC as media">
  26. <!-- 向EMMC烧写Android系统 -->
  27. </LIST>
  28. <LISTname="Nand-Android"desc="Choose NAND as media">
  29. <!-- 向NAND Flash烧写Android系统 -->
  30. </LIST>
  31. <LISTname="SDCard-Brillo"desc="Choose SD Card as media">
  32. <!-- 向SD卡烧写Brillo系统 -->
  33. </LIST>
  34. </UCL>
复制代码
       ucl2.xml首先会判断当前要向I.MX系列的哪个芯片烧写系统,代码如下:
示例代码39.2.2.2 判断要烧写的处理器型号
  1. <CFG>
  2. <STATEname="BootStrap"dev="MX6SL"vid="15A2"pid="0063"/>
  3. <STATEname="BootStrap"dev="MX6D"vid="15A2"pid="0061"/>
  4. <STATEname="BootStrap"dev="MX6Q"vid="15A2"pid="0054"/>
  5. <STATEname="BootStrap"dev="MX6SX"vid="15A2"pid="0071"/>
  6. <STATEname="BootStrap"dev="MX6UL"vid="15A2"pid="007D"/>
  7. <STATEname="BootStrap"dev="MX7D"vid="15A2"pid="0076"/>
  8. <STATEname="BootStrap"dev="MX6ULL"vid="15A2"pid="0080"/>
  9. <STATEname="Updater"dev="MSC"vid="066F"pid="37FF"/>
  10. </CFG>
复制代码
       通过读取芯片的VIDPID即可判断出当前要烧写什么处理器的系统,如果VID=0X15A2PID=0080,那么就表示要给I.MX6ULL烧写系统。确定了处理器以后就要确定向什么存储设备烧写系统,这个时候就要有请mfgtool2-yocto-mx-evk-emmc.vbs再次登场,此文件内容如下:
示例代码39.2.2.3mfgtool2-yocto-mx-evk-emmc.vbs文件内容
  1. Set wshShell = CreateObject("WScript.shell")
  2. wshShell.run "mfgtool2.exe-c ""linux"" -l ""eMMC"" -s ""board=sabresd""-s ""mmc=1"" -s ""6uluboot=14x14evk""-s ""6uldtb=14x14-evk"""
  3. Set wshShell = Nothing
复制代码
       重点是“wshShell.run”这一行,这里一行调用了mfgtool2.exe这个软件,并且还给出了一堆的参数,其中就有“eMMC”字样,说明是向EMMC烧写系统,要烧写的存储设备就这样确定下来了。“wshShell.run”后面还有一堆的其他参数,这些参数都有对应的值,如下所示:
  1. board=sabresd
  2. mmc=1
  3. 6uluboot=14x14evk
  4. 6uldtb=14x14-evk
复制代码
我们继续回到ucl2.xml中,既然现在已经知道了是向I.MX6ULL的EMMC中烧写系统,那么直接在ucl2.xml中找到相应的烧写命令就行了,因为相应的命令太长,为了缩小篇幅,我们就以uboot的烧写为例讲解一下。前面说了烧写分两个阶段,第一步是通过USB OTG向DDR中下载系统,第二步才是正常的烧写。通过USB OTG向DDR下载uboot的命令如下:
示例代码39.2.2.4 通过USB OTG下载uboot
  1. <CMDstate="BootStrap"type="boot"body="BootStrap"file ="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx"ifdev="MX6ULL">Loading U-boot
  2. </CMD>
复制代码
       上面的命令就是BootStrap阶段,也就是第一阶段,“file”表示要下载的文件位置,在firmware目录下,文件名字为
  1. u-boot-imx6ul%lite%%6uluboot%_emmc.imx
复制代码
       在L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools-with-rootfs\mfgtools下找到cfg.ini文件,该文件里包含了开发板的一些信息,查看cfg.ini文件可得lite=l以及一些字符串代表的值。
“%lite%”和“%6uluboot%”分别表示取lite和6uluboot的值,而lite=l,6uluboot=14x14evk,因此将这来个值带进去以后就是:
  1. u-boot-imx6ull14x14evk _emmc.imx
复制代码
       所以,这里向DDR中下载的是firmware/ u-boot-imx6ull14x14evk_emmc.imx这个uboot文件。同样的方法将.dtb(设备树)zImage都下载到DDR中以后就会跳转去运行OS,这个时候会在MfgTool工具中会有“Jumpingto OS image”提示语句,ucl2.xml中的跳转命令如下:
示例代码39.2.2.5 跳转到OS
  1. <CMDstate="BootStrap"type="jump"> Jumping to OSimage. </CMD>
复制代码
       启动Linux系统以后就可以在EMMC上创建分区,然后烧写ubootzImage.dtb(设备树)和根文件系统。
       这个就是MfgTool的整个烧写原理,弄懂了烧写原理以后就可以开始试着先将NXP官方的系统烧写到正点原子的I.MX6U-ALPHA开发板中。
39.3 烧写NXP官方系统
       我们先试着将NXP官方的系统烧写到正点原子的I.MX6U-ALPHA开发板中,主要是先熟悉一下烧写过程。因为正点原子的EMMC核心版用的也是512MBDDR34GEMMC,因此烧写NXP官方的系统是没有任何问题的。烧写步骤如下:
①、连接好USB,拨码开关拨到USB下载模式。
②、弹出TF卡,然后按下开发板复位按键。
③、打开SecureCRT。
③、双击“mfgtool2-yocto-mx-evk-emmc.vbs”,打开下载软件,如果出现“符合 HID 标准的供应商定义设备”等字样就说明下载软件已经准备就绪。点击“Start”按钮开发烧写NXP官方系统,烧写过程如图39.3.1所示:
image016.jpg
39.3.1 烧写过程
       这个时候可以在SecurCRT上看到具体的烧写过程,如图39.3.2所示:
image018.jpg
39.3.2 正在烧写的文件
       等待烧写完成,因为NXP官方的根文件系统比较大,因此烧写的时候耗时会久一点。烧写完成以后MfgTool软件如图39.3.3所示:
image020.jpg
39.3.2 烧写完成
       烧写完成以后点击“Stop”按钮停止烧写,然后点击“Exit”键退出。拔出USB线,将开发板上的拨码开关拨到EMMC启动模式,然后重启开发板,此时就会从EMMC启动。只是启动以后的系统是NXP官方给I.MX6ULL EVK开发板制作的,这个系统需要输入用户名,用户名为“root”,没有密码,如图39.3.3所示:
image022.jpg
39.3.3 NXP官方根文件系统
       在“imx6ul7d login:”后面输入“root”用户名,然后点击回车键即可进入系统中,进入系统以后就可以进行其他操作了。所以说,NXP官方的系统其实是可以在正点原子的EMMC版核心板上运行的。
39.4 烧写自制的系统39.4.1 系统烧写
       上一小节我们试着将NXP官方提供的系统烧写到正点原子的I.MX6U-ALPHA开发板好中,目的是体验一下通过MfgTool烧写系统的过程。本小节我们就来学习如何将我们做好的系统烧写到开发板中,首先是准备好要烧写的原材料:
       ①、自己移植编译出来的uboot可执行文件:u-boot.imx
       ②、自己移植编译出来的zImage镜像文件和开发板对应的.dtb(设备树),对于I.MX6U-ALPHA开发板来说就是imx6ull-alientek-emmc.dtb
       ③、自己构建的根文件系统rootfs,这里我们需要对rootfs进行打包,进入到Ubuntu中的rootfs目录中,然后使用tar命令对其进行打包,命令如下:
  1. cdrootfs/
  2. tar -vcjf rootfs.tar.bz2 *
复制代码
    完成以后会在rootfs目录下生成一个名为rootfs.tar.bz2的压缩包,将rootfs.tar.bz2发送到windows系统中。
       将上面提到的这4个“原材料”都发送到Windows系统中,如图39.4.1所示:
image024.jpg
39.4.1 烧写原材料
       材料准备好以后还不能直接进行烧写,必须对其进行重命名,否则的话ucl2.xml是识别不出来的,前面讲解ucl2.xml语法的时候已经说过了,图39.4.1中的这四个文件重命名见表39.4.1
55F42B7F-39A7-4fcd-A616-0E776AD69C47.png
39.4.1 文件重命名表
       完成以后如图39.4.2所示:
image026.jpg

39.4.2 重命名以后的文件
接下来就是用我们的文件替换掉NXP官方的文件,先将图39.4.2中的zImageu-boot-imx6ull14x14evk_emmc.imxzImage-imx6ull-14x14-evk-emmc.dtb这三个文件拷贝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/firmware目录中,替换掉原来的文件。然后将图39.4.2中的所有4个文件都拷贝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/files目录中,这两个操作完成以后我们就可以进行烧写了。
       双击“mfgtool2-yocto-mx-evk-emmc.vbs”,打开烧写软件,点击“Start”按钮开始烧写,由于我们自己制作的rootfs比较小,因此烧写相对来说会快一点。烧写完成以后设置开发板从EMMC启动,启动我们刚刚烧写进去的系统,测试有没有问题,一般肯定没问题,因为这些都是我们已经测试好的。
39.4.2 网络开机自启动设置
       大家在测试网络的时候可能会发现网络不能用,这并不是因为我们将系统烧写到EMMC中以后网络坏了。仅仅是因为网络没有打开,我们用NFS挂载根文件系统的时候因为要使用NFS服务,因此Linux内核会打开eth0这个网卡,现在我们不使用NFS挂载根文件系统,因此Linux内核也就不会自动打开eth0网卡了。我们可以手动打开网卡,首先输入“ifconfig-a”命令查看一下eth0eth1是否都存在,结果如图39.4.3所示:
image028.jpg
39.4.3 查看网络
       可以看出eth0eth1都存在,既然存在我们就打开,以打开eth0网卡为例,输入如下命令打开eth0:
  1. ifconfig eth0 up
复制代码
       打开网卡的时候会有如图39.4.4所示的提示信息:
image030.jpg
39.4.5 打开eth0网卡
       打开的时候会提示使用LAN8710/LAN8720的网络芯片,eth0连接成功,并且是100Mpbs全双工,eth0链接准备就绪。这个时候输入“ifconfig”命令就会看到eth0这个网卡,如图39.4.6所示:
image032.jpg
39.4.6 当前工作的网卡
       接下来就是个eth0设置IP地址,如果你的开发板连接的路由器,那么可以通过路由器自动分配IP地址,命令如下:
  1. udhcpc -i eth0       //通过路由器分配IP地址
复制代码
       如果你的开发板连接着电脑,那么就可以手动设置IP地址,比如设置为192.168.1.251,命令如下:
  1. ifconfig eth0 192.168.1.251  netmask 255.255.255.0         //设置IP地址和子网掩码
  2. routeadddefaultgw 192.168.1.1                                       //添加默认网关
复制代码
       推荐大家将开发板连接到路由器上,设置好IP地址以后就可以测试网络了,比如ping一下电脑IP地址,或者ping一下百度官网。
       每次开机以后都要自己手动打开网卡,然后手动设置IP地址也太麻烦了,有没有开机以后自动启动网卡并且设置IP地址的方法呢?肯定有的,我们将打开网卡,设置网卡IP地址的命令添加到/etc/init.d/rcS文件中就行了,完成以后的rcS文件内容如下所示:
//示例代码39.4.2.1 网络开机自启动
  1.   #!/bin/sh

  2.   PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3.   LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
  4.   export PATH LD_LIBRARY_PATH runlevel

  5.   #网络开机自启动设置
  6.   ifconfig eth0 up
  7.   #udhcpc-i eth0  
  8. ifconfig eth0 192.168.1.251 netmask 255.255.255.0
  9. route add default gw 192.168.1.1
  10. ......
  11. #cd /drivers
  12. #./hello &
  13. #cd /
复制代码
       8行,打开eth0网卡
       9行,通过路由器自动获取IP地址。
       10行,手动设置eth0IP地址和子网掩码。
       11行,添加默认网关。
       修改好rcS文件以后保存并退出,重启开发板,这个时候eth0网卡就会在开机的时候自动启动了,我们也就不用手动添加相关设置了。
39.5 改造我们自己的烧写工具39.5.1 改造MfgTool
       在上一小节中我们已经实现了将自己的系统烧写到开发板中,但是使用的是“借鸡生蛋”的方法。我们通过将NXP官方的系统更换成我们自己制作的系统来完成系统烧写,本节我们就来学习一下如何将MfgTool这个工具改造成我们自己的工具,让其支持我们自己的开发板。要改造MfgTool,重点是三方面:
       ①、针对不同的核心版,确定系统文件相关名字。
       ②、新建我们自己的.vbs文件。
       ③、修改ucl2.xml文件。
1、确定系统文件名字
       确定系统文件名字完全是为了兼容不同的产品,比如某个产品有NANDEMMC两个版本,那么EMMCNAND这两个版本的ubootzImage.dtbrootfs有可能不同。为了在MfgTool工具中同时支持EMMCNAND这两个版本的核心板,EMMC版本的系统文件命名如图39.5.1.1所示:
image034.jpg
39.5.1.1 系统文件名
       2、新建.vbs文件
       直接复制mfgtool2-yocto-mx-evk-emmc.vbs文件即可,将新复制的文件重命名为mfgtool2-alientek-alpha-emmc.vbs,文件内容不要做任何修改,.vbs文件我们就新建好了。
       3、修改ucl2.xml文件
       在修改ucl2.xml文件之前,先保存一份原始的ucl2.xml。将ucl2.xml文件改为如下所示内容:
  1. <!-- 正点原子修改后的ucl2.xml文件 -->
  2. <UCL>
  3. <CFG>
  4. <STATEname="BootStrap"dev="MX6UL"vid="15A2"pid="007D"/>
  5. <STATEname="BootStrap"dev="MX6ULL"vid="15A2"pid="0080"/>
  6. <STATEname="Updater"dev="MSC"vid="066F"pid="37FF"/>
  7. </CFG>
  8. <!-- 向EMMC烧写系统 -->
  9. <LISTname="eMMC"desc="Choose eMMC as media">
  10. <CMDstate="BootStrap"type="boot"body="BootStrap"file ="firmware/u-boot-alientek-emmc.imx"ifdev="MX6ULL">Loading U-boot</CMD>
  11. <CMDstate="BootStrap"type="load"file="firmware/zImage-alientek-emmc"address="0x80800000"
  12. loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
  13. <CMDstate="BootStrap"type="load"file="firmware/%initramfs%"address="0x83800000"
  14. loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD>
  15. <CMDstate="BootStrap"type="load"file="firmware/imx6ull-alientek-emmc.dtb"address="0x83000000"
  16. loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6ULL">Loading device tree.</CMD>
  17. <CMDstate="BootStrap"type="jump"> Jumping to OS image. </CMD>
  18. <!-- create partition -->
  19. <CMDstate="Updater"type="push"body="send"file="mksdcard.sh.tar">Sending partition shell</CMD>
  20. <CMDstate="Updater"type="push"body="$tar xf $FILE "> Partitioning...</CMD>
  21. <CMDstate="Updater"type="push"body="$ shmksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>
  22. <!-- burn uboot -->
  23. <CMDstate="Updater"type="push"body="$ ddif=/dev/zero of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD>
  24. <!-- access boot partition -->
  25. <CMDstate="Updater"type="push"body="$echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access bootpartition 1</CMD>
  26. <CMDstate="Updater"type="push"body="send"file="files/u-boot-alientek-emmc.imx"ifdev="MX6ULL">Sending u-boot.bin</CMD>
  27. <CMDstate="Updater"type="push"body="$ ddif=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sdcard</CMD>
  28. <CMDstate="Updater"type="push"body="$echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enableread-only access </CMD>
  29. <CMDstate="Updater"type="push"body="$mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
  30. <!-- create fat partition -->
  31. <CMDstate="Updater"type="push"body="$while [ ! -e /dev/mmcblk%mmc%p1 ]; do sleep 1; echo "waiting..."; done ">Waiting for the partition ready</CMD>
  32. <CMDstate="Updater"type="push"body="$mkfs.vfat /dev/mmcblk%mmc%p1">Formatting rootfs partition</CMD>
  33. <CMDstate="Updater"type="push"body="$mkdir -p /mnt/mmcblk%mmc%p1"/>
  34. <CMDstate="Updater"type="push"body="$mount -t vfat /dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>
  35. <!-- burn zImage -->
  36. <CMDstate="Updater"type="push"body="send"file="files/zImage-alientek-emmc">Sending kernelzImage</CMD>
  37. <CMDstate="Updater"type="push"body="$ cp$FILE /mnt/mmcblk%mmc%p1/zImage">write kernel image to sd card</CMD>
  38. <!-- burn dtb -->
  39. <CMDstate="Updater"type="push"body="send"file="files/imx6ull-alientek-emmc.dtb"ifdev="MX6ULL">Sending Device Tree file</CMD>
  40. <CMDstate="Updater"type="push"body="$ cp$FILE /mnt/mmcblk%mmc%p1/imx6ull-alientek-emmc.dtb"ifdev="MX6ULL">write device tree to sd card</CMD>
  41. <CMDstate="Updater"type="push"body="$umount /mnt/mmcblk%mmc%p1">Unmounting vfat partition</CMD>
  42. <!-- burn rootfs -->
  43. <CMDstate="Updater"type="push"body="$mkfs.ext3 -F -E nodiscard /dev/mmcblk%mmc%p2">Formatting rootfs partition</CMD>
  44. <CMDstate="Updater"type="push"body="$mkdir -p /mnt/mmcblk%mmc%p2"/>
  45. <CMDstate="Updater"type="push"body="$mount -t ext3 /dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
  46. <CMDstate="Updater"type="push"body="pipetar -jxv -C /mnt/mmcblk%mmc%p2"file="files/rootfs-alientek-emmc.tar.bz2"ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfs</CMD>
  47. <CMDstate="Updater"type="push"body="frf">Finishing rootfswrite</CMD>
  48. <CMDstate="Updater"type="push"body="$umount /mnt/mmcblk%mmc%p2">Unmounting rootfs partition</CMD>
  49. <CMDstate="Updater"type="push"body="$echo Update Complete!">Done</CMD>
  50. </LIST>
  51. </UCL>
复制代码
       ucl2.xml文件我们仅仅保留了给EMMC烧写系统,如果要支持NAND的话可以自行参考原版的ucl2.xml文件,添加相关的内容。
39.5.2 烧写测试
MfgTool工具修改好以后就可以进行烧写测试了,将imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx和zImage-alientek-emmc这三个文件复制到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/firmware目录中。将imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx、zImage-alientek-emmc和 rootfs-alientek-emmc.tar.bz2这四个文件复制到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/files目录中。
       点击“mfgtool2-alientek-alpha-emmc.vbs”打开MfgTool烧写系统,等待烧写完成,然后设置拨码开关为EMMC启动,重启开发板,系统启动信息如图39.5.2.1所示:
image036.jpg
39.5.2.1 系统启动log信息
       从图39.5.2.1可以看出,出现“Starting kernel ...”以后就再也没有任何信息输出了,说明Linux内核启动失败了。接下来就是解决为何Linux内核启动失败这个问题。
39.5.3 解决Linux内核启动失败
       上一小节我们启动系统以后发现输出“Starting kernel ...”以后就再也没有任何信息了,难道是系统烧写错误了?可以确定的是uboot启动正常,就是在启动Linux的时候出问题了,仔细观察uboot输出的log信息,会发现如图39.5.3.1所示两行信息:
image038.jpg
39.5.3.1 读取设备树出错
       从图39.5.3.1可以看出,在读取“imx6ull-14x14-evk.dtb”这个设备树文件的时候出错了。重启uboot,进入到命令行模式,输入如下命令查看EMMC的分区1里面有没有设备树文件:
  1. mmcdev 1             //切换到EMMC
  2. lsmmc 1:1             //输出EMMC1分区1中的所有文件
复制代码
       结果如图39.5.3.2所示:
image040.jpg
39.5.3.2 EMMC分区1文件
       从图39.5.3.2可以看出,此时EMMC的分区1中是存在设备树文件的,只是文件名字为:imx6ull-alientek-emmc.dtb,因此读取imx6ull-14x14-evk.dtb肯定会出错的,因为根本就不存在这个文件。之所以出现这个错误的原因是因为uboot里面默认的设备树名字就是imx6ull-14x14-evk.dtb,这个我们在讲解uboot的时候就已经说过了。解决方法很简单,有两种方法:
       1、重新设置bootcmd环境变量值
       进入uboot的命令行,重新设置bootcmdbootargs这两个环境变量的值,这里要注意的是bootargs的值也要重新设置一下,命令如下:
  1. setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000zImage;fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 -83000000'
  2. setenvbootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
  3. saveenv
复制代码
设置好bootcmdbootargs这两个环境变量以后重启开发板,Linux系统就可以正常启动。
       2、修改uboot源码
       1种方法每次重新烧写系统以后都要先手动设置一下bootcmd的值,这样有点麻烦,有没有一劳永逸的方法呢?肯定是有的,就是直接修改uboot源码。打开uboot源码中的文件include/configs/mx6ull_alientek_emmc.h,在宏CONFIG_EXTRA_ENV_SETTINGS中找到如下所示内容:
示例代码39.5.3.1 查找设备树文件
  1. "findfdt="\
  2. "if test$fdt_file = undefined; then " \
  3. "if test$board_name = EVK && test $board_rev = 9X9; then " \
  4. "setenv fdt_fileimx6ull-9x9-evk.dtb; fi; " \
  5. "if test$board_name = EVK && test $board_rev = 14X14; then " \
  6. "setenvfdt_file imx6ull-14x14-evk.dtb; fi; " \
  7. "if test$fdt_file = undefined; then " \
  8. "echo WARNING:Could not determine dtb to use; fi; " \
  9. "fi;\0" \
复制代码
       findfdt就是用于确定设备树文件名字的环境变量,fdt_file环境变量保存着设备树文件名。第196行和197行用于判断设备树文件名字是否为imx6ull-9x9-evk.dtb,第198行和199行用于判断设备树文件名字是否为imx6ull-14x14-evk.dtb。这两个设备树都是NXP官方开发板使用的,I.MX6U-ALPHA开发板用不到,因此直接将示例代码39.5.3.1findfdt的值改为如下内容:
示例代码39.5.3.1 查找设备树文件
  1. "findfdt="\
  2. "if test$fdt_file = undefined; then " \
  3. "setenvfdt_file imx6ull-alientek-emmc.dtb; " \
  4. "fi;\0" \
复制代码
       196行,如果fdt_file未定义的话,直接设置fdt_file= imx6ull-alientek-emmc.dtb,简单直接,不需要任何的判断语句。修改后以后重新编译uboot,然后用将新的uboot烧写到开发板中,烧写完成以后重启测试,Linux内核启动正常。
       关于系统烧写就讲解到这里,本章我们使用NXP提供的MfgTool工具通过USB OTG口向开发板的EMMC中烧写ubootLinuxkernel.dtb(设备树)rootfs这四个文件。在本章我们主要做了五个工作:
       ①、理解MfgTool工具的工作原理。
       ②、使用MfgTool工具将NXP官方系统烧写到I.MX6U-ALPHA开发板中,主要是为了体验一下MfgTool软件的工作流程以及烧写方法。
       ③、使用MfgTool工具将我们自己编译出来的系统烧写到I.MX6U-ALPHA开发板中。
       ④、修改MfgTool工具,使其支持我们所使用的硬件平台。
       ⑤、修改相应的错误。
       关于系统烧写的方法就讲解到这里,本章内容不仅仅是为了讲解如何向I.MX6ULL芯片中烧写系统,更重要的是向大家详细的讲解了MfgTool的工作原理。如果大家在后续的工作或学习中使用I.MX7或者I.MX8等芯片,本章同样适用。
       随着本章的结束,也宣告着本书第三篇的内容也正式结束了,第三篇是系统移植篇,重点就是ubootLinuxkernelrootfs的移植,看似简简单单的“移植”两个字,引出的却是一篇300多页的“爱恨情仇”。授人以鱼不如授人以渔,本可以简简单单的教大家修改哪些文件、添加哪些内容,怎么去编译,然后得到哪些文件。但是这样只能看到表象,并不能深入的了解其原理,为了让大家能够详细的了解整个流程,笔者义无反顾的选择了这条最难走的路,不管是uboot还是Linuxkernel,从Makefile到启动流程,都尽自己最大的努力去阐述清楚。奈何,笔者水平有限,还是有很多的细节没有处理好,大家有疑问的地方可以到正点原子论坛www.openedv.com上发帖留言,大家一起讨论学习。






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 03:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表