此功能是使用linux内核usb子系统里gadget实现的.
配置内核,使用gadget里所需的功能模块:
//在内核源码目录下打开终端:
make menuconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
Device Drivers --->
[*] USB support --->
<*> USB Gadget Support --->
<M> USB Gadget Drivers
<M> Audio Gadget //让板通过usb线连接pc时, 板作声卡的角色
<M> Ethernet Gadget (with CDC Ethernet support) //作网卡的角色
<M> Mass Storage Gadget //作u盘的角色
<M> Serial Gadget (with CDC ACM and CDC OBEX support) //作uart的角色
<M> Printer Gadget //作打印机的角色
<M> HID Gadget //作如鼠标,键盘的人机交互设备角色
//内核里原已选上,可不作修改.
//编译内核里的驱动模块(选'M'项)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules
//如果配置内核时修改了选项,则还需要编译内核镜像并更新sd卡里的内核镜像
编译完成后,还需要把编译出来的.ko驱动模块安装到sd卡文件系统里.
如sd接上pc后, ext4分区挂载到/run/media/jk/ROOTFS目录里, 则:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=/run/media/jk/ROOTFS
//为了备份,也可以在安装一份到前面的_install目录里, 只需通过INSTALL_MOD_PATH指定路径即可.
把卡接回板上启动并进入系统后,所需驱动模块在:
ls /lib/modules/4.11.2/kernel/drivers/usb/gadget/legacy/
g_acm_ms.ko g_ffs.ko g_multi.ko g_zero.ko
g_audio.ko g_hid.ko g_ncm.ko gadgetfs.ko
g_cdc.ko g_mass_storage.ko g_printer.ko
g_ether.ko g_midi.ko g_serial.ko
使用相应功能的驱动模块:
//注意:通过otg作的虚拟设备角色一时刻只能作一种角色,只有把原角色的驱动模块卸载后才可以加载另一种功能的驱动模块
把板上的sd卡的mmcblk0p2分区作u盘:
modprobe g_mass_storage file=/dev/mmcblk0p2 removable=1
//命令执行后, 在pc上会像u盘一样弹出界面,然后就可以在pc上访问板上的sd卡分区里.
//当需要再作另一种功能时,需要"rmmod g_mass_storage"卸载此功能的驱动模块
把板作一个uart设备接入pc:
modprobe g_serial
//命令执行后,板上的系统会多"/dev/ttyGS0"设备文件, pc系统上会多一个"/dev/ttyACM0"设备文件
//两个设备一个读和另一个作写操作就可以接收到数据
把板作一个网卡接入pc:
modprobe g_ether
命令执行后, 板上的网络设备会多"usb0"设备, pc系统上会多一个网络设备"enp0s29f7u5"(名字不是固定的)
然后把两个设备设置同一个网段后,测试ping通后,在板上就可以挂载pc上的nfs共享目录了.
// 注意设置的ip地址不能与同一系统里的其它网卡的ip地址同一网段
// 在板上挂载pc的nfs目录时,记得加上参数"-o nolock,tcp"