UBOOT 之U盤枚舉
簡單的說下U盤的枚舉過程,一下是我的U盤的枚舉截圖
在接口描述符,09 04 00 00 03 08 06 50 00,其後爲三個端點描述符
03非0端點的數目 兩個批量傳輸 一個interrupt
08 接口所使用的類爲mass storage
06 子類爲SCSI命令集
50 協議爲批量傳輸
接着與U盤有關的就是從GET MAX LUN開始,返回長度爲0001
a1 fe 00 00 00 00 01 00返回的00表示有1塊邏輯塊
接下來顯示的是批量傳輸協議的數據流模型(封裝UFI)
需要明白CBW和CSW結構,這裏就不詳細介紹,簡單說明
0x43425355 爲CBW和CSW的標誌
0x85ca3cd8爲主機分配的CBW簽名,CSW返回也需要此值
0x00000024爲請求的長度,36字節
80 D7表示傳輸數據方向 1爲IN 0爲OUT
00 低四位表示使用LUN
06 低五位表示返回的CBWCB長度 不足16字節補0
後面的16字節根據選擇的子類(這裏是SCSI命令集,實際上使用UFI)
CSW就不分析了,總體而言,就是UFI命令被CBW封裝,解析UFI之後,返回對應數據,最後以CSW(最後一個字節00表示傳輸成功)結束一次批量數據傳輸。
UFI(USB Floppy Interface)命令集介紹
(1) INQUIRY 查詢U盤信息
發送:
12 00 00 00 24 00 00 00 00 …
12爲 UFI INQUIRY操作碼
00 D7~D5 邏輯單元號,0
24 爲返回的數據分配的存儲空間長度 36字節(前面請求的最大長度也不能超過36字節)
返回的數據具體看文檔
內容包括外設類型,存儲介質是否可移除,廠商信息,產品信息,產品版本信息(1.00 信息均爲ACSII)
(2) READ FORMAT CAPACITIES 讀取可格式化容量
發送: 23 00 00 …00 fc 00…
23爲 read format capacities 主機讀取可能的格式化容量的列表
00fc 分配的緩衝區長度252
返回的數據:
00 00 00 08 00 1e bf fe 02 00 02 00
08 表示容量列表的長度
001ebffe 高字節在前 表示塊數
02 描述符代碼
000200 高字節在前 每塊字節數512字節
容量=塊數*每塊字節數
(3) READ CAPACITY 讀取可用的最大容量
發送:25 00 …
25爲 操作碼 讀取可用容量
返回: 00 1e bf fe 00 00 02 00
001ebffe 最後邏輯塊地址
(與可格式化容量一樣表示沒有其他塊用作他用)
00000200 塊大小 512字節
(4) READ(10)
28 00 …01.
28 爲READ(10)操作碼 邏輯塊的地址爲00000000 01爲傳輸長度
就是讀取以邏輯地址爲起始地址,長度爲1的塊的內容
返回: 對應塊的內容
(5) WRITE(10)
命令和(4)類似,略,操作碼爲0x2A
(6) REQUEST SENSE 用於探測上一個命令執行失敗的原因
(7) TEST UNIT READY 用來檢測設備的某個邏輯單元是否準備好
對於U盤的操作,就是基於這些UFI來進行的。