完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在嵌入式开发中,涉及交叉编译:在 PC 上编译,在开发板上运行。所以就涉及 PC 和开发板之间的文件 传输,方法有多种:网络传输、串口传输、USB 传输,当然,还有最笨的方法:U 盘拷贝。 一般的日常开发流程为: a. 在 Windows 上阅读修改代码,然后通过 FileZilla 把代码传到 VMWare 中的 Ubuntu; b. 在 Ubuntu 上编译程序; c. 把程序下载到开发板上,运行验证, d. 在 Windows 下通过串口操作开发板。 所以在 Windows、Ubuntu、开发板三者间,两两之间都存在文件的传输。 当然,有人不喜欢 Windows,PC 只用纯 Linux,这些高手已经熟练掌握各种 Linux 命令,不再存在文件传输的障碍。 总之,各种需求都存在,比如某些笔记本没有网口,那可以使用 USB 线连接开发板,开发板模拟出网卡;在工地上网口、USB 口统统没有,那我们还可以使用串口。 我们会一一列举,作为初学者,不需要验证全部章节,选择合适你的即可。 8.2 在 Windows 上通过串口和开发板传输文件 如果只是偶尔传输小文件,可以直接使用串口。 注意:在开发过程中,使用 NFS 是最方便的。 8.2.1 用 MobaXterm 打开串口、启动开发板 这不用介绍了吧。 8.2.2 使用 rz 命令通过串口下载 Windows 文件到开发板上 可以在开发板上使用 rz 命令,将 PC 上的文件传输到开发板。 请参考《5.3.2 使用rz命令通过串口下载Windows文件到开发板上》 8.2.3 使用 sz 命令让开发板向 PC 发送文件 可以在开发板上使用 sz 命令,将开发板的文件上传给PC。 请参考《5.3.3 使用 sz 命令通过串口把开发板文件上传给 PC》。 8.3 通过 USB 给开发板传文件 尚未实现。 8.4 安装网络服务 在嵌入式开发中,网络服务带来了很多便利,特别是 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,其他的先不管。 8.4.1 在 Ubuntu 中安装、配置 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 服务。 8.4.2 Ubuntu 安装 TFTP 服务 注意:使用 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/tftpbootbook@100ask:~$ sudo chmod 777 /home/book/tftpbootbook@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” 8.4.3 在 Windows 安装 TFTP 服务 Windows 上的 TFTP 服务由一个应用程序 tftpd64 提供,下载后双击运行,再做些设置即可。tftpd64 的前身是 tftpd32,它是 32 位的程序。对于 64 位电脑,请使用 tftpd64。 tftpd64 的官网为:http://tftpd32.jounin.net/,建议下载“portable edition”版本,无需安装直接运行。官网不好打开的话,直接百度搜“tftpd64”即可,它是免费软件。 把“网盘配套资料 1_Tools (工具) 1_Tools.zip”解压后,也有此工具。 tftpd64 的使用非常简单,运行后只需要设置 3 步: a. 选择目录(开发板将从这个目录读、写文件) b. 通过 IP 选择网卡 有些电脑有多个网卡,选择哪个网卡?使用 VMware 桥接网络时请参考《1.3 VMware 桥接网络设置》,使用 VMware NAT 网络或 Docker 时请参考《第四章 使用 NAT 配置 Ubuntu 网络》和《第五章 安装软件及开 发示例》。 c. 设置防火墙,直接关闭防火墙;或是允许 tftpsever 使用网络: 对于 Windows 10 可以按下图操作,对于其他操作系统,请自行百度: 8.5 没有网卡时可以使用 OTG 虚拟 USB 网卡 如果你的电脑有网卡,请使用真实网卡。 如果你的电脑没有网卡,那么用 USB 线连接 PC 和开发板的 USB OTG 口,开发板可以模拟出一个 USB 网卡。Windows 使用这个 USB 网卡比较复杂,我们一般是在 VMWare 中把它连接到 Ubuntu,让开发板和 Ubuntu通过该虚拟网卡来交互。 8.5.1 安装、设置虚拟 USB 网卡 再次声明:电脑有真实网卡,建议使用真实网卡,那就不需要看本节内容。 开发板的 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 驱动程序,它会在开发板里虚拟出网卡 u***0,需要设置 IP b. 在 VMWare 上把虚拟网卡连接到 Ubuntu,在 Ubuntu 中设置 IP 8.5.1.1 在开发板上安装 USB OTG 网卡模块驱动程序并设置 IP 如下所示,我们需要先在开发板终端上执行“modprobe -f g_ether”来安装驱动模块程序,安装成功的示意图如下所示。 [root@imx6ull:~]# modprobe -f g_ether 该驱动会给开发板模拟出网卡 u***0,使用以下命令设置其 IP,我们取 IP 为 10.10.70.1: [root@imx6ull:~]# ifconfig u***0 10.10.70.1 在安装 g_ether 驱动时,开发板就已经模拟出了一个 USB 网卡。一旦连接开发板的 USB OTG 口到电脑,就相当于给电脑插上了一个 USB 网卡,设备管理器会自动识别到新的设备。 8.5.1.2 在 VMWare 中连接虚拟网卡设备至 Ubuntu 并设置 IP 如下图所示,在开发板上安装 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 8.5.1.3 测试网络并使用 NFS 服务 分配完 IP 地址后,我们就可以通过 ping 命令来测试 Ubuntu 和开发板系统是否可以互通,测试命令如下所示。 在开发板 ping Ubuntu 的 IP: [root@imx6ull:~]# ping -I u***0 10.10.70.2 确认开发板和 Ubuntu 网络互通后,就可以在开发板上挂载 Ubuntu 的 NFS 目录来互传文件了: 8.5.1.4 常见问题 有时候你会发现开发板和 Ubuntu 无法 ping 通对方,多试几次就可以: a. 试试重新拔插 USB OTG 线 b. 试试在开发板上先禁止网卡,再启用网卡,比如: [root@imx6ull:~]# ifconfig u***0 down[root@imx6ull:~]# ifconfig u***0 10.10.70.1 c. 试试在 Ubuntu 上先禁止网卡,再启用网卡,假设虚拟网卡名为 ens35u1,可以试试这样的命令: book@100ask:~$ sudo ifconfig ens35u1 downbook@100ask:~$ sudo ifconfig ens35u1 10.10.70.2 注意:Ubuntu 上的虚拟网卡名不一定是 ens35u1,需要执行“ifconfig -a”命令确认。 8.6 使用网络服务传输文件 8.6.1 开发板挂载 Ubuntu 的 NFS 目录 开发板和 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目录中访问该文件。 8.6.2 开发板通过 tftp 传输 Ubuntu 文件 注意:使用 VMware NAT 网络或 Docker,无法使用 tftp 命令访问 Ubuntu,本节针对使用 VMware 桥接网络。 注意:使用 VMware NAT 网络或 Docker,可以使用 tftp 命令访问 Windows,请参考《8.6.3 开发板通过 tftp 传输 Windows 文件》。 8.6.2.1 在开发板上使用 tftp 命令下载文件 首先确保你已经将要下载的文件上传至 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 下载后的文件如下图所示。 8.6.2.2 在开发板上使用 tftp 命令上传文件 比如我们现在开发板家目录下创建一个 1.txt 的文本文件,然后写入 111111…. : 然后在开发板上执行如下命令上传此文件到 Ubuntu 服务器的 tftp 服务目录下。 [root@imx6ull:~]# tftp -p -l 1.txt 192.168.1.123 此时我们查看 Ubuntu 服务器的 tftp 服务目录下,即可看到之前在开发板上创建的 1.txt 。 8.6.3 开发板通过 tftp 传输 Windows 文件 在 Windows 的 TFTP 服务由软件 tftpd64.exe 实现,它无需安装,解压就可运行。 重要的是:需要设置防火墙,请参考《8.4.3 在 Windows 安装 TFTP 服务》。 首先启动 tftpd64.exe,设置好文件目录,选择 IP。假设该 IP 为 192.168.1.99。那么开发板可以使用tftp 命令向该 IP 上传文件,或是下载文件。 8.6.3.1 在开发板上使用 tftp 命令下载文件 首先确保你已经将要下载的文件放入 Windows 中上图所选的目录里,比如 zImage。 然后可以在开发板上执行如下命令(假设 Windows Ip 是 192.168.1.99): [root@imx6ull:~]# tftp -g -r zImage 192.168.1.99 这就会从 Windows 下载文件,效果如下图: 下载后的文件保存在开发板的当前目录下,如下图所示: 8.6.3.2 在开发板上使用 tftp 命令上传文件 比如我们想把/boot/zImage 文件上传到 Windows(假设 IP 为 192.168.1.99),可以在开发板上执行如下命令: [root@imx6ull:~]# cd /boot[root@imx6ull:/boot]# tftp -p -l zImage 192.168.1.99 效果如下图: 8.6.4 在 Windows 上通过 FileZilla 和开发板传输文件 Windows 和开发板之间可以通过 TFTP 服务,或是 SSH 服务传输文件。前者需要在开发板上输入 tftp 命令,后者可以在纯 GUI 界面操作。 100ASK_IMX6ULL 自带的 Linux 系统中,已经安装并开启了 SSH 服务,所以只要网络联通,就可以通过FileZilla 和开发板传输文件。 注意:在开发过程中,使用 NFS 是最方便的。 8.6.4.1 确保 Windows 和开发板之间网络联通 假设 Windows 和开发板之间网络已经联通,可以通过下列方法确认。
在 FileZilla 中输入开发板的 IP,输入用户名 root,输入端口号 22,就可以回车连接开发板了,如下图: 第一次连接开发板时,会有如下提示: 连接成功后,就可以直接拖动文件进行传输了: 8.7 开发板使用 NFS 根文件系统 注意:所谓根文件系统就是类似 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服务。 8.7.1 准备好文件 使用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)作为根文件系统。
使用 mobaxterm 工具打开开发板串口,此时将开发板上电,在打印 u-boot 时按下任意键进入 uboot 界面。 8.7.2.1 测试开发板与 Ubuntu/Windows 是否联通 (1) 如果使用 VMware 桥接网络 查看 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 验证开发板网络》 8.7.2.2 使用网络启动文件系统 注意: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- |
|||
|
|||
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1083浏览 2评论
700浏览 1评论
452浏览 0评论
193浏览 0评论
329浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:12 , Processed in 0.961816 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号