usb真是很强很大,强是现在很多产品都用她来做,为了方便,不用开发驱动。大是因为usb协议太多了,就光hid都有好多种。还是扯回正题,这次总
结复合型设备,前面总结了hid和mass storage设备,如果在正常情况下两个设备都正常了的,那么现在就可以来做做复合型设备了。
百度和google都没找到她的定义,那么我来定义一下(见笑),复合型设备:具有两种usb设备功能的一种设备,无论是相同的设备功能,还是不同的
设备功能,只要同时具有两种以上的功能就是复合型设备。其实很直白,大家都看的出来。
现在就把hid keyboard and usb mass storage复合起来,组成一个设备。
首先要说的是既然是复合型设备,那么就有多个interface,这里有两个设备,那么就需要两个interface,需要几个设备描述符呢,一个就够了,那配
置描述符呢,也只需要一个就好了,那需要几个端点描述符呢,这个嘛,我就不知道了(开玩笑,你在总结你不知道),这个就得讲讲usb的几种传输
模式了。
在usb里面一共有四种传输:控制传输、中断传输、批量传输、等时传输。控制和批量端点用于异步的数据传输,驱动需要他们就立马工作。中断和等
时端点是周期性的,即在固定时间段连续的传输数据。是不是有点熟悉,的确,前面总结过的,在这里再提提。所以有几个端点,还是得看你在用哪种
传输模式,hid keyboard和usb mass storage他们使用的传输方式是中断传输和批量传输。
中断传输:interrupt in ,在这里只需要interrupt in就ok了,既只要一个端点,至于interrupt out就不用管了。
批量传输:bulk in和bulk out,由于u盘是双向的,当然需要有两个端点哦,毕竟他们通信要有来回才行啊。
所以要复合hid keyboard和usb mass storage就需要三个端点。好了,前面说来复合型设备的描述符分别是:设备描述符*1+配置描述符*1+端点描
述符*3,那么到这里就完了吗,如果只是usb mass storage,在加一个端点就完了,但是这里是Hid,还需要一个子类,在hid里面还有很多子类,那么
就需要区分他们,不然host不知道你是哪家的,好比有很多人叫张三,但是这个世界那么多是张三,你知道他应该是哪家的呢,还是只有slave主动说
自己是谁方便。现在配置是设备描述符*1+配置描述符*1+端点描述符*3+子类描述符,但是描述符排列是有顺序的,写完一个在写另外一个。
// Descriptors for the GET_DESCRIPTOR and SET_DESCRIPTOR requests.
typedef struct usb_device_descriptor {
unsigned char length; // USB_DEVICE_DESCRIPTOR_LENGTH == 18
unsigned char type; // USB_DEVREQ_DESCRIPTOR_TYPE
unsigned char usb_spec_lo;
unsigned char usb_spec_hi;
unsigned char device_class;
unsigned char device_subclass;
unsigned char device_protocol;
unsigned char