每個(gè)USB設(shè)備必須響應(yīng)默認(rèn)管道上的設(shè)置包。設(shè)置包用于設(shè)備的檢測和配置,并執(zhí)行諸如設(shè)置USB設(shè)備的地址、請求設(shè)備描述符或檢查端點(diǎn)狀態(tài)等常見功能。兼容USB的主機(jī)要求所有請求在最長5秒鐘內(nèi)得到處理。它還為特定請求規(guī)定了更嚴(yán)格的時(shí)間安排:
沒有數(shù)據(jù)階段的標(biāo)準(zhǔn)設(shè)備請求必須在50ms內(nèi)完成。
帶有數(shù)據(jù)階段的標(biāo)準(zhǔn)設(shè)備請求必須在請求500毫秒后開始返回?cái)?shù)據(jù)。
每個(gè)數(shù)據(jù)包必須在前一個(gè)數(shù)據(jù)包成功傳輸后500毫秒內(nèi)發(fā)送。
狀態(tài)階段必須在最后一個(gè)數(shù)據(jù)包傳輸后50ms內(nèi)完成。
SetAddress命令(包含數(shù)據(jù)階段)必須處理該命令并在50ms內(nèi)返回狀態(tài)。在發(fā)送下一個(gè)請求之前,設(shè)備有2ms的時(shí)間更改地址。
即使是最慢的設(shè)備也可以接受這些超時(shí)時(shí)間,但在調(diào)試期間可能會(huì)受到限制。50mS不允許在異步串行端口上以9600bps的速度發(fā)送許多調(diào)試字符,也不允許在線調(diào)試器/仿真器單步執(zhí)行或中斷執(zhí)行以檢查內(nèi)部寄存器。因此,USB接口的調(diào)試方法與其它單片機(jī)項(xiàng)目不同。
隨便讀一下XP-DDK,你可能會(huì)注意到主機(jī)控制器驅(qū)動(dòng)程序現(xiàn)在有一個(gè)USBUSER_OP_SEND_one_PACKET命令,注釋為“此API用于實(shí)現(xiàn)‘單步’USB事務(wù)開發(fā)工具”。雖然這樣的工具還沒有發(fā)布,但我們只能希望很快看到一個(gè)。
每個(gè)請求以一個(gè)8字節(jié)長的設(shè)置包開始,其格式如下:,抵消場大小價(jià)值說明zeroBM請求類型one位圖D7數(shù)據(jù)相轉(zhuǎn)移方向
0 = Host to Device1 = Device to HostD6..5型
0 = Standard1 = Class2 = Vendor3 = ReservedD4..0收件人
0 = Device1 = Interface2 = Endpoint3 = Other4..31 = Reservedone布雷奎斯特one價(jià)值請求twoWValuetwo價(jià)值價(jià)值four溫得克斯two索引或偏移量索引sixW長度two計(jì)數(shù)如果存在數(shù)據(jù)階段,要傳輸?shù)淖止?jié)數(shù)這個(gè) BM請求類型字段將確定請求的方向、請求的類型和指定的收件人 布雷奎斯特字段確定正在發(fā)出的請求。bmRequestType通常被解析,執(zhí)行被分支到許多處理程序,例如標(biāo)準(zhǔn)設(shè)備請求處理程序、標(biāo)準(zhǔn)接口請求處理程序、標(biāo)準(zhǔn)端點(diǎn)請求處理程序、類設(shè)備請求處理程序等。如何解析安裝程序包完全取決于您的喜好。其他人可以選擇先解析bRequest,然后根據(jù)每個(gè)請求確定類型和接收者。所有USB設(shè)備的標(biāo)準(zhǔn)請求都是通用的,下一頁將詳細(xì)介紹。類請求對于驅(qū)動(dòng)程序類是通用的。例如,所有符合HID類的設(shè)備都將有一組通用的類特定請求。這些將不同于符合通信類的設(shè)備,也不同于轉(zhuǎn)換為大容量存儲(chǔ)類的設(shè)備。最后是供應(yīng)商定義的請求。這些是你作為USB設(shè)備設(shè)計(jì)者可以分配的請求。這些通常因設(shè)備而異,但這完全取決于您的實(shí)現(xiàn)和想象。一個(gè)共同的請求可以被定向到不同的接收者,并根據(jù)接收者執(zhí)行不同的功能。例如,GetStatus標(biāo)準(zhǔn)請求可以定向到設(shè)備、接口或端點(diǎn)。當(dāng)定向到某個(gè)設(shè)備時(shí),它將返回指示遠(yuǎn)程喚醒狀態(tài)以及設(shè)備是否自供電的標(biāo)志。但是,如果同一個(gè)請求被定向到接口,它總是返回零,或者如果它被定向到一個(gè)端點(diǎn),它將返回該端點(diǎn)的halt標(biāo)志。這個(gè)WValue和 溫得克斯字段允許參數(shù)隨請求一起傳遞。 W長度如果存在數(shù)據(jù)階段,則指定要傳輸?shù)淖止?jié)數(shù)。
USB規(guī)范第9.4節(jié)詳細(xì)說明了每個(gè)USB設(shè)備需要實(shí)現(xiàn)的“標(biāo)準(zhǔn)設(shè)備”請求。該標(biāo)準(zhǔn)提供了按請求對項(xiàng)目分組的單個(gè)表??紤]到大多數(shù)固件將按接收者解析設(shè)置包,我們將選擇按接收者分解請求,以便于檢查和實(shí)現(xiàn)。
目前有8個(gè)標(biāo)準(zhǔn)設(shè)備請求,下表詳細(xì)說明了這些請求。BM請求類型布雷奎斯特WValue溫得克斯W長度數(shù)據(jù)1000萬B獲取狀態(tài)(0x00)零零二設(shè)備狀態(tài)0000萬B清除功能(0x01)功能選擇器零零沒有0000萬B設(shè)置功能(0x03)功能選擇器零零沒有0000萬B設(shè)置地址(0x05)設(shè)備地址零零沒有1000萬B獲取描述符(0x06)描述符類型和索引零或語言ID描述符長度描述符0000萬B集合描述符(0x07)描述符類型和索引零或語言ID描述符長度描述符1000萬B獲取配置(0x08)零零one配置值0000萬B設(shè)置配置(0x09)配置值零零沒有
這個(gè)獲取狀態(tài)針對設(shè)備的請求將在數(shù)據(jù)階段返回兩個(gè)字節(jié),格式如下:,15號(hào)公路第14天第13天第12天第11天第10天第9天D8型D7型D6型D5型D4號(hào)D3D2號(hào)D1D0號(hào)保留遠(yuǎn)程喚醒自供電如果設(shè)置了D0,則表示設(shè)備為自供電。如果清除,則設(shè)備為總線供電。如果設(shè)置了D1,則設(shè)備已啟用遠(yuǎn)程喚醒,并且可以在掛起期間喚醒主機(jī)。遠(yuǎn)程喚醒位可以通過SetFeature和ClearFeature請求,并使用DEVICE_remote_wakeup(0x01)的功能選擇器進(jìn)行
清除特征和設(shè)置功能請求可用于設(shè)置布爾特征。當(dāng)指定的接收者是設(shè)備時(shí),只有兩個(gè)可用的功能選擇器是device_REMOTE_WAKEUP和TEST_MODE。測試模式允許設(shè)備顯示各種條件。這些在USB規(guī)范修訂版2.0中有進(jìn)一步的記錄。
設(shè)置地址在枚舉期間用于為USB設(shè)備分配唯一地址。地址是用wValue指定的,最大只能是127。此請求的唯一性在于設(shè)備在完成狀態(tài)階段之后才設(shè)置其地址。(參見控制權(quán)轉(zhuǎn)讓)所有其他請求必須在狀態(tài)階段之前完成。
設(shè)置描述符/獲取描述符用于返回wValue中的指定描述符。對配置描述符的請求將在一個(gè)請求中返回設(shè)備描述符以及所有接口和端點(diǎn)描述符。終結(jié)點(diǎn)描述符無法由GetDescriptor/SetDescriptor請求直接訪問。接口描述符無法由GetDescriptor/SetDescriptor請求直接訪問。字符串描述符在wIndex中包含一個(gè)語言ID,以支持多種語言。
獲取配置/設(shè)置配置用于請求或設(shè)置當(dāng)前設(shè)備配置。在Get配置請求的情況下,將在數(shù)據(jù)階段返回一個(gè)字節(jié),指示設(shè)備狀態(tài)。零值表示設(shè)備未配置,非零值表示設(shè)備已配置。設(shè)置配置用于啟用設(shè)備。它應(yīng)該包含所需的bConfigurationValue的值配置描述符在wValue的低字節(jié)中選擇要啟用的配置。
該規(guī)范目前定義了五個(gè)標(biāo)準(zhǔn)接口請求,詳細(xì)信息見下表。有趣的是,只有兩個(gè)請求可以做任何可以理解的事情。
BM請求類型 | 布雷奎斯特 | WValue | 溫得克斯 | W長度 | 數(shù)據(jù) |
1000 0001b | 獲取狀態(tài)(0x00) | 零 | 接口 | 二 | 接口狀態(tài) |
0000 0001b號(hào) | 清除功能(0x01) | 功能選擇器 | 接口 | 零 | 沒有 |
0000 0001b號(hào) | 設(shè)置功能(0x03) | 功能選擇器 | 接口 | 零 | 沒有 |
1000 0001b | 獲取接口(0x0A) | 零 | 接口 | 一 | 備用接口 |
0000 0001b號(hào) | SET U接口(0x11) | 替代設(shè)置 | 接口 | 零 | 沒有 |
溫得克斯通常用于為指向接口的請求指定引用接口。其格式如下所示。15號(hào)公路第14天第13天第12天第11天第10天第9天D8型D7型D6型D5型D4號(hào)D3D2號(hào)D1D0號(hào)保留接口編號(hào)
獲取狀態(tài)用于返回接口的狀態(tài)。對接口的這種請求應(yīng)該返回兩個(gè)字節(jié)0x00、0x00。兩個(gè)字節(jié)都保留供將來使用
清除特征和設(shè)置功能請求可用于設(shè)置布爾特征。當(dāng)指定的接收者是接口時(shí),當(dāng)前的USB規(guī)范修訂版2沒有指定接口特性。
獲取接口和設(shè)置接口設(shè)置替代接口設(shè)置,在接口描述符 .
標(biāo)準(zhǔn)端點(diǎn)請求有以下四種類型。BM請求類型布雷奎斯特WValue溫得克斯W長度數(shù)據(jù)1000 0010b獲取狀態(tài)(0x00)零終結(jié)點(diǎn)二終結(jié)點(diǎn)狀態(tài)0000 0010b清除功能(0x01)功能選擇器終結(jié)點(diǎn)零沒有0000 0010b設(shè)置功能(0x03)功能選擇器終結(jié)點(diǎn)零沒有1000 0010b同步幀(0x12)零終結(jié)點(diǎn)二框架
這個(gè) 溫得克斯字段通常用于指定指向端點(diǎn)的請求的引用端點(diǎn)和方向。其格式如下所示。15號(hào)公路第14天第13天第12天第11天第10天第9天D8型D7型D6型D5型D4號(hào)D3D2號(hào)D1D0號(hào)保留去吧保留終結(jié)點(diǎn)編號(hào)
獲取狀態(tài)返回兩個(gè)字節(jié),指示終結(jié)點(diǎn)的狀態(tài)(暫停/暫停)。返回的兩個(gè)字節(jié)的格式如下所示。15號(hào)公路第14天第13天第12天第11天第10天第9天D8型D7型D6型D5型D4號(hào)D3D2號(hào)D1D0號(hào)保留停止
清除特征和設(shè)置功能用于設(shè)置端點(diǎn)特征。該標(biāo)準(zhǔn)目前定義了一個(gè)端點(diǎn)特性選擇器endpoint_HALT(0x00),它允許主機(jī)暫停和清除一個(gè)端點(diǎn)。建議只有默認(rèn)端點(diǎn)以外的端點(diǎn)具有此功能。
A 同步幀請求用于報(bào)告端點(diǎn)同步幀。