任务动机:用USB代替网络通讯,实现Cartographer上位机与下位机之间的消息传递。
任务描述:根据任务动机,研发实现用USB代替网络通讯,形成文档。
1. 在Toybrick-RK3399 ProD上编译Linux Kernel
这是个漫长且无聊的过程,因为有关这方面的教程少之又少,在本人无数次踩坑下终于搞定。感兴趣的小伙伴可以打开官方教程链接体验下想找教程却没有教程然后砸电脑未遂的心情。
1.1 编译原理
在RK3399 ProD里面,Linux的Kernel和rootfs(根文件系统)是分开地址存放的,rootfs是在Kernel之上运行的,所有的驱动和最基础的指令都存放在Kernel里面,各个厂商根据自己的特性在Kernel上开发自己的操作系统(例如Fedora和Ubuntu)。板子可以在不用重新编译内核的情况下更换操作系统,在本文档中,我们主要讲如何编译驱动到kernel里面,并支持多种操作系统。我用的rootfs链接(Ubuntu):百度云网盘提取码:q9my
1.2 编译过程
首先,RK3399 ProD是A53+A7的芯片,你需要特殊的gcc编译器,然后再编译。
git clone https://github.com/friendlyarm/prebuilts.git -b master --depth 1
cd prebuilts/gcc-x64
cat toolchain-6.4-aarch64.tar.gz* | sudo tar xz -C /
然后再编辑你的.bashrc,把下面的东西加到bashrc的最底部。
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin:$PATH
export GCC_COLORS=auto
接下来,你需要下载Linux Kernel源码,由于官方给的源码太多坑,我把我修改后的直接上传到gitee供国人下载,方便快捷。
git clone -b kernel-joybrick https://gitee.com/harryzhangabc/ros_bridge-and-catographer-setup.git
这里介绍下如何给驱动添加USB RNIDS/gagnet网络功能。
cd /path/to/your/ros_bridge-and-catographer-setup/dir/
make menuconfig
然后把下面的几个选项操作成如下方式
<M> USB Gadget Drivers
<M> USB functions configurable through configfs
<M> Ethernet Gadget (with CDC Ethernet support)
[*] RNDIS support (NEW)
接着在该目录下编译内核。
./make.sh linux prod
编译完成后会生成boot_linux.img文件,把这个文件烧入到3399pro对应的区域中烧写教程,只要烧这个文件,其他的都不用管。当然你想偷懒的话可以用我编译好的:D百度网盘提取码:pt7p
最后看下你编译好的文件,有几个驱动模块文件需要手动复制到RK3399 ProD里面手动加载
drivers/usb/gadget/function/u_ether.ko
drivers/usb/gadget/function/usb_f_ecm_subset.ko
drivers/usb/gadget/function/usb_f_ecm.ko
drivers/usb/gadget/function/usb_f_rndis.ko
drivers/usb/gadget/legacy/g_ether.ko
drivers/usb/gadget/libcomposite.ko
然后在设备上,依次加载上述模块
insmod libcomposite.ko
insmod u_ether.ko
insmod usb_f_rndis.ko
insmod usb_f_ecm.ko
insmod usb_f_ecm_subset.ko
insmod g_ether.ko
注意: 要先加载 libcomposite.ko 和 u_ether.ko,后面的模块才可以加载进去。
1.3 IP设置
- IP 地址设置
用数据线连接 PC 机和设备的 OTG 接口,在 PC 机中执行 lsusb 命令可以查看到 USB 以太网设备,即说明连接成功。
firefly@Desktop:~$ lsusb
Bus 002 Device 003: ID 09da:5814 A4Tech Co., Ltd.
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 04f2:b2ea Chicony Electronics Co., Ltd Integrated Camera [ThinkPad]
Bus 001 Device 004: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]
Bus 001 Device 003: ID 147e:1002 Upek Biometric Touchchip/Touchstrip Fingerprint Sensor
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 0525:a4a2 Netchip Technology, Inc. Linux-USB Ethernet/RNDIS Gadget
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
- 在设备中 IP 的设置
输入执行 ifconfig -a 命令,可以查看到以下信息: