如何將原始數據寫入 USB 設備
我正在嘗試將原始數據寫入連接到我的電腦的 USB 設備。我正在使用 Kali Linux,我找到了正確的文件路徑: “/dev/usb/003/013” 。但是,當我嘗試向其中寫入數據時,出現錯誤。
root@kali:~/usb# printf "test" > /dev/bus/usb/003/013 bash: printf: write error: Invalid argument
我也嘗試過使用貓:
root@kali:~/usb# cat test > /dev/bus/usb/003/013 cat: write error: Invalid argument
在前一種情況下,文件“test”確實存在並且其中包含數據。似乎系統無法寫入文件描述符,即使它在那裡。
經過研究,我得出的結論是,您要麼:
A. 需要一個與設備介面的 USB 驅動程序。
B. 使用 SCSI 直通將數據直接寫入設備上的端點。
我是 USB 程式的新手,雖然我很想嘗試,但我以前從未編寫過驅動程序。任何建議或幫助將不勝感激。
是否可以像我最初嘗試的那樣將原始數據寫入設備?如果沒有,您能解釋一下我可以使用的一些選項嗎?
USB 設備遠比您讀寫的管道複雜得多。您必須編寫程式碼來操作它們。您(可能)不需要編寫核心驅動程序。請參閱http://libusb.info(née libusb.org)和http://libusb.sourceforge.net/api-1.0。這聲稱適用於 Linux、OSX、Windows、Android、OpenBSD 等。在 Mac OS X 下, I/O Kit中有使用者級功能,可讓您訪問 USB。在Windows下,你也許可以使用WinUSB,但它很複雜。
這是我曾經畫過的一張小圖,可以幫助我理解 USB 的架構:
╭────────────────────────────────────╮ ┌──────┐ │ device ┌─────┐ ┌─────────┐ │ │ Port ├──┐ │ ┌─┤ EP0 ├──┤ control │ │ └──────┘ │ │ ┌────────┐ │ └─────┘ ├─────────┤ │ ├────┤addr = 2├─┤ ┌─────┐ │ │ │ │ │ └────────┘ ├─┤ EP1 ├──┤interface│ │ │ │ │ └─────┘ │ #0 │ │ │ │ │ ┌─────┐ ├─────────┤ │ │ │ ├─┤ EP2 ├──┤ │ │ │ │ │ └─────┘ │interface│ │ │ │ │ ┌─────┐ │ #1 │ │ │ │ └─┤ EP3 ├──┤ │ │ │ │ └─────┘ └─────────┘ │ │ ╰────────────────────────────────────╯ │ │ :
執行摘要:每個設備都有一個地址(由作業系統分配,可能會發生變化),最多(我認為)32 個端點。
設備內有一個或多個“介面”。例如,網路攝像頭可能提供“相機”界面和“麥克風”界面。多功能列印機將提供多個介面。
Endpoint 0 用於設備的控制和配置,其他用於訪問各種介面。每個介面都有零個或多個(通常更多)端點。
端點可以是以下幾種傳輸類型之一:
- 控制傳輸用於查詢和配置設備。每個設備都需要支持最少的控制語句集。我相信控制傳輸僅用於端點 0。
- 批量傳輸以全頻寬發送或接收數據
- 中斷傳輸(我不確定這與批量傳輸有何不同;USB 沒有中斷)。範例包括鍵盤和滑鼠
- 同步傳輸以全頻寬發送或接收具有實時要求但不可靠的數據。用於音頻/影片應用。
另外值得注意的是:一個 USB 設備可以有多種配置,這些配置可以控制可用的介面等等。更改設備配置幾乎就像拔下設備並在其位置插入不同的設備。
所有這些資訊都在設備描述符、配置描述符、介面描述符、端點描述符等中列出,可以通過端點零進行查詢。
(在內部,數據不是字節流,它被打包成數據包,其確切格式是 USB 規範的一部分。在大多數情況下,您無需擔心這一點,因為控制器和驅動程序將管理這部分你。)
實際上,根據您的 API 庫和作業系統,您需要檢測設備,讀取各種描述符以找出您正在處理的內容,可選擇設置其配置(如果作業系統允許),打開界面,並打開端點。
對於批量端點,您可以向它們讀取和寫入原始數據。對於控制傳輸,API 庫將提供函式呼叫。我從未使用過中斷或同步傳輸;我確信你的 API 庫會有相關的文件。
更多資訊:“功能”是協同工作的介面的集合。它最初不是 USB 規範的一部分,由設備驅動程序知道應該將哪些介面組合在一起。USB 工作組定義了支持功能的設備類。這是通過介面關聯描述符 (IAD) 完成的。