1.usb 裝置硬體部分
a.這個硬體的標識是用的 vender id 和 product id, 即「廠家標識」和「產品標識」
b.這個硬體規定了各個 end point (端點) 的性質, 讀/寫 及 型別 (control/interrupt/bulk/isochronous)
c.這個硬體的韌體裡面有 deviceiocontrol 的實現部分, 規定了這個函式的具體引數和動作
2.usb 裝置驅動
①硬體介面
a.需要識別 vender id 和 product id
b.對每個 endpoint 的每個 i/o 分配乙個 pipe, 並且起乙個名字作為軟體介面
c.做 deviceiocontrol 的介面
②軟體介面
a.guid, 驅動程式的標識, 每個驅動程式使用不同的 guid, guid 是識別驅動的, 與硬體無關 (驅動程式公升級版本 guid 不能修改)
b.硬體介面裡面的 b: pipe 名字是軟體介面, 這個 pipe 名字純粹由驅動定義的, 和硬體無關, 公升級驅動不能改 pipe 的名字
c.硬體介面裡面的 c 的各個引數也是軟體的介面, 這些引數是由硬體帶來的, 不是驅動規定的, 當然也可以在驅動裡面轉義, 隱藏裝置的真實情況
③這個驅動程式是用 winddk 編譯的, 可以用文字編輯器或其他開發工具的編輯器程式設計序**, 然後呼叫 winddk 編譯
3.讀寫 usb 口的程式
①與驅動的介面
a.利用驅動程式裡面的 guid 找出裝置的檔名, 用 createfile 函式開啟裝置。我前面的程式裡面的 openusbdevice 就是這個作用
b.通過 a.得到的裝置檔名和驅動程式裡面的 pipe 名開啟 pipe, 訪問這個 pipe 對應的 usb 端點 (讀寫資料)
c.使用 a.的 createfile 得到的控制代碼, 通過 deviceiocontrol 實現裝置規定的動作
②有關需要的資料
a.vender id, product id 和 guid 一般在驅動程式的 .inf 檔案裡面能看到, 如果找不到就需要和廠家聯絡
b.pipe 的名字是驅動程式規定的, 需要有驅動程式的資料才能知道
c.deviceiocontrol 的引數需要有驅動程式的資料或者硬體資料才能知道
③這個程式一般用 c/c++ 直接編寫, 如果使用其他語言(vb/pb等)需要呼叫 c/c++ 編的 dll
usb 驅動程式可以到登錄檔裡面找到:
"hkey_local_machine//system//controlset001//enum//usb//vid_廠家標識&pid_產品標識//驅動程式"
裡面的 classguid 就是驅動程式的 guid 標識, 例如
相當於程式的: define_guid(usb_driver_guid, 0x36fc9e60,0xc465,0x11cf,0x80,0x56,0x44,0x45,0x53,0x54,0x00,0x00);
另外在這個登錄檔鍵裡面還可找到有關裝置的其他描述, 例如 devicedesc = "usb mass storage device" 等
USB裝置驅動(1 1) 硬體特性
usb裝置硬體特性 1.序列資料傳輸 差分 2.支援熱拔插。3.主從結構,兩個可以互連的裝置,一定有主從之分。後來支援otg 可以讓裝置更換角色,但並未能改變主從結構的本質。4.usb主機,一定要具備 2種裝置 usb主控制器,usb根集線器 主控制器 處理根集線器上的資料,交給系統處理 根集線器 ...
USB裝置驅動
1.linux usb架構 usb通訊都是由host端發起的。usb裝置驅動程式分配並初始化乙個urb發給usb core,usb core改一改,發給usb主機控制器驅動,usb主機控制器驅動把它解析成包,在匯流排上進行傳送。usb core是由核心實現的,其實也就是把host control d...
USB裝置驅動
把usb裝置接到pc 右下角彈出 發現android phone 跳出乙個對話方塊,提示你安裝驅動程式 問1.既然還沒有 驅動程式 為何能知道是 android phone 答1.windows裡已經有了usb的匯流排驅動程式,接入usb裝置後,是 匯流排驅動程式 知道你是 android phon...