Các thiết bị USB phức tạp hơn nhiều so với các ống đơn giản bạn đọc và viết. Bạn sẽ phải viết mã để thao tác chúng. Bạn không cần phải viết trình điều khiển kernel. Xem http://libusb.info (nhũ danh libusb.org) và http://libusb.sourceforge.net/api-1.0 . Điều này khẳng định sẽ hoạt động với Linux, OSX, Windows, Android, OpenBSD, v.v. Trong Mac OS X, có các chức năng cấp người dùng trong I / O Kit sẽ cho phép bạn truy cập USB. Trong Windows, bạn có thể sử dụng WinUSB, nhưng nó phức tạp.
Đây là một sơ đồ nhỏ mà tôi đã vẽ một lần để giúp tôi hiểu kiến trúc của USB:
╭──────────────────────────────────────╮
┌──────┐ │ device ┌─────┐ ┌───────────┐ │
│ Port ├──┐ │ ┌─┤ EP0 ├──┤ control │ │
└──────┘ │ │ ┌────────┐ │ └─────┘ │┌─────────┐│ │
├────┤addr = 2├─┤ ┌─────┐ ││ ││ │
│ │ └────────┘ ├─┤ EP1 ├──┼┤interface││ │
│ │ │ └─────┘ ││ #0 ││ │
│ │ │ ┌─────┐ │├─────────┤│ │
│ │ ├─┤ EP2 ├──┼┤ ││ │
│ │ │ └─────┘ ││interface││ │
│ │ │ ┌─────┐ ││ #1 ││ │
│ │ └─┤ EP3 ├──┼┤ ││ │
│ │ └─────┘ │└─────────┘│ │
│ │ └───────────┘ │
│ ╰──────────────────────────────────────╯
│
│
:
Tóm tắt điều hành: mọi thiết bị đều có một địa chỉ (được chỉ định bởi O / S và có thể thay đổi) và tối đa (tôi nghĩ) 32 điểm cuối.
Trong thiết bị có một hoặc nhiều "giao diện". Ví dụ: một web cam có thể cung cấp giao diện "camera" và giao diện "micrô". Một máy in đa chức năng sẽ cung cấp một số giao diện.
Điểm cuối 0 được sử dụng để điều khiển và cấu hình thiết bị và các điểm khác là để truy cập các giao diện khác nhau. Mỗi giao diện có 0 hoặc nhiều hơn (thường là nhiều hơn) điểm cuối.
Điểm cuối có thể là một trong một số loại chuyển:
- Kiểm soát chuyển được sử dụng để truy vấn và cấu hình thiết bị. Mỗi thiết bị được yêu cầu để hỗ trợ một tập hợp các câu lệnh điều khiển tối thiểu. Tôi tin rằng chuyển điều khiển chỉ được sử dụng với điểm cuối 0.
- Chuyển số lượng lớn gửi hoặc nhận dữ liệu ở băng thông đầy đủ
- Chuyển khoản bị gián đoạn (Tôi không thực sự chắc chắn điều này khác với chuyển khoản số lượng lớn như thế nào; USB không bị gián đoạn). Ví dụ bao gồm bàn phím và chuột
- Chuyển đồng bộ gửi hoặc nhận dữ liệu ở băng thông đầy đủ với các yêu cầu thời gian thực nhưng không có độ tin cậy. Được sử dụng cho các ứng dụng âm thanh / video.
Cũng đáng chú ý: một thiết bị USB có thể có nhiều cấu hình, điều khiển các giao diện có sẵn và vv. Thay đổi cấu hình thiết bị gần giống như rút phích cắm của thiết bị và cắm một thiết bị khác vào vị trí của nó.
Tất cả các thông tin này được trình bày trong các mô tả thiết bị, mô tả cấu hình, mô tả giao diện, mô tả điểm cuối, v.v., có thể được truy vấn thông qua điểm cuối không.
(Bên trong, dữ liệu không phải là một luồng byte, nó được đóng gói thành các gói có định dạng chính xác là một phần của đặc tả USB. Đối với hầu hết các phần, bạn không cần phải lo lắng về điều này vì bộ điều khiển và trình điều khiển sẽ quản lý phần này cho bạn.)
Trong thực tế, tùy thuộc vào thư viện API và hệ điều hành của bạn, bạn sẽ cần phát hiện thiết bị, đọc các mô tả khác nhau để tìm hiểu những gì bạn đang xử lý, tùy ý đặt cấu hình của nó (nếu HĐH cho phép), mở giao diện, và mở các điểm cuối.
Đối với các điểm cuối số lượng lớn, bạn có thể đọc và ghi dữ liệu thô cho chúng. Để chuyển điều khiển, thư viện API sẽ cung cấp các lệnh gọi hàm. Tôi chưa bao giờ sử dụng chuyển khoản gián đoạn hoặc đẳng thời; Tôi chắc rằng thư viện API của bạn sẽ có tài liệu liên quan.
Thông tin thêm: "Chức năng" là tập hợp các giao diện hoạt động cùng nhau. Ban đầu, đây không phải là một phần của thông số kỹ thuật USB và tùy thuộc vào trình điều khiển thiết bị để biết các giao diện nào sẽ được nhóm lại với nhau. Nhóm làm việc USB đã xác định các lớp thiết bị hỗ trợ các chức năng. Điều này được thực hiện thông qua Bộ mô tả Hiệp hội Giao diện (IAD).
echo "test" > /dev/bus/usb/003/013
thay vì thửprintf
thì sao? Ngoài ra, đây có thể là một câu hỏi liên quan có thể giúp đỡ.