USB的描述符詳解總結.doc_第1頁
USB的描述符詳解總結.doc_第2頁
USB的描述符詳解總結.doc_第3頁
USB的描述符詳解總結.doc_第4頁
USB的描述符詳解總結.doc_第5頁
免費預覽已結束,剩余19頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

.USB的描述符與命令請求詳解一、 描述符1. 什么是描述符所謂描述符,就是用于描述設備特性的具有特定格式排列的一種數(shù)據(jù)組織結構。2. 描述符的作用描述符的作用在于設備向主機匯報自己的信息、特征,主機根據(jù)這些信息從而加載相應的驅(qū)動程序。3. 描述符的分類描述符分為三大類:標準描述符、設備類描述符、廠商描述符。除字符串描述符可選外,任何設備都必須包含剩下的幾種標準描述符。在USB1.0中規(guī)定了5種標準的描述符:設備描述符配置描述符接口描述符端點描述符字符串描述符規(guī)定的設備類描述符有:集線器類描述符、人機接口類描述符。下表是三種描述符的類型值:表1 . USB描述符的類型值類型描述符描述符值標準描述符設備描述符(Device Descriptor)0x01配置描述符(Configuration Descriptor)0x02字符串描述符(String Descriptor)0x03接口描述符(Interface Descriptor)0x04端點描述符(EndPontEndPoint Descriptor)0x05(Device Qualifier descriptor)0x06(BOS descriptor)0x0F(Device Capability descriptor)0x10端點伴隨描述符(Endpoint companion descriptor)0x30類描述符集線器類描述符(Hub Descriptor)0x29人機接口類描述符(HID)0x21廠商定義的描述符0xFF4. 使用的幾種類設備類DeviceClass下表是設備類值的含義。表2. 設備的類別(bDeviceClass)值(十進制)值(十六進制)說明00x00使用接口描述符中提供的類20x02通信類(CDC)90x09集線器類2200xDC用于診斷用途的設備類2240xFE0xEF混雜類型設備類2550xFF廠商定義的設備類接口類InterfaceClass下表是接口類值的含義。表3. USB協(xié)議定義的接口類別(bInterfaceClass)值(十六進制)類別0x01音頻類0x02通信類(CDC)0x03人機接口類(HID)0x05物理類0x06圖像類0x07打印機類0x08大數(shù)據(jù)存儲類0x09集線器類0x0ACDC數(shù)據(jù)類0x0B智能卡類0x0D安全類0x0EVideo 視頻設備(攝像頭,Class_0e&SubClass_03&Prot_00)0xDC診斷設備類0xE0無線控制器類0xEF混雜設備類0xFE特定應用類(包括紅外的橋接器等)0xFF廠商定義的設備 類的交叉與獨享在描述符中,只有設備描述符和接口描述符中會有類別之分,即只有設備和接口會分類使用,不過有些類別的使用只需經(jīng)過設備或接口的區(qū)分就可徹底清楚明白,這說明在設備類別和接口類別的定義上會有共同的類別名稱。而有些類別則是設備或接口獨享的,下表是與使用設備相關的類別劃分交叉或共享情況:Base Class Usage Description 00h Device Use class information in the Interface Descriptors 01h Interface Audio 02h Both Communications and CDC Control 03h Interface HID (Human Interface Device) 05h Interface Physical 06h Interface Image 07h Interface Printer 08h Interface Mass Storage 09h Device Hub 0Ah Interface CDC-Data 0Bh Interface Smart Card 0Dh Interface Content Security 0Eh Interface Video 0Fh Interface Personal Healthcare 10h Interface Audio/Video Devices DCh Both Diagnostic Device E0h Interface Wireless Controller EFh Both Miscellaneous FEh Interface Application Specific FFh Both Vendor Specific (此表也適用于標準命令Get_Descriptor中wValue域高字節(jié)的取值含義) 【說明:】在設備或接口分類上均可徹底分清使用的(Usage = Both),即在任一處描述符中定義即可的分清楚使用的類(Usage = Both)的基本類有:02h - 通信及CDC控制類;DCh - 診斷設備類;EFh - 混雜設備類;FFh - 廠商定義的設備類。5. 標準描述符設備描述符表4、USB設備描述符的結構偏移域Bytes值描述0bLength1數(shù)字此描述符的字節(jié)數(shù)1bDecriptorType1常量描述符的類型(此處應為0x01,即設備描述符)2bcdUSB2BCD碼USB版本號(BCD 碼)4bDeviceClass1設備類設備類碼:bDeviceClass = 0 ,表明設備類型使用接口描述符中定義的類型,且各個接口獨立工作。bDeviceClass = FFh,表明設備類是由廠商自定義的。bDeviceClass = 1FEh,查表可得對應設備類值,該設備在不同的接口上支持不同的類。且這些接口可能不能獨立工作。此值指出了這些接口集體的類定義。5bDeviceSubClass1設備子類設備子類碼: 這些碼值的具體含義根據(jù)bDeviceClass 域來看。 如bDeviceClass 域為零,此域也須為零 如bDeviceClass 域為FFH,此域的所有值保留。6bDevicePortocol1設備協(xié)議協(xié)議碼 這些碼的值視bDeviceClass 和 bDeviceSubClass 的值而定。 如果設備支持設備類相關的協(xié)議,此碼標志了設備類的值。如果此域的值為零,則此設備不支持設備類相關的協(xié)議,然而,可能它的接口支持設備類相關的協(xié)議。如果此域的值為FFH,此設備使用廠商定義的協(xié)議。7bMaxPacketSize01數(shù)字端點0的最大包大?。▋H8,16,32,64為合法值)8idVendor2ID廠商標志(由USB-IF組織賦值)10idProduct2ID產(chǎn)品標志(由廠商賦值)12bcdDevice2BCD 碼設備版本號(BCD 碼)14iManufacturer1索引描述廠商信息的字符串描述符的索引值。15iProduct1索引描述產(chǎn)品信息的字串描述符的索引值。16iSerialNumber1索引描述設備序列號信息的字串描述符的索引值。17bNumConfigurations1數(shù)字可能的配置描述符數(shù)目【說明1:】當設備類型bDeviceClass = 0時,說明類型將由接口描述符中定義的為準。【說明2:】從設備描述符表格中可知,有3個索引值:廠商信息索引、產(chǎn)品信息索引、設備序列號索引,這意味著,將有3個字符串描述符為其準備。配置描述符配置描述符中包含了配置描述符本身的長度、所有配置信息的總長度、供電方式及遠程喚醒、供電量。 如果主機發(fā)出標準命令Get_Descriptor要求獲得設備的某個配置描述符時,該配置應用的所有信息都將發(fā)給主機,它包括:該標準配置符本身、該配置所包含的所有接口、端點描述符及設備類描述符和廠商描述符。 下表為配置描述符結構:表8、USB配置描述符的結構 偏移量 域大小 值 描述 0bLength1 數(shù)字此描述表的字節(jié)數(shù)長度。 1bDescriptorType1 常量配置描述表類型(此處為0x02) 2wTotalLength2 數(shù)字此配置信息的總長(包括配置,接口,端點和設備類及廠商定義的描述符),即:將要返回的配置信息總長度。 4bNumInterfaces1 數(shù)字此配置所支持的接口個數(shù) 5bCongfigurationValue1 數(shù)字在SetConfiguration()請求中用作參數(shù)來選定此配置。 6iConfiguration1 索引描述此配置的字串描述符的索引 7bmAttributes1 位圖配置特性: D7: 保留(設為1) D6: 自給電源 D5: 遠程喚醒 D4.0:保留(設為1) 一個既用總線電源又有自給電源的設備會在MaxPower域指出需要從總線取的電量。并設置D6為1。運行時期的實際電源模式可由GetStatus(DEVICE) 請求得到。 8MaxPower1 mA在此配置下的總線電源耗費量。以 2mA 為一個單位。 【說明1:】配置描述符也包含了個用于描述符該配置的字符串描述符索引iConfiguration,這說明將有個字符串描述符為其準備。 【說明2:】枚舉的過程可分為4個狀態(tài)階段:接入狀態(tài)階段、缺省狀態(tài)階段、地址狀態(tài)階段、設置狀態(tài)階段,各狀態(tài)階段任務如下:接入狀態(tài)階段-主機檢測到新設備接入后,將復位總線(釋放總線于空閑狀態(tài))。缺省狀態(tài)階段-主機利用0x00地址訪問新接入的設備,讀取部分描述符后,會分配個設備地址。地址狀態(tài)階段-主機再次復位總線,然后用新分配的地址獲取設備所有的描述符。設置狀態(tài)階段-主機根據(jù)設備的描述符,會對設備作些相關的配置。 【說明3:】bCongfigurationValue-USB設備的配置值。用于存放主機執(zhí)行SetConfiguration命令的設置值。當主機發(fā)送GetConfiguration命令時,設備將向主機返回1個字節(jié)的配置值。然而,USB設備處于不同的狀態(tài)時,對GetConfigration的請求也有不同的響應:1. 在枚舉階段,若設備處于地址狀態(tài)時,對GetConfigration的請求返回為0;2. 在枚舉階段,若設備處于默認狀態(tài)(缺省狀態(tài))時,對GetConfigration的請求視為無效;3. 在枚舉階段,若設備處于配置狀態(tài)時,對GetConfigration的請求將返回bConfigurationValue字段的值(該值可能是配置描述符的默認值,也可能是USB主機的設置值,這要看在執(zhí)行GetConfigration命令前是否執(zhí)行了SetConfigration命令)。因為主機要執(zhí)行SetConfigration命令,所以bCongfigurationValue的默認值沒什么用。實際上主機給bCongfigurationValue賦值后,bCongfigurationValue值就充當配置描述符的編號,用以區(qū)分不同的配置,因為一個設備可能有多個配置。接口描述符USB設備的接口,并不指物理接口,更確切的說應該是“功能接口“,是個賦予特定功能邏輯概念,是由一組物理端點為實現(xiàn)這一特定功能而凝聚的集合。/定義標準的接口描述符結構typedef struct _INTERFACE_DESCRIPTOR_STRUCT BYTE bLength; /接口描述符的字節(jié)數(shù)大小 BYTE bDescriptorType; /接口描述符的類型編號 BYTE bInterfaceNumber; /接口的編號 BYTE bAlternateSetting; /可替換的接口描述符編號。實際就是接口的描述符的編號。 BYTE bNumEndpoints; /該接口使用的端點數(shù),不包括端點0 BYTE bInterfaceClass; /接口類 BYTE bInterfaceSubClass; /接口子類 BYTE bInterfaceProtocol; /接口遵循的協(xié)議 BYTE iInterface; /描述該接口的字符串索引值 INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;【說明1:】接口描述符中用到接口編號bInterfaceNumber,以區(qū)分在同一配置下的不同的接口。同時還有該接口描述符的索引iInterface,這意味著將為其準備準備一個字符串描述符。 【說明2:】接口描述符中有一項:可替換的接口描述符編號bAlternateSetting,表示對某一接口進行描述的描述符編號。雖然,USB設備的配置與配置描述符是一一對應的,即一個配置只能由一個配置描述來描述它,但一個接口卻允許有多種描述符來描述它,盡管接口描述符的編號還是唯一一個。說白了就是:一個接口有唯一的一個接口編號,但一個接口卻可以有多個不同的描述符編號,而這些不同的接口描述符的編號值就是bAlternateSetting。所以,通過bInterfaceNumber可以選定一個唯一的接口,然后再通過bAlternateSetting選擇想要的對該接口的描述。主機通過GetInterface可以獲取當前正在使用的接口及接口描述,通過SetInerface可以選定某接口及其使用的描述符。端點描述符端點是設備與主機之間進行數(shù)據(jù)傳輸?shù)倪壿嫿涌?,除配置使用的端點0(控制端點,一般一個設備只有一個控制端點)為雙向端口外,其它均為單向。端點描述符描述了數(shù)據(jù)的傳輸類型、傳輸方向、數(shù)據(jù)包大小和端點號(也可稱為端點地址)等。每個設備必須要有一個默認的控制型端點,地址為0,它的數(shù)據(jù)傳輸為雙向,而且沒有專門的描述符,只是在設備描述符中定義了它的最大包長度。主機通過此端點向設備發(fā)送命令,獲得設備的各種描述符的信息,并通過它來配置設備。/定義標準的端點描述符結構typedef struct _ENDPOINT_DESCRIPTOR_STRUCT BYTE bLegth; /端點描述符字節(jié)數(shù)大小 BYTE bDescriptorType; /端點描述符類型編號 BYTE bEndpointAddress; /端點地址及輸入輸出屬性 BYTE bmAttributes; /端點的傳輸類型屬性 WORD wMaxPacketSize; /端點收、發(fā)的最大包大小 BYTE bInterval; /對周期性端點的訪問間隔 ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;【說明1:】端點的傳輸類型字節(jié)bmAttributes,描述了該端點的傳輸特性:01bit定義了傳輸類型-00=控制傳輸、01=同步傳輸、10=批量傳輸、11=中斷傳輸?!菊f明2:】周期端點的訪問周期字節(jié)bInterval,定義了該端點被主機的訪問周期,此域值對于批量傳輸和控制傳輸毫無意義。對于同步傳輸,其值必須為1,即1ms為標準的同步幀周期。對于中斷傳輸,該值為1255,即1ms255ms。字符串描述符字符串描述符是一種可選的USB標準描述符,描述了如制商、設備名稱或序列號等信息。如果一個設備無字符串描述符,則其它描述符中與字符串有關的索引值都必須為0。字符串使用的是Unicode編碼。字符串描述符是用字符的形式描述設備、配置、接口、端點等信息。字符串描述符以一種格式2類符值的方式存在:1. 顯示語言的字符串描述符-該字符串描述符表明了設備支持哪幾種語言。2. 顯示信息的字符串描述符-用于描述具體的信息。標準的字符串描述符的格式為:表9. 字符串描述符偏移量 域 大小 值 描述 0bLength1數(shù)字此描述表的字節(jié)數(shù)(bString域的數(shù)值N2)1bDescriptorType1常量描述符類型(此處應為0x03)2NStringsN數(shù)字字符串顯示語言的字符串描述符與顯示信息的字符串描述符的區(qū)別在于Strings項的不同,對于顯示語言的字符串描述符來說Strings項由多個wLANGIDn數(shù)組元素組成,每個wLANGIDn是一個雙字節(jié)的代表語言的ID值。而對于顯示信息的字符串描述符而言,Strings則是描述信息后的一組UNICODE編碼。為什么會出現(xiàn)這兩種情況,原因在于訪問字符串描述符的過程,主機請求訪問某個字符串描述符的步驟分成兩步:第一步:獲取語言信息-首先主機向設備發(fā)送標準請求命令Get_Descriptor,其參數(shù)為:描述符類型=字符串描述符,字符串的索引值=0,語言=0,這樣設備將返回顯示語言的字符串描述符,從而主機知道了設備能支持哪些語言。第二步:主機根據(jù)自已需要的語言,再次向設備發(fā)出標準請求命令Get_Descriptor,其參數(shù)為:描述符類型=字符串描述符,字符串索引值=目標字符串索引值,語言=目標語言。這次設備將返回目標已經(jīng)明確的顯示信息的字符串描述符?!菊f明1:】只有字符串描述符的長度不是固定的,其長度為N+2,其中N代表Strings項的字節(jié)數(shù),2代表字符串描述符的bLength、bDescritorType所占的兩個字節(jié)。設備類描述符之HID描述符在USB協(xié)議中,HID設備的描述符沒有劃作為標準的描述符,而是作為一類設備單獨劃分出來進行描述,以設備類的方式來描述它。所以,描述它的格式用設備類描述符。 HID設備的信息在設備描述符和配置描述符中都不包含,而是包含在接口描述符中,所以在使用HID設備時,其設備描述符中的相關項應定義如下:bDeviceClass=0;bDeviceSubClass=0;bDeviceProtocol=0;其接口描述符應該:bInterfaceClass=0x03另外,對無引導的HID設備,其接口描述符中子類代碼bInterfaceSubClass應置0,此時bInterfaceProtocol無效,置零即可。即為:bInterfaceClass=0x03 bInterfaceSubClass=0 bInterfaceProtocol=0對支持引導的USB設備,其接口描述符中子類代碼bInterfaceSubClass應置1,此時bInterfaceProtocol可以為1或2,1表示鍵盤接口,3表示鼠標接口。其參考設置如下:bInterfaceClass=0x03 bInterfaceSubClass=1 bInterfaceProtocol=1或2下面是HID設備類描述符:【說明1:】HID設備類描述符并不是說僅用這一個描述符就可描述清楚這類設備,而是指HID設備除包含所有的標準描述符外,還需這個HID設備來補充描述。也就是說,在使用一般的設備時,只需使用標準的描述符就可描述清楚,而若使用HID設備時,除了要使用全部的標準的描述符外還需HID描述符來補充描述。同時,從HID描述符中看出,它還將引出HID的報告描述符,在此不講述??梢赃@么說,設備類描述符是作為一個對標準描述進行補充描述的描述符。6. 描述符的編號及索引1. 一個USB設備只能擁有一個設備描述符,故設備描述符不需要編號。但設備描述符通常會提供設備最基本的文字描述信息,通常包含廠商、設備、產(chǎn)品的信息,故它擁有3個字符串描述符的索引,這3個索引將指向3個字符串描述,分別描述廠商信息、產(chǎn)品信息、設備序列號信息。簡言之,設備描述符指示了設備有幾種配置,及廠商、產(chǎn)品、設備序列號的字符串描述符索引。2. 配置描述符提供了相應的配置參數(shù)和查找參數(shù):配置描述符編號bCongfigurationValue、配置描述符的字符串描述符的索引。3. 接口描述提供了該接口的應用參數(shù)和查找參數(shù):接口編號bInterfaceNumber、接口描述符編號bAlternateSetting、該接口描述符對應的字符串描述符的索引。4. 字符串描述符是對各描述符所需的字符信息描述的實現(xiàn),每個描述符所需的字符信息描述的索引都將對應一個字符串描述符。但通常都不那么做,而是把所有的字符描述的實現(xiàn)都寫在一個總的字符串描述符中,即字符串描述符的bStrings項,它們之間用索引來區(qū)分。7. 描述符的獲取獲取描述符的命令格式命令碼CmdCode = GetDescriptor , 格式如下:bmRequestTypebRequestwValuewIndexwLength0x800x60類型和索引0或語言ID描述符長度wValue-其高字節(jié)wValue_H指明要獲取的描述符類型(實際只有3種類型:設備描述符類型、配置描述符類型、字符串描述符類型),低字節(jié)wValue_L指明目標描述符的索引,然而wValue_L的值只對配置描述符和字符串描述符有效,而對設備描述符無效。wIndex-只對字符串描述符有意義,對其它描述符時該值為0.。當然對于字符串描述符時,其值也可為0,表示要獲取“顯示語言的字符串描述符” ,若為其它值則代表了確定的語言ID,即表明要獲取指定了語言的“顯示信息的字符串描述符” 。wLength-主機要求的返回的描述符長度。如果wLength大于實際的描述符長度,則以實際描述符長度為準;如果wLength小于實際描述符長度,則以wLength值為準。獲取描述符的過程獲取描述符屬于枚舉的過程,其整個過程當然必經(jīng)Setup傳輸?shù)?大過程:Setup過程、數(shù)據(jù)過程、狀態(tài)信息過程。首先,在Setup過程中,主機發(fā)送GetDescriptor命令。若成功,設備就開始準備數(shù)據(jù),通信將繼續(xù)向前推進,進入數(shù)據(jù)過程。然后,在數(shù)據(jù)過程中,主機啟動IN事件,設備就把準備好的數(shù)據(jù)(描述符)發(fā)送出去。若成功,則通信繼續(xù)向前推進,進入狀態(tài)信息過程。最后,在狀態(tài)信息過程,主機發(fā)送通信過程的信息狀態(tài),祝賀并告知通信完美結束。獲取配置描述符對于主機來說,配置是廣義的,包括狹義的配置、接口配置、端點配置等,而接口配置、端點配置等都隸屬于標準配置描述符,故主機若要求獲取配置描述符時,實際上是要求獲取除設備描述符和字符串描述符以外的所有描述符。對于只有標準描述符的設備而言,當主機要求或者配置描述符時,需設備按照順序把標準配置描述符、標準接口描述符、標準端點描述符一次性發(fā)給主機。所以,通常在寫程序時,會將廣義上的“配置”打成一個包,在包中,由標準配置描述符引領,按照發(fā)送順序依次實現(xiàn)標準接口描述符、標準端點描述符等。這樣做的理由是,在標準配置描述符中有一項wTotalLength,它代表廣義上的配置包描述符總長度,根據(jù)這個參數(shù)就可把廣義的配置包描述符一起發(fā)給主機,以避免多個描述符時的多次傳輸。bmRequestTypebRequestwValuewIndexwLength0x800x60類型和索引0或語言ID描述符長度 wValue _H = 配置描述符類型。wValue _L = 配置描述符編號(索引),實際為bCongfigurationValue值。wIndex = 0 。wLength,其值由主機自己規(guī)定。因為,是按確定的順序發(fā)送的,故主機解析的結果也將一一對應。下面是一個廣義配置包描述符的結構模板: uint8_t USB_ConfigDescriptor = 標準配置描述符的實現(xiàn);標準接口描述符的實現(xiàn);標準設備類描述符的實現(xiàn);標準端點描述符的實現(xiàn);獲取字符串描述符從設備描述符到端點描述符,需要許多的信息描述,即需要許多字符串描述符來描述它們的信息。然而,標準字符串中沒有總長度顯示項wTotalLength,且每個字符串描述符的格式都一樣,所以不可能向獲取配置描述符那樣,用廣義的配置包描述符一起發(fā)給主機,況且有些字符串描述符不是必須的,所以很難做到統(tǒng)一的格式。不過,為了方便管理,在編程時通常還是把所有的字符串描述符組織在一起,不過主機在訪問它們時只能一個一個的訪問,而不能打包訪問,它們之間的選取是依賴各個字符串描述符的長度進行跳過操作來實現(xiàn)的。所以這種組織在一起,只是為了方便管理或好看,而沒有其它任何作用,組織的形式通常以“顯示語言的字符串描述符”領頭,模板如下:uint8_t USB_StringDescriptor = 顯示語言的標準字符串描述符;顯示信息的標準字符串描述符1 ; 顯示信息的標準字符串描述符n ;;在字符串描述符組織中,各個字符串是怎么區(qū)分的?是應用程序,因為這個組織是編寫應用程序時自己規(guī)定內(nèi)部秩序的,故組織中各個字符串描述符對應的索引,程序員當然知道。bmRequestTypebRequestwValuewIndexwLength0x800x60類型和索引0或語言ID描述符長度 wValue _H = 字符串描述符類型。wValue _L = 字符串描述符對應的編號(索引)。wIndex = 0 或ID。wLength,其值由主機自己規(guī)定。在獲取字符串描述符的第一步:獲取設備所支持的語言中,wValue _L = 0,wIndex = 0 ,設備將把顯示語言的標準字符串描述符發(fā)給主機,主機會從中挑選一種語言。在獲取字符串描述符的第二步:獲取顯示信息的字符串描述符中,wValue _L = 目標字符串對應的編號,wIndex=語言ID,設備則把確定的字符串描述符發(fā)給主機。二、 標準命令usb協(xié)議分析-設備描述符配置包-描述符/* usb協(xié)議分析僅供大家參考-設備描述符配置包,設備描述符, 地址設置, 配置描述符, 字符串描述符 */* -1- usb設備描述符配置包 */typedef struct _USB_SETUP_PACKET REQUEST_TYPE bmRequestType; BYTE bRequest; WORD_BYTE wValue; WORD_BYTE wIndex; WORD wLength; USB_SETUP_PACKET;1.bmRequestType 是包含有下面幾方面的內(nèi)容:D7 D6 D5 D4 D3 D2 D1 D0在這一個字節(jié)里,又按位分為:D7位是表示后面?zhèn)魉蛿?shù)據(jù)的方向位。當D7等于0時,表示后面的數(shù)據(jù)是從主控器發(fā)送到USB設備。在PC里,就是從PC機發(fā)送到USB的設備。當D7等于1時,表示后面的數(shù)據(jù)是從USB設備發(fā)送到主控器。在PC里,就是從USB設備發(fā)送到USB設備。在上次里,我收到并顯示出來的數(shù)據(jù)是80,就表示從USB設備里發(fā)送數(shù)據(jù)給PC。在這里再次給出上一次的包數(shù)據(jù):80 06 00 01 00 00 40 00這里的80,就是D7位為1。D6-D5位是請求主分類型0 是表示標準的請求。1 是表示類別的請求。2 是表示廠商的請求。3 是保留。D4-D0位是表求接收這個包的接口。0 是表示USB設備接收。1 是表示接口接收。2 是表示端點接收。3 是表示其它接收,不知道的。4-31是保留。2.bRequest 是本描述符的請求類型,也就是后面發(fā)送的數(shù)據(jù)是什么樣的東西。由于USB里有很多配置信息,比如獲取設備描述符,又有設置USB地址等等,就是通過這個字節(jié)來區(qū)分的。從USB協(xié)議里查找表9-4,就可看到如下的編碼:GET_STATUS 0CLEAR_FEATURE 1Reserved for future use 2SET_FEATURE 3Reserved for future use 4SET_ADDRESS 5GET_DESCRIPTOR 6SET_DESCRIPTOR 7GET_CONFIGURATION 8SET_CONFIGURATION 9GET_INTERFACE 10SET_INTERFACE 11SYNCH_FRAME 12在上面的數(shù)據(jù)包里,看到它的內(nèi)容是06,那么它就是GET_DESCRIPTOR類型。也就是主控器想讀取USB設備的描述符,到這里就已經(jīng)分析出來的意思,就是主控器想讀取USB描述符,但還不知道是什么描述符的內(nèi)容。3.wValue是根據(jù)不同的請求而設置不同的值。一般就是傳送參數(shù)給設備標明這是什么請求。在上面GET_DESCRIPTOR獲取設備描述符里,它的值是00 01。在GET_DESCRIPTOR里這個字段的低字節(jié)表示描述符的索引,高字節(jié)表示描述符的類型。高字節(jié)的類型如下:DEVICE 1CONFIGURATION 2STRING 3INTERFACE 4ENDPOINT 5DEVICE_QUALIFIER 6OTHER_SPEED_CONFIGURATION 7INTERFACE_POWER1 8wValue值在這里的高字節(jié)是01,那么它就是設備描述符了。低字節(jié)是00,那么它就是表示從偏移地址0開始讀取設備描述符。由于在配置描述符里有很多配置,所以低字節(jié)在那里就可以用來識別獲取同樣類型的描述符不同的配置。4.wIndex是根據(jù)不同的請求而設置不同的值。一般用來說明端點號或者說明接口標識。在獲取描述符里,設置為0,或者是語言ID。在這個發(fā)送的描述符里,它是設置為00 00。5.wLength是根據(jù)請求來決定下一階段發(fā)送數(shù)據(jù)的長度。前面請求第一個字節(jié)里,已經(jīng)說明下一階段數(shù)據(jù)傳送的方向,這里說明了傳送數(shù)據(jù)的長度。不管是發(fā)送數(shù)據(jù),還是接收數(shù)據(jù),都不要超過這個數(shù)據(jù)長度,否則主機會出問題,或者設備有問題。在這個獲取設備描述里,它的長度是40 00,按小端格式去解釋,就是64個字節(jié)。到這里,就把主控器發(fā)下來的數(shù)據(jù)解釋完成了,知道去做什么的事情和回應。下一次就去分析怎么樣返回設備描述符。/* - */* -2- 回應設備描述符 */上一次已經(jīng)介紹怎么樣收到主控器的獲取設備描述符的數(shù)據(jù),這里就解釋怎么樣發(fā)送回應數(shù)據(jù)給主控器。先從USB協(xié)議里找到標準設備的定義,我把它用C語言定義如下:typedef struct _USB_DEVICE_DESCRIPTOR BYTE bLength;BYTE bDescriptorType;WORD bcdUSB;BYTE bDeviceClass;BYTE bDeviceSubClass;BYTE bDeviceProtocol;BYTE bMaxPacketSize0;WORD idVendor;WORD idProduct;WORD bcdDevice;BYTE iManufacturer;BYTE iProduct;BYTE iSerialNumber;BYTE bNumConfigurations; USB_DEVICE_DESCRIPTOR;返回給主控器的數(shù)據(jù)結構就是上面的內(nèi)容,只要把上面的結構填寫合適的內(nèi)容,就可以發(fā)送回去給主控器。在我的USB設備里,我把它填寫如下的數(shù)據(jù):12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01看到這串數(shù)據(jù)是不明白是什么東西的,現(xiàn)在就來仔細地分析它的具體定義。下面就按著一個字段一個字段地分析它。bLength是本結構的數(shù)據(jù)長度,這樣可以方便以后兼容不同的版本協(xié)議。因為不同的結構是不同的長度,這樣就可以區(qū)分不同的協(xié)議了。比如有一天想添加一個字段,那么它的長度就會改變,這時就可以根據(jù)不同的長度進行解釋不同的協(xié)議了。這次返回的結構長度是0x12,也就是18個字節(jié),它的長度是從bLength長度開始,也就是說是完全整個結構的長度。bDescriptorType是描述符的類型。它的定義跟主控器發(fā)下來描述符的類型是一樣的,如下:DEVICE 1CONFIGURATION 2STRING 3INTERFACE 4ENDPOINT 5DEVICE_QUALIFIER 6OTHER_SPEED_CONFIGURATION 7INTERFACE_POWER1 8由于返回的是設備描述符,所以就選擇了1,也就是包里顯示的第二個字節(jié)01。用這個類型來區(qū)分不同的描述符。bcdUSB是USB發(fā)布的協(xié)議版本。也就是本設備能適用于那種協(xié)議,目前USB主要有兩個版本,一個是1.10,一個是2.10版本。在本設備里,采用了1.10的協(xié)議版本。由于這個字段是采用BCD編碼,所以1.10的表示為0x0110的格式,按小端格式輸出來,就變成10 01的顯示了。bDeviceClass是設備分類。當它的值是0時,表示所有接口在配置描述符里,并且所有接口是獨立的。當它的值是1到FEH時,表示不同的接口關聯(lián)的。當它的值是FFH時,它是廠商自己定義的。在這個設備里,是定義為0。bDeviceSubClass是設備子分類碼。當前面的bDeviceClass值是0時,這里一定要設置為0。其它就跟據(jù)USB-IF組織定義的編碼。bDeviceProtocol是設備使用的協(xié)議。如果使用USB-IF組織定義的協(xié)議,就需要設置這里的值。如果不使用,就直接設置為0。如果廠商自己定義的可以設置為FFH。以上三個值,在本設備里全部設置為0。bMaxPacketSize0是端點0收發(fā)最大的包大小。僅允許設置8,16,32,64中的任何一個大小。在本設備里是設置為64個字節(jié)大小。所以看到這個字段是40 的大小。12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01idVendor是廠商標識。由USB-IF分配的編碼。在這里使用0x8000。idProduct是廠商定義的產(chǎn)品標識。由廠家和產(chǎn)品標識,就可以讓操作系統(tǒng)加載不同的驅(qū)動程序。如下:12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01bcdDevice是用BCD表示的設備發(fā)布的版本號。這里是1.00。12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01iManufacturer是廠商字符串的偏移值。這值主要說明了它在字符串描述符里的偏移位置。如果它設置為0,表示沒有廠商字符串。在這里是0x04,就是從字符串描述符開始位置算起第4個字節(jié)位置讀取字符串。iProduct是產(chǎn)品字符串的偏移值。這值主要說明了它在字符串描述符里的偏移位置。如果它設置為0,表示沒有產(chǎn)品字符串。在這里是0x2C,就是從字符串描述符開始位置算起第2C個字節(jié)位置讀取字符串。iSerialNumber是序列號字符串的偏移值。這值主要說明了它在字符串描述符里的偏移位置。如果它設置為0,表示沒有序列號字符串。在這里是0x4A,就是從字符串描述符開始位置算起第4A個字節(jié)位置讀取字符串。所有字符串,都是采有UNICODE編碼。bNumConfigurations是配置描述符的個數(shù)。在這里只使用了一個配置,所以設置為1。/* - */* -3- 設置USB地址 */前面已經(jīng)解釋主控器怎么樣發(fā)送設備描述符下來,然后設備返回相應的設備描述符。下一步主控器的動作是做什么呢?由于在USB總線上的設備有很多,為了區(qū)分不同的設備通訊,就需要給每個設備分配一個地址,這跟網(wǎng)絡中的IP地址是一樣的,或者跟MAC地址也是一樣的。因而,接著下來就是主控器分配地址給設備,USB的設備地址是從1開始到127。下面就是接收到主控器發(fā)下來的數(shù)據(jù)包:00 05 01 00 00 00 00 00由USB_SETUP_PACKET定義具體地分析這個數(shù)據(jù),就可以知道應做什么樣的響應了。下面就來解釋這個操作。先取得bmRequestType的類型,也就是第一個字節(jié),它是00。從USB協(xié)議里查看,它的方向位是主控器發(fā)送給設備,由D6D5位就知道它是USB協(xié)議里定義的標準請求,由D4-D0位知道它是USB設備接收這個包數(shù)據(jù)。bRequest是05,從前面已經(jīng)介紹的類型,就知道它是設置地址,如下:SET_ADDRESS 5所以這個包需要按設置地址的格式去解釋后面的數(shù)據(jù)。由于USB協(xié)議可以知道,USB的設備地址放在字段wValue里,因它的值是01 00,按小端格式解釋就是0x0001了。其它相應的字段wIndex和wLength應都是0,如果是其它非0的數(shù)據(jù),是沒有定義的。USB的串行引擎通過這個地址來判斷是否接收總線上的數(shù)據(jù),如果發(fā)送的地址跟它一致,就會接收主控器發(fā)過來的數(shù)據(jù),當然從這個設備發(fā)送出去的數(shù)據(jù)也帶有這個地址,因此就可以讓主控器識別不同的USB設備數(shù)據(jù)了。/* - */* -4- 配置描述符 */前面已經(jīng)介紹設置USB的設備地址,接著下來是做什么呢?其實有了設備地址后,主控器還會再次發(fā)送獲取上面已經(jīng)讀取的設備描述符下來,如下:80 06 00 01 00 00 12 00然后USB設備也再次回應它,但這次發(fā)送的長度是0x0012了,不再是第一次64個字節(jié)長度了。接著USB設備就返回下面的描述符給主控器,也就是第一次已經(jīng)發(fā)送的設備描述符,如下:12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01這樣分配地址之后,再次獲取設備描述符成功了,接著下來就是主控器獲取配置描述符。下面就是收到的配置描述符數(shù)據(jù):80 06 00 02 00 00 09 00分析上面的數(shù)據(jù)如下:bmRequestType是80,表示方向USB設備發(fā)送給主控器,接收設備是USB設備。bRequest是06,表示這是獲取描述符。GET_DESCRIPTOR 6wValue是00 02。低字節(jié)表示偏移地址00,高字節(jié)表示描述符的類型。如下:CONFIGURATION 2所以這里的返回的設備描述符是配置描述符。wIndex是00 00。wLength是09 00。它表示返回描述符的長度。這里是9個字節(jié)。接著下來,就是設備返回配置描述符給主控器,發(fā)送的數(shù)據(jù)如下:09 02 22 00 01 01 00 01 32發(fā)送的數(shù)據(jù)是按下面的結構來定義,這也是在USB協(xié)議里

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論