前言
记录下自己做的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