Drivers

如何將原始數據寫入 USB 設備

  • January 27, 2022

我正在嘗試將原始數據寫入連接到我的電腦的 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) 完成的。

引用自:https://unix.stackexchange.com/questions/292933