「正点原子Linux连载」第三十九章系统烧写
1)实验平台:正点原子Linux开发板
2)摘自《正点原子嵌入式Linux驱动开发指南》

前面我们已经移植好了uboot和linuxkernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中肯定不可能通过网络来运行,否则没网的时候产品岂不是就歇菜了。因此我们需要将uboot、linuxkernel、.dtb(设备树)和rootfs这四个文件烧写到板子上的EMMC、NAND或QSPIFlash等其他存储设备上,这样不管有没有网络我们的产品都可以正常运行。本章我们就来学习一下如何使用NXP官方提供的MfgTool工具通过USBOTG口来烧写系统。
39.1MfgTool工具简介MfgTool工具是NXP提供的专门用于给系列CPU烧写系统的软件,可以在NXP官网下载到。此工具已经放到了开发板光盘中,路劲为:5、开发工具-3、NXP官方原版MFG_TOOL烧写工具-_2.0.0-ga_。此软件在Windows下使用,对于我们来说太友好了。将此压缩包进行解压,解压完成以后会出现一个名为_2.0.0-ga_mfg-tools的文件夹,进入此文件夹,此文件夹的内容如图39.1.1所示:

图39.1.1mfg_tools工具目录
从图39.1.1可以看出,有两个.txt文件和两个.gz压缩包。.txt文档就不去看了,重点是这两个.gz压缩包,这两个压缩包的区别在名字上已经写的很详细了。"without-rootfs"和"with-rootfs",一个是带rootfs和一个是不带rootfs。mfg_tools这个工具本意是给NXP自己的开发板设计的烧写软件,所以肯定带有自家开发板对应的uboot、linuxkernel和rootfs的文件。我们肯定是要烧写文件系统的,所以选择这个压缩包,继续对其解压,解压出一个名为mfgtools-with-rootfs的文件夹,此文件夹就包含有我们需要的烧写工具。
进入目录mfgtools-with-rootfs\mfgtools中,在此目录下有几个文件夹和很多的.vbs文件,如图39.1.2所示:
图39.1.2mfgtools目录内容
我们只关心图39.1.2中Profiles这个文件夹,因为后面要烧写文件就放到这个文件夹中。就是烧写软件,但是我们不会直接打开这个软件烧写,mfg_tools不仅能烧写,而且也能给、等芯片烧写,所以在烧写之前必须要进行配置,指定烧写的是什么芯片,烧写到哪里去?下面的这些众多的.vbs文件就是配置脚本,烧写的时候通过双击这些.vbs文件来打开烧写工具。这些.vbs烧写脚本既可以根据处理器的不同,由用户选择向、、、、和等的哪一款芯片烧写系统。也可以根据存储芯片的不同,选择向EMMC、NAND或QSPIFlash等的哪一种存储设备烧写,功能非常强大!!我们现在需要向烧写系统,因此需要参考表39.1.1所示的5个烧写脚本:
表39.1.1使用的烧写脚本
其他的.vbs烧写脚本用不到,因此可以删除掉,防止干扰我们的视线。本书用的是正点原子的EMMC版核心板,因此只会用到这个烧写脚本,如果用其他的核心板请参考相应的烧写脚本。
39.2MfgTool工作原理简介MfgTool只是个工具,具体的原理不需要去深入研究,大概来了解一下其工作原理就行了,知道它的工作流程就行了。
39.2.1烧写方式1、连接USB线
MfgTool是通过USBOTG接口将系统烧写进EMMC中的,正点原子开发板上的USBOTG口如图39.2.1.1所示:
图39.2.2.1USBOTG1接口
在烧写之前,需要先用USB线将图39.2.2.1中的USB_OTG1接口与电脑连接起来。
2、拨码开关拨到USB下载模式
将图39.2.2.1中的拨码开关拨到"USB"模式,如图39.2.2.2所示:
图39.2.2.2USB下载模式
如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!
如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!
如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!
一切准备就绪以后,按一下开发板的复位键,此时就会进入到USB模式,如果是第一次进入USB模式的话可能会久一点,这个是免驱的,因此不需要安装驱动。第一次进入USB模式会在电脑右下角有如图39.2.2.3所示提示:
图39.2.2.3第一次进入USB模式
一旦第一次设置好设备以后,后面每次连接都不会有任何提示了。到这里,我们的开发板已经和电脑连接好了,可以开始烧写系统了。
39.2.2系统烧写原理开发板连接电脑以后双击"",打开下载对话框,如图39.2.2.1所示:
图39.2.2.1MfgTool工具界面
_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware
此目录中的文件如图39.2.2.2所示:
图39.2.2.2OSFirmware文件夹内容
①、将firmware目录中的uboot、linuxkernel和.dtb(设备树),然后通过USBOTG将这个文件下载到开发板的DDR中,目的就是在DDR中启动Linux系统,为后面的烧写做准备。
②、经过第①步的操作,此时Linux系统已经运行起来了,系统运行起来以后就可以很方便的完成对EMMC的格式化、分区等操作。EMMC分区建立好以后就可以从firmware中读取要烧写的uboot、linuxkernel、.dtb(设备树)和rootfs这4个文件,然后将其烧写到EMMC中,这个就是MfgTool的大概工作流程。
1、firmeare文件夹
打开firmware文件夹,里面有很多的.imx结尾的uboot文件、一个zImage镜像文件、很多.dtb结尾的设备树文件。这些文件都是NXP官方开发板使用的,不同的板子使用不同的文件,其中我们需要关心的只有表39.2.2.1中的这三个文件:
表39.2.2.1开发板使用的系统文件
表39.2.2.1中的这三个文件就是开发板烧写系统的时候第一阶段所需的文件。如果要烧写我们的系统,就需要用我们编译出来的zImage、和这三个文件替换掉表39.2.2.1中这三个文件。但是名字要和表39.2.2.1中的一致,因此需要将重命名为u-boot-imx6ull14x14evk_,将重命名为。
2、files文件夹
将表39.2.2.1中的这三个文件下载到开发板的DDR上以后烧写的第一阶段就完成了,第二阶段就是从files目录中读取整个系统文件,并将其烧写到EMMC中。files目录中的文件和firmware目录中的基本差不多,都是不同板子对应的uboot、设备树文件,同样,我们只关心表39.2.2.2中的四个文件:
表39.2.2.2开发板烧写文件
如果要烧写我们自己编译出来的系统,就需要用我们编译出来的zImage、和和rootfs这四个文件替换掉表39.2.2.2中这四个文件。
3、文件
files和firmware目录下有众多的uboot和设备树,那么烧写的时候究竟选择哪一个呢?这个工作就是由文件来完成的。以"UCL"开始,以"/UCL"结束。"CFG"和"/CFG"之间是配置相关内容,主要是判断当前是给系列的哪个芯片烧写系统。"LIST"和"/LIST"之间的是针对不同存储芯片的烧写命令。整体框架如下:
示例代码39.2.2.1框架
UCL
CFG
!--判断向系列的哪个芯片烧写系统--
/CFG
LISTname="SDCard"desc="ChooseSDCardasmedia"
!--向SD卡烧写Linux系统--
/LIST
LISTname="eMMC"desc="ChooseeMMCasmedia"
!--向EMMC烧写Linux系统--
/LIST
LISTname="NorFlash"desc="ChooseNorflashasmedia"
!--向NorFlash烧写Linux系统--
/LIST
LISTname="QuadNorFlash"desc="ChooseQuadNorflashasmedia"
!--向QuadNorFlash烧写Linux系统--
/LIST
LISTname="NANDFlash"desc="ChooseNANDasmedia"
!--向NANDFlash烧写Linux系统--
/LIST
LISTname="SDCard-Android"desc="ChooseSDCardasmedia"
!--向SD卡烧写Android系统--
/LIST
LISTname="eMMC-Android"desc="ChooseeMMCasmedia"
!--向EMMC烧写Android系统--
/LIST
LISTname="Nand-Android"desc="ChooseNANDasmedia"
!--向NANDFlash烧写Android系统--
/LIST
LISTname="SDCard-Brillo"desc="ChooseSDCardasmedia"
!--向SD卡烧写Brillo系统--
/LIST
/UCL
首先会判断当前要向系列的哪个芯片烧写系统,代码如下:
示例代码39.2.2.2判断要烧写的处理器型号
21CFG
22STATEname="BootStrap"dev="MX6SL"vid="15A2"pid="0063"/
23STATEname="BootStrap"dev="MX6D"vid="15A2"pid="0061"/
24STATEname="BootStrap"dev="MX6Q"vid="15A2"pid="0054"/
25STATEname="BootStrap"dev="MX6SX"vid="15A2"pid="0071"/
26STATEname="BootStrap"dev="MX6UL"vid="15A2"pid="007D"/
27STATEname="BootStrap"dev="MX7D"vid="15A2"pid="0076"/
28STATEname="BootStrap"dev="MX6ULL"vid="15A2"pid="0080"/
29STATEname="Updater"dev="MSC"vid="066F"pid="37FF"/
30/CFG
通过读取芯片的VID和PID即可判断出当前要烧写什么处理器的系统,如果VID=0X15A2,PID=0080,那么就表示要给烧写系统。确定了处理器以后就要确定向什么存储设备烧写系统,这个时候就要有请再次登场,此文件内容如下:
示例代码39.2.2.3文件内容
SetwshShell=CreateObject("")
"""linux""-l""eMMC""-s""board=sabresd""-s""mmc=1""-s""6uluboot=14x14evk""-s""6uldtb=14x14-evk"""
SetwshShell=Nothing
重点是""这一行,这里一行调用了这个软件,并且还给出了一堆的参数,其中就有"eMMC"字样,说明是向EMMC烧写系统,要烧写的存储设备就这样确定下来了。""后面还有一堆的其他参数,这些参数都有对应的值,如下所示:
board=sabresd
mmc=1
6uluboot=14x14evk
6uldtb=14x14-evk
我们继续回到中,既然现在已经知道了是向的EMMC中烧写系统,那么直接在中找到相应的烧写命令就行了,因为相应的命令太长,为了缩小篇幅,我们就以uboot的烧写为例讲解一下。前面说了烧写分两个阶段,第一步是通过USBOTG向DDR中下载系统,第二步才是正常的烧写。通过USBOTG向DDR下载uboot的命令如下:
示例代码39.2.2.4通过USBOTG下载uboot
CMDstate="BootStrap"type="boot"body="BootStrap"file="firmware/u-boot-imx6ul%lite%%6uluboot%_"ifdev="MX6ULL"LoadingU-boot
/CMD
上面的命令就是BootStrap阶段,也就是第一阶段,"file"表示要下载的文件位置,在firmware目录下,文件名字为
u-boot-imx6ul%lite%%6uluboot%_
在_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools-with-rootfs\mfgtools下找到文件,该文件里包含了开发板的一些信息,查看文件可得lite=l以及一些字符串代表的值。
"%lite%"和"%6uluboot%"分别表示取lite和6uluboot的值,而lite=l,6uluboot=14x14evk,因此将这来个值带进去以后就是:
u-boot-imx6ull14x14evk_
所以,这里向DDR中下载的是firmware/u-boot-imx6ull14x14evk_这个uboot文件。同样的方法将.dtb(设备树)和zImage都下载到DDR中以后就会跳转去运行OS,这个时候会在MfgTool工具中会有"JumpingtoOSimage"提示语句,中的跳转命令如下:
示例代码39.2.2.5跳转到OS
CMDstate="BootStrap"type="jump"JumpingtoOSimage./CMD
启动Linux系统以后就可以在EMMC上创建分区,然后烧写uboot、zImage、.dtb(设备树)和根文件系统。
这个就是MfgTool的整个烧写原理,弄懂了烧写原理以后就可以开始试着先将NXP官方的系统烧写到正点原子的开发板中。
39.3烧写NXP官方系统我们先试着将NXP官方的系统烧写到正点原子的开发板中,主要是先熟悉一下烧写过程。因为正点原子的EMMC核心版用的也是512MB的DDR3加4G的EMMC,因此烧写NXP官方的系统是没有任何问题的。烧写步骤如下:
①、连接好USB,拨码开关拨到USB下载模式。
②、弹出TF卡,然后按下开发板复位按键。
③、打开SecureCRT。
图39.3.1烧写过程
这个时候可以在SecurCRT上看到具体的烧写过程,如图39.3.2所示:
图39.3.2正在烧写的文件
等待烧写完成,因为NXP官方的根文件系统比较大,因此烧写的时候耗时会久一点。烧写完成以后MfgTool软件如图39.3.3所示:
图39.3.2烧写完成
图39.3.3NXP官方根文件系统
39.4烧写自制的系统39.4.1系统烧写上一小节我们试着将NXP官方提供的系统烧写到正点原子的开发板好中,目的是体验一下通过MfgTool烧写系统的过程。本小节我们就来学习如何将我们做好的系统烧写到开发板中,首先是准备好要烧写的原材料:
①、自己移植编译出来的uboot可执行文件:。
②、自己移植编译出来的zImage镜像文件和开发板对应的.dtb(设备树),对于开发板来说就是。
③、自己构建的根文件系统rootfs,这里我们需要对rootfs进行打包,进入到Ubuntu中的rootfs目录中,然后使用tar命令对其进行打包,命令如下:
cdrootfs/
*
完成以后会在rootfs目录下生成一个名为的压缩包,将发送到windows系统中。
将上面提到的这4个"原材料"都发送到Windows系统中,如图39.4.1所示:
图39.4.1烧写原材料
材料准备好以后还不能直接进行烧写,必须对其进行重命名,否则的话是识别不出来的,前面讲解语法的时候已经说过了,图39.4.1中的这四个文件重命名见表39.4.1:
表39.4.1文件重命名表
完成以后如图39.4.2所示:
图39.4.2重命名以后的文件
接下来就是用我们的文件替换掉NXP官方的文件,先将图39.4.2中的zImage、u-boot-imx6ull14x14evk_和这三个文件拷贝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/firmware目录中,替换掉原来的文件。然后将图39.4.2中的所有4个文件都拷贝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/files目录中,这两个操作完成以后我们就可以进行烧写了。
39.4.2网络开机自启动设置大家在测试网络的时候可能会发现网络不能用,这并不是因为我们将系统烧写到EMMC中以后网络坏了。仅仅是因为网络没有打开,我们用NFS挂载根文件系统的时候因为要使用NFS服务,因此Linux内核会打开eth0这个网卡,现在我们不使用NFS挂载根文件系统,因此Linux内核也就不会自动打开eth0网卡了。我们可以手动打开网卡,首先输入"ifconfig-a"命令查看一下eth0和eth1是否都存在,结果如图39.4.3所示:
图39.4.3查看网络
可以看出eth0好eth1都存在,既然存在我们就打开,以打开eth0网卡为例,输入如下命令打开eth0:
ifconfigeth0up
打开网卡的时候会有如图39.4.4所示的提示信息:
图39.4.5打开eth0网卡
打开的时候会提示使用LAN8710/LAN8720的网络芯片,eth0连接成功,并且是100Mpbs全双工,eth0链接准备就绪。这个时候输入"ifconfig"命令就会看到eth0这个网卡,如图39.4.6所示:
图39.4.6当前工作的网卡
接下来就是个eth0设置IP地址,如果你的开发板连接的路由器,那么可以通过路由器自动分配IP地址,命令如下:
udhcpc-ieth0//通过路由器分配IP地址
如果你的开发板连接着电脑,那么就可以手动设置IP地址,比如设置为192.168.1.251,命令如下:
//设置IP地址和子网掩码
//添加默认网关
推荐大家将开发板连接到路由器上,设置好IP地址以后就可以测试网络了,比如ping一下电脑IP地址,或者ping一下百度官网。
每次开机以后都要自己手动打开网卡,然后手动设置IP地址也太麻烦了,有没有开机以后自动启动网卡并且设置IP地址的方法呢?肯定有的,我们将打开网卡,设置网卡IP地址的命令添加到/etc//rcS文件中就行了,完成以后的rcS文件内容如下所示:
//示例代码39.4.2.1网络开机自启动
1网络开机自启动设置
8ifconfigeth0up
9cd/drivers
13cd/
第8行,打开eth0网卡
第9行,通过路由器自动获取IP地址。
第10行,手动设置eth0的IP地址和子网掩码。
第11行,添加默认网关。
修改好rcS文件以后保存并退出,重启开发板,这个时候eth0网卡就会在开机的时候自动启动了,我们也就不用手动添加相关设置了。
39.5改造我们自己的烧写工具39.5.1改造MfgTool在上一小节中我们已经实现了将自己的系统烧写到开发板中,但是使用的是"借鸡生蛋"的方法。我们通过将NXP官方的系统更换成我们自己制作的系统来完成系统烧写,本节我们就来学习一下如何将MfgTool这个工具改造成我们自己的工具,让其支持我们自己的开发板。要改造MfgTool,重点是三方面:
①、针对不同的核心版,确定系统文件相关名字。
②、新建我们自己的.vbs文件。
③、修改文件。
1、确定系统文件名字
确定系统文件名字完全是为了兼容不同的产品,比如某个产品有NAND和EMMC两个版本,那么EMMC和NAND这两个版本的uboot、zImage、.dtb和rootfs有可能不同。为了在MfgTool工具中同时支持EMMC和NAND这两个版本的核心板,EMMC版本的系统文件命名如图39.5.1.1所示:
图39.5.1.1系统文件名
2、新建.vbs文件
直接复制文件即可,将新复制的文件重命名为,文件内容不要做任何修改,.vbs文件我们就新建好了。
3、修改文件
在修改文件之前,先保存一份原始的。将文件改为如下所示内容:
!--正点原子修改后的文件--
UCL
CFG
STATEname="BootStrap"dev="MX6UL"vid="15A2"pid="007D"/
STATEname="BootStrap"dev="MX6ULL"vid="15A2"pid="0080"/
STATEname="Updater"dev="MSC"vid="066F"pid="37FF"/
/CFG
!--向EMMC烧写系统--
LISTname="eMMC"desc="ChooseeMMCasmedia"
CMDstate="BootStrap"type="boot"body="BootStrap"file="firmware/"ifdev="MX6ULL"LoadingU-boot/CMD
CMDstate="BootStrap"type="load"file="firmware/zImage-alientek-emmc"address="0x80800000"
loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6SLMX6SXMX7DMX6ULMX6ULL"LoadingKernel./CMD
CMDstate="BootStrap"type="load"file="firmware/%initramfs%"address="0x83800000"
loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6SLMX6SXMX7DMX6ULMX6ULL"LoadingInitramfs./CMD
CMDstate="BootStrap"type="load"file="firmware/"address="0x83000000"
loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6ULL"Loadingdevicetree./CMD
CMDstate="BootStrap"type="jump"JumpingtoOSimage./CMD
!--createpartition--
CMDstate="Updater"type="push"body="s"file=""Singpartitionshell/CMD
CMDstate="Updater"type="push"body="$tarxf$FILE"Partitioning/CMD
CMDstate="Updater"type="push"body="$/dev/mmcblk%mmc%"Partitioning/CMD
!--burnuboot--
CMDstate="Updater"type="push"body="$ddif=/dev/zeroof=/dev/mmcblk%mmc%bs=1kseek=768conv=fsynccount=8"clearu-bootarg/CMD
!--accessbootpartition--
CMDstate="Updater"type="push"body="$echo0/sys/block/mmcblk%mmc%boot0/force_ro"accessbootpartition1/CMD
CMDstate="Updater"type="push"body="s"file="files/"ifdev="MX6ULL"/CMD
CMDstate="Updater"type="push"body="$ddif=$FILEof=/dev/mmcblk%mmc%boot0bs=512seek=2"writeU-Boottosdcard/CMD
CMDstate="Updater"type="push"body="$echo1/sys/block/mmcblk%mmc%boot0/force_ro"re-enableread-onlyaccess/CMD
CMDstate="Updater"type="push"body="$mmcbootpartenable11/dev/mmcblk%mmc%"enablebootpartion1toboot/CMD
!--createfatpartition--
CMDstate="Updater"type="push"body="$while[!-e/dev/mmcblk%mmc%p1];dosleep1;echo\"waiting\";done"Waitingforthepartitionready/CMD
CMDstate="Updater"type="push"body="$/dev/mmcblk%mmc%p1"Formattingrootfspartition/CMD
CMDstate="Updater"type="push"body="$mkdir-p/mnt/mmcblk%mmc%p1"/
CMDstate="Updater"type="push"body="$mount-tvfat/dev/mmcblk%mmc%p1/mnt/mmcblk%mmc%p1"/
!--burnzImage--
CMDstate="Updater"type="push"body="s"file="files/zImage-alientek-emmc"SingkernelzImage/CMD
CMDstate="Updater"type="push"body="$cp$FILE/mnt/mmcblk%mmc%p1/zImage"writekernelimagetosdcard/CMD
!--burndtb--
CMDstate="Updater"type="push"body="s"file="files/"ifdev="MX6ULL"SingDeviceTreefile/CMD
CMDstate="Updater"type="push"body="$cp$FILE/mnt/mmcblk%mmc%p1/"ifdev="MX6ULL"writedevicetreetosdcard/CMD
CMDstate="Updater"type="push"body="$umount/mnt/mmcblk%mmc%p1"Unmountingvfatpartition/CMD
!--burnrootfs--
CMDstate="Updater"type="push"body="$/dev/mmcblk%mmc%p2"Formattingrootfspartition/CMD
CMDstate="Updater"type="push"body="$mkdir-p/mnt/mmcblk%mmc%p2"/
CMDstate="Updater"type="push"body="$mount-text3/dev/mmcblk%mmc%p2/mnt/mmcblk%mmc%p2"/
CMDstate="Updater"type="push"body="pipetar-jxv-C/mnt/mmcblk%mmc%p2"file="files/"ifdev="MX6ULMX7DMX6ULL"Singandwrittingrootfs/CMD
CMDstate="Updater"type="push"body="frf"Finishingrootfswrite/CMD
CMDstate="Updater"type="push"body="$umount/mnt/mmcblk%mmc%p2"Unmountingrootfspartition/CMD
CMDstate="Updater"type="push"body="$echoUpdateComplete!"Done/CMD
/LIST
/UCL
文件我们仅仅保留了给EMMC烧写系统,如果要支持NAND的话可以自行参考原版的文件,添加相关的内容。
39.5.2烧写测试MfgTool工具修改好以后就可以进行烧写测试了,将、和zImage-alientek-emmc这三个文件复制到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/firmware目录中。将、、zImage-alientek-emmc和这四个文件复制到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OSFirmware/files目录中。
图39.5.2.1系统启动log信息
从图39.5.2.1可以看出,出现"Startingkernel"以后就再也没有任何信息输出了,说明Linux内核启动失败了。接下来就是解决为何Linux内核启动失败这个问题。
39.5.3解决Linux内核启动失败上一小节我们启动系统以后发现输出"Startingkernel"以后就再也没有任何信息了,难道是系统烧写错误了?可以确定的是uboot启动正常,就是在启动Linux的时候出问题了,仔细观察uboot输出的log信息,会发现如图39.5.3.1所示两行信息:
图39.5.3.1读取设备树出错
从图39.5.3.1可以看出,在读取""这个设备树文件的时候出错了。重启uboot,进入到命令行模式,输入如下命令查看EMMC的分区1里面有没有设备树文件:
mmcdev1//切换到EMMC
lsmmc1:1//输出EMMC1分区1中的所有文件
结果如图39.5.3.2所示:
图39.5.3.2EMMC分区1文件
从图39.5.3.2可以看出,此时EMMC的分区1中是存在设备树文件的,只是文件名字为:,因此读取肯定会出错的,因为根本就不存在这个文件。之所以出现这个错误的原因是因为uboot里面默认的设备树名字就是,这个我们在讲解uboot的时候就已经说过了。解决方法很简单,有两种方法:
1、重新设置bootcmd环境变量值
进入uboot的命令行,重新设置bootcmd和bootargs这两个环境变量的值,这里要注意的是bootargs的值也要重新设置一下,命令如下:
setenvbootcmd'mmcdev1;fatloadmmc1:180800000zImage;fatloadmmc1:183000000;bootz8080'
setenvbootargs'console=ttymxc0,115200root=/dev/mmcblk1p2rootwaitrw'
saveenv
设置好bootcmd和bootargs这两个环境变量以后重启开发板,Linux系统就可以正常启动。
2、修改uboot源码
第1种方法每次重新烧写系统以后都要先手动设置一下bootcmd的值,这样有点麻烦,有没有一劳永逸的方法呢?肯定是有的,就是直接修改uboot源码。打开uboot源码中的文件include/configs/mx6ull_alientek_,在宏CONFIG_EXTRA_ENV_SETTINGS中找到如下所示内容:
示例代码39.5.3.1查找设备树文件
194"findfdt="\
195"iftest$fdt_file=undefined;then"\
196"iftest$board_name=EVKtest$board_rev=9X9;then"\
197"setenvfdt_;fi;"\
198"iftest$board_name=EVKtest$board_rev=14X14;then"\
199"setenvfdt_;fi;"\
200"iftest$fdt_file=undefined;then"\
201"echoWARNING:Couldnotdeterminedtbtouse;fi;"\
202"fi;\0"\
findfdt就是用于确定设备树文件名字的环境变量,fdt_file环境变量保存着设备树文件名。第196行和197行用于判断设备树文件名字是否为,第198行和199行用于判断设备树文件名字是否为。这两个设备树都是NXP官方开发板使用的,开发板用不到,因此直接将示例代码39.5.3.1中findfdt的值改为如下内容:
示例代码39.5.3.1查找设备树文件
194"findfdt="\
195"iftest$fdt_file=undefined;then"\
196"setenvfdt_;"\
197"fi;\0"\
第196行,如果fdt_file未定义的话,直接设置fdt_file=,简单直接,不需要任何的判断语句。修改后以后重新编译uboot,然后用将新的uboot烧写到开发板中,烧写完成以后重启测试,Linux内核启动正常。
关于系统烧写就讲解到这里,本章我们使用NXP提供的MfgTool工具通过USBOTG口向开发板的EMMC中烧写uboot、Linuxkernel、.dtb(设备树)和rootfs这四个文件。在本章我们主要做了五个工作:
①、理解MfgTool工具的工作原理。
②、使用MfgTool工具将NXP官方系统烧写到开发板中,主要是为了体验一下MfgTool软件的工作流程以及烧写方法。
③、使用MfgTool工具将我们自己编译出来的系统烧写到开发板中。
④、修改MfgTool工具,使其支持我们所使用的硬件平台。
⑤、修改相应的错误。
关于系统烧写的方法就讲解到这里,本章内容不仅仅是为了讲解如何向芯片中烧写系统,更重要的是向大家详细的讲解了MfgTool的工作原理。如果大家在后续的工作或学习中使用或者等芯片,本章同样适用。
随着本章的结束,也宣告着本书第三篇的内容也正式结束了,第三篇是系统移植篇,重点就是uboot、Linuxkernel和rootfs的移植,看似简简单单的"移植"两个字,引出的却是一篇300多页的"爱恨情仇"。授人以鱼不如授人以渔,本可以简简单单的教大家修改哪些文件、添加哪些内容,怎么去编译,然后得到哪些文件。但是这样只能看到表象,并不能深入的了解其原理,为了让大家能够详细的了解整个流程,笔者义无反顾的选择了这条最难走的路,不管是uboot还是Linuxkernel,从Makefile到启动流程,都尽自己最大的努力去阐述清楚。奈何,笔者水平有限,还是有很多的细节没有处理好,大家有疑问的地方可以到正点原子论坛上发帖留言,大家一起讨论学习。
第四篇ARMLinux驱动开发篇前面3篇,我们学习Ubuntu操作系统、学习ARM裸机、学习系统移植,其目的就是为了本篇做准备。本篇应该是大家最期待的内容了,毕竟大部分学习者的最初目的就是学习Linux驱动开发。本篇我们将会详细讲解Linux中的三大类驱动:字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是占用篇幅最大的一类驱动,因为字符设备最多,从最简单的点灯到I2C、SPI、音频等都属于字符设备驱动的类型。块设备和网络设备驱动要比字符设备驱动复杂,就是因为其复杂所以半导体厂商一般都给我们编写好了,大多数情况下都是直接可以使用的。所谓的块设备驱动就是存储器设备的驱动,比如EMMC、NAND、SD卡和U盘等存储设备,因为这些存储设备的特点是以存储块为基础,因此叫做块设备。网络设备驱动就更好理解了,就是网络驱动,不管是有线的还是无线的,都属于网络设备驱动的范畴。一个设备可以属于多种设备驱动类型,比如USBWIFI,其使用USB接口,所以属于字符设备,但是其又能上网,所以也属于网络设备驱动。本篇我们就围绕着三大设备驱动类型展开,尽可能详细的讲解每种设备驱动的开发方式。
本书使用的Linux内核版本为4.1.15,其支持设备树(Devicetree),所以本篇所有例程均采用设备树。设备树将是本篇的重点!从设备树的基本原理到设备树驱动的开发方式,从最简单的点灯到复杂的网络驱动开发,本篇均有详细的讲解,是学习设备树的不二之选。
最后,祝大家学习愉快!
推荐阅读
-
湛江科技学院诚聘部分行政教辅人员公告
一、学校概况湛江科技学院坐落在中国大陆最南端的美丽港城湛江市,是一所全日制普通本科院校。学校于1999年由广东海洋大学与湛江寸金教育集团合作创办,2006年经教育部批准为独立学院,2021年经教育部批准转设为独立设置的民办普通本科高校。经过20余年的建设和发展,学校已成为粤西地区规模最大、具有重要区...
-
家电维修视频教程从入门到精通/家电维修培训/家电维修入门学习
家电维修基础入门:家电维修基础主要学习电路工作原理,例如电阻电容、二极管、三极管等等主要器件实物识别等,电参数标识及计算,电路图原理,复位及检修;学习热风枪电烙铁等各种设备氧焊技术,及检修工具、仪器仪表等使用方法、安全操作技巧制冷设备维修培训:制冷仪器仪表的使用方法,学习家用空调安装、拆机、移机、清...
-
糖果食品号称强肝解毒 荣格科技不正当竞争挨罚
中(张慕晨)日前,深圳市荣格科技有限公司(简称:荣格科技)因发布食品广告构成不正当竞争行为,被深圳市市场监督管理局南山监督管理局罚款10500元。行政处罚决定书(深市监南处罚〔2022〕稽47号)显示,经调查,荣格科技“柏力宝膜养TM压片糖果”“牡蛎钛压片糖果”“芦荟果粒”三款商品的属性为食品。但在...
-
小米众筹售出600万的黑科技透明音箱,悬浮歌词透明机身,简直了
听音乐是最简单的StairwaytoHappiness,每个人穷尽一生只为寻觅幸福,说实在的,能听见音乐,看懂歌词就足够快乐了。同千万万人一样热爱音乐的小编,也一直在期待遇见一直击心弦的音乐载体。近日,小米众筹卖火了一台会表达“音乐情绪”的音箱,成功吸引了小编的注意力。MORRORART悬浮歌词透明...