在上篇《linux usb gadget驱动详解(一)》中,我们了解到gadget的测试方法,但在最后,我们留下一个问题,就是怎样使用新的方法进行usb gadget驱动测试。

我们发现linux的文档是宝库!

这篇文章的测试方法主要是参考如下文档:

linux-4.4.19/Documentation/ABI/testing/configfs-usb-gadget
linux-4.4.19/Documentation/usb/gadget-testing.txt

如果对gadget感兴趣,除了阅读linux gadget源代码之外,也需要阅读linux自带的Documentation。它们时常给我们带来惊喜~~

在linux 2.6开始,linux内核加入了configfs文件系统,对应驱动加载为:

modprobe configfs

这个文件系统主要用于在用户态配置内核对象,这样用户态与内核态驱动的交互就可以更加简单和密切,具体可以参考内核相关文档及其源码。

我们还是使用BBB板进行测试,configfs开启gadget驱动测试前,需要加载必要的驱动程序:

modprobe musb_am335x
modprobe configfs
modprobe libcomposite
modprobe usb_f_mass_storage

其中libcomposite实现了通用的设备驱动api,我们在开发自己的gadget时,可以利用该api,并参考已有例子,如f_mass_storage.c、f_hid.c等

加载好上述驱动后,就可以在用户态配置U盘驱动了!

#挂载configfs文件系统
mount -t configfs none /sys/kernel/config
cd /sys/kernel/config/usb_gadget
mkdir gadget
cd gadget#ls一下,含有如下文件和目录
// UDC              bMaxPacketSize0  functions        strings
// bDeviceClass     bcdDevice        idProduct
// bDeviceProtocol  bcdUSB           idVendor
// bDeviceSubClass  configs          os_desc#设置USB协议版本
echo 0x0200  > bcdUSB#定义产品的VendorID和ProductID
echo "0x0525"  > idVendor
echo "0xa4a5" > idProduct#实例化"英语"ID:
mkdir strings/0x409
ls strings/0x409//manufacturer    product    serialnumber#将开发商、产品和序列号字符串写入内核:
echo "01234567" > strings/0x409/serialnumber
echo "mkelehk"  > strings/0x409/manufacturer
echo "upan"  > strings/0x409/product#创建一个USB配置实例:
mkdir configs/config.1
ls configs/config.1//MaxPower bmAttributes stringsecho 120 > configs/config.1/MaxPower#定义配置描述符使用的字符串
mkdir configs/config.1/strings/0x409
ls configs/config.1/strings/0x409///configurationecho "mass_storage" >   configs/config.1/strings/0x409/configuration#创建一个功能实例,需要注意的是,一个功能如果有多个实例的话,扩展名必须用数字编号:
mkdir functions/mass_storage.0#配置U盘参数
echo "/var/sdcard/disk.img" > functions/mass_storage.0/lun.0/file
echo 1 > functions/mass_storage.0/lun.0/removable
echo 0 > functions/mass_storage.0/lun.0/nofua#捆绑功能实例到配置config.1
ln -s functions/mass_storage.0 configs/config.1#查找本机可获得的UDC实例
ls /sys/class/udc///musb-hdrc.1.auto#将gadget驱动注册到UDC上,插上USB线到电脑上,电脑就会枚举USB设备。
echo "musb-hdrc.1.auto" > UDC

上述步骤写成脚本,即可加载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)。端点资源有限,所以不可能复合任意多个设备。

mount -t configfs none /sys/kernel/config
cd /sys/kernel/config/usb_gadget
mkdir gadget
cd gadget
ls#含有如下文件和目录
// UDC              bMaxPacketSize0  functions        strings
// bDeviceClass     bcdDevice        idProduct
// bDeviceProtocol  bcdUSB           idVendor
// bDeviceSubClass  configs          os_desc#设置USB协议版本USB2.0
echo 0x0200  > bcdUSB#定义产品的VendorID和ProductID
echo "0x0525"  > idVendor
echo "0xa4ac" > idProduct#实例化"英语"ID:
mkdir strings/0x409
ls strings/0x409//manufacturer    product    serialnumber#将开发商、产品和序列号字符串写入内核:
echo "76543210" > strings/0x409/serialnumber
echo "mkelehk"  > strings/0x409/manufacturer
echo "keyboard_mouse"  > strings/0x409/product#创建一个USB配置实例:
mkdir configs/config.1
ls configs/config.1//MaxPower bmAttributes stringsecho 120 > configs/config.1/MaxPower#定义配置描述符使用的字符串
mkdir configs/config.1/strings/0x409
ls configs/config.1/strings/0x409///configurationecho "hid" >   configs/config.1/strings/0x409/configuration#创建功能实例,需要注意的是,一个功能如果有多个实例的话,扩展名必须用数字编号:
mkdir functions/hid.0
mkdir functions/hid.1#配置hid描述符(根据hid协议或者g_hid.ko对于的源码hid.c的说明)
echo 1 > functions/hid.0/subclass
echo 1 > functions/hid.0/protocol
echo 8 > functions/hid.0/report_length
echo -ne \\x5\\x1\\x9\\x2\\xa1.... > functions/hid.0/report_descecho 1 > functions/hid.1/subclass
echo 2 > functions/hid.1/protocol
echo 4 > functions/hid.1/report_length
echo -ne \\x5\\x1\\x9\\x2\\xa1.... > functions/hid.1/report_desc#捆绑功能实例到配置config.1
ln -s functions/hid.0 configs/config.1
ln -s functions/hid.1 configs/config.1#查找本机可获得的UDC实例
ls /sys/class/udc///musb-hdrc.1.auto#将gadget驱动注册到UDC上,插上USB线到电脑上,电脑就会枚举USB设备。
echo "musb-hdrc.1.auto" > UDC

