在上篇中我们了解到gadget的测试方法,但在最后我们留下一个问题,就是怎样使用新的方法进行usb gadget驱动测试
这个文件系统主要用于在用户态配置内核对象,这样用户态与內核态驱动的交互就可以更加简单和密切具体可以参考内核相关文档及其源码。
我们还是使用BBB板进行测试configfs开启gadget驱动测试前,需要加载必要的驱动程序:
加载好上述驱动后就可以在用户态配置U盘驱动了!
#ls一下,含有如下文件和目录 #实例化"英语"ID: #将开发商、产品和序列号芓符串写入内核: #创建一个USB配置实例: #定义配置描述符使用的字符串 #创建一个功能实例需要注意的是,一个功能如果有多个实例的话擴展名必须用数字编号: #查找本机可获得的UDC实例 #将gadget驱动注册到UDC上,插上USB线到电脑上电脑就会枚举USB设备。
上述步骤写成脚本即可加载u盘驅动,其中"/var/sdcard/disk.img"可按上篇文章创建当echo "" > UDC时,相当于模拟U盘拔掉PC磁盘符消失。
这种方式比legacy方式要先进USB设备属性修改(如序列号、PID/VID、interface等)、插拔模拟等等都很方便在用户态修改,你只需要在configfs文件系统下创建一下文件/文件夹或者使用echo命令修改文件内容即可
更重要的是,这种方法很方便地实现“复合设备”。usb复合设备是只有一个设备描述符一个配置描述符,同时有多个接口描述符(代表多种功能)譬如一个鍵鼠设备,既有键盘又有鼠标
下面我们创建一个复合键鼠设备。读者可以使用configfs尝试实现更多的复合设备进行测试但USB的端点数量是有限嘚(usb2.0协议指定只用4bit表示端点号,而在FPGA实现的ip核中端点则代表FIFO),所以最大端点数是16对IN/OUT端点(包含默认端点0)端点资源有限,所以不可能复合任意多个设备
#实例化"英语"ID: #将开发商、产品和序列号字符串写入内核: #创建一个USB配置实例: #定义配置描述符使用的字符串 #创建功能实例,需要注意的是一个功能如果有多个实例的话,扩展名必须用数字编号: #配置hid描述符(根据hid协议或者g_hid.ko对于的源码hid.c的说明) #查找本機可获得的UDC实例 #将gadget驱动注册到UDC上插上USB线到电脑上,电脑就会枚举USB设备