模拟磁盘设备

otg模拟磁盘设备做为外设时, 需要使用USB Mass Gadget Storage的驱动.

kernel  usb mass-storage 模块说明文档: https://www.kernel.org/doc/html/latest/usb/mass-storage.html

通过镜像文件作为磁盘设备

nandflash上的文件系统是ubifs格式, 一般PC上不能够直接识别UBI文件系统格式. 因此需要使用镜像文件, 可以在nandflash上使用/dev/loop来创建一个虚拟的快设备, 然后将镜像文件挂载上去:

开发板默认镜像没有mkdosfs,需要在yocto安装dosfstools包

yocto安装软件参考: 在yocto中怎样为系统安装/删除软件 / yocto how to add/remove packages

mkdir /usb
cd /usb
mkdir files
dd if=/dev/zero  of=/usb/disk.img  bs=1M  count=100			# 生成100M的镜像文件
mkdosfs  disk.img											# 镜像文件格式化为fat32格式
mount -t vfat -o sync /usb/disk.img /usb/files				# 使用/dev/loop设备节点来挂载disk.img到/usb/files目录下			

开发板加载g_mass_storage模块, 使用file参数可设置存储设备节点

modprobe  g_mass_storage file=/usb/disk.img removable=1

此时使用otg线连接开发板和PC时, PC可识别出一个磁盘设备

更新disk.img:

  • 当开发板需要更新文件时
    • 往/usb/files/目录下写入文件
    • PC需要重新连接开发板后, PC端识别出来的磁盘文件才会更新.
  • PC端更新文件时
    • 在PC上往挂载的优盘写入文件
    • 开发板需要重新挂载disk.img
    • 可在/usb/目录下创建一个sync脚本来执行更新操作,执行后/usb/files与img文件同步。
    • /usb/sync
      #!/bin/sh
      
      umount /usb/files
      mount -t vfat -o sync  /usb/disk.img /usb/files

将SD卡作为磁盘设备

sdcard文件系统为fat32格式时, PC可以识别出来,  当使用otg线连接时开发板时, g_mass_storage模块的设备节点设置为sdcard设备时, PC就能识别出来.

modprobe g_mass_storage file=/dev/mmcblk0p1 removable=1

而对sdcard的更新操作可参考上面的nandflash中更新disk.img内容来操作.

模拟串口设备

otg模拟串口设备需要使用USB Gadget Serial 驱动, 内核驱动文档参考:

https://www.kernel.org/doc/Documentation/usb/gadget_serial.txt

加载otg串口驱动:

root@phyboard-segin-imx6ul-2:~# modprobe g_serial          
[   27.376194] g_serial gadget: Gadget Serial v2.4
[   27.380903] g_serial gadget: g_serial ready
[   27.788629] g_serial gadget: high-speed config #2: CDC ACM config

驱动加载后,  开发板otg的模拟串口设备节点为/dev/ttyGS0

模拟网络设备

otg模拟网络设备需要加载g_ether驱动:

root@phyboard-mira-imx6-3:~# modprobe g_ether
[  343.735172] using random self ethernet address
[  343.739649] using random host ethernet address
[  343.745990] usb0: HOST MAC 82:e6:4b:e1:c2:b3
[  343.750868] usb0: MAC 36:b0:d8:6f:46:64
[  343.754935] using random self ethernet address
[  343.759429] using random host ethernet address
[  343.764077] g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
[  343.769091] IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready
[  343.776724] g_ether gadget: g_ether ready

加载驱动后, 开发板会有usb0的网络节点.

root@phyboard-mira-imx6-3:~# ifconfig
usb0      Link encap:Ethernet  HWaddr 36:B0:D8:6F:46:64  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

使用systemd-networkd来配置usb0的ip和开启dhcp服务, 需要创建/lib/systemd/network/20-usb0.network文件配置网络.

/lib/systemd/network/20-usb0.network
[Match]
Name=usb0

[Network]
Address=192.168.4.11/24
DHCPServer=yes

配置好usb0后, 重启网络服务即可. 

root@phyboard-mira-imx6-3:~# systemctl restart systemd-networkd

otg连接PC后, 就能连接到开发板的网络.

  • No labels