一、前言
在上一次的STM32MP157的教程中,教大家STM32MP157基础命令的使用,同时也验证了我们STM32MP157U-Boot的部分功能。因为U-Boot的网络配置部分比较复杂,所以在上一次的教程中并没有涉及。那么本次教程,我会为大家详细的讲解U-Boot的网络相关的配置,同时也会分析多种情况下我们应该如何配置U-Boot的网络。本次教程同样是采用正点原子的STM32MP157开发板。如果你是小白请使用和我一样的开发板。如果你对U-Boot已经非常熟悉了,也可以使用自己移植好U-Boot的开发板。如果你准备好了,那就让我们开始吧!
二、谁适合本次教程
本次教程只要求大家已经移植好一个能够使用的Uboot,并且能够成功进入Uboot的终端。所以,不论你的开发板是不是和我一样的,只要Uboot的网络驱动已经移植完成,都可以看本次教程进行网络配置。如果你的开发板和我一样,那么你只需要跟着我前面的教程将Uboot移植好就可以配置网络了,当然,你也可以直接使用正点原子已经移植好的Uboot。这里要求大家进入Uboot的终端。在上一次的Uboot命令讲解中已经很详细的讲了如何进入Uboot的终端。如果还有不清楚的小伙伴可以查看Uboot命令讲解教程:
Uboot相关命令讲解:[Linux]从零开始的STM32MP157 U-Boot命令讲解及功能验证_单片机实现 uboot功能-CSDN博客
在学习本教程之前,也请确保自己有最基础的网络知识,至少需要理解什么是IP地址,什么是网关,等等。本次教程的网络相关配置并不复杂,只是比较麻烦。如果只是跟着我操作也能完成,但是我更希望大家能够理解我这些操作的用意。
三、资料的准备
这里同样的使用正点原子的官方资料,资料的下载方法在STM32MP157的环境搭建教程中已经讲得很清楚了,没有下载资料得小伙伴可以查看环境搭建教程:
STM32MP157开发环境搭建:[Linux]从零开始的STM32MP157交叉编译环境配置_stm32mp157 linux 开发 单片机开发-CSDN博客
准备好的资料如下图:
四、U-Boot网络配置
这里配置Uboot的网络主要是为了使用Uboot的网络功能从Ubuntu上拉取一些文件或者让开发板从Ubuntu下载系统到DDR中启动。所以我们的网络配置最主要需要做的就是让我们的开发板能够直接访问到Ubuntu虚拟机。这里我们会使用ping命令进行通断测试,如果开发板额能够ping到Ubuntu那就说明我们的开发板与Ubuntu的网络通信没有问题。这里会为大家提供两种网络配置的方法,一种是直接使用网线连接开发板和计算机。另一种则是正点原子官方文档中的,使用路由器作为媒介,连接开发板和计算机。这两种方法在接下来的教程中都会进行详细的介绍。大家可以根据自己的情况选择这两种方法的其中一种。那就让我们开始吧!
1.直接连接Ubuntu与开发板
下面这种方式适用于直接使用网线连接开发板的情况。这里大家需要找一根能够使用的网线,将网线的一头接在开发板的网口,另一头接到计算机的网口上,随后启动开发板进入U-Boot的终端中。这样,我们的开发板和计算机就使用网线连接起来了。这里的连接比较简单就不多说了。
如果计算机与开发板成功连接的话,网口旁边的LED会亮起,并且网口的LED也会亮起:
如果你的开发板上述的LED没有亮起,先检查网线是否插好,并且测试网线是不是正常可以使用的。最后检查开发板的接口和计算机的接口是否都正常。
这里我们可以打开“网络和Internet”,就可以查看到这里会多一个以太网,出现这个以太网也表示我们的开发板和计算机已经成功连接了:
下面我们可以前往控制面板中配置一下这个以太网,我们来到控制面板中,点击“网络和Internet”:
随后点击“网络和共享中心”:
随后再点击“更改适配器设置”:
来到下面的网络配置界面后我们就可以开始配置网络了:
这里我们需要找到网线连接到了哪个网卡上,很明显的,我的开发板连接到了主板的网口上,所以这里选择PCIE的这张网卡:
双击就会出现下面的配置界面,我们点击属性:
随后再点击“Internet协议版本4”:
随后就会出现下面的界面,我们就可以开始配置IP了:
在配置之前,请确保自己有一定的网络基础,如果你没有网络基础,但又想完成操作的话,请把所有的参数都配置得和我一样。这里先讲解一下原理。我们需要让开发板能够ping通Ubuntu,首先要保证开发板和计算机正确连接并且可以正常传输数据。怎么确保开发板和计算机能够正常通信呢?我们可以让我们的开发板和计算机处于同一个网段内,并且在U-Boot中将计算机设置为开发板的服务器。这样,我们的开发板和计算机应该就能ping通了,同时也确保了开发板与计算机的连接没有问题。现在让我们开始吧!
这里我们选择“使用下面的IP地址”:
这里我们先将计算机的IP地址配置为“192.168.1.100”,子网掩码会自动补出来:
默认网关可以配置为“192.168.1.1”,当然,我们的网络中并不存在这个设备,如果开发板发起ping请求的话,我们的计算机就直接接收到请求并且做出回应了:
这样一来,我们计算机一侧就配置好了,准备配置开发板的参数。首先还是要求大家进入开发板的U-Boot终端,如图:
在上一次的教程中,我们教了大家如何修改环境变量。我们开发板的IP地址,子网掩码等都是通过环境变量来配置的,这里我们需要将开发板的IP地址的网段配置到和计算机一样。所以我这里就将开发板的IP地址配置成了“192.168.1.200”,我们使用下面的命令:
setenv ipaddr 192.168.1.200
然后我们设置一下子网掩码,这里子网掩码我们设置为“255.255.255.0”,子网掩码用于网络地址与主机地址的划分,一定要与计算机上配置得一样。我们使用下面得命令:
setenv netmask 255.255.255.0
下面我们来设置一下网关,这里的网关我们配置为和计算机一样的,即“192.168.1.1”,使用下面的命令:
setenv gatewayip 192.168.1.1
这里我们还需要设置一下服务器的IP地址,因为现在对于Uboot来说,服务器就是我们的计算机,我们Uboot中服务器的IP地址直接配置为我们计算机的IP地址,使用下面的命令:
setenv serverip 192.168.1.100
最后我们还需要设置一下开发板网卡的MAC地址,这里的MAC地址也是作为我们开发板网卡的唯一标识,使用下面的命令进行设置:
setenv ethaddr b8:ae:1d:01:01:00
设置完以上以后,我们使用下面的命令将上述的配置保存到EMMC中:
saveenv
至此我们开发板的网络配置就都完成了。我们可以使用下面的ping命令来验证一下配置是否成功。
ping 192.168.1.100
出现以下的提示就表示已经ping通了,我们的开发板和计算机已经成功连接并且可以传输数据了:
当然,这里只能使用开发板ping计算机才是通的,假如使用计算机去ping开发板,开发板是不会响应的。这也是正常的现象。
如果做了以上的步骤,你被提示“ping failed; host 192.168.1.100 is not alive”。这需要你检查计算机相关网卡的IP地址是否配置正确。在Uboot中的相关配置是否配置正确。如果你已经确定你做的没问题了,就可以尝试以下解决办法。当然,如果你没有遇到ping不通的错误,就可以跳过此步。
这里我们首先要打开控制面板,点击“系统和安全”:
随后点击“Windows Defender防火墙”:
随后再点击高级设置:
随后再点击“入站规则”:
进入以后往下滑找到“文件和打印机共享(回显请求CMPv4-ln)”并且启用:
启用了上述的项以后,应该就能ping通了。
下面的步骤也都建立在开发板能够ping通计算机的前提之上。
走到这里,我们已经完成一半了。要实现开发板和Ubuntu通信也仅仅是一步之遥。
下面同样来讲讲原理,我们上面做的一切都是为了验证开发板到计算机的通信有没有问题。当我们测试计算机到开发板的物理通信没问题以后,我们就可以将计算机本身当作网关,Ubuntu和开发板都将网关设置为计算机的IP地址,并且将三个设备都配置在同一IP内。这样我们的Ubuntu和开发板就能正常通信了。
那我们说干就干,这里首先配置计算机,我们想将计算机当作Ubuntu和开发板的网关,IP地址自然就设置为“192.168.1.1”,这里我们同样去控制面板中设置就行了,如下图所示:
这里配置完成以后,直接点击“确定”即可。这样我们计算机一侧就配置好了。下面开始配置Ubuntu。这里我们首先要配置一下虚拟网卡,打开VM,我们点击“编辑”:
随后点击“虚拟网络编辑器”:
随后在弹出的窗口中点击“更改设置”:
这里我们一般配置“VMnet0”:
这里我们需要将“VMnet”配置为桥接模式并且桥接到相关的网卡上。因为我的开发板是直接接到主板上的,所以这里我就直接桥接到主板的网卡上:
配置完成以后,点击“应用”即可。
随后我们点击Ubuntu虚拟机的设置:
随后点击“网络适配器”,然后点击“自定义”并且选择“VMnet0”,也就是我们刚刚配置过的网卡:
配置完成以后点击“确定”。
完成上面的配置以后,我们启动虚拟机。下面我们开始配置Ubuntu的IP地址。我们点击右上角的网络图标:
随后点击“有线连接”:
再点击“有线设置”:
随后点击有线连接旁边的设置:
这里我们点击“IPV4”:
下面我们再点击“手动”:
这里我们将Ubuntu的IP地址配置为“192.168.1.100”,这样一来,开发板ping192.168.1.100这个地址的时候就是直接ping到Ubuntu了,这样Ubuntu也是作为开发板服务器的存在:
子网掩码同样的配置为“255.255.255.0”:
这里我们将网关同样配置为“192.168.1.1”表示将我们的计算机作为网关:
配置完以上以后,点击“应用”即可:
配置完以上以后,我们需要重启一下Ubuntu确保网络配置正确刷新,重启完成以后在Ubuntu中输入“ifconfig”查询网络信息是否修改成功:
完成以上以后,我们就可以使用我们的开发板去pingUbuntu的IP地址,即192.168.1.100:
可以看到,我们的开发板已经成功ping到Ubuntu了,这也意味着我们的开发板与Ubuntu已经成功建立联系了。
至此,我们使用网线直接连接Ubuntu与开发板的配置就已经完成了。
2.使用路由器连接Ubuntu与开发板
使用路由器将开发板与Ubuntu连接也是正点原子比较官方的做法。这里需要大家的网络中有一个路由器,并且将将电脑的网口直接接在路由器的LAN口上。这里的路由器能不能上网都不会影响到我们的Ubuntu与开发板正常连接。这里我们将开发板和路由器都通过网线连接到路由器的LAN口上,如果你的路由器没有做明确的WAN口和LAN口的分明,就说明你的路由器的接口是可以灵活配置的。这里我会为大家演示在路由器打开DHCP的情况下,如何配置开发板与Ubuntu连接并且进行网络通信。现在就让我们开始吧!
首先我们需要打开路由器的DHCP功能,这需要我们进入路由器的后台管理界面。大家的路由器品牌各不相同,但是进入后台的方法都大同小异。这里大家就根据自己的路由器型号自行进行搜索吧!因为CSDN不允许放路由器后台图片,所以这里就没办法展示了。
大家打开路由器的DHCP功能以后,就可以进行下一步了。
下面我们就可以开始配置Ubuntu的IP地址了,这里我们同样点击VM的“编辑”:
随后点击“虚拟网络编辑器”:
随后再点击“更改设置”:
这里我们同样是修改VMnet0,将其修改为桥接模式,并且桥接到我们已经连接到路由器的网卡上:
配置完以上以后,直接点击“确定”即可。
随后我们再点击“编辑虚拟机设置”:
这里我们选择“网络适配器”然后选择“自定义”这里选择我们刚刚配置过的网卡,也就是VMnet0:
完成以上配置以后,点击“确定”,然后我们重启虚拟机,
我们进入Ubuntu系统以后输入“ifconfig”查询一下Ubuntu现在的IP地址,这里可以看到我们的Ubunbtu已经被路由器分配到IP地址了:
这样一来,我们的Ubuntu一侧就配置好了,现在我们开始配置开发板。
这里我们开始配置开发板,首先确保自己的路由器与开发板已经使用网线正确连接,然后,这里首先我们使用下面的命令来设置一下开发板的MAC地址:
setenv ethaddr b8:ae:1d:01:01:00
在为开发板设置完MAC地址以后,我们可以设置一下Uboot中服务器的地址,这里服务器的地址就是刚刚我们查询到的Ubuntu的IP地址,我这里Ubuntu中的IP地址为“192.168.1.100”,所以直接使用下面的命令:
setenv serverip 192.168.1.100
设置好以上以后,我们可以直接使用DHCP命令,这条命令可以让DHCP服务器为开发板分配一个IP地址,但是前提是开发板已经正确的连接到路由器上。这里我们直接输入下面的命令:
dhcp
可以看到,我这里的开发板已经成功分配到IP地址了,这里被分配到的地址为“192.168.1.106”:
如果你在这一步中没有分配到IP地址,首先确定开发板与路由器已经正确连接,然后确定路由器已经开启了DHCP。
然后我们使用下面的命令配置一下Uboot的子网掩码:
setenv netmask 255.255.255.0
然后我们还需要设置一下Uboot的网关地址,这里我们直接将路由器当作网关就行了,这里我路由器的IP地址为192.168.1.1所以直接使用下面的命令:
setenv gatewayip 192.168.1.1
设置完以上以后,我们直接使用下面的命令将这些环境变量保存:
saveenv
完成以上以后,我们就可以直接使用Uboot去ping Ubuntu的地址了,我这里Ubuntu的地址为192.168.1.100,所以使用下面的命令:
ping 192.168.1.100
可以看到,这里我们已经ping成功了:
同样的,只能使用Uboot去ping Ubuntu,Ubuntu去ping Uboot是不会有响应的。
至此,我们使用路由器连接Ubuntu与开发板就完成了。
3.双网卡的解决方案
因为我们的VM网卡已经桥接到了开发板连接的网卡上了,这张网卡肯定是没有网络的。那么我如果我们的Ubuntu要使用网络,我们又应该怎么办呢?这里我们可以为我们的Ubuntu添加两张网卡,这样我们的Ubuntu既能连接到互联网,同时也能连接到开发板。话不多说,现在就开始操作吧!
这里我们同样点击VM的“编辑”然后点击“虚拟网络编辑器”来到下面的页面:
然后我们再点击“更改设置”:
这里需要注意,如果你是小白,请务必保证你的操作和我一样。现在先简单描述一下我计算机的网络情况,我的计算机目前主要使用wifi无线网络进行上网,并且计算机的网口连接了开发板。这里我们需要将VMnet0桥接到我们的上网网卡上,注意是上网网卡:
然后需要将VMnet1桥接到接了开发板的网卡上:
这样我们的虚拟网卡相关的配置就完成了。然后点击“确定”即可:
然后我们再点击“编辑虚拟机设置”:
随后我们点击“添加”:
我们选择“网络适配器”点击“完成”:
这样我们就有两张网卡了:
这里的“网络适配器1”需要自定义到VMnet0:
“网络适配器2”自定义到VMnet1:
完成上面的配置以后,我们直接点击“确定”即可。
然后我们可以重启Ubuntu,就可以看到我们的Ubuntu有两张网卡了:
这里我们可以去ping一下baidu:
如果你在这一步中,无法访问外部网络,可以尝试在“虚拟机设置中”将两个网络适配器配置到的VMnet0和VMnet1交换一下位置。
这里我们再使用Uboot去ping一下Ubuntu:
这里我们的Uboot也可以正常的ping到Ubuntu。
这里我们的双网卡就已经成功配置了。
五、nfs与tftp的使用
nfs与tftp是Uboot与Ubuntu之间一种常用的文件传输协议。主要用于Uboot从Ubuntu拉取文件。这样一来,每次编译好一个系统以后我们就可以不用STM32CubeProgrammer进行下载了。可以直接使用nfs将其传输到开发板中,再使用开发板启动这个系统。这样也节省了我们调试系统的时间。nfs与tftp也可以实现从网络启动系统,Uboot每次启动时可以使用这两种传输协议进行网络启动。下面就来教大家如何安装与配置nfs和tftp。当然在进行下面的步骤之前我们需要先确保使用Uboot能够正常的ping通Ubuntu。现在就让我们开始吧!
1.nfs的安装与使用
这里我们要使用nfs,首先就需要在Ubuntu中安装nfs服务,这里我们直接使用下面的命令安装nfs服务:
sudo apt-get install nfs-kernel-server rpcbind
在安装好相关的软件包以后,我们需要创建一个目录专门用于nfs文件传输的目录,这里我将文件夹新建在了用户目录下的linux目录下,如图所示:
这里我们需要记住这个路径,然后使用下面的命令打开nfs的配置文件:
nano /etc/exports
然后将下面的一行配置添加到配置文件的最后一行中:
/home/chulingxiao/linux/nfs *(rw,sync,no_root_squash)
这里需要注意的是,前面“/home/chulingxiao/linux/nfs”是我创建的用于nfs文件传输的目录路径,大家新建的目录可能不一样,所以路径也可能不一样,大家根据自己的情况进行修改。
完成上面的操作以后保存文件并且退出。然后我们使用下面的命令重启一下nfs服务,注意,这一步非常重要:
sudo /etc/init.d/nfs-kernel-server restart
完成上面的步骤以后,我们Ubuntu上的nfs服务就已经配置完成了。下面我们向这个nfs目录中拷贝一个文件,这里我们打开正点原子资料目录下的“08、系统镜像\02、出厂系统镜像\03、linux-mp1-5.4.31-g886e225be-v1.9”目录,就可以看到一个名为“uImage”的文件:
这里我们将其拷贝到nfs的文件传输目录中,如图所示:
这样我们Ubuntu一侧的文件就准备好了,可以准备进行nfs文件传输了。
下面是一条nfs文件传输命令:
nfs [loadAddress] [[hostIPaddr:]bootfilename]
首先是这里的“[loadAddress]”表示我们要将拉取下来的文件存放在内存的哪一段地址中,然后是“hostIPaddr”表示我们需要访问的服务器的IP地址,这里简单来说就是我们Ubuntu的IP地址,后面的“bootfilename”表示我们要拉取的文件的路径。理解了上面命令的含义,我们就来实际的写一下,首先是内存地址,这里我们就将拉取的文件存放在“C2000000”中吧。然后因为“hostIPaddr”就是我们Ubuntu的IP地址所以直接写“192.168.1.100”。然后是路径,这里我的文件路径是“/home/chulingxiao/linux/nfs/uImage”所以我这里的nsf文件传输命令如下:
nfs C2000000 192.168.1.100:/home/chulingxiao/linux/nfs/uImage
当我们输入命令并且回车以后,我们的文件就被拉取过来了:
如果你在这一步出错了,首先根据错误检查问题,查看IP地址与路径是否写错了。
至此,我们nfs的安装与使用就已经完成了。
2.tftp的安装与使用
和nfs一样,tftp同样用于在Ubuntu与开发板之间传输文件。在使用tftp服务之前我们需要先安装相关的tftp服务,这里我们使用下面的命令安装即可:
sudo apt-get install tftp-hpa tftpd-hpa xinetd
这里如果大家的因为连接了开发板导致拉取不成功,可以先将网卡桥接回上网网卡。或者使用上面“四.3双网卡的解决方案”。
这里安装好tftp相关的包以后,我们还需要创建一个tftp传输文件的目录,这里我同样将tftp的目录创建在了用户目录下的linux目录下:
这里我们还需要给这个目录权限,使用下面的命令即可:
chmod 777 tftp
然后我们需要创建一个tftp的配置文件,这里大家直接使用下面的命令创建即可:
sudo nano /etc/xinetd.d/tftp
然后将下面的内容填到配置文件中:
server tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/chulingxiao/linux/tftp/
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
注意,这里的“server_args”表示tftp的目录,也就是我们刚才创建的目录。大家改成自己的目录即可。
完成以上以后,我们使用下面的命令启动tftp服务:
sudo service tftpd-hpa start
然后我们使用下面的命令打开另一个tftp相关的配置文件:
nano /etc/default/tftpd-hpa
我们需要将配置文件中的“TFTP_DIRECTORY”改成我们刚刚创建的tftp路径。将“TFTP_OPTIONS”中的内容改为“-l -c -s”,修改完以后如图所示:
保存并退出后,我们使用下面的命令重启tftp:
sudo service tftpd-hpa restart
重启完成以后,我们的tftp就差不多配置完成了。
然后我们向tftp的目录中拷贝一个文件。这里我们还是用uimage这个文件来举例,拷贝到tftp目录以后,需要赋予权限777,否则可能会拉取失败:
chmod 777 uImage
设置完成以后,如图所示:
下面我们来看看tftp的命令格式:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
这里的“loadAddress”与nfs命令中的一样,都表示要将拉取的文件存放在DDR中的地址,然后是“hostIPaddr”同样表示要拉取文件的服务器的地址,在tftp中“hostIPaddr”可以不写,tftp会去我们配置的环境变量中去寻找服务器的地址。最后是“bootfilename”表示文件的路径,这里和nfs不一样的地方在于,这里的路径不用写绝对路径,直接写放在tftp目录的文件即可,这里我们命令直接写成这样即可:
tftp C2000000 uImage
这里可以看到,我们的uImage已经使用tftp拉取过来了。
六、从网络启动Linux内核
上面我们已经成功安装并且配置完成nfs与tftp以后,我们就可以来配置从网络启动了。这里需要结合到我们上一节讲的“bootcmd”环境变量。每当Uboot启动以后,都会执行“bootcmd”环境变量中的命令,我们只需要让我们的Uboot在启动时从网络拉取Linux的内核以及设备树文件到DDR中,然后再启动就行了。那么,说干就干,我们之前已经将uImage文件复制到了tftp目录,这个是Linux的内核文件。然后我们还需要将设备树文件复制过去,Linux的对应的设备树文件被放在了正点原子资料目录下的“08、系统镜像\02、出厂系统镜像\03、linux-mp1-5.4.31-g886e225be-v1.9”目录下:
我们将其复制到tftp目录下,并且赋予777的权限,如图所示:
这样就已经可以了,我们回到Uboot中,使用下面的命令配置一下“bootcmd”环境变量,将其配置为,使用tftp去拉取设备树和内核文件到DDR中并且启动内核:
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
配置完成以后,我们使用下面的命令保存环境变量:
saveenv
然后输入下面的命令就可以执行“bootcmd”环境变量的内容:
boot
输入命令回车以后,我们可以看到,Uboot首先去拉取了相关的文件到DDR中然后启动了系统:
以后每次复位都会运行“bootcmd”中的命令,也就是说,我们的开发板复位就实现了网络启动。
至此,我们从网络启动就已经完成了。
七、结语
在本次教程中,教了大家如何配置Uboot的网络,也教了大家如何使用网络相关的命令并且我们还接触到了Uboot网络的进阶用法——从网络启动。大家最后还是好好吸收一下上面的内容吧,如果遇到问题也欢迎在评论区和私信中问我,那么最后,感谢大家的观看!