linux字符设备烧写,「正点原子Linux连载」第三十九章系统烧写

1)实验平台:正点原子Linux开发板

2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》

关注官方微信号公众号,获取更多资料:正点原子

jishu_1909878_1_1.html

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

39.1 MfgTool工具简介MfgTool工具是NXP提供的专门用于给I.MX系列CPU烧写系统的软件,可以在NXP官网下载到。此工具已经放到了开发板光盘中,路劲为:5、开发工具->3、NXP官方原版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所示:

jishu_1909878_1_1.html

图39.1.1 mfg_tools工具目录

从图39.1.1可以看出,有两个.txt文件和两个.gz压缩包。.txt文档就不去看了,重点是这两个.gz压缩包,这两个压缩包的区别在名字上已经写的很详细了。"without-rootfs"和"with-rootfs",一个是带rootfs和一个是不带rootfs。mfg_tools这个工具本意是给NXP自己的开发板设计的烧写软件,所以肯定带有自家开发板对应的uboot、linuxkernel和rootfs的文件。我们肯定是要烧写文件系统的,所以选择mfgtools-with-rootfs.tar.gz这个压缩包,继续对其解压,解压出一个名为mfgtools-with-rootfs的文件夹,此文件夹就包含有我们需要的烧写工具。

进入目录mfgtools-with-rootfs\mfgtools中,在此目录下有几个文件夹和很多的.vbs文件,如图39.1.2所示:

jishu_1909878_1_1.html

图39.1.2 mfgtools目录内容

我们只关心图39.1.2中Profiles这个文件夹,因为后面要烧写文件就放到这个文件夹中。MfgTool2.exe就是烧写软件,但是我们不会直接打开这个软件烧写,mfg_tools不仅能烧写I.MX6U,而且也能给I.MX7、I.MX6Q等芯片烧写,所以在烧写之前必须要进行配置,指定烧写的是什么芯片,烧写到哪里去?下面的这些众多的.vbs文件就是配置脚本,烧写的时候通过双击这些.vbs文件来打开烧写工具。这些.vbs烧写脚本既可以根据处理器的不同,由用户选择向I.MX6D、I.MX6Q、I.MX6S、I.MX7、I.MX6UL和I.MX6ULL等的哪一款芯片烧写系统。也可以根据存储芯片的不同,选择向EMMC、NAND或QSPI Flash等的哪一种存储设备烧写,功能非常强大!!我们现在需要向I.MX6U烧写系统,因此需要参考表39.1.1所示的5个烧写脚本:

表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所示:

jishu_1909878_1_1.html

图39.2.2.1 USB OTG1接口

在烧写之前,需要先用USB线将图39.2.2.1中的USB_OTG1接口与电脑连接起来。

2、拨码开关拨到USB下载模式

将图39.2.2.1中的拨码开关拨到"USB"模式,如图39.2.2.2所示:

jishu_1909878_1_1.html

图39.2.2.2 USB下载模式

如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!

如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!

如果插了TF卡,请弹出TF卡,否则电脑不能识别USB!等识别出来以后再插上TF卡!

一切准备就绪以后,按一下开发板的复位键,此时就会进入到USB模式,如果是第一次进入USB模式的话可能会久一点,这个是免驱的,因此不需要安装驱动。第一次进入USB模式会在电脑右下角有如图39.2.2.3所示提示:

jishu_1909878_1_1.html

图39.2.2.3 第一次进入USB模式

一旦第一次设置好设备以后,后面每次连接都不会有任何提示了。到这里,我们的开发板已经和电脑连接好了,可以开始烧写系统了。

39.2.2 系统烧写原理开发板连接电脑以后双击"mfgtool2-yocto-mx-evk-emmc.vbs",打开下载对话框,如图39.2.2.1所示:

jishu_1909878_1_1.html

图39.2.2.1 MfgTool工具界面

如果出现"符合 HID 标准的供应商定义设备"就说明连接正常,可以进行烧写,如果出现其他的字符那么就要检查连接是否正确。点击"Start"按钮即可开始烧写,烧写什么东西呢?肯定是烧写uboot、Linuxkernel、.dtb和rootfs,那么这四个应该放到哪里MfgTool才能访问到呢?进入如下目录中:

L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware

此目录中的文件如图39.2.2.2所示:

jishu_1909878_1_1.html

图39.2.2.2 OS Firmware文件夹内容

