裝置描述符
裝置描述符給出了USB裝置的一般資訊。這包括裝置及裝置設定全程起作用的資訊,一個USB裝置只能有一個裝置描述符。所有的USB裝置都有預設的控制管道,在裝置描述符中給定了預設控制管道最大包長度。
ROM USB_DEVICE_DESCRIPTOR device_dsc={ 0x12, //BYTE bLength描述符長度 0x01, // BYTE bDescriptorType描述符類型固定 為 0x01 一個位元組 0x0200, //WORD bcdUSB規範版本號碼(採用BCD碼) 0x00, //BYTE bDeviceClass,類代碼 表示所遵循的標準裝置類0x01~0xfe為標準設//備類,0xff為廠商自訂類型 //0x00不是在裝置描述符中定義的,如HID 為0時表示//裝置的各個介面相互獨立,在介面描述符中將進一步定義 0x00, //BYTE bDeviceSubClass對裝置類更加細緻定義 0x00, //BYTE bDeviceProtocl協議代碼,為0 表示不使用任何裝置類協議 8, //BYTE bMaxPacketSize0端點0所支援的最大資料包長度,0x04D8, //WORD idVendor USB裝置的供應商ID0x003F, //WORD idProduct USB產品ID0x0002, // BCD碼錶示USB裝置的版本號碼,由供應商指定0x01, //WORD bcdDevice供應商字串描述符索引值0x02, // BYTE iManufacturer產品字串描述符索引值0x00, // BYTE iProduct USB設別序號字串描述符索引值,為0 表示沒有 0x01 // BYTE iSerialNumber USB裝置所支援的配置數數 }; 配置描述符
配置描述符給出了裝置配置的資訊,描述表包括一個bConfigurationValue域,在SetConfiguration( )請求時作為參數來設定所需的配置備。此描述符給出了此配置下的介面數,每個介面可能獨立操作。
ROM BYTE configDescriptor1[]={0x09, //BYTE bLength 配置描述符長度,固定為 0x09位元組0x02, //BYTE bDescriptorType USB描述符類型 固定為 02H 對應上面為0x12則為0x010x29,0x00, //WORD wTotalLength 配置資訊總長度,包括配置、介面、端點描述符 1, // BYTE bNumInterface 該配置所支援的介面數 1, //BYTE bConfigurationVale配置值Set_Configuration命令需要的參數值 0, // BYTE iConfiguration字串描述符索引值,為0 表示沒有配置字串 0xe0, //BYTE bmAttribute配置屬性,供電模式的選擇, see usb_device.h 第六位置 1// //表示使用匯流排電源,第五位置 1 表示支援遠程喚醒功能,其它為保留,一般 //0~4位置0,第七位置1,設為11100000b50, // BYTE MaxPower所需要的最大匯流排電流即裝置從匯流排提取的最大電流單位 //2mA,最大500mA,設定為250 介面描述符
介面描述符在一個配置內給出一個介面的資訊,如果一個配置支援多個介面,端點的描述符會跟在介面描述符後被返回。介面描述符總是作為配置描述符的一部分返回的。SetInterface( )與GetInterface( )用來選擇和返回選擇了的介面設定。一個介面描述符的端點個數不把端點0計算在內。
0x09, // BYTE bLength 裝置描述符的位元組數大小 0x04, // BYTE bDescriptorType 描述符類型編號 0, // BYTE bInterfaceNunber 介面的編號 0, // BYTE bAlternateSetting 備用的介面描述符編號2, // BYTE bNumEndpoints 該介面使用端點總數,不包括端點00x03, // BYTE bInterfaceClass 介面類型,所屬裝置類,這裡為HID類 0, // BYTE bInterfaceSubClass 介面子類型如果裝置類在1-FEH之間則需進一 //步表示裝置子類0, // BYTE bInterfaceProtocol 介面所遵循的協議 0, // BYTE iInterface 描述該介面的字串索引值
HID 描述符
除了標準的USB描述符,HID裝置還必須支援HID描述符、報告描述符和物理描述符(可選)。HID描述符用於識別USB裝置中包含的額外描述符例如報告描述符.
0x09, //bLength描述符長度 sizeof(USB_HID_DSC)+3, 0x21, //bDescriptorType 描述符類型: HID = 0x21 0x11,0x01, //bcdHID HID規範版本號碼(BCD碼),此為1.11 0x00, //bCountryCode 國家代碼 00 表示裝置不是本土化的 1, // bNumDescriptor 支援的其他類描述符數量 see usbcfg.h 0x22, //bDescriptorType 報告描述符類型 28,0x00, //WDescriptorLength 報告描述符總長度sizeof(hid_rpt01),
端點描述符
每個介面使用的端點都有自己的描述符,描述符被主機用來決定每個端點的頻寬需求。每個端點的描述符總是作為裝置設定描述的一部分返回,而控制端點0沒有描述符。
/***************端點1 描述符 輸入*********************/0x07, // BYTE bLength 裝置描述符長度 位元組數大小 *sizeof(USB_EP_DSC)0x05, // BYTE bDescriptorType 描述符類型編號0x81, // BYTE bEndpointAddress 端點號、傳輸方向,,第7位 表示端點的資料轉送 //方向,0表示OUT資料轉送,1表示IN資料轉送,第0~3表示連接埠號碼001B //表示端點1,。0x03, //端點特性,00B表示控制傳輸 01同步傳輸,10B塊傳輸,11B 中斷0x40,0x00, //WORD wMaxPacketSize 端點收、發的最大包的大小0x01, //BYTE bInterval 主機查詢端點的時間間隔 ms /***************端點1描述符 輸出*********************/0x07, //BYTE bLength 0x05, //Endpoint Descriptor 0x01, //EndpointAddress 0表示OUT輸入0x03, //Attributes0x40,0x00 //size 0x01 //Interval };