iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等
第八章STM32MP157烧写系统
STM32MP157进行系统的烧写在Windows、Linux、mac上均可以实现,但由于条件的限制,在这里只是进行Windows和Ubuntu系统的烧写。
ST公司推出的STM32CubeProgrammer 软件属于多合一软件工具,它将 ST Visual Programmer、DFUse Device Firmware Update、Flash Loader 和 ST-Link 等软件功能整合到了一起,为用户提供 STM32 微控制器代码烧写和固件安全安装、更新功能,帮助用户更快地开发特定外部存储器的加载程序。STM32CubeProgrammer 支持对外部存储器进行编程、擦除和验证,用户烧写 STM32 微控制器既可使用片上 SWD (单线调试)或 JTAG 调试端口,也可以用程序引导装入端口(例如UART 和 USB)。它支持 Motorola S19、Intel HEX、ELF 和 二进制格式(BIN 文件),支持 ST-LINK 固件更新,支持图形化界面操作也支持命令行操作,在命令行界面,可通过脚本实现自动化编程。
STM32CubeProgrammer 可以直接在 ST 官网下载到,下载地址为https://www.st.com/,为了方便起见,我们已经将对应的压缩包下载好,存放路径为“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\en.stm32cubeprog_v2-5-0.zip”。
8.1 Windows环境的烧写
8.1.1 Java环境的搭建
Windows安装STM32CubeProgrammer需要安装Java环境。对应的java jdk安装包我们已经下好(我们提供的是64位的安装包,如果是32位的电脑请自行到官网下载),存放路径为“iTOP-STM32MP157开发板网盘资料汇总\01_开发所需PC软件\10_JAVA_JDK\windows”。
双击对应的文件进行安装,进入下图所示界面。点击安装,也可以通过左下角来进行安装目录的修改。建议不要修改。
点击安装按钮之后,如下图所示:
等待安装完成,如下图所示:
点击关闭按钮,java环境安装完成。
8.1.2 STM32CubeProgrammer安装
STM32CubeProgrammer安装包存放路径为“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\en.stm32cubeprog_v2-5-0.zip”
将对应的压缩包解压之后,压缩包文件内会存在三个文件,中间的文件即为windows环境对应的安装包:
双击安装包进入安装界面,如下图所示:
点击Next按钮之后,阅读STM32CubeProgrammer的信息,如下图所示:
点击Next按钮之后,勾选同意,如下图所示:
点击Next之后,选择安装路径,如下图所示:
点击next按钮之后会有创建目录的信息弹出,点击确定如下图所示:
点击确定之后,进入选择安装界面,我们保持默认即可,如下图所示:
点击Next按钮之后,进入安装界面,等待安装完成,在安装的过程中会进行驱动的安装,全部选择是即可。如下图所示:
安装完成之后如下图所示:
点击Next之后,保持默认设置即可,如下图所示:
点击Next之后,点击下图右下角的Done按钮。至此STM32CubeProgrammer软件安装完成。 8.1.3
8.1.3系统的烧写
将开发板的拨码开关拨到“0000”,然后按下电源开关,在设备管理器的通用串行总线设备下会有如上图所示的设备标识。这就证明我们的驱动没有问题,可以正常的烧写。
点击STM32CubeProgrammer的图标,来打开STM32CubeProgrammer烧写工具。
烧写工具打开之后如下图所示
然后点击Open file右边的加号,选择open file选项,如下图所示:
找到我们要烧写的镜像,然后选择打开image\flashlayout目录,选择自身的配置文件,如果是烧写到EMMC则选择emmc.tsv ,如果是烧写到TF卡则选择tfcard.tsv如下图所示:
选择配置文件之后会将烧写的内容显示出来,然后选择右上角的USB设备,并点击绿色的链接按钮,如下图所示:
连接成功之后(默认都是USB1),之前的Connect会变成Disconnect,然后点击Download按钮就会开始烧写了,如下图所示:
需要注意的是下方的Binaries path可能不会默认选择,未选择时需要自行选择一下:
烧写成功之后,重启开发板,在uboot倒计时的过程之中,按下任意键,然后进入uboot模式,如下图所示:
至此我们就可以查看“8.7 设置屏幕参数”章节设置具体屏幕的参数。
8.2 Ubuntu环境的烧写
8.2.1 Java环境的搭建
在Linux环境下也是需要java 的环境才可以运行STM32CubeProgrammer软件,大家可以自行去官网下载,具体链接为 https://java.com/zh-CN/download/manual.jsp 。
为了方便起见,我们已经将对应的安装包下载了,具体路径为“iTOP-STM32MP157开发板网盘资料汇总\01_开发所需PC软件\10_JAVA_JDK\ubuntu”。
通过SSH软件拷贝我们提供的安装包jdk-8u291-linux-x64.tar.gz 到虚拟机ubuntu上,如下图所示:
然后使用命令,将其解压到/usr/lib/jvm/目录下,如下图所示:
解压成功之后,使用命令“cd”,如下图所示,进入根目录:
然后使用命令“vim .bashrc”,进入.bashrc文件设置环境变量,如下图所示:
然后我们来到最下面,来设置java的环境变量,添加内容如下:
export CLASSPATH=.:/usr/lib/jvm/jdk1.8.0_291/lib
export PATH=$PATH:/usr/lib/jvm/jdk1.8.0_291/bin
添加完成之后保存退出,然后使用命令“source .bashrc”更新环境变量,如下图所示:
然后我们使用命令“java -version”,来查看版本,如下图所示:
至此我们的java环境就安装成功了。
8.2.2 STM32CubeProgrammer安装
STM32CubeProgrammer安装包存放路径为“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具”路径下的en.stm32cubeprog_v2-5-0.zip。在windows解压之后。将SetupSTM32CubeProgrammer-2.5.0.linux和SetupSTM32CubeProgrammer-2.5.0.exe两个安装包通过SSH软件拷贝该文件到Ubuntu上,如下图所示:
然后我们使用以下命令来赋予安装包权限,如下图所示
chmod 777 SetupSTM32CubeProgrammer-2.5.0*
赋予权限之后,使用命令“./SetupSTM32CubeProgrammer-2.5.0.linux”进行安装,如下图所示
进入安装界面如下图所示:
点击Next按钮之后,阅读STM32CubeProgrammer的信息,如下图所示:
点击Next按钮之后,勾选同意,如下图所示:
点击Next之后,选择安装路径,在这里我们保持默认路径即可,如下图所示:
点击next按钮之后会有创建目录的信息弹出,点击确定如下图所示:
点击ok之后,进入选择安装界面,我们保持默认即可,如下图所示:
点击Next按钮之后,进入安装界面,等待安装完成。安装完成之后如下图所示:
点击Next之后,保持默认设置即可,如下图所示:
点击Next之后,点击下图右下角的Done按钮。至此STM32CubeProgrammer软件安装完成。
为了方便起见,我们直接写一个脚本文件,当运行该脚本时就自动打开该烧写软件。首先我们使用命令“ cd /usr/bin/”,进入/usr/bin目录下,然后使用命令“vim stm32.sh”,创建stm32.sh文件,如下图所示:
然后写如以下内容
#/bin/sh
cd /usr/local/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin
./STM32CubeProgrammer
然后写如以下内容
#/bin/sh
cd /usr/local/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin
./STM32CubeProgrammer
保存退出之后。使用命令“chmod 777 stm32.sh”,给予stm32.sh可执行权限如下图所示:
在任意目录下使用命令“stm32.sh”,就可以打开该烧写文件,如下图所示:
在任意目录下使用命令“stm32.sh”,就可以打开该烧写文件,如下图所示:
8.2.3 系统的烧写
在任意目录下使用命令“stm32.sh”打开该烧写文件,如下图所示:
然后点击Open file右边的加号,选择open file选项,如下图所示:
找到我们要烧写的镜像,然后选择打开tf-a.tsv配置文件,如下图所示:
选择配置文件之后会将烧写的内容显示出来,然后选择右上角的USB设备,并点击绿色的链接按钮,如下图所示:
连接成功之后(默认都是USB1),之前的Connect会变成Disconnect,然后点击Download按钮就会开始烧写了,如下图所示:
需要注意的是下方的Binaries path可能不会默认选择,未选择时需要自行选择一下:
烧写成功之后,重启开发板,在uboot倒计时的过程之中,按下任意键,然后进入uboot模式,如下图所示:
至此我们就可以查看“8.7 设置屏幕参数”章节设置具体屏幕的参数。
8.3 ums挂载烧写系统
对于较大的文件系统,以烧写ubuntu18有桌面版本镜像为例,整个镜像的大小为2G,假如通过以上两种烧写方式即通过官方提供的烧写软件烧写方式会烧写一个多小时,所耗费的时间会很长,尤其是当我们进行调试修改时,总不会每一次修改重新烧写一遍系统,为了方便起见我们可以通过ums的方式来进行烧写。
首先我们连接好otg线和串口线,前提是emmc或者TF卡中已经有系统了(EMMC中必然有,而TF卡中第一次使用的话需要根据前两个小节来将系统烧写到TF卡中),然后将拨码开关设置为emmc启动(当然如果使用的是TF卡,则设置为TF卡启动)。在uboot倒计时阶段按下任意键来进入uboot的命令行如下图所示:
然后我们使用输入以下命令来将emmc或者tf卡通过otg线挂载到电脑上。
ums mmc 0
ums mmc 1
ums mmc 0 是将TF卡挂载到电脑上,而ums mmc 1是将emmc挂载到电脑上,我们在这里以挂载TF卡为例进行测试。输入ums mmc 0,如下图所示:
由于分区格式为ext4,无法在windows端打开,所以我们直接将其挂载到虚拟机ubuntu上,挂载完成如下图所示: 可以在ubuntu的桌面上看到TF卡的分区,如果是emmc也是这两个分区,bootfs分区之中存放的是内核和设备树文件,rootfs分区之中存放的文件系统。
假如我们编译了我们自己的内核源码要更新内核和设备树,只需要拷贝对应的文件对bootfs下的文件进行覆盖即可。如下图所示:
假如我们要更新文件系统,这里需要进行注意rootfs分区的大小和所要烧写文件系统的大小
在ubuntu上,对rootfs分区右击选择properties查看属性,如下图所示
可以看到作者的rootfs分区总大小为4.1G,而我们接下来要烧写的文件系统不能比4G大,
我们以烧写buildroot系统为例进行演示,首先将“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\02_buildroot文件系统\03_buildroot制作好的镜像”路径下的rootfs.tar.gz源码文件拷贝到ubuntu上(这里注意的是,每种系统都有一个tar.gz格式的源码包,是方便我们进行更改和进行ums烧写的,而另外一个rootfs.ext4格式的文件是用来通过软件来进行烧写的,如果要使用的话需要先进行挂载,随后再进行使用),拷贝完成如下图所示:
使用以下命令
tar -vxf rootfs.tar.gz
对rootfs.tar.gz文件进行解压,解压完成如下图所示:
然后我们使用命令
rm -rf /media/topeet/rootfs/*
将rootfs分区内的文件清空随后使用以下拷贝命令将我们新解压出来的文件拷贝到该分区内,如下图所示:
最后,使用“sync”命令进行同步处理(这里注意,同步处理很重要,否则可能会存在文件拷贝不全的情况)同步完成如下图所示:
至此我们的文件系统就拷贝完成了,这个时候可以回到终端使用ctrl+c结束ums挂载,然后输入reset命令重启开发板即可,如下图所示:
系统重启完成之后,可以看到我们已经是buildroot文件系统了,如下图所示:
至此我们的ums挂载烧写就结束了。
8.4 TF卡Raw镜像制作和烧写
在前面的三个小节之中,我们分别介绍了STM32CubeProgrammer软件烧写和ums挂载烧写,但我们会发现,使用STM32CubeProgrammer软件烧写速度会特别慢,以烧写有桌面的ubuntu系统为例子,4个G大小的镜像要烧写一个半小时,长时间的等待是让人无法忍受的,而ums挂载烧写虽然大大的提高了烧写的速度,但是会存在一定的限制,当们上一次烧写的空间一定要比本次烧写的镜像大小大,而本次的raw镜像就能解决这些问题,但是只能在TF卡上。具体操作步骤如下:
首先,我们将“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\02_烧写文件模板\”下的image文件拷贝到ubuntu虚拟机上,如下图所示:
Image文件中存储的为我们的烧写镜像,每个镜像的作用可以参考第七章的讲解,在这里就不再陈述。使用以下命令进入flashlayout/烧写规则目录下,如下图所示:
cd image/flashlayout/
、然后我们将“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\04_TF卡镜像制作”目录下的create_sdcard_from_flashlayout.sh和sdcard_update.sh两个脚本拷贝到当前目录下,拷贝完成如下图所示:.
其中create_sdcard_from_flashlayout.sh脚本文件是TF卡raw镜像制作脚本,而sdcard_update.sh脚本是将raw镜像烧写进TF卡的脚本。具体的使用如下:
在使用之前我们命令
vim create_sdcard_from_flashlayout.sh
进入create_sdcard_from_flashlayout.sh脚本文件,如下图所示:
然后我们来到第38行,可以看到DEFAULT_RAW_SIZE=1536,这里的意思为设置默认raw镜像大小为1536MB,这里的大小根据我们要烧写镜像的大小来设置,以烧写ubuntu有桌面系统为例子,如下图所示我们ubuntu文件系统镜像的大小为4096MB,所以在此我们可以设置为5000MB.
而本次所要演示的文件系统镜像仅仅为300MB,如下图所示:
所以我们就不修改了,保存退出之后,我们使用以下命令制作TF卡raw镜像(tsv格式文件为我们的烧写规则文件,该脚本就是根据烧写规则制作对应的镜像),制作过程如下图所示:
./create_sdcard_from_flashlayout.sh tfcard.tsv
制作好的raw镜像名称为tfcard.raw,该名称是根据我们的tfcard.tsv的文件名来确定的,如下图所示:
然后我们的任务是将该raw镜像烧写进tf卡,将装有TF卡的读卡器连接到虚拟机ubuntu,然后使用命令“df -l”查看挂载分区,如下图所示:
可以看到我们的TF卡设备为/dev/sdb1,我们使用以下命令解除挂载(这里要注意的是,如果tf卡的分区多的话,需要全部解除挂载),如下图所示:
umount /dev/sdb1
然后我们使用以下命令来将raw镜像写入TF卡(这里要注意后面的设备不带数字为sdb),烧写完成如下图所示:
./sdcard_update.sh /dev/sdb
至此我们的TF卡就烧写成功了,拔出TF卡然后插到开发板上,将拨码开关设置为“1010”TF卡启动模式,然后对开发板上电,成功启动系统之后,如下图所示:
8.5 EMMC Raw镜像制作和烧写
在上一章节之中,我们介绍了制作TF卡的raw烧写镜像,大大提高了烧写的速度,但是这个仅仅是对于外置TF卡系统的制作,接下来我们将介绍EMMC的raw烧写镜像的制作过程和烧写。
首先,我们将“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\02_烧写文件模板\”下的image文件拷贝到ubuntu虚拟机上,如下图所示:
Image文件中存储的为我们的烧写镜像,每个镜像的作用可以参考第七章的讲解,在这里就不再陈述。使用以下命令进入flashlayout/烧写规则目录下,如下图所示:
cd image/flashlayout/
然后我们将“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\05_EMMC镜像制作”目录下的create_emmc_from_flashlayout.sh、emmc_update.sh、emmc_update.tsv和emmc_update.tsv三个文件拷贝到当前目录下,拷贝完成如下图所示:.
其中create_emmc_from_flashlayout.sh脚本文件是TF卡raw镜像制作脚本,而sdcard_update.sh脚本是将raw镜像烧写进TF卡的脚本。具体的使用如下:
在使用之前我们命令
vim create_emmc_from_flashlayout.sh
进入create_emmc_from_flashlayout.sh脚本文件,如下图所示:
然后我们来到第38行,可以看到DEFAULT_RAW_SIZE=1536,这里的意思为设置默认raw镜像大小为1536MB,这里的大小根据我们要烧写镜像的大小来设置,以烧写ubuntu有桌面系统为例子,如下图所示我们ubuntu文件系统镜像的大小为4096MB,所以在此我们可以设置为5000MB.
而本次所要演示的文件系统镜像仅仅为300MB,如下图所示:
所以我们就不修改了,保存退出之后,我们使用以下命令制作TF卡raw镜像(tsv格式文件为我们的烧写规则文件,该脚本就是根据烧写规则制作对应的镜像),制作过程如下图所示:
./create_emmc_from_flashlayout.sh emmc_update.tsv
制作好的raw镜像名称为emmc_update.raw,该名称是根据我们的emmc_update.tsv的文件名来确定的,如下图所示:
然后我们的任务是将该raw镜像烧写进emmc,这个时候就出现问题了,emmc和上一小节的TF卡不同,TF卡可以使用读卡器来连接到电脑上进而对此进行烧写,而emmc不可以,但是我们可以根据8.3小节的ums烧写将emmc通过otg线进行挂载。具体步骤如下:
首先,将拨码开关设置为emmc启动,设置完成之后,对开发板上点,在uboot倒计时阶段按下任意键来进入uboot的命令行如下图所示:
然后我们使用输入以下命令来将emmc通过otg线挂载到电脑上。
ums mmc 1
ums mmc 1是将emmc挂载到电脑上,我们在这里以挂载EMMC,如下图所示:
由于分区格式为ext4,无法在windows端打开,所以我们直接将其挂载到虚拟机ubuntu上,挂载完成如下图所示:
然后我们使用命令“df -h”命令查看emmc的挂载分区,如下图所示:
挂载的分区为sdb2和sdb3,在烧写之前我们要使用umount命令将所有的挂载分区来进行解除挂载,具体命令如下:
umount /dev/sdb2
umount /dev/sdb3
然后我们使用命令然后我们使用以下命令来将raw镜像写入EMMC卡(这里要注意后面的设备不带数字为sdb),烧写完成如下图所示:
./emmc_update.sh /dev/sdb
至此我们的emmc就烧写完成了,重启开发板,可以看到我们的系统已经成功烧写,下图所示:
最后做一个说明,本小节的emmc raw镜像中并没有tf-a文件,所以如果我们对tf-a进行测试移植的话不可以用这种方法,但一般我们不会对tf-a进行修改,所以本小节的方法对大部分情况都适用。
ext4load mmc 0:4 c2000000 uImage
ext4load mmc 0:4 c4000000 stm32mp157a-itop-rgb-070.dtb
bootm c2000000 - c4000000
saveenv
8.6 Tftp下载和nfs启动
使用网络方式调试Linux非常方便,下面开始介绍用tftp下载Linux内核镜像,设备树,然后使用NFS网络挂载根文件系统,成功后可以在PC机上调试开发板。
8.6.1 配置开发板网络
连接好网线,上电启动开发板,在uboot的倒计时阶段点击任意按键,进入uboot命令行,如下图所示:
然后我们输入命令“dhcp”进行自动分配ip,分配成功如下图所示:
然后我们来到ubuntu虚拟机终端,输入命令“ifconfig”来查看虚拟机ubuntu的ip,如下图所示:
可以看到我们ubuntu虚拟机的ip地址为192.168.1.3,然后我们回到开发板的串口终端,输入命令
setenv serverip 192.168.1.3
saveenv
这里设置的为ubuntu虚拟机的ip地址,如下图所示:
然后我们,输入命令
printenv serverip ipaddr gatewayip netmask
显示如下图所示:
测试与服务器的网络是否畅通,输入命令“ ping 192.168.1.3 ”,显示如下图所示:
出现这样的结果表示网络已通,可以进行下一步了。
如果环境变量不知道哪里设置错了,可以使用以下命令重置环境变量
env default -a
8.6.2 tftp服务搭建
tftp是一个简单的基于udp的文本文件传输协议,我们用它将内核镜像和设备树下载到开发板内存中,并指定地址,只在 Ubuntu上配置好tftp服务器即可。
首先,我们来到虚拟机ubuntu的home目录下,使用以下命令创建文件夹tftpboot 如下图所示:
mkdir tftpboot
然后我们使用以下命令将文件夹的权限修改为777,如下图所示:
chmod 777 tftpboot
然后我们是用以下命令安装tftp-hpa tftpd-hpa,安装过程如下图所示:
apt-get install tftp-hpa tftpd-hpa
安装完成之后,使用以下命令修改配置文件,进入该文件之后如下图所示:
vim /etc/default/tftpd-hpa
对该文件进行修该,修改内容如下,修改完成如下图所示:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/tftpboot/"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l-c-s"
保存退出之后,在终端输入以下命令重启tftpd-hpa服务,如下图所示:
service tftpd-hpa restart
将Linux内核镜像uImage和设备树拷贝到tftpboot文件夹下(linux内核镜像和设备树文件可以通过“第十二章编译linux内核”编译源码得到)为了方便起见,我们将linux内核镜像和设备树文件放在了“iTOP-STM32MP157开发板光盘资料\02_开发板烧写工具\06_Tftp下载和nfs启动\tftpboot”路径下,拷贝完成如下图所示:
然后我们回到开发板的串口终端,输入命令“tftp 0xc2000000 uImage”,显示如下图:
出现上图所示的结果说明tftp搭建成功。
8.6.3 nfs服务搭建
我们将开发板的文件系统放在PC端(Ubuntu),开发板的文件系统类型设置为nfs,就可以挂载文件系统了。
我们首先要来到ubuntu虚拟机上,使用以下命令安装nfs服务,安装完成如下图所示:
sudo apt-get install nfs-kernel-server
安装完成之后,我们回到ubuntu的home目录下,使用以下命令创建nfs_rootfs文件夹,用来存放开发板的根文件系统,如下图所示:
mkdir nfs_rootfs
然后我们使用以下命令修改文件夹权限,如下图所示:
chmod 777 nfs_rootfs
然后我们使用以下命令进入exports 文件夹,如下图所示:
vim /etc/exports
然后我们在文件末尾添加以下内容:
/home/nfs_rootfs *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
前面路径修改为自己的路径,* 含义为所有的用户,*和后边的左括号"("之间不要出现空格。修改为下图所示:
NFS 参数 | 参数所代表的意义 |
rw : | 读写访问 |
* | 代表允许所有的网络段访问; |
sync : | 所有数据在请求时写入共享 |
async : | NFS在写入数据前可以相应请求 |
secure : | NFS通过1024以下的安全TCP/IP端口发送 |
insecure : | NFS通过1024以上的端口发送 |
wdelay : | 如果多个用户要写入NFS目录,则归组写入(默认) |
no_wdelay : | 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。 |
subtree_check | 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限 |
no_subtree_check | 和上面相对,不检查父目录权限 |
all_squash | 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 |
no_all_squash | 保留共享文件的UID和GID |
root_squash root | 用户的所有请求映射成如anonymous用户一样的权限 |
no_root_squas root | 用户具有根目录的完全管理访问权限 |
保存退出之后在终端输入以下命令对nfs-kernel-server进行内容的添加,打开文件之后如下图所示:
vim /etc/default/nfs-kernel-server
在文件底部添加以下内容,以此来适配开发板和ubuntu虚拟机的nfs版本,添加内容如下,添加完成如下图所示:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
保存退出之后在终端输入以下命令,重启nfs服务 ,如下图所示:
sudo service nfs-kernel-server restart
sudo /etc/init.d/nfs-kernel-server restart
然后我们使用命令“showmount -e”查看nfs挂载目录如下图所示:
出现上图所示说明我们的nfs服务搭建成功。
在这里我们以buildroot系统为例子,将“iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\02_buildroot文件系统\03_buildroot制作好的镜像”目录下的rootfs.tar.gz拷贝到ubuntu的home目录下,如下图所示:
然后我们使用以下命令将rootfs.tar.gz进行解压,解压完成会生成一个system文件夹,该文件夹之中就是我们的文件系统,如下图所示:
tar -vxf rootfs.tar.gz
随后我们使用以下命令将system目录中的内容拷贝到nfs_rootfs目录下,拷贝完成如下图所示:
cp system/* ./nfs_rootfs/ -a
至此我们的ubuntu虚拟机的设置就完成了。
8.6.4 功能实现
由于我们默认修改了uboot的源码,所以每一次重新启动系统的环境变量都是我们预先设置好的,所以要使用nfs启动和Tftp下载的情况都要重新输入参数。
8.6.4.1 tftp加载内核和设备树
首先我们根据第一小节配置自身ip和server ip,然后我们使用以下命令将内核和设备树加载进内核之中,如下图所示:
tftp c2000000 uImage
tftp c4000000 stm32mp157a-itop-rgb-070.dtb
uImage为内核镜像,下载到首地址为0xc2000000的内存空间;
stm32mp157a-itop-rgb-070.dtb为设备树,根据实际屏幕型号烧写设备树
这个时候我们的设备树内核就已经加载进了内存之中,然后我们使用以下命令查看bootargs参数,如下图所示:
printenv bootargs
可以看到我们现在文件系统的挂载目录为TF卡的第五个分区,稍后我们使用命令
bootm c2000000 - c4000000
bootm 根据内核镜像地址和设备树地址加载启动,注意“ - ”左右有空格.
加载进系统,启动成功如下图所示:
8.6.4.2 nfs挂载文件系统
首先我们根据第一小节配置开发板自身ip和查看ubuntu虚拟机ip,然后我们在开发板终端输入以下命令,设置网络启动参数(启动文件系统)如下图所示:
setenv bootargs 'root=/dev/nfs nfsroot=192.168.1.3:/home/nfs_rootfs ip=dhcp rootwait rw earlyprintk console=ttySTM0,115200'
saveenv
注意最后面的“ ' ”不能丢掉
nfsroot后的参数为PC端的nfs文件夹路径,读者根据自己需要配置,格式为:
nfsroot=NFS服务器IP(Ubuntu的IP):文件系统的绝对路径。
注意空格,字母和标点符号都是英文。
然后我们使用命令来查看bootcmd参数,如下图所示:
printenv bootcmd
可以看到我们默认加载的内核和设备树是再mmc 0 的分区4中,如果我们想通过网络的方式加载内核可以参考上一章节。
然后我们通过以下命令来加载内核和设备树,如下图所示:
run bootcmd
启动文件系统会显示出挂载NFS文件系统信息:
成功后输入用户名 root ,进入系统,在Ubuntu的nfs_rootfs创建文件ccc,开发板上也会有相应的文件如下图:
至此我们的ubuntu挂载文件系统就成功了。
8.6.4.3 nfs加载内核和设备树
其实也可以通过nfs来加载内核和设备树,操作方法和8.6.4.1方法相似,只是命令不相同。
在ubuntu上进入,我们的nfs共享文件夹nfs_rootfs,如下图所示:
然后使用以下命令,将我们在8.6.2小节中存放设备树内核的tftpboot文件夹拷贝到该目录下,如下图所示:
cp -a /home/tftpboot/ ./
然后我们启动开发板,来到uboot命令行,使用以下命令加载设备树和内核(其实可以不用提前获取ip,uboot会自动帮我们获取),如下图所示:
nfs c2000000 192.168.1.3:/home/nfs_rootfs/tftpboot/uImage
nfs c4000000 192.168.1.3:/home/nfs_rootfs/tftpboot/stm32mp157a-itop-rgb-070.dtb
uImage为内核镜像,下载到首地址为0xc2000000的内存空间;
stm32mp157a-itop-rgb-070.dtb为设备树,根据实际屏幕型号烧写设备树
这个时候我们的设备树内核就已经加载进了内存之中,然后我们使用以下命令查看bootargs参数,如下图所示:
printenv bootargs
可以看到我们现在文件系统的挂载目录为TF卡的第五个分区,稍后我们使用命令
bootm c2000000 - c4000000
bootm 根据内核镜像地址和设备树地址加载启动,注意“ - ”左右有空格.
加载进系统,启动成功如下图所示:
至此我们的nfs加载内核和设备树就完成了。
这三个小节大家可以灵活组合使用,就比如通过nfs加载内核和设备树之后,文件系统挂载也通过nfs挂载。或者通过tftp加载内核和设备树之后,文件系统通过nfs挂载。
8.7 设置屏幕参数
各屏幕与对应的uboot命令如下:
屏幕 | 设置命令 |
4.3寸屏幕 | setenv lcdtype 4.3 |
5寸屏幕 | setenv lcdtype 5.0 |
9.7寸屏幕 | setenv lcdtype 9.7 |
10.1寸屏幕 | setenv lcdtype 10.1 |
塑胶壳7寸屏幕 | setenv lcdtype 7.0 |
金属框7寸屏幕 | setenv lcdtype 1024x600 |
HDMI屏幕 | setenv lcdtype hdmi |
以设置9.7寸屏为例,上电后在uboot倒计时按回车,进入命令行,输入“setenv lcdtype 9.7”,然后输入“saveenv”保存,然后输入“reset”重启使环境变量生效,
8.8 设置系统启动参数
为了方便起见,且能适配更多的系统,我们在uboot中加入了系统选择,其中默认的系统选择为qt系统,由于只有yocto系统和其他系统的分区不相同,所以我们在这里只需要根据是否为yocto系统来做出选择,各系统与对应的uboot命令如下:
屏幕 | 设置命令 |
最小linux系统、Qt系统、buildroot系统、Ubuntu系统、Debian系统 | setenv bootsystem qt |
Yocto系统 | setenv bootsystem yocto |