文件夹"OS Firmware"看名字就知道是存放系统固件的,我们重点关注files、firmware这两个文件夹,以及ucl2.xml这个文件。在具体看这三个文件和文件夹之前,我们先来简单了解一下MfgTool烧写的原理,MfgTool其实是先通过USB OTG先将uboot、kernel和.dtb(设备树)这是三个文件下载到开发板的DDR中,注意不需要下载rootfs。就相当于直接在开发板的DDR上启动Linux系统,等Linux系统启动以后再向EMMC中烧写完整的系统,包括uboot、linuxkernel、.dtb(设备树)和rootfs,因此MfgTool工作过程主要分两个阶段:

①、将firmware目录中的uboot、linuxkernel和.dtb(设备树),然后通过USB OTG将这个文件下载到开发板的DDR中,目的就是在DDR中启动Linux系统,为后面的烧写做准备。

②、经过第①步的操作,此时Linux系统已经运行起来了,系统运行起来以后就可以很方便的完成对EMMC的格式化、分区等操作。EMMC分区建立好以后就可以从firmware中读取要烧写的uboot、linux kernel、.dtb(设备树)和rootfs这4个文件,然后将其烧写到EMMC中,这个就是MfgTool的大概工作流程。

1、firmeare文件夹

打开firmware文件夹,里面有很多的.imx结尾的uboot文件、一个zImage镜像文件、很多.dtb结尾的设备树文件。这些文件都是NXP官方开发板使用的,不同的板子使用不同的文件,其中我们需要关心的只有表39.2.2.1中的这三个文件:

表39.2.2.1 I.MX6ULL EVK开发板使用的系统文件

表39.2.2.1中的这三个文件就是I.MX6ULL EVK开发板烧写系统的时候第一阶段所需的文件。如果要烧写我们的系统,就需要用我们编译出来的zImage、u-boot.imx和imx6ull-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中的四个文件:

表39.2.2.2 I.MX6ULL EVK开发板烧写文件

如果要烧写我们自己编译出来的系统,就需要用我们编译出来的zImage、u-boot.imx和imx6ull-alientek-emmc.dtb和rootfs这四个文件替换掉表39.2.2.2中这四个文件。

3、ucl2.xml文件

files和firmware目录下有众多的uboot和设备树,那么烧写的时候究竟选择哪一个呢?这个工作就是由ucl2.xml文件来完成的。ucl2.xml以""开始,以""结束。""和""之间是配置相关内容,主要是判断当前是给I.MX系列的哪个芯片烧写系统。""和""之间的是针对不同存储芯片的烧写命令。整体框架如下:

示例代码39.2.2.1 ucl2.xml框架

......

......

ucl2.xml首先会判断当前要向I.MX系列的哪个芯片烧写系统,代码如下:

示例代码39.2.2.2 判断要烧写的处理器型号

21

22

23

24

25

26

27

28

29

30

通过读取芯片的VID和PID即可判断出当前要烧写什么处理器的系统,如果VID=0X15A2,PID=0080,那么就表示要给I.MX6ULL烧写系统。确定了处理器以后就要确定向什么存储设备烧写系统,这个时候就要有请mfgtool2-yocto-mx-evk-emmc.vbs再次登场,此文件内容如下:

示例代码39.2.2.3 mfgtool2-yocto-mx-evk-emmc.vbs文件内容

Set wshShell = CreateObject("WScript.shell")

wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC"" -s ""board=sabresd"" -s ""mmc=1"" -s ""6uluboot=14x14evk"" -s ""6uldtb=14x14-evk"""

Set wshShell = Nothing

重点是"wshShell.run"这一行,这里一行调用了mfgtool2.exe这个软件,并且还给出了一堆的参数,其中就有"eMMC"字样,说明是向EMMC烧写系统,要烧写的存储设备就这样确定下来了。"wshShell.run"后面还有一堆的其他参数,这些参数都有对应的值,如下所示:

board=sabresd

mmc=1

6uluboot=14x14evk

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

Loading U-boot

上面的命令就是BootStrap阶段,也就是第一阶段,"file"表示要下载的文件位置,在firmware目录下,文件名字为

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,因此将这来个值带进去以后就是:

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

Jumping to OS image.

启动Linux系统以后就可以在EMMC上创建分区,然后烧写uboot、zImage、.dtb(设备树)和根文件系统。

这个就是MfgTool的整个烧写原理,弄懂了烧写原理以后就可以开始试着先将NXP官方的系统烧写到正点原子的I.MX6U-ALPHA开发板中。

39.3 烧写NXP官方系统我们先试着将NXP官方的系统烧写到正点原子的I.MX6U-ALPHA开发板中,主要是先熟悉一下烧写过程。因为正点原子的EMMC核心版用的也是512MB的ddr3加4G的EMMC,因此烧写NXP官方的系统是没有任何问题的。烧写步骤如下:

①、连接好USB,拨码开关拨到USB下载模式。

②、弹出TF卡,然后按下开发板复位按键。

③、打开SecureCRT。

③、双击"mfgtool2-yocto-mx-evk-emmc.vbs",打开下载软件,如果出现"符合 HID 标准的供应商定义设备"等字样就说明下载软件已经准备就绪。点击"Start"按钮开发烧写NXP官方系统,烧写过程如图39.3.1所示:

jishu_1909878_1_1.html

图39.3.1 烧写过程

这个时候可以在SecurCRT上看到具体的烧写过程,如图39.3.2所示:

jishu_1909878_1_1.html

图39.3.2 正在烧写的文件

等待烧写完成,因为NXP官方的根文件系统比较大,因此烧写的时候耗时会久一点。烧写完成以后MfgTool软件如图39.3.3所示:

jishu_1909878_1_1.html

图39.3.2 烧写完成

烧写完成以后点击"Stop"按钮停止烧写,然后点击"Exit"键退出。拔出USB线,将开发板上的拨码开关拨到EMMC启动模式,然后重启开发板,此时就会从EMMC启动。只是启动以后的系统是NXP官方给I.MX6ULL EVK开发板制作的,这个系统需要输入用户名,用户名为"root",没有密码,如图39.3.3所示:

jishu_1909878_1_1.html

图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命令对其进行打包,命令如下:

cdrootfs/

tar -vcjf rootfs.tar.bz2 *

完成以后会在rootfs目录下生成一个名为rootfs.tar.bz2的压缩包,将rootfs.tar.bz2发送到windows系统中。

将上面提到的这4个"原材料"都发送到Windows系统中,如图39.4.1所示:

jishu_1909878_1_1.html

图39.4.1 烧写原材料

材料准备好以后还不能直接进行烧写,必须对其进行重命名,否则的话ucl2.xml是识别不出来的,前面讲解ucl2.xml语法的时候已经说过了,图39.4.1中的这四个文件重命名见表39.4.1:

表39.4.1 文件重命名表

完成以后如图39.4.2所示:

jishu_1909878_1_1.html

图39.4.2 重命名以后的文件

接下来就是用我们的文件替换掉NXP官方的文件,先将图39.4.2中的zImage、u-boot-imx6ull14x14evk_emmc.imx和zImage-imx6ull-14x14-evk-emmc.dtb这三个文件拷贝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware目录中,替换掉原来的文件。然后将图39.4.2中的所有4个文件都拷贝到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files目录中,这两个操作完成以后我们就可以进行烧写了。

双击"mfgtool2-yocto-mx-evk-emmc.vbs",打开烧写软件,点击"Start"按钮开始烧写,由于我们自己制作的rootfs比较小,因此烧写相对来说会快一点。烧写完成以后设置开发板从EMMC启动,启动我们刚刚烧写进去的系统,测试有没有问题,一般肯定没问题,因为这些都是我们已经测试好的。

39.4.2 网络开机自启动设置大家在测试网络的时候可能会发现网络不能用,这并不是因为我们将系统烧写到EMMC中以后网络坏了。仅仅是因为网络没有打开,我们用NFS挂载根文件系统的时候因为要使用NFS服务,因此Linux内核会打开eth0这个网卡,现在我们不使用NFS挂载根文件系统,因此Linux内核也就不会自动打开eth0网卡了。我们可以手动打开网卡,首先输入"ifconfig-a"命令查看一下eth0和eth1是否都存在,结果如图39.4.3所示:

jishu_1909878_1_1.html

图39.4.3 查看网络

可以看出eth0好eth1都存在,既然存在我们就打开,以打开eth0网卡为例,输入如下命令打开eth0:

ifconfig eth0 up

打开网卡的时候会有如图39.4.4所示的提示信息:

jishu_1909878_1_1.html

图39.4.5 打开eth0网卡

打开的时候会提示使用LAN8710/lan8720的网络芯片,eth0连接成功,并且是100Mpbs全双工,eth0链接准备就绪。这个时候输入"ifconfig"命令就会看到eth0这个网卡,如图39.4.6所示:

jishu_1909878_1_1.html

图39.4.6 当前工作的网卡

接下来就是个eth0设置IP地址,如果你的开发板连接的路由器,那么可以通过路由器自动分配IP地址,命令如下:

udhcpc -i eth0 //通过路由器分配IP地址

如果你的开发板连接着电脑,那么就可以手动设置IP地址,比如设置为192.168.1.251,命令如下:

ifconfig eth0 192.168.1.251 netmask 255.255.255.0 //设置IP地址和子网掩码

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

3 PATH=/sbin:/bin:/usr/sbin:/usr/bin

4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib

5 export PATH LD_LIBRARY_PATH runlevel

6

7 #网络开机自启动设置

8 ifconfig eth0 up

9 #udhcpc-i eth0

10 ifconfig eth0 192.168.1.251 netmask 255.255.255.0

11 route add default gw 192.168.1.1

......

12 #cd /drivers

13 #./hello &

14 #cd /

第8行,打开eth0网卡

第9行,通过路由器自动获取IP地址。

第10行,手动设置eth0的IP地址和子网掩码。

第11行,添加默认网关。

修改好rcS文件以后保存并退出,重启开发板,这个时候eth0网卡就会在开机的时候自动启动了,我们也就不用手动添加相关设置了。

39.5 改造我们自己的烧写工具39.5.1 改造MfgTool在上一小节中我们已经实现了将自己的系统烧写到开发板中,但是使用的是"借鸡生蛋"的方法。我们通过将NXP官方的系统更换成我们自己制作的系统来完成系统烧写,本节我们就来学习一下如何将MfgTool这个工具改造成我们自己的工具,让其支持我们自己的开发板。要改造MfgTool,重点是三方面:

①、针对不同的核心版,确定系统文件相关名字。

②、新建我们自己的.vbs文件。

③、修改ucl2.xml文件。

1、确定系统文件名字

确定系统文件名字完全是为了兼容不同的产品,比如某个产品有NAND和EMMC两个版本,那么EMMC和NAND这两个版本的uboot、zImage、.dtb和rootfs有可能不同。为了在MfgTool工具中同时支持EMMC和NAND这两个版本的核心板,EMMC版本的系统文件命名如图39.5.1.1所示:

jishu_1909878_1_1.html

图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文件改为如下所示内容:

Loading U-boot

loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.

loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.

loadSection="OTH"setSection="OTH"HasFlashHeader="FALSE"ifdev="MX6ULL">Loading device tree.

Jumping to OS image.

Sending partition shell

Partitioning...

Partitioning...

clear u-boot arg

/sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1

Sending u-boot.bin

write U-Boot to sd card

/sys/block/mmcblk%mmc%boot0/force_ro">re-enable read-only access

enable boot partion 1 to boot

Waiting for the partition ready

Formatting rootfs partition

Sending kernel zImage

write kernel image to sd card

Sending Device Tree file

write device tree to sd card

Unmounting vfat partition

Formatting rootfs partition

Sending and writting rootfs

Finishing rootfs write

Unmounting rootfs partition

Done

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/OS Firmware/firmware目录中。将imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx、zImage-alientek-emmc和 rootfs-alientek-emmc.tar.bz2这四个文件复制到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files目录中。

点击"mfgtool2-alientek-alpha-emmc.vbs"打开MfgTool烧写系统,等待烧写完成,然后设置拨码开关为EMMC启动,重启开发板,系统启动信息如图39.5.2.1所示:

jishu_1909878_1_1.html

图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所示两行信息:

jishu_1909878_1_1.html

图39.5.3.1 读取设备树出错

从图39.5.3.1可以看出,在读取"imx6ull-14x14-evk.dtb"这个设备树文件的时候出错了。重启uboot,进入到命令行模式,输入如下命令查看EMMC的分区1里面有没有设备树文件:

mmcdev 1 //切换到EMMC

lsmmc 1:1 //输出EMMC1分区1中的所有文件

结果如图39.5.3.2所示:

jishu_1909878_1_1.html

图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的命令行,重新设置bootcmd和bootargs这两个环境变量的值,这里要注意的是bootargs的值也要重新设置一下,命令如下:

setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000'

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'

saveenv

设置好bootcmd和bootargs这两个环境变量以后重启开发板,Linux系统就可以正常启动。

2、修改uboot源码

第1种方法每次重新烧写系统以后都要先手动设置一下bootcmd的值,这样有点麻烦,有没有一劳永逸的方法呢?肯定是有的,就是直接修改uboot源码。打开uboot源码中的文件include/configs/mx6ull_alientek_emmc.h,在宏CONFIG_EXTRA_ENV_SETTINGS中找到如下所示内容:

示例代码39.5.3.1 查找设备树文件

194"findfdt="\

195"if test $fdt_file = undefined; then " \

196"if test $board_name = EVK && test $board_rev = 9X9; then " \

197"setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \

198"if test $board_name = EVK && test $board_rev = 14X14; then " \

199"setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \

200"if test $fdt_file = undefined; then " \

201"echo WARNING: Could not determine dtb to use; fi; " \

202"fi;\0" \

findfdt就是用于确定设备树文件名字的环境变量,fdt_file环境变量保存着设备树文件名。第196行和197行用于判断设备树文件名字是否为imx6ull-9x9-evk.dtb,第198行和199行用于判断设备树文件名字是否为imx6ull-14x14-evk.dtb。这两个设备树都是NXP官方开发板使用的,I.MX6U-ALPHA开发板用不到,因此直接将示例代码39.5.3.1中findfdt的值改为如下内容:

示例代码39.5.3.1 查找设备树文件

194"findfdt="\

195"if test $fdt_file = undefined; then " \

196"setenv fdt_file imx6ull-alientek-emmc.dtb; " \

197"fi;\0" \

第196行,如果fdt_file未定义的话,直接设置fdt_file= imx6ull-alientek-emmc.dtb,简单直接,不需要任何的判断语句。修改后以后重新编译uboot,然后用将新的uboot烧写到开发板中,烧写完成以后重启测试,Linux内核启动正常。

关于系统烧写就讲解到这里,本章我们使用NXP提供的MfgTool工具通过USB OTG口向开发板的EMMC中烧写uboot、Linuxkernel、.dtb(设备树)和rootfs这四个文件。在本章我们主要做了五个工作:

①、理解MfgTool工具的工作原理。

②、使用MfgTool工具将NXP官方系统烧写到I.MX6U-ALPHA开发板中,主要是为了体验一下MfgTool软件的工作流程以及烧写方法。

③、使用MfgTool工具将我们自己编译出来的系统烧写到I.MX6U-ALPHA开发板中。

④、修改MfgTool工具,使其支持我们所使用的硬件平台。

⑤、修改相应的错误。

关于系统烧写的方法就讲解到这里,本章内容不仅仅是为了讲解如何向I.MX6ULL芯片中烧写系统,更重要的是向大家详细的讲解了MfgTool的工作原理。如果大家在后续的工作或学习中使用I.MX7或者I.MX8等芯片,本章同样适用。

随着本章的结束,也宣告着本书第三篇的内容也正式结束了,第三篇是系统移植篇,重点就是uboot、Linuxkernel和rootfs的移植,看似简简单单的"移植"两个字,引出的却是一篇300多页的"爱恨情仇"。授人以鱼不如授人以渔,本可以简简单单的教大家修改哪些文件、添加哪些内容,怎么去编译,然后得到哪些文件。但是这样只能看到表象,并不能深入的了解其原理,为了让大家能够详细的了解整个流程,笔者义无反顾的选择了这条最难走的路,不管是uboot还是Linuxkernel,从Makefile到启动流程,都尽自己最大的努力去阐述清楚。奈何,笔者水平有限,还是有很多的细节没有处理好,大家有疑问的地方可以到正点原子论坛上发帖留言,大家一起讨论学习。

第四篇 ARM Linux驱动开发篇

前面3篇,我们学习Ubuntu操作系统、学习ARM裸机、学习系统移植,其目的就是为了本篇做准备。本篇应该是大家最期待的内容了,毕竟大部分学习者的最初目的就是学习Linux驱动开发。本篇我们将会详细讲解Linux中的三大类驱动:字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是占用篇幅最大的一类驱动,因为字符设备最多,从最简单的点灯到I2C、SPI、音频等都属于字符设备驱动的类型。块设备和网络设备驱动要比字符设备驱动复杂,就是因为其复杂所以半导体厂商一般都给我们编写好了,大多数情况下都是直接可以使用的。所谓的块设备驱动就是存储器设备的驱动,比如EMMC、NAND、SD卡和U盘等存储设备,因为这些存储设备的特点是以存储块为基础,因此叫做块设备。网络设备驱动就更好理解了,就是网络驱动,不管是有线的还是无线的,都属于网络设备驱动的范畴。一个设备可以属于多种设备驱动类型,比如USB WIFI,其使用USB接口,所以属于字符设备,但是其又能上网,所以也属于网络设备驱动。本篇我们就围绕着三大设备驱动类型展开,尽可能详细的讲解每种设备驱动的开发方式。

本书使用的Linux内核版本为4.1.15,其支持设备树(Device tree),所以本篇所有例程均采用设备树。设备树将是本篇的重点!从设备树的基本原理到设备树驱动的开发方式,从最简单的点灯到复杂的网络驱动开发,本篇均有详细的讲解,是学习设备树的不二之选。

最后,祝大家学习愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值