Linux提供了一套API,使得嵌入式的Linux系统软件可以以USB外设的方式工作。Kernel中提供了Gadget的Framework及相关的Demo,开发者可以参考用于开发自己的USB Gadget Driver。但并非所有的开发者都希望在Kernel中编程,或者依赖于Linux提供的Kernel API,所以Kernel中还提供了一套称为gadgetfs的文件系统,用于User Mode的代码直接与USB Host侧通信。另外,使用Gadgetfs实现的用户空间的驱动还可以避免版权的问题。

要使用Gadgetfs,首先需要在Kernel中打开Gadgetfs的支持;之后,开发者需要手动挂载这个文件系统,一般命令如下:

$mkdir /dev/gadget

$mount -t gadgetfs gadgetfs /dev/gadget

挂载成功后,可以在/dev/gadget下看到一个文件,该文件的名称与硬件平台提供的USB Device Controller有关,在这儿以$CHIP的替代。该文件相当于USB Device的Control Endpoint0,Host诸如SETUP, Get Descriptor操作都会由Gadgetfs通过此文件转发到用户程序中。用户在虚拟Gadget Driver之前,需要写入此Gadget的基本配置信息,该信息由以下部分构成:

Tag:4字节,当前版本该值必须为0;

Config Descriptor:长度不定,必须包括Config Descriptor + n个Interface Descriptor + 各Interface包含的low/full speed的Endpoint Descriptor,根据不同的硬件配置,可能还要提供n个Interface Descriptor + 各Interface包含的High Speed的Endpoint Descriptor。Gadgetfs只提供一个configuration的支持。

Device Descriptor:18字节,按USB标准提供。

以上数据通过write方式写入到$CHIP中,Gadgetfs会在/dev/gadget/目录下生成Endpoint的文件,文件名同样与底层的USB Device Controller有关,我们在这儿以$EP替代。

一旦Gadget接入到Host中,设备会被枚举。可以通过poll操作,获取$CHIP是否有数据写入,通过read操作,取得Host发起的动作信息,如,Get Descriptor,或者Set Configuration等。Set Configuration时,需要将Endpoint Descriptor信息写入到相关的$EP中,之后就可以使用$EP(read/write)与Host侧通信了,数据的内容根据USB协议来打包(Bulk, Interrupt和iso传输没有指定的数据格式)。

 

GitHub 加速计划 / li / linux-dash
13
2
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 5 年前
5def40a3 Add host customization support for the NodeJS version 5 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