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