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传输没有指定的数据格式)。