USB

linux USB学习(一)

USB驱动实验

Posted by 婷 on March 15, 2022 本文总阅读量

前言

记录下自己做的USB驱动的实验。实验主要分两种,一种是板子做USB主机的实验,另一个种则是做从机的实验。

USB主机实验

USB鼠标实验

USB 鼠标键盘属于 HID 设备。HID,翻译过来就是人体学接口设备,主要是一些人机交互的设备,比如键盘,鼠标,摇杆,绘图板等等。如果想要实现USB鼠标功能,分两步走,需要内核使能通用HID驱动鼠标的驱动

使能通用HID驱动

make menuconfig,然后按照此路径去使能HID驱动

Device Drivers -> HID support -> HID bus support -> Generic HID driver 

image-20220227213116084

image-20220227213156890

image-20220227213251328

使能鼠标驱动

路径跟前面一样,这里选择USB HID support->USB HID transport layer

image-20220227213515497

image-20220227213540962

鼠标测试

查看加载的驱动

image-20220313213718735

查看热插拔信息

image-20220227213925853

[ 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目录下新增了event3mouse1

image-20220227215311424

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

image-20220227215451596

特殊的HID驱动

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

image-20220227215954708

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

image-20220227220055576

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

image-20220227220123538

USB U盘实验

使能SCSI协议

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

image-20220227234103371

使能U盘驱动

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

image-20220227234216771

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

image-20220227234252715

U盘测试

查看加载的驱动

image-20220313213921771

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

image-20220313214108568

统检测到 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

image-20220313215946374

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

image-20220313220323470

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

image-20220313220440476

USB从机实验

USB声卡实验

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

image-20220313221806767

注这里编译为驱动模块,配置完成以后重新编译内核,得到三个声卡相关驱动

drivers/usb/gadget/libcomposite.ko 
drivers/usb/gadget/function/usb_f_uac1.ko 
drivers/usb/gadget/legacy/g_audio.ko 

升级内核后,依次加载上述三个驱动,但是在加载的时候 ,发现加载第一个libcomposite.ko就出现了符号表的错误,最后是找到了configfs.ko才成功加载驱动。

image-20220314000452883

加载的时候报错

image-20220314000640313

根据关键词查询config_group_init

image-20220314000733751

最后将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

image-20220313221644152

配置完成以后重新编译内核,得到三个相关驱动

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盘设备

image-20220315004211606

打开内容查看

image-20220315004219852

操作完成后要退出的话执行命令

rmmod g_mass_storage.ko