1. uboot烧录
2.linux安装nfs服务
-
sudo apt-get install nfs-kernel-server rpcbind安装nfs服务
-
在用户根目录下创建一个名为“linux”的文件夹,以后所有的东西都放到这个“linux”文件夹里面,在“linux”文件夹里面新建一个名为“nfs”的文件夹,更改777权限。
-
打开 nfs 配置文件:sudo vi /etc/exports
-
在最后加上:/home/tao/linux/nfs *(rw,sync,no_root_squash)
-
重启nfs服务:sudo /etc/init.d/nfs-kernel-server restart
-
(可选)windows中打开nfs,访问虚拟机中的nfs:
mount 192.168.72.129:/home/tao/linux/nfs X:
在文件管理中能看到x盘,取消挂载:umount X: -
如果用开发板则可能出现cannot mount 问题,解决:sudo vi /etc/default/nfs-kernel-server
-
执行指令查看 NFS 共享目录:showmount -e;指令nfsstat可查看状态。
3. uboot网络通信命令:
1.与虚拟机通信(桥接模式,可nfs)
1.NAT模式,不能用nfs,要nfs用桥接模式,烧录uboot程序后,开发板拨码开关改为010由内置emmc启动:
usb通过usb_ttl接上电脑,打开MobaXterm软件,波特率115200,启动完成后软件显示界面:
2. 使用的是usb网卡连接开发板与电脑。控制面板->网络和Internet->适配器:可知以太网是usb网卡。双击以太网(usb网卡)->详细信息,查看ip地址为192.168.137.1/24(如果没有则点击属性->ipv4配置一个ip地址),这时候表明开发板与网卡使用192.168.137.0/24这个网段可以与虚拟机通信。
- 配置一个虚拟网卡用于与开发板通信。点击虚拟机:编辑->虚拟网络编辑器->右下角点击更改配置,同意权限。然后选中VMnet0这一项,选择桥接模式,选择要跟开发板通过网线连接的接口,我这儿是Realtek USB……,你可根据自己的网络接口选择。
- 虚拟机设置->网络适配器->选择使用VMnet0网卡,这是虚拟机VMnet0与usb网卡直连,与开发板处于同一网段,可通信。
- 此时网卡还没有ip地址,设置一个与开发板同一网段的ip:sudo ifconfig ens33 192.168.137.4,使用ifconfig查看:
- 在MobaXterm软件中设置开发版ip地址与电脑usb网卡处于同一网段,这里设置为192.168.137.3/24,网关则为电脑usb网卡地址,serverip为服务器地址,用于nfs传输文件,不用nfs则不设置,这里虚拟机中地址为192.168.137.4/24。使用ping 命令测试与网卡连通性,注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!
- 此时开发板ip为192.168.137.3/24,使用nfs可挂载。注意:使用NAT模式时nfs c2000000 192.168.137.4:/home/tao/linux/nfs/uImage会提示cannot mount,而网上的方法是试遍了也不行,用桥接模式可以。
2.dhcp命令
1.dhcp 用于从路由器获取 IP 地址,前提是开发板得连接到路由器上的,如果开发板是和电
脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址,DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来启动 linux 内核,输入“? dhcp”即可查看 dhcp 命令详细
的信息。
3.nfs命令
- nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试.
- 网络调试是 Linux 开发中最常用的调试方法。原因是嵌入式 linux 开发不像单片机开发,可以直接通过 JLINK 或 STLink 等仿真器将代码直接烧写到单片机内部的flash 中,嵌入式 Linux 通常是烧写到 EMMC、NAND Flash、SPI Flash 等外置 flash 中,但是嵌入式 Linux 开发也没有 MDK,IAR 这样的 IDE,更没有烧写算法,因此不可能通过点击一个“download”按钮就将固件烧写到外部 flash 中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有 MDK、IAR的一键下载方便,在 Linux 内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的 linux 镜像和设备树文件下载到 DRAM 中,然后就可以直接运行。
- 我们一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中.我的ubuntu主机中nfs目录设置为/home/tao/linux/nfs.
- uboot 中的 nfs 命令格式为:nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。这里我们将正点原子官方编译出来的 Linux 镜像文件 uImage 下载到开发板 DRAM 的 0xC2000000,这个地址处(ST 官方指定的 Linux 内核加载地址)。
- 准备好以后就可以使用 nfs 命令来将 uImage 下载到开发板 DRAM 的 0XC2000000 地址处,命令如下:
nfs C2000000 192.168.72.129:/home/tao/linux/nfs/uImage
4.TFTP命令
-
ubuntu需要安装tftp-hpa和tftpd-hpa:
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd -
新建目录:
mkdir /home/tao/linux/tftpboot
chmod 777 /home/tao/linux/tftpboot
3.新建目录/etc/xinetd.d,创建文件/etc/xinetd.d/tftp,内容如下:
1 server tftp
2 {
3 socket_type = dgram
4 protocol = udp
5 wait = yes
6 user = root
7 server = /usr/sbin/in.tftpd
8 server_args = -s /home/tao/linux/tftpboot
9 disable = no
10 per_source = 11
11 cps = 100 2
12 flags = IPv4
13
14 } -
完了之后启动tftp服务: sudo service tftpd-hpa start
-
修改/etc/default/tftpd-hpa:
6. 重启服务器:sudo service tftpd-hpa restart,将uImgae文件复制到tftpboot目录中并赋予权限。
7. tftp C2000000 uImage下载过程:
5.EMMC和SD卡操作命令
- 常用命令:
mmc info 输出 MMC 设备信息
mmc read 读取 MMC 中的数据。
mmc wirte 向 MMC 设备写入数据。
mmc rescan 扫描 MMC 设备。
mmc part 列出 MMC 设备的分区。
mmc dev 切换 MMC 设备。
mmc list 列出当前有效的所有 MMC 设备。
mmc hwpartition 设置 MMC 设备的分区。
mmc bootbus…… 设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值。
mmc bootpart…… 设置指定 MMC 设备的 boot 和 RPMB 分区的大小。
mmc partconf…… 设置指定 MMC 设备的 PARTITION_CONFG 域的值。
mmc rst 复位 MMC 设备
mmc setdsr 设置 DSR 寄存器的值。
-
mmc info
-
mmc dev 命令用于切换当前 MMC 设备,命令格式如下:
mmc dev [dev] [part]
[dev]用来设置要切换的 MMC 设备号,[part]是分区号,如果不写分区号的话默认为分区 0。
使用如下命令切换到 SD 卡:
mmc dev 0 //切换到 SD 卡,0 为 SD 卡,1 为 eMMC -
mmc read 命令
mmc read 命令用于读取 mmc 设备的数据,命令格式如下:
mmc read addr blk# cnt
addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十六进制)。比如从 EMMC 的第 1024(0x400)个块开始,读取 16(0x10)个块的数据到 DRAM 的0XC0000000 地址处,命令如下:
mmc dev 1 //切换到 EMMC
mmc read c0000000 400 10 //读取数据
6.EXT格式文件系统操作命令
- ext4ls
ext4ls 命令用于查询 EXT4 格式设备的目录和文件信息,命令格式如下:
ext4ls [<dev[:part]>] [directory]
interface 是要查询的接口,比如 mmc,dev 是要查询的设备号,part 是要查询的分区,directory是要查询的目录。比如查询 EMMC 分区 2中的所有的目录和文件,输入命令:
ext4ls mmc 1:2
从下图可以看出,emmc 的分区 2 中存放了 10 个文件,其中比较重要的就是三个.dtb 设备、树文件和 Linux 内核的 uImage 镜像文件。
- ext4load 命令
extload 命令用于将指定的文件读取到 DRAM 中,命令格式如下:
extload [<dev[:part]> [ [ [bytes [pos]]]]]
interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是保存在 DRAM 中的起始地址,filename 是要读取的文件名字。bytes 表示读取多少字节的数据,如果 bytes 为 0 或者省略的话表示读取整个文件。pos 是要读的文件相对于文件首地址的偏移,如果为 0 或者省略的话表示从文件首地址开始读取。我们将图 10.3.6.1 中 EMMC 分区 2 中的 uImage 文件读取到DRAM 中的 0XC2000000 地址处,命令如下:
ext4load mmc 1:2 C2000000 uImage
- ext4write
ext4wirte 命令用于将 DRAM 中的数据写入到 MMC 设备中,命令格式如下:
ext4write <dev[:part]> [sizebytes] [file offset]
interface 为接口,比如 mmc;dev 是设备号;part 是分区;addr 是要写入的数据在 DRAM中的起始地址;absolute filename path 是写入的数据文件名字,注意是要带有绝对路径,以‘/’开始;sizebytes 表示要写入多少字节的数据;file offset 为文件偏移。我们可以通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树。我们以更新 linux 镜像文件 uImage 为例,首先将正点原子 STM32MP157 开发板提供的uImage 镜像文件拷贝到 Ubuntu 中的 tftpboot 目录下,使用命令 tftp 将 uImage 下载到 DRAM 的 0XC0000000 地址处,命令如下:
tftp C0000000 uImage
uImage 大小为 7313888(0X6F99E0)个字节,接下来使用命令 ext4write 将其写入到 EMMC的分区 2 中。为了和原有的 uImage 文件区分,我们将要写入的文件命名为 test_uImage,命令如下:
ext4write mmc 1:2 c0000000 /test_uImage 0x6f99e0
- 完成以后使用“ext4ls”命令查看一下 EMMC 分区 2 里面的文件。