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