在线课堂:https://www.100ask.net/index(课程观看) 论 坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taobao.com/ (淘宝) https://weidongshan.tmall.com/(天猫) 交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载) 交流群二:QQ群:536785813(单片机-嵌入式) 公 众 号:百问科技
在嵌入式开发中,涉及交叉编译:在 PC 上编译,在开发板上运行。所以就涉及 PC 和开发板之间的文件 传输,方法有多种:网络传输、串口传输、USB 传输,当然,还有最笨的方法:U 盘拷贝。
一般的日常开发流程为:
a. 在 Windows 上阅读修改代码,然后通过 FileZilla 把代码传到 VMWare 中的 Ubuntu; b. 在 Ubuntu 上编译程序; c. 把程序下载到开发板上,运行验证, d. 在 Windows 下通过串口操作开发板。
所以在 Windows、Ubuntu、开发板三者间,两两之间都存在文件的传输。
当然,有人不喜欢 Windows,PC 只用纯 Linux,这些高手已经熟练掌握各种 Linux 命令,不再存在文件传输的障碍。
总之,各种需求都存在,比如某些笔记本没有网口,那可以使用 USB 线连接开发板,开发板模拟出网卡;在工地上网口、USB 口统统没有,那我们还可以使用串口。
我们会一一列举,作为初学者,不需要验证全部章节,选择合适你的即可。
如果只是偶尔传输小文件,可以直接使用串口。 注意:在开发过程中,使用 NFS 是最方便的。
这不用介绍了吧。
可以在开发板上使用 rz 命令,将 PC 上的文件传输到开发板。
请参考《5.3.2 使用rz命令通过串口下载Windows文件到开发板上》
可以在开发板上使用 sz 命令,将开发板的文件上传给PC。 请参考《5.3.3 使用 sz 命令通过串口把开发板文件上传给 PC》。
尚未实现。
在嵌入式开发中,网络服务带来了很多便利,特别是 Ubuntu 上的 NFS 服务。使用 NFS 服务,开发板可以挂载 Ubuntu 上的某个目录,假设开发板把 Ubuntu 上的/home/book 目录挂载到自己的/mnt 目录,那么在开发过程中,可以如此操作:
a. 在 Ubuntu 上的/home/book/abc 目录中编译程序 b. 开发板可以直接运行/mnt/abc 下的程序
在 Ubuntu 上编译程序,开发板可以立刻执行程序,免去了上传、下载等等繁琐的操作。
Windows 推出了 WSL 子系统(Windows Subsystem for Linux),这确实是个很牛的产品。可惜它不支持NFS 服务,否则我们早就舍弃 Ubuntu 而采用 WSL 了。
当然,网络服务不仅仅有 NFS,还有 TFTP、SSH 等服务。如果只是传输文件,可以使用 TFTP、SSH 等服务,比如:
a. 在 Ubuntu 启动 TFTP 服务,开发板通过 tftp 命令和 Ubuntu 互传文件; b. 在 Windows 启动 TFTP 服务,开发板通过 tftp 命令和 Windows 互传文件; c. 在开发板上启动 SSH 服务,Windows 通过 FileZilla 登录开发板,互传文件。
上述场景各有其存在的道理: 如果开发板没安装 SSH 服务,那么就可以通过 tftp 命令使用 Ubuntu 或 Windows 的 TFTP 服务。 如果开发板安装了 SSH 服务,那么使用 FileZilla 传输文件时是完全的 GUI 操作,非常方便。 开发、调试过程使用 Ubuntu 的 NFS 服务,这是最方便的。
NFS、TFTP、SSH 等服务,都是基于网络的。开发板可以使用网线和电脑相连,也可以使用 USB OTG 线与电脑相连,后者通过虚拟的 USB 网卡使用网络。
使用网线,还是使用 USB OTG 线?有网卡、有网线就用网线,没有再选择 USB OTG 线。
下面章节讲解怎么安装、配置各种服务,作为初学者建议先使用 NFS,其他的先不管。
如果你使用的是我们提供的 Ubuntu,那么已经安装好了 NFS 服务。查看一下/etc/export 的内容,就知道开发板可以挂载哪一个目录。如果该文件中没有指定目录,请继续往下看。
如果你的 Ubuntu 未安装 NFS 服务,那么在确保 Ubuntu 可以上网的前提下,执行以下命令:
sudo apt-get install nfs-kernel-server注意:如果 Ubuntu 无法上网,使用 VMware 桥接网络时请参考《1.3 VMware 桥接网络设置》,使用 VMware NAT 网络或 Docker 时请参考《第四章 使用 NAT 配置 Ubuntu 网络》和《第五章 安装软件及开发示例》。
然后,还得修改/etc/exports,添加类似以下的内容,下面的例子里允许开发板通过 NFS 访问 Ubuntu的/home/book 目录:
/home/book *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)最后,重启 NFS 服务,在 Ubuntu 上执行以下命令:
sudo /etc/init.d/nfs-kernel-server restart可以在 Ubuntu 上通过 NFS 挂载自己,验证一下 NFS 可用:
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/book /mntls /mnt再次重申:NFS 是一种网络服务,开发板可以通过网线连接 Ubuntu 来使用 NFS 服务;甚至也可以通过USB OTG 线连接 Ubuntu,通过虚拟的 USB 网卡使用 NFS 服务。
注意:使用 VMware NAT 网络或 Docker 时,不需要在 Ubuntu 中安装 TFTP 服务,而是在 Windows 运行tftpd64 程序。
在 Ubuntu 中执行以下命令安装 TFTP 服务:
book@100ask:~$ sudo apt-get install tftp-hpa tftpd-hpa然后,创建 TFTP 服务器工作目录,并打开 TFTP 服务配置文件,如下:
book@100ask:~$ mkdir -p /home/book/tftpboot book@100ask:~$ sudo chmod 777 /home/book/tftpboot book@100ask:~$ sudo vim /etc/default/tftpd-hpa在配置文件/etc/default/tftpd-hpa 中,添加以下字段:
TFTP_DIRECTORY="/home/book/tftpboot" TFTP_OPTIONS="-l -c -s"最后,重启 TFTP 服务:
book@100ask:~$ sudo service tftpd-hpa restart查看 tftp 服务是否在运行,运行如下命令,即可查看是否在后台运行。
book@100ask:~$ ps –aux | grep “tftp”Windows 上的 TFTP 服务由一个应用程序 tftpd64 提供,下载后双击运行,再做些设置即可。tftpd64 的前身是 tftpd32,它是 32 位的程序。对于 64 位电脑,请使用 tftpd64。
tftpd64 的官网为:http://tftpd32.jounin.net/,建议下载“portable edition”版本,无需安装直接运行。官网不好打开的话,直接百度搜“tftpd64”即可,它是免费软件。
把“网盘配套资料\01_Tools (工具)\01_Tools.zip”解压后,也有此工具。
tftpd64 的使用非常简单,运行后只需要设置 3 步:
a. 选择目录(开发板将从这个目录读、写文件) b. 通过 IP 选择网卡
有些电脑有多个网卡,选择哪个网卡?使用 VMware 桥接网络时请参考《1.3 VMware 桥接网络设置》,使用 VMware NAT 网络或 Docker 时请参考《第四章 使用 NAT 配置 Ubuntu 网络》和《第五章 安装软件及开 发示例》。 c. 设置防火墙,直接关闭防火墙;或是允许 tftpsever 使用网络:
对于 Windows 10 可以按下图操作,对于其他操作系统,请自行百度:
如果你的电脑有网卡,请使用真实网卡。 如果你的电脑没有网卡,那么用 USB 线连接 PC 和开发板的 USB OTG 口,开发板可以模拟出一个 USB 网卡。Windows 使用这个 USB 网卡比较复杂,我们一般是在 VMWare 中把它连接到 Ubuntu,让开发板和 Ubuntu通过该虚拟网卡来交互。
再次声明:电脑有真实网卡,建议使用真实网卡,那就不需要看本节内容。
开发板的 USB OTG 口通过 USB 线接到 Ubunut 时,开发板是 USB 从设备,开发板可以模拟 U 盘、USB 串口、USB 网卡;Ubuntu 看到的就是一个 U 盘、USB 串口或是 USB 网卡。Ubuntu 可以通过这样的 USB 网卡跟 开发板进行网络通信,反过来开发板当然也就可以通过这个 USB 网卡挂载 Ubunut 的 NFS 目录。
开发板要安装 USB 驱动程序以模拟 USB 网卡,Ubuntu 要安装 USB 网卡驱动程序。幸运的是,Ubuntu 中自带该 USB 网卡的驱动程序,并且会自动安装驱动程序。
所以,我们要做的事情不多:
a. 在开发板上安装 USB 驱动程序,它会在开发板里虚拟出网卡 usb0,需要设置 IP b. 在 VMWare 上把虚拟网卡连接到 Ubuntu,在 Ubuntu 中设置 IP
如下所示,我们需要先在开发板终端上执行“modprobe -f g_ether”来安装驱动模块程序,安装成功的示意图如下所示。
[root@imx6ull:~]# modprobe -f g_ether该驱动会给开发板模拟出网卡 usb0,使用以下命令设置其 IP,我们取 IP 为 10.10.70.1:
[root@imx6ull:~]# ifconfig usb0 10.10.70.1在安装 g_ether 驱动时,开发板就已经模拟出了一个 USB 网卡。一旦连接开发板的 USB OTG 口到电脑,就相当于给电脑插上了一个 USB 网卡,设备管理器会自动识别到新的设备。
如下图所示,在开发板上安装 g_ether 驱动并连接 USB OTG 线到 PC 上后,PC 会发现一个新的网卡。
我们需要让 VMWare 把这个网卡连接到 Ubuntu 上,依次点击“虚拟机”–>“可移动设备”–>“Netchip RNDIS/Ethernet Gadget”–> “连接(断开与主机的连接)©”,如下图所示: 成功后,Ubuntu 系统下会多出一个新网卡,执行“ifconfig -a”命令查看网卡名,如下图所示,新网卡名为“ens35u1”。
注意:不同系统上新网卡的名字可能不同,再次接插 USB OTG 线时 Ubuntu 中新网卡名也会变化。 使用以下命令设置其 IP,我们取 IP 为 10.10.70.2:
book@100ask:~$ sudo ifconfig ens35u1 10.10.70.2分配完 IP 地址后,我们就可以通过 ping 命令来测试 Ubuntu 和开发板系统是否可以互通,测试命令如下所示。
在开发板 ping Ubuntu 的 IP:
[root@imx6ull:~]# ping -I usb0 10.10.70.2确认开发板和 Ubuntu 网络互通后,就可以在开发板上挂载 Ubuntu 的 NFS 目录来互传文件了:
有时候你会发现开发板和 Ubuntu 无法 ping 通对方,多试几次就可以:
a. 试试重新拔插 USB OTG 线 b. 试试在开发板上先禁止网卡,再启用网卡,比如:
[root@imx6ull:~]# ifconfig usb0 down [root@imx6ull:~]# ifconfig usb0 10.10.70.1c. 试试在 Ubuntu 上先禁止网卡,再启用网卡,假设虚拟网卡名为 ens35u1,可以试试这样的命令:
book@100ask:~$ sudo ifconfig ens35u1 down book@100ask:~$ sudo ifconfig ens35u1 10.10.70.2注意:Ubuntu 上的虚拟网卡名不一定是 ens35u1,需要执行“ifconfig -a”命令确认。
开发板和 Ubuntu 之间网络互通之后,就可以在两者之间传输文件了。
开发板上不一定安装有 FTP 服务、SSH 等服务,所以不一定能使用 FTP 等工具登录开发板。
但是开发板的系统一般都自带 mount 命令,并且支持 NFS 文件系统。所以可以在开发板上执行 mount 命令挂载 Ubuntu 的某个目录。这样就可以在开发板和 Ubuntu 之间传文件了。
开发板使用 NFS 挂载 Ubuntu 的前提是:Ubuntu 中已经安装了 NFS 服务,并且在/etc/exports 中配置了某个目录供挂载。
使用 NAT 网络时,确保开发板可以 ping 通 Windows 后,就可以通过 NFS 挂载 Ubuntu 中的某个目录。
使用桥接网络时,确保开发板可以 ping 通 Ubuntu 后,就可以通过 NFS 挂载 Ubuntu 中的某个目录。
哪些目录呢?请查看 Ubuntu 的/etc/exports 文件。
如果你使用的是VMware NAT方式,或是使用docker,假设Windows IP为192.168.1.100,在开发板上执行以下命令(注意:必须指定port为2049、mountport为9999):
[root@imx6ull:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.1.100:/home/book/nfs_rootfs /mnt [root@imx6ull:~]# cp /mnt/hello ./hello如果你使用的是VMware桥接方式,假设Ubuntu IP为192.168.1.100,在开发板上执行以下命令:
[root@imx6ull:~]# mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book/nfs_rootfs /mnt [root@imx6ull:~]# cp /mnt/hello ./hello如果一切正常,你可以在 Ubuntu 上把文件放到/home/book/nfs_rootfs 目录中,在开发板上可以从/mnt目录中访问该文件。
注意:使用 VMware NAT 网络或 Docker,无法使用 tftp 命令访问 Ubuntu,本节针对使用 VMware 桥接网络。
注意:使用 VMware NAT 网络或 Docker,可以使用 tftp 命令访问 Windows,请参考《8.6.3 开发板通过 tftp 传输 Windows 文件》。
首先确保你已经将要下载的文件上传至 Ubuntu 系统中 tftp 服务的目录内,如下图所示我的 tftp 服务目录内有 zImage 100ask_imx6ull-14x14.dtb 两个文件,我的 Ubuntu 主机 IP 地址为 192.168.1.123。 比如我要下载 Ubuntu 服务器下的 zImage 文件,则在开发板上执行如下命令。
[root@imx6ull:~]# tftp -g -r zImage 192.168.1.123下载后的文件如下图所示。
比如我们现在开发板家目录下创建一个 1.txt 的文本文件,然后写入 111111…. : 然后在开发板上执行如下命令上传此文件到 Ubuntu 服务器的 tftp 服务目录下。
[root@imx6ull:~]# tftp -p -l 1.txt 192.168.1.123此时我们查看 Ubuntu 服务器的 tftp 服务目录下,即可看到之前在开发板上创建的 1.txt 。
在 Windows 的 TFTP 服务由软件 tftpd64.exe 实现,它无需安装,解压就可运行。
重要的是:需要设置防火墙,请参考《8.4.3 在 Windows 安装 TFTP 服务》。
首先启动 tftpd64.exe,设置好文件目录,选择 IP。假设该 IP 为 192.168.1.99。那么开发板可以使用tftp 命令向该 IP 上传文件,或是下载文件。
首先确保你已经将要下载的文件放入 Windows 中上图所选的目录里,比如 zImage。
然后可以在开发板上执行如下命令(假设 Windows Ip 是 192.168.1.99):
[root@imx6ull:~]# tftp -g -r zImage 192.168.1.99这就会从 Windows 下载文件,效果如下图: 下载后的文件保存在开发板的当前目录下,如下图所示:
比如我们想把/boot/zImage 文件上传到 Windows(假设 IP 为 192.168.1.99),可以在开发板上执行如下命令:
[root@imx6ull:~]# cd /boot [root@imx6ull:/boot]# tftp -p -l zImage 192.168.1.99效果如下图:
Windows 和开发板之间可以通过 TFTP 服务,或是 SSH 服务传输文件。前者需要在开发板上输入 tftp 命令,后者可以在纯 GUI 界面操作。
100ASK_IMX6ULL 自带的 Linux 系统中,已经安装并开启了 SSH 服务,所以只要网络联通,就可以通过FileZilla 和开发板传输文件。
注意:在开发过程中,使用 NFS 是最方便的。
假设 Windows 和开发板之间网络已经联通,可以通过下列方法确认。
确定开发板 IP,假设为 192.168.1.100: 使用串口连接开发板,执行 ifconfig 命令查看或是配置 IP,如下图所示: 在 Windows 命令行 ping 开发板,确保网络联通: 启动 Windows 命令行,执行 ping 192.168.1.100,如果下图所示:在 FileZilla 中输入开发板的 IP,输入用户名 root,输入端口号 22,就可以回车连接开发板了,如下图: 第一次连接开发板时,会有如下提示: 连接成功后,就可以直接拖动文件进行传输了:
注意:所谓根文件系统就是类似 Windows 的 C 盘,里面存放有必须的 APP、库文件、配置文件。通过 NFS可以把 Ubuntu 的某个目录,当作板子的“C 盘”──Linux 中称之为根文件系统。
Buildroot编译完成之后生成的rootfs.tar.bz2,可以解压之后放到NFS服务器上作为NFS ROOT文件系统供开发板使用。使用NFS文件系统,便于程序的开发调试。所谓NFS服务器,就是我们在VMWare上运行的Ubuntu。
使用NFS根文件文件系统之前时,我们一般还会在u-boot使用tftpboot命令从Ubuntu或Windows中下载内核文件zImage和设备树文件,所以:
① 使用VMware桥接网络时: Ubuntu上既要配置NFS服务,也要配置TFTP服务。
① 使用VMware NAT网络或Docker时: Ubuntu上要配置NFS服务,Windows要运行tftpd64程序。
对于Ubuntu,如果你按照《5.2 安装Ubuntu软件》来安装过Ubuntu的软件,那么NSF和TFTP服务都安装好了。
也可以手工安装这些服务,请参考《8.4.1 在Ubuntu中安装、配置NFS》安装NFS服务,参考《8.4.2 Ubuntu安装TFTP服务》安装TFTP服务。
使用NFS根文件系统时,涉及3个文件:uImage、设备树(比如stm32mp157c-100ask-512d-lcd-v1.dtb)、rootfs.tar.bz2(解压到Ubuntu某个目录,比如/home/book/nfs_rootfs)。
在U-Boot中通过tftpboot命令从Ubuntu/Windows中下载内核文件uImage、stm32mp157c-100ask-512dlcd-v1.dtb, 设置Uboot启动参数使用Ubuntu的某个目录(比如/home/book/nfs_rootfs)作为根文件系统。
拷贝内核和设备树文件到 tftp 目录: 如果使用 VMware 桥接网络,将出厂镜像或者自行编译的 zImage 和设备树文件 100ask_imx6ull-14x14.dtb,拷贝到 Ubuntu 的 /home/book/tftpboot 目录。 如果使用 VMware NAT 网络或 Docker,需要把这些文件复制到 Windows tftpd64 程序所指定的目录。
把根文件系统压缩包解压到 NFS 目录: 把使用 buildroot 构建得到的根文件系统 rootfs.tar.bz2(在 buildroot2019.02/output/images 目录 下),复制、解压到 Ubuntu 的/etc/exports 文件中指定的目录里,即复制到/home/book/nfs_rootfs 目录 下,并解压(注意:解压时要用 sudo):
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x/output/images $ cp -rf rootfs.tar ~/nfs_rootfs/ book@100ask: ~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x/output/images$ cd ~/nfs_rootfs book@100ask:~/nfs_rootfs$ sudo tar xjf rootfs.tar使用 mobaxterm 工具打开开发板串口,此时将开发板上电,在打印 u-boot 时按下任意键进入 uboot 界面。
查看 Ubuntu 系统 IP 地址,如下图所示在 Ubuntu 系统终端里使用 ifconfig 查看所有网络设备的信息,获取到当前网卡设备的 IP 地址为 192.168.1.15 (也就意味着改 IP 地址的网段是 192.168.1.1)
先在 u-boot 中设置开发板 IP 为 192.168.1.112,然后在 u-boot 中使用 ping 命令测试开发板与 Ubuntu系统是否连通(出现“alive”就表示联通):命令如下:
=> setenv ipaddr 192.168.1.112 => ping 192.168.1.158如果提示 host is alive 就表示开发板和 Ubuntu 系统可以互通,截图示例如下所示。 (2) 如果使用 VMware NAT 网络或 Docker 只需要确保开发板和 Windows 的网络是联通的,在 Windows 命令行中执行“ipconfig”确定 Windows IP,然后在 Uboot 中 ping Windows IP。
可能由于防火墙或杀毒软件的原因导致 Uboot 无法 ping 通 Windows,那也没关系,继续往下走,有问题再说。
注意:板子正在运行 Uboot 时,Windows 是无法 ping 通开发板,因为 Uboot 的网络功能不完善。如果想通过 Windows ping 开发板来验证网络,可以让开发板启动进入 Linux 后再去 ping 开发板。
如果有网络问题,请参考: 《第 2 篇 环境搭建、Linux 基本操作、工具使用》 《6.4 验证开发板网络》
注意:Uboot 只能使用 eth0,网线必须接入 eth0,如下: (1) 对于使用 VMware NAT 网络或 Docker 先在 Windows 启动 tftpd64,并在该程序所指定目录里放入 zImage 和设备树文件。 再在 Ubuntu 的/home/book/nfs_rootfs 目录下解压好根文件系统。 然后在 U-Boot 控制台执行以下命令启动单板,假设 Windows IP 是 192.168.1.100:
=> setenv serverip 192.168.1.100 //设置服务器的 IP 地址,这里指的是 Windows IP => setenv ipaddr 192.168.1.112 //设置开发板的 IP 地址。 => tftpboot 0xc4000000 stm32mp157c-100ask-512d-lcd-v1.dtb; tftpboot c4100000 uImage; setenv bootargs root=/dev/nfs nfsroot=192.168.1.158:/home/book/nfs_rootfs,vers=3,tcp,port=2049,mountport=9999 rw ip=dhcp; bootm c4100000 - 0xc4000000要注意的是上面第 4 条命令,必须指定“port=2049,mountport=9999”,这样才能访问到 Ubuntu 的 NFS目录。
(2) 对于使用 VMware 桥接网络 先在 Ubuntu 的 TFTP 目录中放入 zImage 和设备树文件,再在/home/book/nfs_rootfs 目录下解压好根文件系统。
然后在 U-Boot 控制台执行以下命令启动单板,假设 Ubuntu IP 是 192.168.1.224:
=> setenv serverip 192.168.1.158 //设置服务器的 IP 地址,这里指的是 Ubuntu 主机 IP => setenv ipaddr 192.168.1.112 //设置开发板的 IP 地址。 => tftpboot 0xc4000000 stm32mp157c-100ask-512d-lcd-v1.dtb; tftpboot c4100000 uImage; setenv bootargs root=/dev/nfs nfsroot=192.168.1.158:/home/book/nfs_rootfs,vers=3 rw ip=dhcp; bootm c4100000 - 0xc4000000-end-