因为PC的推广linux usb驱动,USB(通用串行总线)是我们最熟知的通讯总线规范之一,其他的还有例如以太网、PCIE总线和RS232并口等。这儿我们主要讨论USB。
USB是一个主从通讯构架,但只能一主多从。其中usb主机控制器有ECHI()等规范支持,而usb设备则包含普通usb设备和hub两种。USB2.0规范、USBclass等规范文档可以从获得。另外,还有ULPI、UTMI插口(类比RGMII、MII)支持USBphy(类比以太网phy)与ip核(有开源的verilogUSBip核)对接。
linuxusb驱动框架中包含好多有趣的玩意儿,其中drivers/usb/gadget就是其中一个。gadget是usb设备驱动,可以根据USB规范和设备类进行配置,使其成为各类各样的通用USB设备,如键鼠(HIDclass)、U盘(massstorageclass)、网卡(CDCclass)、摄像头(Videoclass)等。
在开始gadget源码剖析前,我们先玩一下它!
先申明一下,我们剖析的是linux4.4.19版本的gadget源码linux系统应用,其他版本的可能会有些出入,但原理上是相通的。测试平台为通用的硬件平台BeagleBoneBlack。
要使用linux内核为我们打算的gadget驱动demo,我们主要关注legacy这个文件夹,这个是遗留出来的驱动,已不建议使用了,之后的linux版本似乎会消失。但我们这儿先从传统入手!
编译内核前linux usb驱动,makemenuconfig更改一下配置。在usb菜单中选中gadget编译为模块(M),这样内核就可以编译出gadget驱动。编译好后,会在legacy下生成g_xxx.ko。例如U盘设备驱动为g_mass_storage.ko。而function文件夹则是功能插口(interface)的具体实现,生成形如usb_f_xxx.ko,对应U盘驱动为usb_f_mass_storage.ko。
下边我们测试U盘设备驱动:
先ssh登陆到BeagleBoneBlack板(简称BBB)上进行如下操作,生成一个FAT32格式的img,并挂载到sda文件夹上。
mkdir -p /var/sdcard;
cd /var/sdcard;
mkdir sda;
dd if=/dev/zero of=/var/sdcard/disk.img bs=1M count=20;
mkdosfs -F 32 disk.img
mount -t vfat -o sync /var/sdcard/disk.img /var/sdcard/sda
此时/var/sdcard/sda为FAT32格式的文件系统,这样我们才能在linux系统里查看disk.img里包含的文件,以便测试验证!
之后在BBB上加载USB相关驱动:
modprobe musb_am335x
modprobe g_mass_storage file=/var/sdcard/disk.img
此时,U盘设备驱动启动,同时指定操作文件为/var/sdcard/disk.img,这样的目的是让PC辨识成一个“可联通c盘”,同时在PC上读写c盘时,实质上是对BBB板内的/var/sdcard/disk.img进行操作。
在BBB板上lsmod查看当前已加载的驱动:
<lsmod
g_mass_storage 4414 0
usb_f_mass_storage 37916 2 g_mass_storage
libcomposite 44392 2 usb_f_mass_storage,g_mass_storage
musb_dsps 8235 0
musb_hdrc 71550 1 musb_dsps
udc_core 12063 2 musb_hdrc,libcomposite
usbcore 195125 2 musb_hdrc,usbhid
musb_am335x 1426 0
USB电缆接入PC后,我们能够看见PC辨识出“可联通c盘”。我们可以拖一个文件进去,或则在其上创建文件。在BBB板上,我们在已挂载的/var/sdcard/sda上看见刚从PC上拷贝过来的文件。
最后,里面说过,这些方法是legacy的linux定时器,现已不推荐使用。欲知后事怎么,且听下回分解!我们《linuxusbgadget驱动解读(二)》见。