前言
记录下自己做的USB驱动的实验。实验主要分两种,一种是板子做USB主机的实验,另一个种则是做从机的实验。
USB主机实验
USB鼠标实验
USB 鼠标键盘属于 HID 设备。HID,翻译过来就是人体学接口设备,主要是一些人机交互的设备,比如键盘,鼠标,摇杆,绘图板等等。如果想要实现USB鼠标功能,分两步走,需要内核使能通用HID驱动和鼠标的驱动。
使能通用HID驱动
make menuconfig,然后按照此路径去使能HID驱动
Device Drivers -> HID support -> HID bus support -> Generic HID driver



使能鼠标驱动
路径跟前面一样,这里选择USB HID support->USB HID transport layer


鼠标测试
查看加载的驱动

查看热插拔信息

[ 8740.902614] usb 2-1.1: new full-speed USB device number 3 using ci_hdrc
[ 8741.030362] input: 2.4G Mouse as /devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb2/2-1/2-1.1/2-1.1:1.0/0003:1EA7:0064.0001/input/input3
[ 8741.062296] hid-generic 0003:1EA7:0064.0001: input: USB HID v1.10 Mouse [2.4G Mouse] on usb-ci_hdrc.1-1.1/input0
鼠标在板子上可以像PC那样使用,测试成功!
鼠标插入识别后,/dev/input目录下新增了event3和mouse1

输入hexdump event3可以看到一些信息,至于是什么就没有去深究了,可以理解为是这些HID驱动的一个接口输出的信息。(个人理解)

特殊的HID驱动
既然前面说的使能通用的HID驱动,那肯定有特殊的HID驱动,点击Special HID drivers进去看看

可以查看Apple{i,Power,Mac}Books这项内核描述

主要还是针对苹果的产品,不得不感慨内核的强大

USB U盘实验
使能SCSI协议
U 盘使用 SCSI 协议,因此要先使能 Linux 内核中的 SCSI 协议,配置路径如下: Device Drivers -> SCSI device support -> SCSI disk support

使能U盘驱动
我们还需要使能 USB Mass Storage,也就是 USB 接口的大容量存储设备,配置路径如下: Device Drivers -> USB support -> Support for Host-side USB -> USB Mass Storage support

点击这个USB Mass Storage support的配置项,也是提及到要使能SCSI协议

U盘测试
查看加载的驱动

准备一个 FAT32 格式的U盘,NTFS 和 exFAT 由于版权问题所以在 Linux 下支持的不完善,操作的话可能会有问题,比如只能读,不能写或者无法识别等。

统检测到 U 盘插入,大小为 7.94GB,对应的设备文件为/dev/sdb 和/dev/sdb1,/dev/sdb 是整个 U 盘,/dev/sdb1 是 U 盘的第一个分区,我们一般使用 U 盘的时候都是只有一个分区。要想访问 U 盘我们需要先对 U 盘进行挂载,理论上挂载到任意一个目录下都可以,这里我创建一个 /mnt/usb_disk 目录,然后将 U 盘挂载到/mnt/usb_disk 目录下
mkdir /mnt/usb_disk -p
mount /dev/sdb1 /mnt/usb_disk/ -t vfat -o iocharset=utf8

对U盘内的空文件readme2.txt写入test,然后sync,再执行卸载命令。拔出U盘。

重新插入U盘,重新挂载,查看是否写入。

USB从机实验
USB声卡实验
板子上板载了音频解码芯片,因此可以把板子当做一个外置 USB 声卡,配置 Linux 内核,路径如下:Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers ->Audio Gadget ->UAC 1.0 (Legacy)

注这里编译为驱动模块,配置完成以后重新编译内核,得到三个声卡相关驱动
drivers/usb/gadget/libcomposite.ko
drivers/usb/gadget/function/usb_f_uac1.ko
drivers/usb/gadget/legacy/g_audio.ko
升级内核后,依次加载上述三个驱动,但是在加载的时候 ,发现加载第一个libcomposite.ko就出现了符号表的错误,最后是找到了configfs.ko才成功加载驱动。

加载的时候报错

根据关键词查询config_group_init

最后将fs/configfs这个路径下的configfs.ko加载之后就不会报错了,具体啥原因还不清楚,但是符号表的问题总算是解决了。
加载完驱动后,用USB连接线,将电脑连接到主机的USB接口,这时候打开设备管理器,总是提示识别到未知的USB设备。实验到此也无法进行下去,猜测可能是我跟我电脑是win11有关?
模拟U盘
模拟 U 盘实验就是将开发板当做一个 U 盘,配置 Linux,路径如下: Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers ->Mass Storage Gadget

配置完成以后重新编译内核,得到三个相关驱动
drivers/usb/gadget/libcomposite.ko
drivers/usb/gadget/function/usb_f_mass_storage.ko
drivers/usb/gadget/legacy/g_mass_storage.ko
升级内核后,输入下列命令,依次加载驱动
insmod configfs.ko
insmod libcomposite.ko
insmod usb_f_mass_storage.ko
insmod g_mass_storage.ko file=/dev/sdb1 removable=1
加载 g_mass_storage.ko 的时候使用 file 参数指定使用的大容量存储设备,加载成功后可以看到电脑识别到了U盘设备

打开内容查看

操作完成后要退出的话执行命令
rmmod g_mass_storage.ko