其中,echo -ne \\x5\\x1\\x9\\x2\\xa1.... > functions/hid.0/report_desc等为“HID的报告描述符”填写,我没有填写完整。这部分需要自行查阅HID class的相关文档,但我在另一篇文章《STM32F103C8T6的USB HID复合设备的实现要点》中有tips。或者参考linux-4.4.19/Documentation/usb/gadget_hid.txt里面有一个/* hid descriptor for a keyboard */的键盘HID报告描述符例子。

说了这么多,也还停留在对gadget驱动程序的测试。接下来要对linux gadget进行源码分析了。

linux usb gadget驱动详解(二)相关推荐

  1. linux usb gadget驱动详解(一)

    由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...

  2. linux usb gadget驱动详解(三)

    本文将对linux4.4.19版本usb gadget源码进行简单分析.鉴于前文反复测试U盘设备驱动,现从linux-4.4.19/drivers/usb/gadget/legacy/mass_sto ...

  3. linux usb gadget驱动详解(四)

    现从msg_bind()函数(drivers/usb/gadget/legacy/mass_storage.c)开始讲起. U盘的gadget驱动比较复杂,因为它包含几部分,包括gadget驱动.U盘 ...

  4. linux usb gadget驱动详解(五)

    现从fsg_bind()讲起. //不失一般性,删掉错误处理和configfs相关代码 static int fsg_bind(struct usb_configuration *c, struct ...

  5. Linux usb设备驱动详解

    1.Linux usb设备驱动框架 USB是通用串行总线的总称,Linux内核几乎支持所有的usb设备,包括键盘,鼠标,打印机,modem,扫描仪.Linux的usb驱动分为主机驱动与gadget驱动 ...

  6. linux usb键盘驱动详解

    1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以我们要修改id_table,使这个驱动为键盘的驱动,如下图所示: ...

  7. linux usb ga驱动详解,Linux设备驱动之内存映射

    1. 内存映射 所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率.Linux提供了mmap()函数,用来映射物理内存. 在驱动程序 ...

  8. Linux字符设备驱动详解七(“插件“设备树实现RGB灯驱动)

    文章目录 系列文章目录 前言 正文 Device Tree Overlays:"插件"设备树 传统设备树 "插件"设备树 使用前提 案例说明 设备树:foo.d ...

  9. Linux字符设备驱动详解四(使用自属的xbus驱动总线)

    文章目录 系列文章目录 前言 驱动目录 正文 驱动总线 总线管理 总线注册 设备注册 驱动注册 代码示例 总结 系列文章目录 Linux字符设备驱动详解 Linux字符设备驱动详解二(使用设备驱动模型 ...

最新文章

  1. BERT论文阅读(一): Pre-training of Deep Bidirectional Transformers for Language Understanding
  2. 初识OneNote 2016
  3. 1xx、101、100 状态详解
  4. .NET MAUI 预览版 6 发布
  5. RBSP、SODB、EBSP三者的区别和联系 SPS: sequence parameter sets
  6. LeetCode 2156. 查找给定哈希值的子串(字符串哈希)
  7. 27日直播预告丨Oracle运营商行业生产实践分享
  8. vue如何加载html字符串_vue如何给html字符串添加指令?
  9. 软件测试之SOL面试题(一)
  10. HDU2074 叠筐【打印图案】
  11. Git基础教程(四)
  12. 【支持4G插卡上网】京东云1代完美固件
  13. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计下载v2.3-西西软件下载...
  14. 微信科室预约挂号小程序
  15. 关于云优CMS系统模板标签调用列表随机显示的代码rand()标签适用
  16. 好用的医药管理软件都有哪些特点
  17. C语言实现哥德巴赫猜想
  18. Photoshop——多变量+文字数据组替换+批处理详细操作
  19. 《Python数据分析与挖掘实战》第8章——中医证型关联规则挖掘(Apriori关联)
  20. 【MATLAB】进阶绘图 ( Pie Chart 饼图 | pie 函数 | 三维饼图 | pie3 函数 )

热门文章

  1. 新疆2016年弃风弃光比例或将达50%左右
  2. 美国“大辞职”潮愈演愈烈
  3. 基于51单片机的简易电子计算器——有温度显示和万年历等额外功能
  4. 用KFServing加速联邦学习模型的部署
  5. day01 三级菜单
  6. MySQL Innodb独立表空间的配置
  7. 接口自动化测试面试题(持续更新中)
  8. 内向者优势 原版_性格内向的人如何笑傲职场?职业规划三步走,为你铺平道路...
  9. 数字电压电流表VCB
  10. 杰特康机器人的概述_机器人概述