Thiết bị USB Stack
Thông số kỹ thuật
- Phiên bản USB: 1.5.1
- Ngày phát hành: 21 tháng 2025 năm XNUMX
- Phiên bản SDK Simplicity: 2025.6.1
Sản phẩm trênview
Thiết bị USB của Silicon Labs cung cấp tính linh hoạt và
kết nối USB dễ sử dụng cho các dự án IoT, tạo điều kiện thuận lợi
giao tiếp giữa bộ đồng xử lý mạng và máy chủ.
Đặc trưng
- Ngăn xếp thiết bị USB hiệu quả
- Lý tưởng cho các dự án IoT
- Hỗ trợ giao tiếp giữa các bộ đồng xử lý mạng và
chủ nhà
Hướng dẫn sử dụng sản phẩm
Cấu hình thiết bị USB
Cấu hình cài đặt thiết bị USB theo dự án của bạn
yêu cầu bằng cách tham khảo phần Cấu hình thiết bị USB
trong tài liệu.
Hướng dẫn lập trình thiết bị USB
Làm theo Hướng dẫn lập trình thiết bị USB để hiểu cách
lập trình và tương tác với thiết bị USB cho nhiều mục đích khác nhau
ứng dụng.
Các lớp thiết bị USB
Phần Lớp thiết bị USB cung cấp mộtview của khác nhau
các lớp như CDC ACM, HID, MSC SCSI và Lớp nhà cung cấp. Chọn
lớp phù hợp dựa trên chức năng thiết bị của bạn.
Khắc phục sự cố thiết bị USB
Nếu bạn gặp bất kỳ sự cố nào với thiết bị USB, hãy tham khảo
Phần Khắc phục sự cố thiết bị USB để biết giải pháp và gỡ lỗi
mẹo.
Máy chủ USB hệ điều hành Microsoft Windows
Nếu bạn đang sử dụng thiết bị USB với hệ điều hành Microsoft Windows
Chủ nhà, hãy đảm bảo làm theo các hướng dẫn được cung cấp trong
tài liệu hướng dẫn tích hợp liền mạch.
Câu hỏi thường gặp
Hỏi: Một số ví dụ phổ biến là gì?ampsố thiết bị tôi có thể xây dựng bằng cách sử dụng
USB này à?
A: Ngăn xếp USB cho phép bạn xây dựng các thiết bị như
Bộ chuyển đổi USB sang serial, chuột hoặc bàn phím, bộ nhớ di động
thiết bị và thiết bị tùy chỉnh.
Q: Có bất kỳ yêu cầu phần mềm cụ thể nào để sử dụng phần mềm này không?
Thiết bị USB?
A: Phần mềm tương thích bao gồm Simplicity SDK, Simplicity
Studio, Simplicity Commander, GCC (Bộ sưu tập trình biên dịch GNU),
IAR Embedded Workbench cho ARM và IAR EWARM.
Bus nối tiếp vạn năng USB
Bus nối tiếp vạn năng USB
USB quaview Quaview
Ghi chú phát hành USB
Thông số kỹ thuật và tính năng trênview
Cấu hình thiết bị USBview
Hướng dẫn lập trình thiết bị USBview
Các lớp thiết bị USB trênview Lớp học ACM của CDC đã kết thúcview Lớp HID kết thúcview Lớp MSC SCSI đã kết thúcview Lớp nhà cung cấp trênview
Tài liệu API API Thiết bị USB API Thiết bị USB ACM API a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t Thiết bị USB CDC API a sl_usbd_cdc_subcl ss_driver_t Thiết bị USB Core API
sl_usbd_device_config_t sl_usbd_setup_req_t
a sl_usbd_cl ss_driver_t Thiết bị USB HID API
sl_usbd_hid_callbacks_t API MSC của thiết bị USB
a sl_usbd_msc_subcl ss_driver_t Thiết bị USB MSC SCSI API
sl_usbd_msc_scsi_callbacks_t
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
1/174
Bus nối tiếp vạn năng USB
một sl_usbd_msc_scsi_lun_ pi
sl_usbd_msc_scsi_lun_info sl_usbd_msc_scsi_lun
API nhà cung cấp thiết bị USB sl_usbd_vendor_callbacks_t
Tài liệu API Khắc phục sự cố thiết bị USB
Quaview Máy chủ USB hệ điều hành Microsoft Windows
Quaview
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
2/174
Quaview
Quaview
Thiết bị USB
USB là một trong những giao diện truyền thông thành công nhất trong lịch sử hệ thống máy tính và là tiêu chuẩn thực tế để kết nối các thiết bị ngoại vi máy tính. Silicon Labs USB Device Stack là một mô-đun thiết bị USB được thiết kế đặc biệt cho các hệ thống nhúng. Được xây dựng từ đầu với chất lượng, khả năng mở rộng và độ tin cậy của Silicon Labs, sản phẩm đã trải qua quy trình xác thực nghiêm ngặt để tuân thủ thông số kỹ thuật USB 2.0. Tài liệu này mô tả cách khởi tạo, khởi động và sử dụng Silicon Labs USB Device Stack. Tài liệu giải thích các giá trị cấu hình khác nhau và cách sử dụng chúng. Tài liệu cũng bao gồm một phần giới thiệu vềview của công nghệ, các loại khả năng cấu hình, quy trình triển khai và ví dụampcác cách sử dụng thông thường cho mọi lớp có sẵn.
Để giúp bạn hiểu các khái niệm về USB một cách nhanh chóng, tài liệu có nhiều ví dụampUSB với các chức năng cơ bản. Những ví dụ nàyamples sẽ cung cấp cho bạn một khuôn khổ cho phép bạn xây dựng các thiết bị một cách nhanh chóng. Những ví dụ nàyampbao gồm:
Bộ chuyển đổi USB sang nối tiếp (Lớp thiết bị truyền thông) Chuột hoặc bàn phím (Lớp thiết bị giao diện người dùng) Thiết bị lưu trữ di động (Lớp lưu trữ khối) Thiết bị tùy chỉnh (Lớp nhà cung cấp)
Sau đây là kết thúcview của các phần tài liệu:
Thông số kỹ thuật và tính năng Cấu hình thiết bị USB Hướng dẫn lập trình thiết bị USB Các lớp thiết bị USB
CDC ACM Class HID Class MSC SCSI Class Vendor Class Khắc phục sự cố thiết bị USB Hệ điều hành Microsoft Windows USB Host
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
3/174
USB
USB
Phiên bản USB 1.5.1 ngày 21 tháng 7 năm 2025 – Ghi chú phát hành
SDK Simplicity Phiên bản 2025.6.1
Bộ thiết bị USB hiệu quả của Silicon Labs cung cấp khả năng kết nối USB linh hoạt, dễ sử dụng, lý tưởng cho các dự án IoT, bao gồm giao tiếp giữa bộ đồng xử lý mạng và máy chủ. Nhấp vào đây để xem các phiên bản trước.
Tóm tắt phát hành
Các tính năng chính | Thay đổi API | Sửa lỗi | Kích hoạt chip
Các tính năng chính
Chỉ thay đổi nền tảng cơ bản.
Thay đổi API
Không có.
Sửa lỗi
Không có.
Kích hoạt chip
Không có.
Các tính năng chính
Tính năng mới | Cải tiến | Tính năng đã xóa | Tính năng đã lỗi thời
Tính năng mới
Không có.
Cải tiến
Chỉ thay đổi nền tảng cơ bản.
Các tính năng đã xóa
Không có.
Các tính năng không được dùng nữa
Không có.
Thay đổi API
API mới | API đã sửa đổi | API đã xóa | API đã lỗi thời
API mới
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
4/174
USB
Không có.
API đã sửa đổi
Không có.
Đã xóa API
Không có.
API không còn được sử dụng nữa
Không có.
Sửa lỗi
Không có.
Kích hoạt chip
Không có.
Ứng dụng Example Changes
Người yêu cũ mớiamples | Đã sửa đổi Examples | Đã xóa Examples | Đã lỗi thời Examptập
Người yêu cũ mớiamptập
Không có.
Đã sửa đổi Examptập
Không có.
Đã xóa người yêu cũamptập
Không có.
Đã lỗi thời Examptập
Không có.
Tác động của những thay đổi trong bản phát hành
Tuyên bố tác động | Hướng dẫn di chuyển
Báo cáo tác động
Không có.
Hướng dẫn di chuyển
Không có.
Các vấn đề và hạn chế đã biết
Không có.
Sử dụng bản phát hành này
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
5/174
USB
Bản phát hành có gì? | Phần mềm tương thích | Cài đặt và sử dụng | Trợ giúp và phản hồi
Bản phát hành có gì?
Ứng dụng USB Device Stack Examptập
Phần mềm tương thích
Phần mềm
Simplicity SDK Simplicity Studio Simplicity Commander GCC Bộ sưu tập trình biên dịch GNU) IAR Embedded Workbench cho ARM IAR EWARM
Phiên bản hoặc biến thể tương thích
2025.6.0 5.11.0 1.18.2 (được cung cấp cùng với Simplicity Studio) 12.2.1 (được cung cấp cùng với Simplicity Studio) 9.40.1 (được cung cấp cùng với Simplicity Studio)
Cài đặt và sử dụng
Để bắt đầu quá trình phát triển của bạn, hãy xem:
Hướng dẫn lập trình thiết bị USB. Tài liệu API.
Để biết thông tin về Tích hợp Secure Vault, hãy xem Secure Vault.
Để lạiview Thông báo về Bảo mật và Tư vấn Phần mềm và quản lý tùy chọn thông báo của bạn:
ò Truy cập https://community.silabs.com/. ó Đăng nhập bằng thông tin tài khoản của bạn. ồ Nhấp vào chuyên gia của bạnfile biểu tượng ở góc trên bên phải của trang.
õ Chọn Thông báo từ menu thả xuống. ö Trong phần Thông báo, hãy chuyển đến tab Thông báo sản phẩm của tôi đểview Tư vấn phần mềm và bảo mật lịch sử
thông báo
÷ Để quản lý tùy chọn của bạn, hãy sử dụng tab Quản lý thông báo để tùy chỉnh các bản cập nhật và thông báo sản phẩm mà bạn muốn
nhận được.
Để biết cài đặt cấu hình được đề xuất, hãy xem tại đây.
Để tìm hiểu thêm về phần mềm trong phiên bản này, hãy tham khảo tài liệu trực tuyến của chúng tôi.
Trợ giúp và phản hồi
Liên hệ với bộ phận Hỗ trợ của Silicon Labs. Để sử dụng công cụ Hỏi AI của chúng tôi để nhận câu trả lời, hãy xem trường tìm kiếm ở đầu trang này.
Lưu ý: Ask AI đang trong giai đoạn thử nghiệm.
Nhận trợ giúp từ cộng đồng nhà phát triển của chúng tôi.
Chính sách phát hành và bảo trì SDK
Xem Chính sách phát hành và bảo trì SDK của chúng tôi.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
6/174
Quaview
Quaview
Thông số kỹ thuật
Tuân thủ “Bản sửa đổi thông số kỹ thuật Universal Serial Bus 2.0” Triển khai “Thông báo thay đổi kỹ thuật mô tả liên kết giao diện (ECN)” Các loại chuyển giao
Kiểm soát ngắt hàng loạt Các lớp USB Lớp thiết bị giao tiếp (CDC) Mô hình điều khiển trừu tượng (ACM) Thiết bị giao diện người dùng (HID) Lớp lưu trữ hàng loạt (MSC) Khung lớp dành riêng cho nhà cung cấp
Đặc trưng
Có thể mở rộng để chỉ bao gồm các tính năng cần thiết nhằm giảm thiểu dung lượng bộ nhớ Hỗ trợ tốc độ đầy đủ (12 Mbit/giây) Hỗ trợ các thiết bị tổng hợp (đa chức năng) Hỗ trợ các thiết bị có nhiều cấu hình Hỗ trợ các chức năng tiết kiệm năng lượng của USB (tạm dừng và tiếp tục thiết bị) Tích hợp hoàn toàn Mass Storage Class vào Micrium OS File Mô-đun hệ thống được phát triển với lớp trừu tượng CMSIS-RTOS2 để có thể hoạt động với nhiều hệ điều hành khác nhau. Silicon Labs GSDK đi kèm với các cổng FreeRTOS và Micrium OS.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
7/174
Quaview
Quaview
Cấu hình thiết bị USB
Phần này thảo luận về cách cấu hình Thiết bị USB Silicon Labs. Có ba nhóm thông số cấu hình như sau:
Cấu hình lõi thiết bị USB Cấu hình thông tin thiết bị USB Cấu hình phần cứng thiết bị USB
Cấu hình lõi thiết bị USB
Thiết bị USB Silicon Labs có thể được cấu hình tại thời điểm biên dịch thông qua một tập hợp #define nằm trong sl_usbd_core_config.h fileThiết bị USB sử dụng #define khi có thể vì chúng cho phép điều chỉnh kích thước mã và dữ liệu tại thời điểm biên dịch dựa trên các tính năng được bật. Điều này cho phép điều chỉnh dung lượng bộ nhớ chỉ đọc (ROM) và bộ nhớ truy cập ngẫu nhiên (RAM) của Thiết bị USB Silicon Labs dựa trên yêu cầu của ứng dụng.
Khuyến nghị: Bắt đầu quá trình cấu hình với các giá trị mặc định (được in đậm).
Các phần bên dưới được sắp xếp dựa trên thứ tự trong cấu hình mẫu file, sl_usbd_core_config.h.
Cấu hình lớp lõi Cấu hình
Cấu hình lõi
Bảng – Hằng số cấu hình lõi thiết bị USB
Mô tả hằng số
Giá trị mặc định
SL_USBD_TA SK_STACK_ KÍCH THƯỚC
Cấu hình kích thước ngăn xếp theo byte của tác vụ lõi USBD
4096
SL_USBD_TA SK_PRIORIT Y
Cấu hình mức độ ưu tiên của tác vụ lõi USBD. Đây là mức độ ưu tiên của CMSIS-RTOS2.
osPriorityHigh
SL_USBD_A UTO_START _USB_DEVIC E
Nếu được bật, thiết bị USB sẽ tự động khởi động khi kernel khởi động và tác vụ lõi USBD đó được lên lịch lần đầu tiên. Nếu bị tắt, ứng dụng của bạn sẽ cần gọi sl_usbd_core_start_device() khi sẵn sàng được máy chủ USB phát hiện.
SL_USBD_C Tổng số cấu hình sẽ được thêm vào thông qua sl_usbd_add_configuration()
1
Chức năng ONFIGURATI.
SỐ LƯỢNG
TY
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
8/174
Quaview
Không thay đổi
SL_USBD _INTERF ACE_QU ANTITY
SL_USBD _ALT_INT ERFACE_ QUANTI
TY
SL_USBD _INTERF ACE_GR
OUP_QU
CỔ
SL_USBD _MÔ TẢ
PTOR_Q
SỐ LƯỢNG
SL_USBD _STRING _QUANTI
TY
SL_USBD _OPEN_E NDPOIN TS_QUA NTITY
Mô tả Tổng số giao diện USB cần thêm cho tất cả cấu hình của bạn. Điều này phụ thuộc rất nhiều vào lớp (các lớp) được sử dụng. Để biết thêm thông tin về số lượng giao diện mà một phiên bản lớp yêu cầu, hãy tham khảo phần "Nhu cầu Tài nguyên từ lõi" của lớp (các lớp) của bạn.
Tổng số giao diện USB thay thế cần thêm cho tất cả cấu hình của bạn. Điều này phụ thuộc rất nhiều vào lớp được sử dụng. Giá trị này phải luôn bằng hoặc lớn hơn SL_USBD_INTERFACE_QUANTITY. Để biết thêm thông tin về số lượng giao diện thay thế mà một phiên bản lớp yêu cầu, hãy tham khảo phần "Nhu cầu Tài nguyên từ Lõi" của lớp của bạn.
Tổng số nhóm giao diện USB sẽ được thêm vào cho tất cả cấu hình của bạn. Điều này phụ thuộc rất nhiều vào lớp (các lớp) được sử dụng. Để biết thêm thông tin về số lượng nhóm giao diện yêu cầu một thể hiện lớp, hãy tham khảo phần "Nhu cầu Tài nguyên từ Lõi" của lớp (các lớp) của bạn.
Tổng số mô tả điểm cuối sẽ được thêm vào cho tất cả các cấu hình của bạn. Điều này phụ thuộc rất nhiều vào lớp(các lớp) được sử dụng. Để biết thêm thông tin về số lượng mô tả điểm cuối mà một thể hiện lớp yêu cầu, hãy tham khảo "Số lượng điểm cuối" trong phần "Nhu cầu tài nguyên từ Lõi" của lớp(các lớp) của bạn. Lưu ý rằng các điểm cuối điều khiển không cần phải được xem xét ở đây. Tổng số chuỗi USB. Đặt số lượng thành 0 sẽ vô hiệu hóa tính năng này. Tắt tính năng này sẽ khiến thiết bị không lưu trữ bất kỳ chuỗi mô tả USB nào được truyền từ ứng dụng. Điều này có nghĩa là máy chủ sẽ không thể truy xuất các chuỗi mô tả (chẳng hạn như tên nhà sản xuất và sản phẩm). Tổng số điểm cuối đã mở cho mỗi cấu hình. Một thiết bị yêu cầu ít nhất hai điểm cuối đã mở để truyền điều khiển, nhưng bạn cũng phải thêm các điểm cuối của lớp(các lớp) được sử dụng. Để biết thêm thông tin về số lượng điểm cuối đã mở mà một thể hiện lớp yêu cầu, hãy tham khảo "Số lượng điểm cuối" trong phần "Nhu cầu tài nguyên từ Lõi" của lớp(các lớp) của bạn.
Giá trị mặc định
10 10
2
20 30 20
Cấu hình lớp
Các lớp có cấu hình thời gian biên dịch cụ thể. Tham khảo phần Lớp thiết bị USB để biết thêm thông tin.
Cấu hình thông tin thiết bị USB
Cấu hình sl_usbd_device_config.h file nhóm lại các #define-s thời gian biên dịch để thiết lập thông tin cơ bản liên quan đến thiết bị của bạn, chẳng hạn như ID Nhà cung cấp/Sản phẩm, chuỗi thiết bị, v.v. Bảng bên dưới mô tả từng cấu hình thông tin xác định có sẵn trong cấu hình này file.
Bảng – Cấu hình thông tin thiết bị USB định nghĩa
Không thay đổi
SL_USBD_DEVIC E_VENDOR_ID
SL_USBD_DEVIC E_PRODUCT_ID
Mô tả Mã số nhận dạng nhà cung cấp của bạn do Diễn đàn Triển khai USB cung cấp. Để biết thêm thông tin về cách lấy Mã số nhà cung cấp, hãy xem http://www.usb.org/developers/vendor/. Mã số nhận dạng sản phẩm của bạn.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
9/174
Quaview
Không thay đổi
Sự miêu tả
SL_USBD_DEVICE_RELEASE Số bản phát hành của thiết bị của bạn. _NUMBER
SL_USBD_DEVICE_MANUFA Chuỗi mô tả nhà sản xuất thiết bị của bạn. Cấu hình này bị bỏ qua khi
CHUỖI_CTURER
cấu hình SL_USBD_STRING_QUANTITY được đặt thành 0.
SL_USBD_DEVICE_PRODUC Chuỗi mô tả sản phẩm của bạn. Cấu hình này bị bỏ qua khi cấu hình
CHUỖI T
SL_USBD_STRING_QUANTITY được đặt thành 0.
SL_USBD_DEVICE_SERIAL_N Chuỗi chứa số sê-ri của thiết bị. Cấu hình này bị bỏ qua khi
CHUỖI_UMBER
cấu hình SL_USBD_STRING_QUANTITY được đặt thành 0.
SL_USBD_DEVICE_LANGUA Mã số nhận dạng ngôn ngữ của chuỗi thiết bị của bạn. Các giá trị có thể là:
Mã số GE
– SL_USBD_LANG_ID_ARABIC_SAUDI_ARABIA
– SL_USBD_LANG_ID_CHINESE_TAIWAN
– SL_USBD_LANG_ID_ENGLISH_US
– SL_USBD_LANG_ID_ENGLISH_UK
– SL_USBD_LANG_ID_FRENCH
– SL_USBD_LANG_ID_GERMAN
– SL_USBD_LANG_ID_GREEK
– SL_USBD_LANG_ID_Ý
– SL_USBD_LANG_ID_PORTUGUESE
– SL_USBD_LANG_ID_SANSKRIT
Cấu hình này bị bỏ qua khi cấu hình SL_USBD_STRING_QUANTITY được đặt thành 0.
Cấu hình phần cứng thiết bị USB
Tùy thuộc vào thiết bị Silicon Labs bạn đang sử dụng, bạn có thể sẽ cần chân GPIO và cổng để cấu hình cho tín hiệu USB VBUS Sense. Cấu hình được định nghĩa trong tiêu đề sl_usbd_hardware_config.h file.
Không thay đổi
SL_USBD_DRIVER_VBUS_SENSE_PORT SL_USBD_DRIVER_VBUS_SENSE_PIN
Sự miêu tả
Cổng GPIO cho tín hiệu USB VBUS Sense trên bo mạch của bạn. Chân GPIO cho tín hiệu USB VBUS Sense trên bo mạch của bạn.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
10/174
Quaview
Quaview
Hướng dẫn lập trình thiết bị USB
Phần này giải thích cách sử dụng mô-đun Thiết bị USB.
Thiết lập ban đầu của Mô-đun thiết bị USB
Phần này mô tả các bước cơ bản cần thiết để khởi tạo mô-đun Thiết bị USB và thêm, chuẩn bị và khởi động thiết bị. Khởi tạo Mô-đun Thiết bị USB Khởi tạo Lõi Thiết bị USB Khởi tạo aCl ss Thêm Thiết bị USB của bạn Xây dựng Thiết bị USB của bạn Thêm Cấu hình Thêm Chức năng USB Khởi động Thiết bị USB của bạn
Hàm móc sự kiện
Khởi tạo Mô-đun Thiết bị USB
Khởi tạo lõi thiết bị USB
a US a Bắt đầu bằng cách khởi tạo lõi mô-đun thiết bị B bằng cách gõ hàm sl_usbd_core_init(). Ví dụ dưới đây minh họa việc gõ sl_usbd_core_init().
Example – Gọi sl_usbd_core_init()
sl_status_t trạng thái; trạng thái = sl_usbd_core_init(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi ở đây. */
}
Khởi tạo Lớp(các lớp)
Sau khi lõi mô-đun thiết bị USB đã được khởi tạo, bạn phải khởi tạo từng lớp bạn định sử dụng. Xem phần "Hướng dẫn Lập trình" trong acl ss(es) của bạn để biết thêm thông tin.
Xây dựng thiết bị USB của bạn
Thêm cấu hình
Sau khi khởi tạo thành công thiết bị, bạn có thể bắt đầu thêm các chức năng USB vào thiết bị, bắt đầu bằng một cấu hình mới. Mỗi thiết bị phải có ít nhất một cấu hình. Để thêm một hoặc nhiều cấu hình, hãy gọi hàm sl_usbd_core_dd_configur tion(). Hàm này phải được gọi cho mỗi cấu hình bạn muốn thêm. Ví dụampbên dưới cho biết cách thêm tốc độ đầy đủ.
Example – Thêm cấu hình vào thiết bị của bạn
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
11/174
Quaview
sl_status_t trạng thái; uint8_t config_nbr_fs;
/* Thêm cấu hình tốc độ đầy đủ vào thiết bị. */
trạng thái = sl_usbd_core_add_configuration(0,
/* Không có thuộc tính đặc biệt nào cho cấu hình. */
100u,
/* Công suất tiêu thụ tối đa: 100mA.
*/
SL_USBD_DEVICE_SPEED_FULL,
/* Cấu hình tốc độ đầy đủ.
*/
“Cấu hình Thêm Example Full-Speed config”,
&config_nbr_fs);
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
Thêm chức năng USB
Sau khi bạn đã thêm thành công ít nhất một cấu hình vào thiết bị, bạn có thể thêm giao diện và điểm cuối vào thiết bị. Mỗi lớp USB có nhu cầu riêng về loại giao diện và điểm cuối, số lượng và các thông số khác. Silicon Labs USB Device bổ sung giao diện và điểm cuối vào các lớp mà nó cung cấp.
Từ ứng dụng của bạn, bạn có thể khởi tạo một lớp USB và thêm nó vào cấu hình. Để biết thêm thông tin về khái niệm thể hiện lớp thiết bị USB, hãy xem mục Lớp thiết bị USB. Lưu ý rằng bạn có thể khởi tạo và thêm nhiều thể hiện lớp khác nhau vào cấu hình để tạo ra một thiết bị đa chức năng (composite).
Người cũampbên dưới cho thấy cách tạo một thể hiện lớp và thêm nó vào cấu hình.
Example – Thêm một thể hiện lớp vào thiết bị của bạn
sl_status_t trạng thái; uint8_t class_nbr;
/* Tạo một thể hiện của lớp bạn muốn sử dụng.*/ /* Lưu ý rằng tùy thuộc vào lớp, hàm này có thể có nhiều đối số hơn. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm tính năng xử lý lỗi vào đây. */ }
/* Thêm phiên bản lớp vào cấu hình Full-Speed. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Số lớp được trả về bởi sl_usbd_ _create_instance. */
config_nbr_fs); /* Số cấu hình được trả về bởi sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi vào đây. */ }
Khởi động thiết bị USB của bạn
Theo mặc định, thiết bị sẽ được khởi động tự động bởi tác vụ lõi thiết bị USB sau khi quá trình khởi tạo thiết bị hoàn tất và kernel được khởi động. Để kiểm soát thời điểm thiết bị được khởi động và hiển thị trên máy chủ USB, hãy sử dụng cấu hình SL_USBD_AUTO_START_USB_DEVICE để tắt tính năng tự động khởi động. Khi tắt, sau khi bạn đã build/chuẩn bị xong thiết bị, bạn có thể khởi động và hiển thị nó trên máy chủ USB bằng cách gọi hàm sl_usbd_core_start_device().
Người cũampVideo dưới đây hướng dẫn cách khởi động thiết bị của bạn bằng hàm sl_usbd_core_start_device().
Example – Khởi động thiết bị của bạn
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
12/174
Quaview
sl_status_t trạng thái;
trạng thái = sl_usbd_core_start_device(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi vào đây. */ }
Hàm móc sự kiện
Mô-đun lõi Thiết bị USB cung cấp hai hàm hook yếu mà bạn có thể định nghĩa lại trong ứng dụng. Mục đích của chúng là thông báo khi xảy ra sự kiện bus và cấu hình.
Bảng – Các hàm móc sự kiện USB
Sự kiện
Sự miêu tả
Xe buýt
Được gọi khi sự kiện Bus USB xảy ra
Cấu hình được gọi khi sự kiện Cấu hình USB xảy ra
Chữ ký hàm
void sl_usbd_on_bus_event(sl_usbd_bus_event_t sự kiện); void sl_usbd_on_config_event(sl_usbd_config_event_t sự kiện, uint8_t config_nbr);
Example – Hàm móc sự kiện
void sl_usbd_on_bus_event(sl_usbd_bus_event_t event) { switch (event) { case SL_USBD_EVENT_BUS_CONNECT:
// được gọi khi cáp USB được cắm vào bộ điều khiển máy chủ bị ngắt;
trường hợp SL_USBD_EVENT_BUS_DISCONNECT: // được gọi khi cáp USB được tháo ra khỏi bộ điều khiển máy chủ bị hỏng;
trường hợp SL_USBD_EVENT_BUS_RESET: // được gọi khi máy chủ gửi lệnh đặt lại break;
trường hợp SL_USBD_EVENT_BUS_SUSPEND: // được gọi khi máy chủ gửi lệnh tạm dừng break;
trường hợp SL_USBD_EVENT_BUS_RESUME: // được gọi khi máy chủ gửi lệnh đánh thức break;
mặc định: ngắt; } }
void sl_usbd_on_config_event(sl_usbd_config_event_t event, uint8_t config_nbr) { chuyển đổi (sự kiện) { trường hợp SL_USBD_EVENT_CONFIG_SET:
// được gọi khi máy chủ thiết lập ngắt cấu hình;
trường hợp SL_USBD_EVENT_CONFIG_UNSET: // được gọi khi cấu hình chưa được thiết lập break;
mặc định: ngắt; } }
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
13/174
Quaview
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
14/174
Quaview
Quaview
Các lớp thiết bị USB
Các lớp USB có sẵn trong Thiết bị USB của Silicon Labs có một số đặc điểm chung. Phần này giải thích các đặc điểm này và tương tác của chúng với lớp lõi.
Để biết thêm thông tin về một lớp học cụ thể, hãy xem thông tin sau:
Lớp CDC ACM Lớp HID Lớp MSC SCSI Lớp nhà cung cấp
Giới thiệu về các thể hiện lớp
Các lớp USB có sẵn trong Thiết bị USB triển khai khái niệm thể hiện lớp. Mỗi thể hiện lớp đại diện cho một chức năng trong một thiết bị. Chức năng này có thể được mô tả bởi một giao diện hoặc một nhóm giao diện và thuộc về một lớp cụ thể.
Mỗi triển khai lớp USB đều có một số cấu hình và hàm chung, dựa trên khái niệm thể hiện lớp. Các cấu hình và hàm chung được trình bày trong bảng dưới đây. Trong tiêu đề cột 'Hằng số hoặc Hàm', ký tự giữ chỗ XXXX có thể được thay thế bằng tên lớp: CDC, HID, MSC, CDC_ACM hoặc VENDOR (Vendor cho tên hàm).
Bảng – Hằng số và hàm liên quan đến khái niệm về nhiều thể hiện lớp
Hằng số hoặc hàm
SL_USBD_XXXX_CL ASS_INS TANCE_QUANTITY
SL_USBD_XXXX_CONFIGUR SỐ LƯỢNG
sl_usb d _XXXX_cre ate _insta nce ()
sl_usbd_XXXX_add_to_conf iguration()
Sự miêu tả
Cấu hình số lượng tối đa các phiên bản lớp.
Cấu hình số lượng cấu hình tối đa. Trong quá trình khởi tạo lớp, một thể hiện lớp đã tạo sẽ được thêm vào một hoặc nhiều cấu hình. Tạo một thể hiện lớp mới.
Thêm một phiên bản lớp hiện có vào cấu hình thiết bị đã chỉ định.
Về mặt triển khai mã, lớp sẽ khai báo một biến toàn cục cục bộ chứa cấu trúc điều khiển lớp. Cấu trúc điều khiển lớp này được liên kết với một thể hiện lớp và sẽ chứa thông tin cụ thể để quản lý thể hiện lớp đó.
Các hình sau đây cho thấy một số trường hợp điển hình. Mỗi hình bao gồm một mã ví dụ.ample tương ứng với tình huống cụ thể.
Hình – Nhiều Thể Hiện Lớp – Thiết bị FS (1 Cấu hình với 1 Giao diện) đại diện cho một thiết bị USB điển hình. Thiết bị này là Full-Speed (FS) và chứa một cấu hình duy nhất. Chức năng của thiết bị được mô tả bằng một giao diện bao gồm một cặp điểm cuối để truyền dữ liệu. Một thể hiện lớp được tạo ra và sẽ cho phép bạn quản lý toàn bộ giao diện với điểm cuối được liên kết.
Hình – Nhiều thể hiện lớp – Cấu hình thiết bị FS 1 với 1 giao diện)
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
15/174
Quaview
Mã tương ứng với Hình – Nhiều thể hiện lớp – Thiết bị FS (1 cấu hình với 1 giao diện) được hiển thị trong ví dụampbên dưới.
Example – Nhiều phiên bản lớp – Cấu hình thiết bị FS 1 với 1 giao diện)
sl_status_t trạng thái; uint8_t lớp_0;
void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Xử lý sự kiện kích hoạt lớp. */ }
void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Xử lý sự kiện vô hiệu hóa lớp. */ }
sl_usbd_XXXX_callbacks_t lớp_gọi_lại = {
(1)
.enable = app_usbd_XXXX_enable,
.disable = app_usbd_XXXX_disable
};
trạng thái = sl_usbd_XXXX_init();
(2)
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Xử lý lỗi. */
}
trạng thái = sl_usbd_XXXX_create_instance(&class_callbacks,
(3)
&class_0);
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Xử lý lỗi. */
}
trạng thái = sl_usbd_XXXX_add_to_configuration(class_0, config_0);
(4)
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Xử lý lỗi. */
}
(1) Mỗi lớp cung cấp một tập hợp các hàm gọi lại cho các sự kiện kết nối/ngắt kết nối thiết bị và cho các sự kiện cụ thể của lớp. Đối tượng cấu trúc gọi lại được truyền làm tham số khi tạo thể hiện lớp bằng sl_usbd_XXXX_create_instance().
chức năng.
(1) Khởi tạo lớp. Tất cả các biến nội bộ, cấu trúc và cổng lớp sẽ được khởi tạo. Lưu ý rằng hàm Init() trong một số lớp có thể sử dụng các đối số khác.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
16/174
Quaview
(2) Tạo thể hiện lớp, là class_0. Hàm sl_usbd_XXXX_create_instance() phân bổ một cấu trúc điều khiển lớp được liên kết với class_0. Tùy thuộc vào lớp, sl_usbd_XXXX_create_instance() có thể có các tham số bổ sung ngoài số lớp biểu diễn thông tin cụ thể của lớp được lưu trữ trong cấu trúc điều khiển lớp. aaa (3) Thêm thể hiện lớp, class_0, vào số cấu hình đã chỉ định, config_0. sl_usbd_XXXX_add_to_configuration() sẽ tạo giao diện 0 và các điểm cuối IN và OUT được liên kết của nó. Kết quả là, thể hiện lớp bao gồm giao diện 0 và các điểm cuối của nó. Bất kỳ giao tiếp nào được thực hiện trên giao diện 0 sẽ sử dụng số thể hiện lớp, class_0. Hình – Nhiều thể hiện lớp – Thiết bị FS (2 cấu hình và nhiều giao diện) biểu diễn một ví dụ phức tạp hơnample. Một thiết bị tốc độ đầy đủ bao gồm hai cấu hình. Thiết bị có hai chức năng thuộc cùng một lớp, nhưng mỗi chức năng được mô tả bởi hai giao diện và có một cặp điểm cuối song hướng. Trong ví dụ nàyample, hai thể hiện lớp được tạo. Mỗi thể hiện lớp được liên kết với một nhóm giao diện, trái ngược với Hình – Nhiều Thể Hiện Lớp – Thiết Bị FS (1 Cấu Hình với 1 Giao Diện) và Hình – Nhiều Thể Hiện Lớp – Thiết Bị FS (2 Cấu Hình và Nhiều Giao Diện) trong đó thể hiện lớp được liên kết với một giao diện duy nhất.
Hình – Nhiều thể hiện lớp – Cấu hình thiết bị FS 2 và nhiều giao diện)
Mã tương ứng với Hình – Nhiều thể hiện lớp – Thiết bị FS (2 cấu hình và nhiều giao diện) được hiển thị trong ví dụampbên dưới. Việc xử lý lỗi được lược bỏ để rõ ràng hơn.
Example – Nhiều phiên bản lớp – Cấu hình thiết bị FS 2 và nhiều giao diện)
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
17/174
Quaview
sl_status_t trạng thái; uint8_t lớp_0; uint8_t lớp_1;
trạng thái = sl_usbd_XXXX_init();
trạng thái = sl_usbd_XXXX_create_instance(&class_0); trạng thái = sl_usbd_XXXX_create_instance(&class_1);
trạng thái = sl_usbd_XXXX_add_to_configuration(lớp_0, cfg_0); trạng thái = sl_usbd_XXXX_add_to_configuration(lớp_1, cfg_0);
trạng thái = sl_usbd_XXXX_add_to_configuration(lớp_0, cfg_1); trạng thái = sl_usbd_XXXX_add_to_configuration(lớp_1, cfg_1);
(1)
(2) (3)
(4) (5)
(6) (6)
(1) Khởi tạo lớp. Mọi biến nội bộ, cấu trúc và cổng lớp sẽ được khởi tạo.
(2) Tạo thể hiện lớp, class_0. Hàm sl_usbd_XXXX_create_instance() phân bổ một cấu trúc điều khiển lớp được liên kết với class_0.
(3) Tạo thể hiện lớp, class_1. Hàm sl_usbd_XXXX_create_instance() phân bổ một cấu trúc điều khiển lớp khác được liên kết với class_1.
(4) Thêm thể hiện lớp, class_0, vào cấu hình, cfg_0. sl_usbd_XXXX_add_to_configuration() sẽ tạo giao diện 0, giao diện 1, các giao diện thay thế và các điểm cuối IN và OUT liên quan. Số thể hiện lớp, class_0, sẽ được sử dụng cho bất kỳ giao tiếp dữ liệu nào trên giao diện 0 hoặc giao diện 1.
(5) Thêm thể hiện lớp, class_1, vào cấu hình, cfg_0. sl_usbd_XXXX_add_to_configuration() sẽ tạo giao diện 2, giao diện 3 và các điểm cuối IN và OUT liên quan của chúng. Số thể hiện lớp, class_1, sẽ được sử dụng cho bất kỳ giao tiếp dữ liệu nào trên giao diện 2 hoặc giao diện 3.
(6) Thêm các thể hiện lớp giống nhau, class_0 và class_1, vào cấu hình khác, cfg_1.
Mỗi lớp định nghĩa cấu trúc kiểu sl_usbd_XXXX_callbacks_t. Mục đích của nó là cung cấp cho mỗi lớp một tập hợp các hàm callback để gọi khi sự kiện xảy ra. Mỗi lớp có hai hàm callback. Chúng được trình bày trong bảng bên dưới.
Bảng – Các hàm gọi lại lớp phổ biến
Trường Mô tả .enable Được gọi khi phiên bản lớp USB được bật thành công. .disable Được gọi khi phiên bản lớp USB bị tắt.
Chữ ký hàm void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
18/174
Quaview
Quaview
Thiết bị USB CDC ACM Class
Thiết bị USB CDC Base Class Overview Nhu cầu tài nguyên lớp CDC ACM của thiết bị USB từ lõi Lớp con CDC ACM của thiết bị USBview Cấu hình lớp CDC ACM của thiết bị USB Hướng dẫn lập trình lớp CDC ACM của thiết bị USB
Phần này mô tả lớp Thiết bị Truyền thông (CDC) và lớp con CDC liên quan được hỗ trợ bởi ngăn xếp Thiết bị USB của Silicon Labs. Silicon Labs USB-Device hiện hỗ trợ lớp con Mô hình Điều khiển Trừu tượng (ACM), thường được sử dụng cho mô phỏng tuần tự.
CDC bao gồm nhiều thiết bị viễn thông và mạng khác nhau. Các thiết bị viễn thông bao gồm modem analog, điện thoại analog và kỹ thuật số, bộ chuyển đổi đầu cuối ISDN, v.v.ampCác thiết bị mạng bao gồm modem ADSL và modem cáp, bộ điều hợp Ethernet và hub. CDC định nghĩa một khuôn khổ để đóng gói các tiêu chuẩn dịch vụ truyền thông hiện có, chẳng hạn như V.250 (cho modem qua mạng điện thoại) và Ethernet (cho thiết bị mạng cục bộ), sử dụng liên kết USB. Thiết bị truyền thông chịu trách nhiệm quản lý thiết bị, quản lý cuộc gọi khi cần và truyền dữ liệu.
CDC định nghĩa bảy nhóm thiết bị chính. Mỗi nhóm thuộc một mô hình giao tiếp, có thể bao gồm một số lớp con. Mỗi nhóm thiết bị có tài liệu đặc tả riêng bên cạnh lớp cơ sở CDC. Bảy nhóm này là:
Mạng Điện thoại Chuyển mạch Công cộng (PSTN), bao gồm modem băng tần thoại, điện thoại và thiết bị mô phỏng nối tiếp. Thiết bị Mạng Số Dịch vụ Tích hợp (ISDN), bao gồm bộ điều hợp đầu cuối và điện thoại. Thiết bị Mô hình Điều khiển Ethernet (ECM), bao gồm các thiết bị hỗ trợ họ IEEE 802 (ví dụ: modem cáp và ADSL, bộ điều hợp WiFi). Thiết bị Chế độ Truyền không Đồng bộ (ATM), bao gồm modem ADSL và các thiết bị khác được kết nối với mạng ATM (máy trạm, bộ định tuyến, bộ chuyển mạch LAN). Thiết bị Truyền thông Di động Không dây (WMC), bao gồm các thiết bị cầm tay liên lạc đa chức năng được sử dụng để quản lý liên lạc thoại và dữ liệu. Thiết bị Mô hình Mô phỏng Ethernet (EEM) trao đổi dữ liệu được đóng khung Ethernet. Thiết bị Mô hình Điều khiển Mạng (NCM), bao gồm các thiết bị mạng tốc độ cao (modem Truy cập Gói Tốc độ Cao, Thiết bị Đầu cuối Đường dây).
CDC và việc triển khai phân lớp liên quan tuân thủ các thông số kỹ thuật sau:
Universal Serial Bus, Định nghĩa lớp cho thiết bị truyền thông, Bản sửa đổi 1.2, ngày 3 tháng 11 năm 2010. Universal Serial Bus, Truyền thông, Lớp con cho thiết bị PSTN, Bản sửa đổi 1.2, ngày 9 tháng 2 năm 2007.
Thiết bị USB CDC Base Class Overview
Thiết bị CDC bao gồm các giao diện sau để thực hiện khả năng giao tiếp:
Giao diện lớp truyền thông (CCI) chịu trách nhiệm quản lý thiết bị và tùy chọn quản lý cuộc gọi.
Quản lý thiết bị cho phép cấu hình và điều khiển chung thiết bị, đồng thời thông báo sự kiện cho máy chủ. Quản lý cuộc gọi cho phép thiết lập và kết thúc cuộc gọi. Quản lý cuộc gọi có thể được ghép kênh thông qua DCI. CCI là bắt buộc đối với tất cả các thiết bị CDC. CCI xác định chức năng CDC bằng cách chỉ định mô hình giao tiếp được thiết bị CDC hỗ trợ. Các giao diện theo CCI có thể là bất kỳ giao diện lớp USB nào được xác định, chẳng hạn như Âm thanh hoặc giao diện dành riêng cho nhà cung cấp. Giao diện dành riêng cho nhà cung cấp được biểu diễn cụ thể bằng DCI.
Giao diện lớp dữ liệu (DCI) chịu trách nhiệm truyền dữ liệu. Dữ liệu được truyền và/hoặc nhận không tuân theo một quy trình cụ thể nào.
định dạng. Dữ liệu có thể là dữ liệu thô từ đường truyền thông, dữ liệu theo định dạng độc quyền, v.v. Tất cả các DCI theo CCI đều có thể được xem là giao diện phụ.
Một thiết bị CDC phải có ít nhất một CCI và không hoặc nhiều DCI. Một CCI và bất kỳ DCI phụ nào cùng nhau cung cấp một tính năng cho máy chủ. Khả năng này cũng được gọi là một chức năng. Trong một thiết bị CDC tổng hợp, bạn có thể có một số
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
19/174
Quaview
chức năng. Do đó, thiết bị sẽ bao gồm một số bộ CCI và DCI như thể hiện trong Hình – Thiết bị tổng hợp CDC.
Hình ảnh – Thiết bị tổng hợp CDC
Thiết bị CDC có thể sử dụng kết hợp các điểm cuối sau:
Một cặp điểm cuối điều khiển IN và OUT được gọi là điểm cuối mặc định. Một điểm cuối IN khối hoặc ngắt tùy chọn. Một cặp điểm cuối IN và OUT khối hoặc đẳng thời. Lưu ý rằng ngăn xếp thiết bị USB của Silicon Labs hiện không hỗ trợ điểm cuối đẳng thời.
Bảng dưới đây hiển thị cách sử dụng các điểm cuối khác nhau và giao diện của CDC sử dụng chúng.
Bảng – Sử dụng Điểm cuối CDC
Điểm cuối
Kiểm soát TRONG
kiểm soát NGOÀI
Ngắt hoặc số lượng lớn IN Số lượng lớn hoặc đồng bộ IN Số lượng lớn hoặc đồng bộ
NGOÀI
Phương hướng
Thiết bị lưu trữ
Máy chủ đến thiết bị
Thiết bị lưu trữ
Thiết bị lưu trữ
Máy chủ đến thiết bị
Sử dụng giao diện
CCI
Yêu cầu tiêu chuẩn cho việc liệt kê, yêu cầu cụ thể cho lớp, thiết bị
quản lý và tùy chọn gọi quản lý.
CCI
Yêu cầu tiêu chuẩn cho việc liệt kê, yêu cầu cụ thể cho lớp, thiết bị
quản lý và tùy chọn gọi quản lý.
CCI
Thông báo sự kiện, chẳng hạn như phát hiện chuông, trạng thái đường dây nối tiếp, trạng thái mạng.
DCI
Truyền dữ liệu thô hoặc đã định dạng.
DCI
Truyền dữ liệu thô hoặc đã định dạng.
Hầu hết các thiết bị truyền thông đều sử dụng điểm cuối ngắt để thông báo cho máy chủ về các sự kiện. Không nên sử dụng điểm cuối đẳng thời để truyền dữ liệu khi giao thức độc quyền dựa vào việc truyền lại dữ liệu trong trường hợp xảy ra lỗi giao thức USB. Truyền thông đẳng thời vốn dĩ có thể làm mất dữ liệu vì nó không có cơ chế thử lại.
Bảy mô hình giao tiếp chính bao gồm một số lớp con. Mỗi lớp con mô tả cách thiết bị sử dụng CCI để xử lý việc quản lý thiết bị và quản lý cuộc gọi. Bảng dưới đây hiển thị tất cả các lớp con có thể có và mô hình giao tiếp mà chúng thuộc về.
Bảng – Các lớp con của CDC
Lớp con
Mô hình điều khiển đường dây trực tiếp Mô hình điều khiển trừu tượng
Mô hình truyền thông
PSTN
PSTN
Exampdanh sách các thiết bị sử dụng lớp con này
Thiết bị modem được điều khiển trực tiếp bởi máy chủ USB
Thiết bị mô phỏng nối tiếp, thiết bị modem được điều khiển thông qua bộ lệnh nối tiếp
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
20/174
Quaview
Lớp con
Mô hình truyền thông
Exampdanh sách các thiết bị sử dụng lớp con này
Mô hình điều khiển điện thoại
PSTN
Mô hình ISDN điều khiển đa kênh
Mô hình điều khiển CAPI ISDN
Mô hình điều khiển ECM mạng Ethernet
Mạng ATM
ATM
Mô hình điều khiển
Mô hình điều khiển điện thoại không dây
WMC
Quản lý thiết bị WMC
Mô hình Đường dây trực tiếp di động
WMC
OBEX
WMC
Mô hình mô phỏng Ethernet EEM
Mô hình kiểm soát mạng
NCM
Thiết bị điện thoại thoại
Bộ chuyển đổi đầu cuối tốc độ cơ bản, bộ chuyển đổi đầu cuối tốc độ chính, điện thoại
Bộ điều hợp đầu cuối tốc độ cơ bản, bộ điều hợp đầu cuối tốc độ chính, điện thoại, modem cáp DOC-SIS, modem ADSL hỗ trợ mô phỏng PPPoE, bộ điều hợp Wi-Fi (họ IEEE 802.11), bộ điều hợp IEEE 802.3, modem ADSL
Thiết bị đầu cuối di động kết nối với các thiết bị không dây
Thiết bị đầu cuối di động kết nối với thiết bị không dây Thiết bị đầu cuối di động kết nối với thiết bị không dây
Thiết bị đầu cuối di động kết nối với thiết bị không dây Thiết bị sử dụng khung Ethernet làm lớp truyền tải tiếp theo. Không dùng cho thiết bị định tuyến và kết nối Internet Bộ điều hợp IEEE 802.3 mang băng thông dữ liệu tốc độ cao trên mạng
Thiết bị USB CDC ACM Class Tài nguyên cần thiết từ Core
Mỗi khi bạn thêm một thể hiện lớp CDC ACM vào cấu hình USB thông qua lệnh gọi hàm sl_usbd_cdc_acm_add_to_configuration() , các tài nguyên sau sẽ được phân bổ từ lõi.
Tài nguyên
Giao diện Giao diện thay thế Điểm cuối Nhóm giao diện
Số lượng
2 2 3 1
Lưu ý rằng những con số này được tính theo từng cấu hình. Khi thiết lập các giá trị cấu hình SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY và SL_USBD_DESCRIPTOR_QUANTITY, đừng quên tính đến số lượng cấu hình mà lớp sẽ được thêm vào. Đối với giá trị cấu hình SL_USBD_OPEN_ENDPOINTS_QUANTITY, vì các điểm cuối chỉ được mở khi cấu hình được máy chủ thiết lập, bạn chỉ cần tính đến số lượng điểm cuối cần thiết cho một thể hiện của lớp.
Thiết bị USB CDC ACM Lớp con trênview
Lớp cơ sở CDC bao gồm Giao diện lớp truyền thông (CCI) và Giao diện lớp dữ liệu (DCI), được thảo luận chi tiết trong Lớp cơ sở CDC của thiết bị USB.view Phần này thảo luận về một CCI loại ACM. Nó bao gồm một điểm cuối mặc định cho phần tử quản lý và một điểm cuối ngắt cho phần tử thông báo. Một cặp điểm cuối khối được sử dụng để truyền dữ liệu không xác định qua DCI.
Lớp con ACM được sử dụng bởi hai loại thiết bị truyền thông:
Thiết bị hỗ trợ lệnh AT (ví dụ: modem băng tần thoại). Thiết bị mô phỏng nối tiếp còn được gọi là thiết bị cổng COM ảo.
Có một số yêu cầu dành riêng cho từng phân lớp con của ACM. Chúng cho phép bạn điều khiển và cấu hình thiết bị. Danh sách đầy đủ và mô tả của tất cả các yêu cầu ACM có thể được tìm thấy trong đặc tả kỹ thuật.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
21/174
Quaview Phân lớp cho Thiết bị PSTN, bản sửa đổi 1.2, ngày 9 tháng 2 năm 2007=, mục 6.2.2.
Trong danh sách này, lớp con ACM của Silicon Labs9 hỗ trợ những mục sau:
Bảng – Các yêu cầu ACM được Silicon Labs hỗ trợ
Mô tả yêu cầu lớp con
SetCommFeature GetCommFeature ClearCommFeature
Máy chủ gửi yêu cầu này để kiểm soát cài đặt cho một tính năng truyền thông nhất định. Không được sử dụng cho mô phỏng nối tiếp.
Máy chủ gửi yêu cầu này để lấy cài đặt hiện tại cho một tính năng truyền thông nhất định. Không được sử dụng cho mô phỏng nối tiếp.
Máy chủ gửi yêu cầu này để xóa cài đặt cho một tính năng truyền thông nhất định. Không được sử dụng cho mô phỏng nối tiếp.
Đặt mã hóa dòng
Máy chủ gửi yêu cầu này để cấu hình các thiết lập của thiết bị ACM: tốc độ truyền, số bit dừng, loại chẵn lẻ và số bit dữ liệu. Đối với mô phỏng nối tiếp, yêu cầu này được gửi tự động bởi thiết bị đầu cuối nối tiếp mỗi khi bạn cấu hình các thiết lập nối tiếp cho một cổng COM ảo đang mở.
GetLineCoding
Máy chủ gửi yêu cầu này để lấy các thiết lập ACM hiện tại (tốc độ truyền, bit dừng, bit chẵn lẻ, bit dữ liệu). Đối với mô phỏng nối tiếp, các thiết bị đầu cuối nối tiếp sẽ tự động gửi yêu cầu này trong quá trình mở cổng COM ảo.
SetControlLineState: Máy chủ gửi yêu cầu này để điều khiển sóng mang cho modem bán song công và cho biết Thiết bị Đầu cuối Dữ liệu (DTE) đã sẵn sàng hay chưa. Trong trường hợp mô phỏng nối tiếp, DTE là một thiết bị đầu cuối nối tiếp. Đối với mô phỏng nối tiếp, một số thiết bị đầu cuối nối tiếp cho phép bạn gửi yêu cầu này với các điều khiển được thiết lập.
Đặt Break
Máy chủ gửi yêu cầu này để tạo ngắt kiểu RS-232. Đối với mô phỏng nối tiếp, một số thiết bị đầu cuối nối tiếp cho phép bạn gửi yêu cầu này.
Lớp con ACM của Silicon Labs9 sử dụng điểm cuối ngắt IN để thông báo cho máy chủ về trạng thái đường truyền nối tiếp hiện tại.
trạng thái dòng là một bitmap thông báo cho máy chủ về:
Dữ liệu bị loại bỏ do tràn dữ liệu Lỗi chẵn lẻ Lỗi đóng khung Trạng thái phát hiện tín hiệu vòng Trạng thái cơ chế phát hiện ngắt Trạng thái sóng mang truyền Trạng thái phát hiện sóng mang thu
Việc triển khai lớp con ACM của Silicon Labs9 tuân thủ theo thông số kỹ thuật sau:
Universal Serial Bus, Truyền thông, Lớp con cho thiết bị PSTN, bản sửa đổi 1.2, ngày 9 tháng 2 năm 2007.
Cấu hình lớp CDC ACM của thiết bị USB
Phần này thảo luận về cách cấu hình Lớp CDC ACM (Lớp Thiết bị Truyền thông, Mô hình Điều khiển Trừu tượng). Có hai nhóm tham số cấu hình:
Cấu hình ứng dụng cụ thể của lớp CDC ACM của thiết bị USB Cấu hình phiên bản lớp CDC ACM của thiết bị USB
Cấu hình ứng dụng cụ thể của lớp CDC ACM của thiết bị USB
Lớp cơ sở CDC Lớp phụ ACM
Lớp cơ sở CDC
Trước tiên, để sử dụng mô-đun lớp CDC của thiết bị USB Silicon Labs, bạn sẽ cần điều chỉnh cấu hình thời gian biên dịch CDC #define-s theo nhu cầu ứng dụng của mình. Chúng được nhóm lại bên trong tiêu đề sl_usbd_core_config.h file trong phần CDC. Mục đích của chúng là thông báo cho mô-đun thiết bị USB về số lượng đối tượng USB CDC cần phân bổ.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
22/174
Quaview
Bảng dưới đây mô tả từng trường cấu hình có sẵn trong cấu trúc cấu hình này.
Bảng – Định nghĩa cấu hình CDC của thiết bị USB
Tên cấu hình
SL_USBD_CDC_CL AS S_INSTANCE_QUANT ITY
SL_USBD_CDC_CONF IGURATION_QUANTI
TY
SL_USBD_CDC_DATA _INTERFACE_QUANTI
TY
Sự miêu tả
Số lượng thể hiện lớp bạn sẽ phân bổ thông qua lệnh gọi hàm
sl_usbd_cdc_acm_create_instance() .
Số lượng cấu hình. Các thể hiện lớp ACM có thể được thêm vào một hoặc nhiều cấu hình aaaa bằng cách sử dụng sl_usbd_cdc_acm_add_to_configuration().
Tổng số giao diện dữ liệu (DCI) cho tất cả các hàm CDC. Mỗi hàm CDC ACM được thêm vi c ll vào hàm sl_usbd_cdc_acm_create_instance() sẽ thêm giao diện dt.
Giá trị mặc định
2
1
2
Phân lớp ACM
Lớp con ACM có một cấu hình thời gian biên dịch được hiển thị trong bảng bên dưới.
Bảng – Định nghĩa cấu hình CDC ACM của thiết bị USB
Tên cấu hình
SL_USBD_CDC_ACM_SUBCL ASS_I SỐ LƯỢNG THỰC THỤ
Sự miêu tả
Cấu hình số lượng phiên bản lớp con mà bạn sẽ phân bổ thông qua lệnh gọi đến
hàm sl_usbd_cdc_acm_create_instance() .
Giá trị mặc định
2
Cấu hình phiên bản lớp CDC ACM của thiết bị USB
Phần này định nghĩa các cấu hình liên quan đến các phiên bản lớp nối tiếp CDC ACM. Tạo phiên bản lớp, trạng thái dòng, khoảng thời gian, quản lý cuộc gọi, khả năng p_acm_callbacks
Tạo phiên bản lớp
Để tạo một thể hiện lớp nối tiếp CDC ACM, hãy gọi hàm T a sl_usbd_cdc_acm_create_instance() . Hàm này có ba đối số cấu hình, như được mô tả tại đây.
khoảng_khoảng_trạng_thái_dòng
Đây là khoảng thời gian (tính bằng mili giây) mà phiên bản lớp nối tiếp CDC ACM của bạn sẽ báo cáo thông báo trạng thái đường truyền tới máy chủ T aa. Giá trị này phải là lũy thừa của hai (1, 2, 4, 8, 16, v.v.).
call_mgmt_capabilities
Bản đồ bitmap Khả năng Quản lý Cuộc gọi. Các giá trị có thể có của bản đồ bitmap như sau:
Giá trị (bit)
SL_USBD_ACM_SERIAL_CALL_MGMT_DEV
SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI _DCI
Sự miêu tả
Thiết bị tự xử lý việc quản lý cuộc gọi. Thiết bị có thể gửi/nhận thông tin quản lý cuộc gọi qua giao diện Lớp Dữ liệu.
p_acm_callbacks
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
23/174
Quaview
aa M aa p_acm_callbacks là con trỏ đến cấu trúc kiểu sl_usbd_cdc_acm_callbacks_t. Mục đích của nó là cung cấp cho CDC AC Cl ss tập hợp các hàm callback được gọi khi sự kiện CDC ACM xảy ra. Không phải tất cả các callback đều bắt buộc và một con trỏ null (NULL) có thể được truyền vào biến cấu trúc callbacks khi callback không cần thiết. Bảng dưới đây mô tả từng trường cấu hình có sẵn trong cấu trúc cấu hình này.
Bảng – Cấu trúc cấu hình sl_usbd_cdc_acm _callbacks_t
Các cánh đồng
Sự miêu tả
.cho phép
Được gọi khi phiên bản lớp USB được bật
thành công.
.vô hiệu hóa
Được gọi khi phiên bản lớp USB bị vô hiệu hóa.
.line_control_changed Được gọi khi nhận được thay đổi điều khiển dòng.
line_coding_changed Được gọi khi nhận được thay đổi mã hóa dòng.
Chữ ký hàm
void app_usbd_cdc_acm_enable(uint8_t subclass_nbr);
void app_usbd_cdc_acm_disable(uint8_t subclass_nbr);
void app_usbd_cdc_acm_line_control_changed(uint8_t subclass_nbr, uint8_t event, uint8_t event_chngd); bool app_usbd_cdc_acm_line_coding_changed(uint8_t subclass_nbr, subclass_nbr, sl_usbd_cdc_acm_line_coding_t
*p_line_coding
Xem phần Đăng ký thông báo sự kiện gọi lại cho các hàm gọi lại ví dụamplà.
Hướng dẫn lập trình lớp CDC ACM cho thiết bị USB
Phần này giải thích cách sử dụng lớp Mô hình điều khiển trừu tượng CDC. Khởi tạo lớp CDC ACM cho thiết bị USB. Thêm phiên bản lớp CDC ACM của thiết bị USB vào thiết bị của bạn. Giao tiếp bằng lớp CDC ACM.
Khởi tạo thiết bị USB CDC ACM Class
Để thêm chức năng lớp CDC ACM vào thiết bị của bạn, trước tiên bạn phải khởi tạo lớp cơ sở CDC và lớp con ACM bằng cách gọi các hàm sl_usbd_cdc_init() và sl_usbd_cdc_acm_init(). Ví dụ dưới đây cho thấy cách gọi sl_usbd_cdc_init() và sl_usbd_cdc_acm_init() bằng cách sử dụng các tham số def ult.
Example – Khởi tạo lớp CDC ACM
sl_status_t trạng thái;
trạng thái = sl_usbd_cdc_init(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi ở đây. */
}
trạng thái = sl_usbd_cdc_acm_init(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi ở đây. */
}
Thêm phiên bản lớp CDC ACM của thiết bị USB vào thiết bị của bạn
Để thêm chức năng lớp CDC ACM vào thiết bị của bạn, bạn phải tạo một phiên bản, sau đó thêm phiên bản đó vào cấu hình của thiết bị.
Tạo một phiên bản lớp CDC ACM
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
24/174
Quaview
Thêm phiên bản lớp CDC ACM vào cấu hình thiết bị của bạn Đăng ký cuộc gọi lại thông báo sự kiện
Tạo một phiên bản lớp CDC ACM
aa M aaa Tạo phiên bản CDC AC cl ss bằng cách gọi hàm sl_usbd_cdc_acm_create_instance(). Ví dụ dưới đây cho thấy cách tạo phiên bản CDC AC cl ss bằng cách gọi hàm sl_usbd_cdc_acm_create_instance().
Example – Tạo hàm CDC ACM thông qua sl_usbd_cdc_acm_create_instance()
uint8_t lớp con_nbr; sl_status_t trạng thái;
trạng thái = sl_usbd_cdc_acm_create_instance(64u, SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI | SL_USBD_ACM_SERIAL_CALL_MGMT_DEV, NULL, &subclass_nbr);
if (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi vào đây. */
}
Thêm phiên bản CDC ACM Class vào cấu hình thiết bị của bạn
Sau khi bạn đã tạo một phiên bản lớp CDC ACM, bạn có thể thêm nó vào cấu hình bằng cách gọi hàm
sl_usbd_cdc_acm_add_to_configuration() .
Ví dụ dưới đây cho thấy cách sử dụng lệnh sl_usbd_cdc_acm_add_to_configuration().
Example – Gọi đến USBD ACM sl_usbd_cdc_acm_add_to_configuration()
sl_status_t trạng thái;
trạng thái = sl_usbd_cdc_acm_add_to_configuration(subclass_nbr,
(1)
config_nbr_fs);
(2)
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
aaa (1) Nhập số ss vào dd cho cấu hình được trả về bởi sl_usbd_cdc_acm_create_instance() . (2) Số cấu hình (ở đây là thêm nó vào cấu hình Full-Speed).
Đăng ký thông báo sự kiện gọi lại
Lớp CDC ACM Serial có thể thông báo cho ứng dụng của bạn về bất kỳ thay đổi nào trong điều khiển dòng hoặc mã hóa thông qua các hàm callback thông báo. Cấu trúc hàm callback có thể được truyền làm đối số trong quá trình tạo phiên bản ACM. Lưu ý rằng các callback này là tùy chọn. Ví dụ:ample – Đăng ký gọi lại CDC ACM minh họa việc sử dụng các hàm đăng ký gọi lại. Ví dụample – Việc triển khai cuộc gọi lại của CDC ACM cho thấy một ví dụampcủa việc thực hiện các hàm gọi lại.
Example – Đăng ký gọi lại CDC ACM
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
25/174
Quaview
uint8_t lớp con_nbr; sl_status_t trạng thái;
sl_usbd_cdc_acm_callbacks_t sli_usbd_cdc_acm_callbacks = { app_usbd_cdc_acm_connect, app_usbd_cdc_acm_disconnect, app_usbd_cdc_acm_line_control_changed, app_usbd_cdc_acm_line_coding_changed, };
trạng thái = sl_usbd_cdc_acm_create_instance(64u, SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI | SL_USBD_ACM_SERIAL_CALL_MGMT_DEV, &sli_usbd_cdc_acm_callbacks, &subclass_nbr);
if (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm tính năng xử lý lỗi vào đây. */ }
Example – CDC ACM Callbacks Implementation
bool app_usbd_cdc_acm_line_coding_changed (uint8_t
lớp con_nbr,
sl_usbd_cdc_acm_line_coding_t *p_line_coding)
{
uint32_t tốc độ truyền mới;
uint8_t parity_new;
uint8_t stop_bits_mới;
uint8_t dữ liệu_bit_mới;
/* TODO Áp dụng mã hóa dòng mới.*/ baudrate_new = p_line_coding->BaudRate; parity_new = p_line_coding->Parity; stop_bits_new = p_line_coding->StopBits; data_bits_new = p_line_coding->DataBits;
trả về (đúng);
(1)
}
void app_usbd_cdc_acm_line_control_changed (uint8_t subclass_nbr, uint8_t event, uint8_t event_changed)
{ bool trạng thái rts; bool trạng thái rts đã thay đổi; bool trạng thái dtr; bool trạng thái dtr đã thay đổi; bool trạng thái brk; bool trạng thái brk đã thay đổi;
/* TODO Áp dụng điều khiển dòng mới. */ rts_state = ((event & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? true : false; rts_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? true : false; dtr_state = ((event & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? true : false; dtr_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? true : false; brk_state = ((event & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? true : false; brk_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? true : false;
}
(1) Điều quan trọng là phải trả về false cho hàm này nếu việc mã hóa dòng không thành công. Nếu không, hãy trả về true.
Giao tiếp bằng cách sử dụng lớp CDC ACM
Trạng thái sê-ri
Mã hóa dòng Kiểm soát dòng
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
26/174
Quaview
Giao tiếp thể hiện lớp con trạng thái dòng
Trạng thái sê-ri
Mã hóa dòng
Máy chủ USB điều khiển mã hóa đường truyền (tốc độ baud, tính chẵn lẻ, v.v.) của thiết bị CDC ACM. Khi cần thiết, ứng dụng chịu trách nhiệm thiết lập mã hóa đường truyền. Có hai chức năng được cung cấp để truy xuất và thiết lập mã hóa đường truyền hiện tại, như được mô tả trong bảng dưới đây.
Bảng – Các hàm mã hóa dòng CDC ACM
Chức năng
sl_usbd_cdc_acm_g e t_line _co d ing ()
sl_usbd_cdc_acm_s e t_line _co d ing ()
Sự miêu tả
Ứng dụng của bạn có thể lấy cài đặt mã hóa dòng hiện tại từ máy chủ bằng yêu cầu SetLineCoding hoặc bằng hàm sl_usbd_cdc_acm_set_line_coding() .
Ứng dụng của bạn có thể thiết lập mã hóa dòng. Máy chủ có thể lấy các thiết lập này bằng yêu cầu GetLineCoding.
Kiểm soát dòng
Máy chủ USB điều khiển việc điều khiển đường truyền (chân RTS và DTR, tín hiệu ngắt, v.v.) của thiết bị CDC ACM. Khi cần thiết, ứng dụng của bạn sẽ chịu trách nhiệm áp dụng các điều khiển đường truyền. Một chức năng được cung cấp để truy xuất và thiết lập các điều khiển đường truyền hiện tại, như được mô tả trong bảng dưới đây.
Bảng – Chức năng điều khiển đường dây CDC ACM
Chức năng
sl_usb d _cd c_acm_g e t_line _co ntr o l_state ()
Ứng dụng của bạn có thể lấy trạng thái dòng điều khiển hiện tại do máy chủ thiết lập bằng yêu cầu SetControlLineState.
Trạng thái dòng
Máy chủ USB truy xuất trạng thái dòng theo định kỳ. Ứng dụng của bạn phải cập nhật trạng thái dòng mỗi khi trạng thái thay đổi. Khi cần thiết, ứng dụng của bạn có trách nhiệm thiết lập trạng thái dòng. Có hai hàm được cung cấp để truy xuất và thiết lập các điều khiển dòng hiện tại, như được mô tả trong bảng dưới đây.
Bảng – Các hàm trạng thái dòng ACM của CDC
Chức năng
sl_usb d _cd c_acm_se t _line _state _e ve nt()
sl_usbd_cdc_acm_cle ar_line _state _e ve nt()
Ứng dụng của bạn có thể thiết lập bất kỳ sự kiện trạng thái dòng nào. Trong khi thiết lập trạng thái dòng, một tín hiệu ngắt IN sẽ được gửi đến máy chủ để thông báo về sự thay đổi trong trạng thái dòng nối tiếp.
Ứng dụng có thể xóa hai sự kiện khỏi trạng thái đường truyền: phát hiện sóng mang truyền và phát hiện sóng mang thu. Tất cả các sự kiện khác đều được tự động xóa bởi lớp con mô phỏng nối tiếp ACM.
Giao tiếp thể hiện lớp con
Lớp con ACM của Silicon Labs cung cấp các hàm sau để giao tiếp với máy chủ. Để biết thêm chi tiết về các tham số functions9, hãy xem tài liệu tham khảo về Hàm lớp con ACM của CDC.
Tên hàm
sl_usb d _cd c_acm_ re ad () sl_usb d _cd c_acm_write ()
Hoạt động
Nhận dữ liệu từ máy chủ thông qua điểm cuối Bulk OUT. Chức năng này đang bị chặn. Gửi dữ liệu đến máy chủ thông qua điểm cuối Bulk IN. Chức năng này đang bị chặn.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
27/174
Quaview
Bảng – Tóm tắt API Giao tiếp CDC ACM aaaaa sl_usbd_cdc_acm_read() và sl_usbd_cdc_acm_write() cung cấp giao tiếp đồng bộ, cho biết quá trình truyền dữ liệu đang bị chặn. Nói cách khác, khi gọi hàm, ứng dụng sẽ bị chặn cho đến khi quá trình truyền dữ liệu hoàn tất, có hoặc không có lỗi. Có thể chỉ định thời gian chờ để tránh phải chờ đợi mãi mãi. Ví dụampbên dưới cho thấy một lệnh đọc và ghiamptập tin nhận dữ liệu từ máy chủ bằng điểm cuối bulk OUT và gửi dữ liệu đến máy chủ bằng điểm cuối bulk IN.
Liệt kê – Đọc và ghi nối tiếp Example
__ĐÃ CĂN CHỈNH(4) uint8_t rx_buf[2];
__ĐÃ CĂN CHỈNH(4) uint8_t tx_buf[2];
uint32_t
xfer_len;
sl_status_t
trạng thái;
trạng thái = sl_usbd_cdc_acm_read(subclass_nbr,
(1)
rx_buf,
(2)
2u,
0u,
(3)
&xfer_len);
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
trạng thái = sl_usbd_cdc_acm_write(subclass_nbr,
(1)
tx_buf,
(4)
2u,
0u,
(3)
&xfer_len);
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
T aaaaa M (1) Số phiên bản lớp được tạo bằng sl_usbd_cdc_acm_create_instance() cung cấp tham chiếu nội bộ đến lớp con AC để định tuyến việc truyền dữ liệu đến điểm cuối Bulk OUT hoặc IN thích hợp. (2) Ứng dụng của bạn phải đảm bảo rằng bộ đệm được cung cấp cho hàm đủ lớn để chứa tất cả dữ liệu. Nếu không, sự cố đồng bộ hóa có thể xảy ra. (3) Để tránh tình trạng chặn vô hạn, hãy chỉ định thời gian chờ được biểu thị bằng mili giây. Giá trị 809 sẽ khiến tác vụ ứng dụng chờ mãi mãi. (4) Ứng dụng cung cấp bộ đệm truyền đã được khởi tạo.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
28/174
Quaview
Quaview
Lớp HID của thiết bị USB
Thiết bị USB HID Class Overview Nhu cầu tài nguyên lớp HID của thiết bị USB từ lõi Cấu hình lớp HID của thiết bị USB Hướng dẫn lập trình lớp HID của thiết bị USB Nhiệm vụ báo cáo đầu vào định kỳ HID
Phần này mô tả lớp Thiết bị giao diện người dùng (HID) được Thiết bị USB Silicon Labs hỗ trợ.
Lớp HID bao gồm các thiết bị được con người sử dụng để điều khiển hoạt động của máy tính, chẳng hạn như bàn phím, chuột, thiết bị trỏ và thiết bị trò chơi.
Lớp HID cũng có thể được sử dụng trong một thiết bị tổng hợp có chứa các nút điều khiển như núm vặn, công tắc, nút bấm và thanh trượt. Ví dụampCác nút điều khiển âm lượng, tắt tiếng và âm lượng trong tai nghe âm thanh được điều khiển bởi chức năng HID của tai nghe. Lớp HID có thể trao đổi dữ liệu cho bất kỳ mục đích nào chỉ bằng cách sử dụng các giao thức điều khiển và ngắt.
Lớp HID là một trong những lớp USB lâu đời nhất và được sử dụng rộng rãi nhất. Tất cả các hệ điều hành máy chủ chính đều cung cấp trình điều khiển gốc để quản lý các thiết bị HID, đó là lý do tại sao nhiều thiết bị của từng nhà cung cấp cụ thể đều hoạt động với lớp HID. Lớp này cũng bao gồm nhiều loại mục đầu ra khác nhau như đèn LED, âm thanh, phản hồi xúc giác, v.v.
Việc triển khai HID tuân thủ các thông số kỹ thuật sau:
Định nghĩa lớp thiết bị cho thiết bị giao diện người dùng (HID), 27/6/01, Phiên bản 1.11. Bảng sử dụng Bus nối tiếp vạn năng HID, 28/10/2004, Phiên bản 1.12.
Thiết bị USB HID Class Overview
Quaview
Thiết bị HID bao gồm các điểm cuối sau:
Một cặp điểm cuối điều khiển IN và OUT được gọi là điểm cuối mặc định Điểm cuối ngắt IN Điểm cuối ngắt OUT tùy chọn
Bảng dưới đây mô tả cách sử dụng các điểm cuối khác nhau:
Bảng – Sử dụng điểm cuối lớp HID
Sử dụng hướng điểm cuối
Kiểm soát TRONG
Điều khiển
NGOÀI
Ngắt VÀO
Ngắt
NGOÀI
Thiết bị lưu trữ
Máy chủ đến thiết bị
Thiết bị lưu trữ
Máy chủ đến thiết bị
Các yêu cầu chuẩn cho việc liệt kê, yêu cầu cụ thể theo lớp và truyền dữ liệu (Báo cáo đầu vào, tính năng được gửi đến máy chủ với yêu cầu GET_REPORT). Các yêu cầu chuẩn cho việc liệt kê, yêu cầu cụ thể theo lớp và truyền dữ liệu (Báo cáo đầu ra, tính năng nhận được từ máy chủ với yêu cầu SET_REPORT). Truyền dữ liệu (Báo cáo đầu vào và tính năng).
Truyền dữ liệu (Báo cáo đầu ra và tính năng).
Báo cáo
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
29/174
Quaview
Máy chủ và thiết bị HID trao đổi dữ liệu bằng báo cáo. Báo cáo chứa dữ liệu được định dạng, cung cấp thông tin về các nút điều khiển và các thực thể vật lý khác của thiết bị HID. Người dùng có thể thao tác nút điều khiển và vận hành một khía cạnh của thiết bị. Ví dụ:ample, một điều khiển có thể là một nút trên chuột hoặc bàn phím, một công tắc, v.v. Các thực thể khác thông báo cho người dùng về trạng thái của một số tính năng của thiết bị. Ví dụampĐèn LED trên bàn phím thông báo cho người dùng về chế độ khóa chữ hoa, bàn phím số đang hoạt động, v.v.
Định dạng và cách sử dụng dữ liệu báo cáo được máy chủ hiểu bằng cách phân tích nội dung của mô tả báo cáo. Việc phân tích nội dung được thực hiện bởi một trình phân tích cú pháp. Mô tả báo cáo mô tả dữ liệu được cung cấp bởi mỗi điều khiển trong thiết bị. Nó bao gồm các mục là các phần thông tin về thiết bị và bao gồm tiền tố 1 byte và các giá trị có độ dài thay đổi.
dữ liệu. Để biết thêm chi tiết về định dạng mục, hãy tham khảo
1.11=, mục 5.6 và 6.2.2.
Có ba loại mặt hàng chính:
Mục chính xác định hoặc nhóm các loại trường dữ liệu nhất định.
Mục toàn cục mô tả đặc điểm dữ liệu của một điều khiển.
Mục cục bộ mô tả đặc điểm dữ liệu của một điều khiển.
Mỗi loại mục được định nghĩa bởi các hàm khác nhau. Một hàm mục cũng có thể được gọi là tag. Một hàm mục có thể được xem như một mục con thuộc một trong ba loại mục chính. Bảng dưới đây cung cấp một cái nhìn tổng quan vềview của các chức năng của item9 trong từng loại item. Để biết mô tả đầy đủ về các mục trong từng danh mục, hãy xem
Bảng – Mô tả chức năng của từng loại mục
Mục Loại mục Chức năng
Sự miêu tả
Đầu vào chính
Mô tả thông tin về dữ liệu được cung cấp bởi một hoặc nhiều điều khiển vật lý.
Đầu ra chính Mô tả dữ liệu được gửi đến thiết bị.
Tính năng chính
Mô tả thông tin cấu hình thiết bị được gửi đến hoặc nhận được từ thiết bị có ảnh hưởng đến hành vi chung của thiết bị hoặc một trong các thành phần của thiết bị.
Nhóm bộ sưu tập chính gồm các mục liên quan (Đầu vào, Đầu ra hoặc Tính năng).
Kết thúc chính của Đóng một bộ sưu tập. Bộ sưu tập
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
30/174
Quaview
Mục Loại mục Chức năng
Sự miêu tả
Trang sử dụng toàn cầu
Xác định chức năng có sẵn trong thiết bị.
Logic toàn cục Xác định giới hạn dưới của các giá trị được báo cáo theo đơn vị logic. Tối thiểu
Logic toàn cục Xác định giới hạn trên của các giá trị được báo cáo theo đơn vị logic. Tối đa
Giá trị vật lý toàn cục Xác định giới hạn dưới của các giá trị được báo cáo theo đơn vị vật lý, tức là Giá trị tối thiểu hợp lý được thể hiện theo đơn vị vật lý.
Giá trị vật lý toàn cục Xác định giới hạn trên của các giá trị được báo cáo theo đơn vị vật lý, tức là Giá trị cực đại logic được thể hiện theo đơn vị vật lý.
Đơn vị toàn cầu
Biểu thị số mũ đơn vị trong cơ số 10. Số mũ nằm trong khoảng từ -8 đến +7.
Số mũ
Đơn vị toàn cầu
Chỉ ra đơn vị của các giá trị được báo cáo. Ví dụ: đơn vị độ dài, khối lượng, nhiệt độ, v.v.
Kích thước báo cáo toàn cầu
Chỉ ra kích thước của các trường báo cáo theo bit.
ID báo cáo toàn cầu Chỉ ra tiền tố được thêm vào một báo cáo cụ thể.
Số lượng báo cáo toàn cầu
Chỉ ra số lượng trường dữ liệu cho một mục.
Đẩy mạnh toàn cầu
Đặt một bản sao của bảng trạng thái mục toàn cục vào ngăn xếp CPU.
Nhạc Pop toàn cầu
Thay thế bảng trạng thái mục bằng cấu trúc cuối cùng trong ngăn xếp.
Sử dụng tại địa phương
Biểu thị một chỉ mục để chỉ định một mục đích sử dụng cụ thể trong Trang mục đích sử dụng. Chỉ mục này cho biết mục đích sử dụng được nhà cung cấp đề xuất cho một hoặc một nhóm mục đích sử dụng cụ thể. Mục đích sử dụng cung cấp thông tin cho nhà phát triển ứng dụng về những gì mục đích sử dụng thực sự đo lường.
Sử dụng tại địa phương
Xác định cách sử dụng ban đầu liên quan đến một mảng hoặc bitmap.
Tối thiểu
Sử dụng tại địa phương
Xác định cách sử dụng kết thúc liên quan đến một mảng hoặc bitmap.
Tối đa
Chỉ định cục bộ Xác định bộ phận cơ thể được sử dụng để điều khiển. Chỉ mục trỏ đến một chỉ định trong mục Vật lý.
Mục lục
người mô tả.
Chỉ định cục bộ Xác định chỉ mục của chỉ định bắt đầu được liên kết với một mảng hoặc bitmap. Tối thiểu
Chỉ định cục bộ Xác định chỉ mục của chỉ định kết thúc được liên kết với một mảng hoặc bitmap. Tối đa
Chỉ mục chuỗi cục bộ
Chỉ mục chuỗi cho một mô tả chuỗi. Nó cho phép một chuỗi được liên kết với một mục hoặc điều khiển cụ thể.
Chuỗi cục bộ
Chỉ định chỉ mục chuỗi đầu tiên khi gán một nhóm chuỗi tuần tự cho các điều khiển trong một mảng
Tối thiểu hoặc bitmap.
Địa phương Địa phương
Chuỗi tối đa
Dấu phân cách
Chỉ định chỉ mục chuỗi cuối cùng khi gán một nhóm chuỗi tuần tự cho các điều khiển trong một mảng hoặc bản đồ bitmap.
Xác định điểm bắt đầu hoặc kết thúc của một tập hợp các mục cục bộ.
Dữ liệu điều khiển phải xác định ít nhất các mục sau:
Đầu vào, Đầu ra hoặc Tính năng Mục chính Sử dụng Mục cục bộ Sử dụng Trang Mục toàn cục Mục logic Tối thiểu Mục toàn cục Mục logic Tối đa Mục toàn cục Kích thước báo cáo Mục toàn cục
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
31/174
Quaview
Số lượng báo cáo Mục toàn cục Bảng dưới đây hiển thị cách biểu diễn nội dung mô tả Báo cáo Chuột từ góc nhìn của trình phân tích cú pháp HID máy chủ. Chuột có ba nút (trái, phải và bánh xe). Mã được trình bày trong ví dụampbên dưới là mã triển khai tương ứng với biểu diễn mô tả báo cáo chuột này.
Hình – Nội dung mô tả báo cáo từ bộ phân tích HID máy chủ View
(1) Chức năng mục Trang sử dụng chỉ định chức năng chung của thiết bị. Trong ví dụ nàyample, thiết bị HID thuộc về một
điều khiển máy tính để bàn chung.
(2) Ứng dụng Bộ sưu tập nhóm các mục Chính có mục đích chung và có thể quen thuộc với các ứng dụng. Trong sơ đồ, nhóm này bao gồm ba mục Chính Đầu vào. Đối với bộ sưu tập này, cách sử dụng được đề xuất cho các điều khiển là chuột như được chỉ ra bởi mục Sử dụng. (3) Các bộ sưu tập lồng nhau có thể được sử dụng để cung cấp thêm chi tiết về việc sử dụng một điều khiển hoặc một nhóm điều khiển cho các ứng dụng. Trong ví dụ nàyample, Bộ sưu tập Vật lý, được lồng vào Ứng dụng Bộ sưu tập, bao gồm ba mục Đầu vào giống nhau tạo nên Ứng dụng Bộ sưu tập. Bộ sưu tập Vật lý được sử dụng cho một tập hợp các mục dữ liệu biểu diễn các điểm dữ liệu được thu thập tại một điểm hình học. Trong ví dụample, cách sử dụng được đề xuất là một con trỏ như được chỉ ra bởi mục Usage. Ở đây, cách sử dụng con trỏ đề cập đến tọa độ vị trí chuột và phần mềm hệ thống sẽ dịch tọa độ chuột khi di chuyển con trỏ trên màn hình. (4) Các trang sử dụng lồng nhau cũng có thể được sử dụng và cung cấp thêm chi tiết về một khía cạnh nhất định trong chức năng chung của thiết bị. Trong trường hợp này, hai mục Input được nhóm lại và tương ứng với các nút của chuột. Một mục Input xác định ba nút của chuột (phải, trái và bánh xe) về số lượng trường dữ liệu cho mục (mục Report Count), kích thước của trường dữ liệu (mục Report Size) và các giá trị có thể có cho mỗi trường dữ liệu (mục Usage Minimum và Maximum, Logical Minimum và Maximum). Mục Input còn lại là một hằng số 13 bit cho phép dữ liệu báo cáo Input được căn chỉnh trên ranh giới byte. Mục Input này chỉ được sử dụng cho mục đích đệm. (5) Một trang sử dụng lồng nhau khác đề cập đến một điều khiển máy tính để bàn chung được xác định cho tọa độ vị trí chuột. Đối với trang sử dụng này, mục Input mô tả các trường dữ liệu tương ứng với trục x và y như được chỉ định bởi hai mục Usage
mặt hàng.
Sau khi phân tích nội dung mô tả báo cáo chuột trước đó, bộ phân tích cú pháp HID của host9 có thể diễn giải dữ liệu báo cáo đầu vào được gửi bởi thiết bị bằng lệnh truyền ngắt IN hoặc để đáp ứng yêu cầu GET_REPORT. Dữ liệu báo cáo đầu vào tương ứng với mô tả báo cáo chuột được hiển thị trong Hình – Nội dung mô tả báo cáo từ bộ phân tích cú pháp HID của máy chủ View is
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
32/174
Quaview
được hiển thị trong bảng bên dưới. Tổng kích thước của dữ liệu báo cáo là 4 byte. Các loại báo cáo khác nhau có thể được gửi qua cùng một điểm cuối. Để phân biệt các loại báo cáo khác nhau, một tiền tố ID báo cáo 1 byte sẽ được thêm vào báo cáo dữ liệu. Nếu ID báo cáo được sử dụng trong ví dụampcủa báo cáo chuột, tổng kích thước của dữ liệu báo cáo sẽ là 5 byte.
Bảng – Báo cáo đầu vào được gửi đến máy chủ và tương ứng với trạng thái của chuột 3 nút
Chênh lệch bit
0 1 2 3 16 24
Số lượng bit 1 1 1 13 8 8
Mô tả Nút 1 (nút trái). Nút 2 (nút phải). Nút 3 (nút bánh xe). Không sử dụng. Vị trí trên trục X. Vị trí trên trục Y.
Mô tả vật lý chỉ ra phần hoặc các phần của cơ thể được thiết kế để kích hoạt một hoặc nhiều điều khiển. Ứng dụng có thể sử dụng thông tin này để gán chức năng cho điều khiển của thiết bị. Mô tả vật lý là một mô tả tùy chọn dành riêng cho từng lớp và hầu hết các thiết bị đều không có nhiều lợi ích khi sử dụng nó. Tham khảo
Nhu cầu tài nguyên lớp HID của thiết bị USB từ lõi
Mỗi khi bạn thêm một thể hiện lớp HID vào cấu hình USB thông qua lệnh gọi hàm sl_usbd_hid_add_to_configuration() , các tài nguyên sau sẽ được phân bổ từ lõi.
Tài nguyên
Giao diện Giao diện thay thế Điểm cuối Nhóm giao diện
Số lượng
1 1 1 (2 nếu điểm cuối OUT ngắt được bật) 0
Lưu ý rằng những con số này được tính theo từng cấu hình. Khi thiết lập các giá trị cấu hình SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY và SL_USBD_DESCRIPTOR_QUANTITY, đừng quên tính đến số lượng cấu hình mà lớp sẽ được thêm vào. Đối với giá trị cấu hình SL_USBD_OPEN_ENDPOINTS_QUANTITY, vì các điểm cuối chỉ được mở khi cấu hình được máy chủ thiết lập, bạn chỉ cần tính đến số lượng điểm cuối cần thiết cho một thể hiện của lớp.
Cấu hình lớp HID của thiết bị USB
Hai nhóm tham số cấu hình được sử dụng để cấu hình lớp HID:
Cấu hình ứng dụng cụ thể của lớp HID thiết bị USB Cấu hình phiên bản lớp HID thiết bị USB
Cấu hình ứng dụng cụ thể của lớp HID thiết bị USB
Trước tiên, để sử dụng mô-đun lớp HID của thiết bị USB Silicon Labs, hãy điều chỉnh các định nghĩa cấu hình thời gian biên dịch HID theo nhu cầu ứng dụng của bạn. Chúng được nhóm lại bên trong tiêu đề sl_usbd_core_config.h file trong phần HID. Chúng có thể được chia thành hai phần: cấu hình số lượng và cấu hình tác vụ HID. Mục đích của cấu hình số lượng là thông báo cho mô-đun thiết bị USB về số lượng đối tượng USB HID cần phân bổ.
Bảng dưới đây mô tả từng cấu hình được xác định.
Bảng – Định nghĩa cấu hình HID của thiết bị USB
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
33/174
Quaview
Tên cấu hình
SL_USBD_HID_CL ASS_I SỐ LƯỢNG THỬ THÁCH
SL_USBD_HID_CONFIG SỐ LƯỢNG
SL_USBD_HID_REPORT_ID_QUANTITY
SL_USBD_HID_PUSH_P OP_ITEM_QUANTITY
SL_USBD_HID_TIMER_T ASK_STACK_SIZE
SL_USBD_HID_TIMER_T ƯU TIÊN HỎI
Sự miêu tả
Số lượng thể hiện lớp bạn sẽ phân bổ thông qua lệnh gọi hàm
sl_usbd_hid_create_instance() .
Số lượng cấu hình. Các thể hiện lớp HID có thể được thêm vào một hoặc nhiều cấu hình aaaa bằng cách sử dụng hàm sl_usbd_hid_add_to_configuration(). Cấu hình tổng số ID báo cáo cần phân bổ.
Cấu hình tổng số mục Đẩy/Nổi để phân bổ.
Tác vụ hẹn giờ xử lý tất cả các hoạt động HID dựa trên bộ hẹn giờ. Cấu hình này cho phép bạn thiết lập kích thước ngăn xếp (tính theo số byte). Mức độ ưu tiên của tác vụ HID. Đây là mức độ ưu tiên CMSIS-RTOS2.
Giá trị mặc định
2 1 2 0 2048
osPriorityHigh
Cấu hình thể hiện lớp HID của thiết bị USB Lớp con tạo thể hiện lớp HID
mã quốc gia giao thức
interval_in và interval_out p_hid_callback Mô tả báo cáo lớp HID ExampPhần này định nghĩa các cấu hình liên quan đến các phiên bản lớp HID.
Tạo phiên bản lớp
Việc tạo một thể hiện lớp HID được thực hiện bằng cách gọi hàm aaa sl_usbd_hid_create_instance() , hàm này có một số đối số cấu hình được mô tả bên dưới.
lớp con
Mã của phân lớp HID. Các giá trị có thể là:
SL_USBD_HID_SUBCL ASS_NONE SL_USBD_HID_SUBCL ASS_BOOT
Thiết bị HID sử dụng lớp con khởi động phải sử dụng định dạng báo cáo chuẩn. Để biết thêm thông tin về mã lớp con, hãy xem mục 4.2 của thông số kỹ thuật HID, bản sửa đổi 1.11.
giao thức
Giao thức được thiết bị HID sử dụng. Các giá trị có thể là:
SL_USBD_HID_PROTOCOL_KHÔNG SL_USBD_HID_PROTOCOL_KBD SL_USBD_HID_PROTOCOL_CHUỘT
Nếu chức năng HID của bạn là chuột, giao thức nên được đặt thành SL_USBD_HID_PROTOCOL_MOUSE. Nếu là bàn phím, nên được đặt thành SL_USBD_HID_PROTOCOL_KBD. Nếu không, giao thức nên được đặt thành SL_USBD_HID_PROTOCOL_NONE. Để biết thêm thông tin về mã lớp con, hãy xem phần 4.3 của thông số kỹ thuật HID, bản sửa đổi 1.11.
mã quốc gia
ID của mã quốc gia. Các giá trị có thể là:
SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
34/174
Quaview
SL_USBD_HID_COUNTRY_CODE_ARABIC SL_USBD_HID_COUNTRY_CODE_BELGIAN SL_USBD_HID_COUNTRY_CODE_CANADIAN_SONGINGSL_USBD_HID_COUNTRY_CODE_CANADIAN_FRENCH SL_USBD_HID_COUNTRY_CODE_CZECH_PRUBLIC SL_USBD_HID_COUNTRY_CODE_DANISH SL_USBD_HID_COUNTRY_CODE_FINNISH SL_USBD_HID_COUNTRY_CODE_FRENCH SL_USBD_HID_COUNTRY_CODE_GERMAN SL_USBD_HID_COUNTRY_CODE_GREEK SL_USBD_HID_COUNTRY_CODE_HEBREW SL_USBD_HID_COUNTRY_CODE_HUNGARY SL_USBD_HID_COUNTRY_CODE_INTERNATIONAL SL_USBD_HID_COUNTRY_CODE_ITALIAN SL_USBD_HID_COUNTRY_CODE_NHẬT BẢN_KATAKANA SL_USBD_HID_COUNTRY_CODE_HÀN QUỐC SL_USBD_HID_COUNTRY_CODE_L ATIN_AMERICAN SL_USBD_HID_COUNTRY_CODE_NETHERL ANDS_DUTCH SL_USBD_HID_COUNTRY_CODE_NA-UY SL_USBD_HID_COUNTRY_CODE_BA TƯ BA BA SL_USBD_HID_COUNTRY_CODE_BOL AND SL_USBD_HID_COUNTRY_CODE_BỒ ĐÀO NHA SL_USBD_HID_COUNTRY_CODE_NGA SL_USBD_HID_COUNTRY_CODE_SLOVAKIA SL_USBD_HID_COUNTRY_CODE_SPANISH SL_USBD_HID_COUNTRY_CODE_THỤY ĐIỂN SL_USBD_HID_COUNTRY_CODE_THỤY ĐIỂN SL_USBD_HID_COUNTRY_CODE_THỤY ĐIỂN PHÁP SL_USBD_HID_COUNTRY_CODE_SWISS_GERMAN SL_USBD_HID_COUNTRY_CODE_SWITZERL VÀ SL_USBD_HID_COUNTRY_CODE_TAIWAN SL_USBD_HID_COUNTRY_CODE_TURKISH_Q SL_USBD_HID_COUNTRY_CODE_UK SL_USBD_HID_COUNTRY_CODE_US SL_USBD_HID_COUNTRY_CODE_YUG OSL AVIA SL_USBD_HID_COUNTRY_CODE_TURKISH_F
Mã quốc gia xác định phần cứng được bản địa hóa cho quốc gia nào. Hầu hết phần cứng đều không được bản địa hóa, do đó, mã này sẽ là SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). Tuy nhiên, bàn phím có thể sử dụng trường này để chỉ ra ngôn ngữ của các phím.
Để biết thêm thông tin về mã quốc gia, hãy xem phần 6.2.1 của bản sửa đổi 1.11 về thông số kỹ thuật HID.
interval_in và interval_out
interval_in và interval_out biểu thị khoảng thời gian thăm dò của điểm cuối ngắt IN và điểm cuối ngắt OUT.
Giá trị này biểu thị khoảng thời gian thăm dò của điểm cuối, tính bằng mili giây. Việc thiết lập giá trị này phụ thuộc vào tần suất thiết bị của bạn có thể tạo báo cáo mới cho máy chủ. Ví dụ: nếu báo cáo được tạo sau mỗi 16 mili giây, khoảng thời gian này nên là 16 hoặc ít hơn.
Giá trị phải là lũy thừa của 2 (1, 2, 4, 8, 16, v.v.).
interval_out v lue sẽ bị bỏ qua nếu ctrl_rd_en được đặt thành true.
p_hid_callback
aaaa p_hid_callback là con trỏ đến cấu trúc kiểu sl_usbd_hid_callbacks_t. Mục đích của nó là cung cấp cho HID Cl ss tập hợp các hàm gọi lại được gọi khi một sự kiện HID xảy ra.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
35/174
Quaview
Không phải tất cả các lệnh gọi lại đều bắt buộc và một con trỏ null (NULL) có thể được truyền vào biến cấu trúc lệnh gọi lại khi lệnh gọi lại không cần thiết. Bảng dưới đây mô tả từng trường cấu hình có sẵn trong cấu trúc cấu hình này.
Bảng – Cấu trúc cấu hình sl_usbd_hid_callbacks_t
Các cánh đồng
Sự miêu tả
Chữ ký hàm
.bật .tắt .get_report_desc
.get_phy_desc
.set_output_report .get_feature_report .set_feature_report
Được gọi khi phiên bản lớp USB được bật thành công. Được gọi khi phiên bản lớp USB bị tắt.
Được gọi trong quá trình tạo Phiên bản HID để truyền mô tả báo cáo của bạn. Đối với mỗi hàm HID, bạn phải cung cấp một mô tả báo cáo. Mô tả báo cáo này chỉ ra cho máy chủ cách phân tích cú pháp báo cáo định kỳ mà thiết bị sẽ gửi. Việc tự viết mô tả báo cáo có thể rất khó khăn, và đó là lý do tại sao có một số tài nguyên hỗ trợ. Đây là hàm gọi lại bắt buộc duy nhất. Được gọi trong quá trình tạo Phiên bản HID để truyền mô tả vật lý của bạn. Mô tả vật lý là một mô tả cung cấp thông tin về bộ phận hoặc các bộ phận cụ thể của cơ thể người đang kích hoạt một hoặc nhiều điều khiển. Để biết thêm thông tin về mô tả vật lý, hãy xem phần 6.2.3 của bản sửa đổi đặc tả HID 1.11. Mô tả vật lý là tùy chọn và hầu hết thời gian bị bỏ qua. Bộ đệm được truyền ở đây có thể được đặt thành NULL và độ dài được đặt thành 0. Được gọi khi máy chủ thiết lập báo cáo như được mô tả trong mô tả báo cáo của bạn (khi máy chủ gửi báo cáo).
Được gọi khi máy chủ yêu cầu báo cáo tính năng như được mô tả trong mô tả báo cáo của bạn.
Được gọi khi máy chủ thiết lập báo cáo tính năng như mô tả trong mô tả báo cáo của bạn.
void app_usbd_hid_enable(uint8_t class_nbr); void app_usbd_hid_disable(uint8_t class_nbr); void app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_get_phy_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_set_output_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len); void app_usbd_hid_get_feature_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len); void app_usbd_hid_set_feature_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len);
.get_protocol
Truy xuất giao thức đang hoạt động hiện tại.
void app_usbd_hid_get_protocol(uint8_t class_nbr, uint8_t *p_protocol);
.set_protocol
Đặt giao thức đang hoạt động hiện tại.
void app_usbd_hid_set_protocol(uint8_t class_nbr, uint8_t protocol);
Mô tả báo cáo lớp HID Example
Lớp HID của Silicon Labsampứng dụng cung cấp một ví dụampcủa một mô tả báo cáo cho một con chuột đơn giản. Các ví dụampbên dưới hiển thị mô tả báo cáo về chuột.
Example – Mô tả báo cáo chuột
tĩnh uint8_t app_usbd_hid_report_desc[] = {
(1) (2)
SL_USBD_HID_GLOBAL_USAGE_PAGE + 1, SL_USBD_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,
SL_USBD_HID_LOCAL_USAGE + 1, SL_USBD_HID_CA_MOUSE,
(3)
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
36/174
Quaview
SL_USBD_HID_MAIN_COLLECTION +1, SL_USBD_HID_COLLECTION_APPLICATION,(4)
SL_USBD_HID_LOCAL_USAGE +1, SL_USBD_HID_CP_POINTER,(5)
SL_USBD_HID_MAIN_COLLECTION +1, SL_USBD_HID_COLLECTION_VẬT LÝ,(6)
SL_USBD_HID_GLOBAL_USAGE_PAGE +1, SL_USBD_HID_USAGE_PAGE_BUTTON,(7)
SL_USBD_HID_LOCAL_USAGE_MIN +1,0 01,
SL_USBD_HID_LOCAL_USAGE_MAX +1,0 03,
SL_USBD_HID_GLOBAL_LOG_MIN +1,0 00,
SL_USBD_HID_GLOBAL_LOG_MAX +1,0 01,
SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 03,
SL_USBD_HID_GLOBAL_REPORT_SIZE +1,0 01,
SL_USBD_HID_MAIN_INPUT +1, SL_USBD_HID_MAIN_DATA |
BIẾN_ĐỔI_CHÍNH_SL_USBD_HID |
SL_USBD_HID_MAIN_TUYỆT ĐỐI,
SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 01,(8)
SL_USBD_HID_GLOBAL_REPORT_SIZE +1,0 0D,
SL_USBD_HID_MAIN_INPUT +1, SL_USBD_HID_MAIN_CONSTANT,(9)
SL_USBD_HID_GLOBAL_USAGE_PAGE +1, SL_USBD_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS,
SL_USBD_HID_LOCAL_USAGE +1, SL_USBD_HID_DV_X,
SL_USBD_HID_LOCAL_USAGE +1, SL_USBD_HID_DV_Y,
SL_USBD_HID_GLOBAL_LOG_MIN +1,0 81,
SL_USBD_HID_GLOBAL_LOG_MAX +1,0 7F,
SL_USBD_HID_GLOBAL_REPORT_SIZE +1,0 08,
SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 02,
SL_USBD_HID_MAIN_INPUT +1, SL_USBD_HID_MAIN_DATA |
BIẾN_ĐỔI_CHÍNH_SL_USBD_HID |
SL_USBD_HID_MAIN_RELATIVE,
SL_USBD_HID_MAIN_ENDCOLLECTION,(10)
SL_USBD_HID_MAIN_ENDCOLLECTION
(11)};
(1) Bảng biểu diễn mô tả báo cáo chuột được khởi tạo theo cách mà mỗi dòng tương ứng với một mục ngắn. Mục ngắn này được tạo thành từ tiền tố 1 byte và dữ liệu 1 byte. Tham khảo viewđược biên tập bởi trình phân tích cú pháp HID máy chủ trong Hình – Nội dung mô tả báo cáo từ trình phân tích cú pháp HID máy chủ View.
(2) Trang sử dụng máy tính để bàn chung được sử dụng.
(3) Trong Trang sử dụng máy tính để bàn chung, việc sử dụng tag cho thấy nhóm điều khiển này dùng để điều khiển chuột. Một bộ chuột thường bao gồm hai trục (X và Y) và một, hai hoặc ba nút.
(4) Bộ sưu tập chuột được bắt đầu.
(5) Trong bộ sưu tập chuột, một cách sử dụng tag Điều này cho thấy cụ thể hơn rằng các điều khiển chuột thuộc về tập hợp con trỏ. Tập hợp con trỏ là tập hợp các trục tạo ra giá trị để định hướng, chỉ ra hoặc hướng ý định của người dùng đến một ứng dụng.
(6) Bộ sưu tập con trỏ được bắt đầu.
(7) Trang Sử dụng Nút định nghĩa một mục Đầu vào bao gồm ba trường 1 bit. Mỗi trường 1 bit đại diện cho nút 1, 2 và 3 của chuột và có thể trả về giá trị 0 hoặc 1.
(8) Mục đầu vào cho Trang sử dụng nút được thêm 13 bit khác.
(9) Một Trang sử dụng máy tính để bàn chung khác được chỉ định để mô tả vị trí chuột bằng trục X và Y. Mục đầu vào bao gồm hai trường 8 bit có giá trị nằm trong khoảng từ -127 đến 127.
(10) Bộ sưu tập con trỏ đã đóng.
(11) Bộ sưu tập chuột đã đóng.
Trang HID của USB.org
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
37/174
Quaview
Diễn đàn Triển khai USB (USB-IF) cung cấp một công cụ có tên là “Công cụ Mô tả HID” cùng với các thông tin khác về định dạng mô tả báo cáo. Xem http://www.usb.org/developers/hidpage/ để biết thêm thông tin.
Hướng dẫn lập trình lớp HID của thiết bị USB
Phần này giải thích cách sử dụng lớp HID. Khởi tạo lớp HID của thiết bị USB Thêm một thể hiện lớp HID của thiết bị USB vào thiết bị của bạn Giao tiếp bằng lớp HID của thiết bị USB
Khởi tạo lớp HID của thiết bị USB
Để thêm chức năng Lớp HID vào thiết bị của bạn, trước tiên bạn phải khởi tạo lớp bằng cách gọi hàm sl_usbd_hid_init(). Ví dụampBên dưới là cách gọi sl_usbd_hid_init() bằng các đối số mặc định. Để biết thêm thông tin về các đối số cấu hình cần truyền cho sl_usbd_hid_init(), hãy xem Cấu hình ứng dụng cụ thể cho lớp HID của thiết bị USB.
Example – Gọi sl_usbd_hid_init()
sl_status_t trạng thái;
trạng thái = sl_usbd_hid_init(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi ở đây. */
}
Thêm một phiên bản lớp HID của thiết bị USB vào thiết bị của bạn
Để thêm chức năng lớp HID vào thiết bị của bạn, bạn phải tạo một phiên bản, sau đó thêm phiên bản đó vào cấu hình của thiết bị.
Tạo một thể hiện lớp HID
Tạo một thể hiện lớp HID bằng cách gọi hàm sl_usbd_hid_create_instance() . Ví dụampVideo dưới đây minh họa cách tạo một hàm chuột đơn giản thông qua sl_usbd_hid_create_instance() bằng các đối số mặc định. Để biết thêm thông tin về các đối số cấu hình cần truyền cho sl_usbd_hid_create_instance(), hãy xem Cấu hình Phiên bản Lớp HID của Thiết bị USB.
Example – Thêm chức năng chuột thông qua sl_usbd_hid_create_instance()
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
38/174
Quaview
/* Hằng số toàn cục. */ static const uint8_t app_usbd_hid_mouse_report_desc[] = {
SL_USBD_HID_GLOBAL_USAGE_PAGE + 1, SL_USBD_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS, SL_USBD_HID_LOCAL_USAGE + 1, SL_USBD_HID_CA_MOUSE, SL_USBD_HID_MAIN_COLLECTION + 1, SL_USBD_HID_COLLECTION_APPLICATION, SL_USBD_HID_LOCAL_USAGE + 1, SL_USBD_HID_CP_POINTER, SL_USBD_HID_MAIN_COLLECTION + 1, SL_USBD_HID_PHYSICAL, SL_USBD_HID_GLOBAL_USAGE_PAGE + 1, SL_USBD_HID_USAGE_PAGE_BUTTON, SL_USBD_HID_LOCAL_USAGE_MIN + 1, 0 01, SL_USBD_HID_LOCAL_USAGE_MAX + 1, 0 03, SL_USBD_HID_GLOBAL_LOG_MIN + 1, 0 00, SL_USBD_HID_GLOBAL_LOG_MAX + 1, 0 01, SL_USBD_HID_GLOBAL_REPORT_COUNT + 1, 0 03, SL_USBD_HID_GLOBAL_REPORT_SIZE + 1, 0 01, SL_USBD_HID_MAIN_INPUT + 1, SL_USBD_HID_MAIN_DATA | SL_USBD_HID_MAIN_BIARIABLE | SL_USBD_HID_MAIN_TUYỆT ĐỐI, SL_USBD_HID_GLOBAL_BÁO CÁO_ĐẾM + 1, 0 01, SL_USBD_HID_GLOBAL_BÁO CÁO_KÍCH THƯỚC + 1, 0 0D, SL_USBD_HID_MAIN_INPUT + 1, SL_USBD_HID_MAIN_CONSTANT, SL_USBD_HID_GLOBAL_USAGE_PAGE + 1, SL_USBD_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS, SL_USBD_HID_LOCAL_USAGE + 1, SL_USBD_HID_DV_X, SL_USBD_HID_LOCAL_USAGE + 1, SL_USBD_HID_DV_Y, SL_USBD_HID_GLOBAL_LOG_MIN + 1, 0 81, SL_USBD_HID_GLOBAL_LOG_MAX + 1, 0 7F, SL_USBD_HID_GLOBAL_REPORT_SIZE + 1, 0 08, SL_USBD_HID_GLOBAL_REPORT_COUNT + 1, 0 02, SL_USBD_HID_MAIN_INPUT + 1, SL_USBD_HID_MAIN_DATA | SL_USBD_HID_MAIN_BIRIABLE | SL_USBD_HID_MAIN_RELATIVE, SL_USBD_HID_MAIN_ENDCOLLECTION, SL_USBD_HID_MAIN_ENDCOLLECTION };
/* Biến cục bộ.*/ uint8_t class_nbr; sl_status_t trạng thái;
sl_usbd_hid_callbacks_t app_usbd_hid_callbacks = { NULL, NULL, app_usbd_hid_get_report_desc, NULL, NULL, NULL, NULL, NULL, NULL };
void app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (void)class_nbr;
*p_report_ptr = app_usbd_hid_mouse_report_desc; *p_report_len = sizeof(app_usbd_hid_mouse_report_desc); }
trạng thái = sl_usbd_hid_create_instance(SL_USBD_HID_SUBCLASS_BOOT, SL_USBD_HID_PROTOCOL_MOUSE, SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED, Ex_USBD_HID_Mouse_ReportDesc, sizeof(Ex_USBD_HID_Mouse_ReportDesc), 2u, 2u, true, &app_usbd_hid_callbacks, &class_nbr);
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
39/174
Quaview
/* Đã xảy ra lỗi. Cần thêm tính năng xử lý lỗi vào đây. */}
Thêm phiên bản lớp HID vào cấu hình thiết bị của bạn Sau khi bạn đã tạo phiên bản lớp HID, bạn có thể thêm nó vào cấu hình bằng cách gọi hàm
sl_usbd_hid_add_to_configuration() .
Người cũampbên dưới cho thấy cách gọi sl_usbd_hid_add_to_configuration() .
Example – Gọi sl_usbd_hid_add_to_configuration()
sl_status_t trạng thái;
sl_usbd_hid_add_to_configuration(class_nbr,
(1)
config_nbr_fs); (2)
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
(1) Số lớp để thêm vào cấu hình được trả về bởi sl_usbd_hid_create_instance(). (2) Số cấu hình (ở đây thêm vào cấu hình Tốc độ đầy đủ).
Giao tiếp bằng thiết bị USB Lớp HID
Giao tiếp giữa các lớp Giao tiếp đồng bộ Giao tiếp giữa các lớp Lớp HID cung cấp các chức năng sau để giao tiếp với máy chủ.
Bảng – Tóm tắt API giao tiếp HID
Tên hàm
sl_usb d _hid _ re ad _sy nc() sl_usb d _hid _write _sy nc()
Hoạt động Nhận dữ liệu từ máy chủ thông qua điểm cuối ngắt OUT. Chức năng này đang bị chặn. Gửi dữ liệu đến máy chủ thông qua điểm cuối ngắt IN. Chức năng này đang bị chặn.
Giao tiếp đồng bộ nghĩa là việc truyền dữ liệu bị chặn. Khi gọi hàm, các ứng dụng sẽ bị chặn cho đến khi việc truyền dữ liệu hoàn tất, dù có lỗi hay không. Có thể chỉ định thời gian chờ để tránh phải chờ đợi mãi mãi. Ví dụampHình bên dưới hiển thị lệnh đọc và ghi nhận dữ liệu từ máy chủ bằng cách sử dụng điểm cuối ngắt OUT và gửi dữ liệu đến máy chủ bằng cách sử dụng điểm cuối ngắt IN.
Example – Đọc và ghi HID đồng bộ
__ĐÃ CĂN CHỈNH(4) uint8_t rx_buf[2];
__ĐÃ CĂN CHỈNH(4) uint8_t tx_buf[2];
uint32_t
xfer_len;
sl_status_t
trạng thái;
trạng thái = sl_usbd_hid_read_sync(class_nbr,
(1)
(void *)rx_buf,
(2)
2u,
0u,
(3)
&xfer_len);
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
40/174
Quaview
trạng thái =sl_usbd_hid_read_sync(class_nbr,(1)(void *)rx_buf,(2)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* Đã xảy ra lỗi. Cần thêm tính năng xử lý lỗi tại đây. */}
trạng thái =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* Đã xảy ra lỗi. Cần thêm tính năng xử lý lỗi tại đây. */}
(1) Số phiên bản lớp được tạo từ sl_usbd_hid_create_instance() cung cấp tham chiếu nội bộ cho lớp HID để định tuyến chuyển giao đến điểm cuối ngắt OUT hoặc IN thích hợp.
(2) Ứng dụng phải đảm bảo rằng bộ đệm được cung cấp cho hàm đủ lớn để chứa tất cả dữ liệu. Nếu không, sự cố đồng bộ hóa có thể xảy ra. Về mặt nội bộ, thao tác đọc được thực hiện với điểm cuối điều khiển hoặc với điểm cuối ngắt, tùy thuộc vào cờ đọc điều khiển được đặt khi gọi sl_usbd_hid_create_instance().
(3) Để tránh tình trạng chặn vô hạn, có thể chỉ định thời gian chờ được biểu thị bằng mili giây. Giá trị 809 sẽ khiến tác vụ ứng dụng phải chờ mãi mãi.
(4) Ứng dụng cung cấp bộ đệm truyền đã khởi tạo.
Nhiệm vụ báo cáo đầu vào định kỳ HID
Để tiết kiệm băng thông, máy chủ có khả năng tắt báo cáo từ điểm cuối ngắt IN bằng cách giới hạn tần suất báo cáo. Để làm như vậy, máy chủ phải gửi yêu cầu SET_IDLE. Lớp HID do Silicon Labs triển khai chứa một tác vụ nội bộ tuân thủ giới hạn tần suất báo cáo mà bạn có thể áp dụng cho một hoặc nhiều báo cáo đầu vào. Hình "Tác vụ Báo cáo Đầu vào Định kỳ" minh họa chức năng của các tác vụ báo cáo đầu vào định kỳ.
Hình – Nhiệm vụ báo cáo đầu vào định kỳ
(1) Thiết bị nhận được yêu cầu SET_IDLE. Yêu cầu này chỉ định thời gian chờ cho một ID báo cáo nhất định. Để biết thêm chi tiết về yêu cầu SET_IDLE, hãy xem
(2) Cấu trúc ID báo cáo (được phân bổ trong giai đoạn khởi tạo lớp HID) được cập nhật với thời gian chờ. Bộ đếm thời gian chờ được khởi tạo với giá trị thời gian chờ. Cấu trúc ID báo cáo được chèn vào cuối danh sách liên kết chứa các cấu trúc ID báo cáo đầu vào. Giá trị thời gian chờ được biểu thị bằng đơn vị 4 ms, cho phạm vi từ 4 đến 1020 ms.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
41/174
Quaview
Nếu thời gian nhàn rỗi ngắn hơn khoảng thời gian thăm dò của điểm cuối ngắt IN, báo cáo sẽ được tạo tại khoảng thời gian thăm dò.
(3) Cứ sau 4 ms, tác vụ báo cáo đầu vào định kỳ sẽ duyệt danh sách ID báo cáo đầu vào. Với mỗi ID báo cáo đầu vào, tác vụ thực hiện một trong hai thao tác sau: Thời lượng của chu kỳ tác vụ khớp với đơn vị 4 ms được sử dụng cho thời gian nhàn rỗi. Nếu máy chủ không gửi bất kỳ yêu cầu SET_IDLE nào, danh sách ID báo cáo đầu vào sẽ trống và tác vụ không có gì để xử lý. Các tác vụ chỉ xử lý các ID báo cáo khác 0 và có thời gian nhàn rỗi lớn hơn 0.
(4) Đối với một ID báo cáo đầu vào nhất định, tác vụ sẽ xác minh xem thời gian chờ đã trôi qua hay chưa. Nếu thời gian chờ chưa trôi qua, bộ đếm sẽ giảm và không có báo cáo đầu vào nào được gửi đến máy chủ.
(5) Nếu thời gian nhàn rỗi đã trôi qua (tức là bộ đếm thời gian nhàn rỗi đã đạt đến số không), một báo cáo đầu vào sẽ được gửi đến máy chủ bằng cách gọi hàm sl_usbd_hid_write_sync() thông qua điểm cuối ngắt IN.
(6) Dữ liệu báo cáo đầu vào được gửi bởi tác vụ đến từ bộ đệm dữ liệu nội bộ được phân bổ cho mỗi báo cáo đầu vào được mô tả trong mô tả Báo cáo. Một tác vụ ứng dụng có thể gọi hàm sl_usbd_hid_write_sync() để gửi báo cáo đầu vào. Sau khi gửi dữ liệu báo cáo đầu vào, sl_usbd_hid_write_sync() cập nhật bộ đệm nội bộ được liên kết với ID báo cáo đầu vào bằng dữ liệu vừa được gửi. Sau đó, tác vụ báo cáo đầu vào định kỳ luôn gửi cùng một dữ liệu báo cáo đầu vào sau mỗi khoảng thời gian nhàn rỗi trôi qua và cho đến khi tác vụ ứng dụng cập nhật dữ liệu trong bộ đệm nội bộ. Có một số cơ chế khóa để tránh làm hỏng dữ liệu ID báo cáo đầu vào trong trường hợp có sửa đổi xảy ra tại thời điểm chính xác của quá trình truyền được thực hiện bởi tác vụ báo cáo đầu vào định kỳ.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
42/174
Quaview
Quaview
Thiết bị USB MSC Class
Thiết bị USB MSC Class Overview Nhu cầu tài nguyên lớp MSC của thiết bị USB từ lõi Cấu hình lớp MSC của thiết bị USB Hướng dẫn lập trình lớp MSC của thiết bị USB Trình điều khiển lưu trữ lớp MSC của thiết bị USB
Phần này mô tả lớp thiết bị lưu trữ khối (MSC) được thiết bị USB của Silicon Labs hỗ trợ. MSC là một giao thức cho phép truyền thông tin giữa thiết bị USB và máy chủ. Thông tin được truyền là bất kỳ thứ gì có thể được lưu trữ điện tử, chẳng hạn như chương trình thực thi, mã nguồn, tài liệu, hình ảnh, dữ liệu cấu hình hoặc dữ liệu văn bản hoặc số khác. Thiết bị USB xuất hiện như một phương tiện lưu trữ ngoài cho máy chủ, cho phép truyền filethông qua thao tác kéo và thả.
A file hệ thống xác định cách thức fileđược tổ chức trong phương tiện lưu trữ. Đặc tả lớp lưu trữ USB không yêu cầu bất kỳ file Hệ thống này được sử dụng trên các thiết bị tương thích. Thay vào đó, nó cung cấp một giao diện đơn giản để đọc và ghi các sector dữ liệu bằng bộ lệnh trong suốt của Giao diện Hệ thống Máy tính Nhỏ (SCSI). Do đó, hệ điều hành có thể xử lý ổ USB như một ổ cứng và có thể định dạng nó bằng bất kỳ phương pháp nào. file hệ thống họ thích.
Lớp thiết bị lưu trữ USB hỗ trợ hai giao thức truyền tải như sau:
Vận chuyển chỉ theo khối lượng lớn (BOT) Điều khiển/Khối lượng lớn/Ngắt (CBI) Vận chuyển (chỉ sử dụng cho ổ đĩa mềm)
Lớp thiết bị lưu trữ khối triển khai bộ lệnh SCSI trong suốt chỉ sử dụng giao thức BOT, nghĩa là chỉ các điểm cuối khối mới được sử dụng để truyền dữ liệu và thông tin trạng thái. Triển khai MSC hỗ trợ nhiều đơn vị logic.
Việc triển khai MSC phải tuân thủ các thông số kỹ thuật sau:
Đặc điểm kỹ thuật lớp lưu trữ khối lượng Bus nối tiếp toàn cầuview, Bản sửa đổi 1.3 ngày 5 tháng 9 năm 2008. Lớp lưu trữ khối lượng lớn của Bus nối tiếp vạn năng, Bản sửa đổi 1.0 ngày 31 tháng 9 năm 1999.
Thiết bị USB MSC aCl ss Overview
Yêu cầu lớp điểm cuối giao thức Giao diện hệ thống máy tính nhỏ (SCSI)
Giao thức
Trong phần này, chúng ta sẽ thảo luận về giao thức Bulk-Only Transport (BOT) của Lớp Lưu trữ Khối lượng. Giao thức Bulk-Only Transport có batagđó là:
Vận chuyển lệnh Vận chuyển dữ liệu Vận chuyển trạng thái
Các lệnh lưu trữ khối được máy chủ gửi thông qua một cấu trúc gọi là Command Block Wrapper (CBW). Đối với các lệnh yêu cầu truyền dữ liệutage, máy chủ sẽ cố gắng gửi hoặc nhận số byte chính xác từ thiết bị như được chỉ định bởi các trường độ dài và cờ của CBW. Sau khi truyền dữ liệutage, máy chủ cố gắng nhận Command Status Wrapper (CSW) từ thiết bị để nêu chi tiết trạng thái của lệnh cũng như bất kỳ dữ liệu còn sót lại nào (nếu có)
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
43/174
Quaview
bất kỳ). Đối với các lệnh không bao gồm dữ liệu vận chuyển stage, máy chủ cố gắng nhận CSW ngay sau khi CBW được gửi. Giao thức được trình bày chi tiết trong Hình – Giao thức MSC.
Hình – Giao thức MSC
Điểm cuối
Về phía thiết bị, tuân thủ theo thông số kỹ thuật của BOT, MSC bao gồm các điểm cuối sau: Một cặp điểm cuối điều khiển IN và OUT, được gọi là điểm cuối mặc định. Một cặp điểm cuối IN và OUT số lượng lớn.
Bảng dưới đây chỉ ra những cách sử dụng khác nhau của các điểm cuối.
Bảng – Sử dụng điểm cuối MSC
Điểm cuối
Kiểm soát VÀO Kiểm soát RA Hàng loạt VÀO Hàng loạt RA
Phương hướng
Thiết bị tới Máy chủ Máy chủ tới Thiết bị Thiết bị tới Máy chủ Máy chủ tới Thiết bị
Cách sử dụng
Yêu cầu liệt kê và cụ thể theo lớp MSC Yêu cầu liệt kê và cụ thể theo lớp MSC Gửi CSW và dữ liệu Nhận CBW và dữ liệu
Yêu cầu lớp học
Có hai yêu cầu điều khiển được xác định cho giao thức MSC BOT. Các yêu cầu này và mô tả chi tiết của chúng được trình bày trong bảng dưới đây.
Bảng – Yêu cầu lớp lưu trữ hàng loạt
Yêu cầu lớp học
Đặt lại bộ nhớ hàng loạt chỉ dành cho hàng loạt
Sự miêu tả
Yêu cầu này được sử dụng để thiết lập lại thiết bị lưu trữ khối và giao diện liên quan. Yêu cầu này chuẩn bị thiết bị để nhận khối lệnh tiếp theo.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
44/174
Quaview
Yêu cầu lớp học
Sự miêu tả
Lấy Max Yêu cầu này được sử dụng để trả về số đơn vị logic cao nhất (LUN) được thiết bị hỗ trợ. Ví dụ:ampđồng cỏ
LUN
thiết bị có LUN 0 và LUN 1 sẽ trả về giá trị 1. Thiết bị có một đơn vị logic duy nhất sẽ trả về 0 hoặc dừng
yêu cầu. Giá trị tối đa có thể trả về là 15.
Giao diện hệ thống máy tính nhỏ SCSI
Ở cấp độ giao diện lập trình, thiết bị MSC triển khai một trong các giao thức truyền thông lưu trữ chuẩn, chẳng hạn như SCSI và SFF-8020i (ATAPI). "Giao diện lập trình" chỉ định giao thức nào được triển khai và giúp hệ điều hành máy chủ tải trình điều khiển thiết bị phù hợp để giao tiếp với thiết bị lưu trữ USB. SCSI là giao thức phổ biến nhất được sử dụng với các thiết bị lưu trữ MSC USB. Chúng tôi cung cấp một triển khai cho lớp con MSC SCSI mà người dùng GSDK của chúng tôi có thể sử dụng ngay lập tức.
SCSI là một bộ tiêu chuẩn để xử lý giao tiếp giữa máy tính và thiết bị ngoại vi. Các tiêu chuẩn này bao gồm các lệnh, giao thức, giao diện điện và giao diện quang. Các thiết bị lưu trữ sử dụng các giao diện phần cứng khác, chẳng hạn như USB, sử dụng các lệnh SCSI để lấy thông tin thiết bị/máy chủ, điều khiển hoạt động của thiết bị và truyền các khối dữ liệu trong phương tiện lưu trữ.
Các lệnh SCSI bao gồm rất nhiều loại thiết bị và chức năng, và do đó, các thiết bị cần một tập hợp con các lệnh này. Nhìn chung, các lệnh sau đây là cần thiết cho giao tiếp cơ bản:
YÊU CẦU ĐỌC DUNG LƯỢNG(10) ĐỌC(10) YÊU CẦU KIỂM TRA CẢM GIÁC ĐƠN VỊ SẴN SÀNG GHI(10)
Nhu cầu tài nguyên lớp MSC của thiết bị USB từ lõi
Mỗi khi bạn thêm một thể hiện lớp MSC vào cấu hình USB thông qua hàm sl_usbd_msc_add_to_configuration() , các tài nguyên sau sẽ được phân bổ từ lõi.
Tài nguyên
Giao diện Giao diện thay thế Điểm cuối Nhóm giao diện
Số lượng
1 1 2 0
Lưu ý rằng những con số này được tính theo từng cấu hình. Khi thiết lập các giá trị cấu hình SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY và SL_USBD_DESCRIPTOR_QUANTITY, đừng quên tính đến số lượng cấu hình mà lớp sẽ được thêm vào. Đối với giá trị cấu hình SL_USBD_OPEN_ENDPOINTS_QUANTITY, vì các điểm cuối chỉ được mở khi cấu hình được máy chủ thiết lập, bạn chỉ cần tính đến số lượng điểm cuối cần thiết cho một thể hiện của lớp.
Cấu hình lớp MSC của thiết bị USB
Hai nhóm tham số cấu hình được sử dụng để cấu hình lớp MSC:
Cấu hình ứng dụng cụ thể của lớp MSC thiết bị USB Cấu hình đơn vị logic của lớp MSC thiết bị USB
Cấu hình ứng dụng cụ thể của lớp MSC thiết bị USB
Cấu hình thời gian biên dịch lớp Tạo phiên bản lớp
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
45/174
Quaview
Cấu hình thời gian biên dịch lớp
Lớp MSC của thiết bị USB Silicon Labs và lớp con SCSI có thể cấu hình được tại thời điểm biên dịch thông qua #defines nằm trong sl_usbd_core_config.h file.
Bảng – Hằng số cấu hình chung
Tên cấu hình
Sự miêu tả
SL_USBD_MSC_CLASS_INST Số lượng thể hiện lớp bạn sẽ phân bổ thông qua lệnh gọi hàm
SỐ LƯỢNG
sl_usbd_msc_scsi_create_instance() .
SL_USBD_MSC_CONFIGURA Số lượng cấu hình mà một thể hiện lớp có thể được thêm vào thông qua lệnh gọi đến
SỐ LƯỢNG
hàm sl_usbd_msc_scsi_add_to_configuration() .
SL_USBD_MSC_LUN_QUANT Số lượng đơn vị logic trên mỗi thể hiện lớp mà bạn sẽ thêm thông qua lệnh gọi tới
TÍNH CÁCH
hàm sl_usbd_msc_scsi_lun_add() .
SL_USBD_MSC_SCSI_64_BIT Bật hoặc tắt hỗ trợ cho Địa chỉ khối logic (LBA) 64 bit.
_LBA_EN
SL_USBD_MSC_DATA_BUFF Kích thước của bộ đệm dữ liệu cho mỗi phiên bản lớp tính bằng byte ER_SIZE
Giá trị mặc định
2
1
2
0
512
Tạo phiên bản lớp
Việc tạo một thể hiện lớp MSC SCSI của thiết bị USB được thực hiện bằng cách gọi hàm sl_usbd_msc_scsi_create_instance(). Hàm này sử dụng một đối số cấu hình được mô tả bên dưới.
p_scsi_callbacks
p_scsi_callbacks là một con trỏ đến một cấu trúc cấu hình có kiểu sl_usbd_msc_scsi_callbacks_t. Ngoài các lệnh gọi lại kết nối/ngắt kết nối phổ biến của lớp thiết bị USB, nó còn cung cấp cho lớp MSC một tập hợp các hàm gọi lại tùy chọn được gọi khi một sự kiện xảy ra trên đơn vị logic. Một con trỏ null (NULL) có thể được truyền cho đối số này nếu không cần lệnh gọi lại.
Bảng dưới đây mô tả từng trường cấu hình có sẵn trong cấu trúc cấu hình này.
Bảng – Cấu trúc cấu hình sl_usbd_msc_scsi_callbacks_t
Các cánh đồng
Sự miêu tả
.cho phép
Được gọi khi phiên bản lớp USB được bật thành công.
.disable Được gọi khi phiên bản lớp USB bị vô hiệu hóa.
.host_eject Hàm được gọi khi một đơn vị logic bị đẩy ra khỏi máy chủ.
Chữ ký hàm
void app_usbd_msc_scsi_enable(uint8_t class_nbr);
void app_usbd_msc_scsi_disable(uint8_t class_nbr); void app_usbd_msc_scsi_host_eject(uint8_t class_nbr, uint8_t lu_nbr);
Cấu hình đơn vị logic lớp MSC của thiết bị USB
Việc thêm một đơn vị logic vào một thể hiện lớp MSC được thực hiện bằng cách gọi hàm sl_usbd_msc_lun_add(). Hàm này sử dụng một đối số cấu hình được mô tả bên dưới.
p_lu_info
p_lu_info là một con trỏ đến một cấu trúc có kiểu sl_usbd_msc_scsi_lun_info_t. Mục đích của nó là cung cấp thông tin về đơn vị logic cho lớp MSC.
Bảng dưới đây mô tả từng trường cấu hình có sẵn trong cấu trúc cấu hình này.
Bảng – Cấu trúc cấu hình sl_usbd_msc_scsi_lun_info_t
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
46/174
Quaview
Cánh đồng
Sự miêu tả
Cánh đồng
.scsi_lun_api_p tr
Sự miêu tả
Con trỏ đến API trình điều khiển phương tiện sẽ xử lý đơn vị logic này. Xem Trình điều khiển lưu trữ lớp MSC của thiết bị USB để biết thêm thông tin về trình điều khiển lưu trữ.
.ve nd o r_id _ p tr
.product_id_ptr
.p ro d uct_ re v isi on_level .is_ re ad _o nly
Con trỏ đến một chuỗi chứa mã định danh nhà cung cấp của đơn vị logic. Độ dài tối đa của chuỗi là 8 ký tự. Con trỏ đến một chuỗi chứa mã định danh sản phẩm của đơn vị logic. Độ dài tối đa của chuỗi là 16 ký tự. Cấp độ sửa đổi sản phẩm.
Cờ cho biết liệu đơn vị logic có nên được xem là chỉ đọc từ điểm view của máy chủ (đúng) hay không (sai).
Hướng dẫn lập trình lớp MSC cho thiết bị USB
Phần này giải thích cách sử dụng lớp MSC.
Khởi tạo lớp MSC của thiết bị USB Thêm một thể hiện lớp SCSI MSC của thiết bị USB vào thiết bị của bạn Xử lý đơn vị logic của lớp MSC của thiết bị USB
Khởi tạo lớp MSC của thiết bị USB
Để thêm chức năng lớp MSC SCSI vào thiết bị của bạn, trước tiên hãy khởi tạo lớp cơ sở MSC và lớp con SCSI bằng cách gọi hàm sl_usbd_msc_init() và sl_usbd_msc_scsi_init() .
Người cũampbên dưới cho thấy cách gọi sl_usbd_msc_init() và sl_usbd_msc_scsi_init() .
Example – Gọi sl_usbd_msc_init() và sl_usbd_msc_scsi_init()
sl_status_t trạng thái;
trạng thái = sl_usbd_msc_init(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi ở đây. */
}
trạng thái = sl_usbd_msc_scsi_init(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi ở đây. */
}
Thêm một thiết bị USB MSC SCSI Class Instance vào thiết bị của bạn
Để thêm chức năng lớp MSC SCSI vào thiết bị của bạn, trước tiên hãy tạo một phiên bản, sau đó thêm nó vào cấu hình thiết bị. Bạn phải thêm ít nhất một đơn vị logic vào phiên bản của mình.
Tạo một thể hiện lớp MSC SCSI
Tạo một thể hiện lớp MSC SCSI bằng cách gọi hàm sl_usbd_msc_scsi_create_instance() .
Người cũampFile bên dưới minh họa cách gọi sl_usbd_msc_scsi_create_instance() bằng các đối số mặc định. Để biết thêm thông tin về các đối số cấu hình cần truyền cho sl_usbd_msc_scsi_create_instance(), hãy xem Cấu hình ứng dụng cụ thể cho lớp MSC của thiết bị USB.
Example – Gọi sl_usbd_ msc_scsi_create_instance()
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
47/174
Quaview
uint8_t class_nbr; sl_status_t trạng thái;
sl_usbd_msc_scsi_callbacks_t app_usbd_msc_scsi_callbacks = { . bật = NULL, . tắt = NULL, . máy chủ_từ chối = NULL };
trạng thái = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
if (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm tính năng xử lý lỗi vào đây. */ }
Thêm MSC Class Instance vào Cấu hình thiết bị của bạn
Sau khi bạn đã tạo một thể hiện lớp MSC, bạn có thể thêm nó vào cấu hình bằng cách gọi hàm
sl_usbd_msc_add_to_configuration() .
Người cũampbên dưới cho thấy cách gọi sl_usbd_msc_scsi_add_to_configuration() bằng cách sử dụng các đối số mặc định.
Example – Gọi sl_usbd_ msc_scsi_add_to_configuration()
sl_status_t trạng thái;
trạng thái = sl_usbd_msc_scsi_add_to_configuration(class_nbr,
(1)
config_nbr_fs);
(2)
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
(1) Số lớp để thêm vào cấu hình được trả về bởi sl_usbd_msc_scsi_create_instance() . (32) Số cấu hình (ở đây thêm vào cấu hình Tốc độ đầy đủ).
Xử lý đơn vị logic lớp MSC của thiết bị USB
Thêm Đơn vị Logic Gắn/Tách Phương tiện Lưu trữ
Thêm một đơn vị logic
Khi thêm một đơn vị logic vào thể hiện lớp MSC SCSI của bạn, nó phải được liên kết với một phương tiện lưu trữ (RAMDisk, thẻ SD, bộ nhớ flash, v.v.). Lớp MSC sử dụng trình điều khiển lưu trữ để giao tiếp với phương tiện lưu trữ. Trình điều khiển này sẽ cần được cung cấp khi thêm đơn vị logic.
Người cũampbên dưới cho thấy cách thêm một đơn vị logic thông qua sl_usbd_msc_scsi_lun_add() .
Example – Thêm một Đơn vị Logic thông qua sl_usbd_msc_scsi_lun_add()
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
48/174
Quaview
sl_usbd_msc_scsi_lun_t *lu_object_ptr = NULL;
sl_usbd_msc_scsi_lun_info_t lu_info;
sl_status_t
trạng thái;
lu_info.sl_usbd_msc_scsi_lun_api_t = &app_usbd_scsi_storage_block_device_api;
lu_info.vendor_id_ptr
= “Phòng thí nghiệm Silicon”;
lu_info.product_id_ptr
= “thiết bị chặn example”;
lu_info.product_revision_level = 0x1000u;
lu_info.is_read_only
= sai;
trạng thái = sl_usbd_msc_scsi_lun_add(class_nbr, &lu_info, &lu_object_ptr);
if (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm tính năng xử lý lỗi vào đây. */ }
Gắn/Tháo thiết bị lưu trữ
Sau khi đơn vị logic được thêm vào, một phương tiện lưu trữ phải được kết nối để có thể truy cập từ phía máy chủ. Lớp MSC cung cấp hai hàm để kiểm soát việc liên kết phương tiện lưu trữ với đơn vị logic: sl_usbd_msc_scsi_lun_attach() và sl_usbd_msc_scsi_lun_detach(). Các hàm này cho phép bạn mô phỏng việc tháo thiết bị lưu trữ để lấy lại quyền truy cập từ ứng dụng nhúng nếu cần.
Người cũampbên dưới cho thấy cách sử dụng hàm sl_usbd_msc_scsi_lun_attach() và sl_usbd_msc_scsi_lun_detach() .
Example – Gắn/Tháo phương tiện
sl_status_t trạng thái;
trạng thái = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi ở đây. */
}
…
(1)
trạng thái = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
…
(2)
trạng thái = sl_usbd_msc_scsi_lun_attach(lu_object_ptr) nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
…
(3)
(1) Từ thời điểm này, nếu thiết bị MSC được kết nối với máy chủ, phương tiện lưu trữ có thể truy cập được.
(2) Nếu thiết bị MSC được kết nối với máy chủ, phương tiện sẽ hiển thị trạng thái không khả dụng. Lúc này, các thao tác trên phương tiện có thể được thực hiện từ ứng dụng nhúng.
(3) Một lần nữa, nếu thiết bị MSC được kết nối với máy chủ, phương tiện lưu trữ sẽ xuất hiện như đã được kết nối.
Trình điều khiển lưu trữ lớp MSC của thiết bị USB
Thiết bị USB MSC Class cần có trình điều khiển lưu trữ để giao tiếp với phương tiện lưu trữ. Hiện tại, Silicon Labs chưa cung cấp trình điều khiển.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
49/174
Quaview
TPY aa trình điều khiển AI được định nghĩa bởi typedef sl_usbd_msc_scsi_lun_api_t. sl_usbd_msc_scsi_lun_api_t của chúng ta phải được bao gồm trong sl_usbd_msc_scsi_lun_info_t của bạn, p ssed sgument khi bạn thêm đơn vị logic l với sl_usbd_msc_scsi_lun_add(). Xem phần API SCSI MSC của thiết bị USB để biết thêm chi tiết về các cấu trúc. Việc triển khai trình điều khiển lưu trữ có thể đơn giản như một mảng các sector trong RAM. Kích thước sector điển hình (tức là kích thước khối) là 512 đối với thiết bị lưu trữ khối và 2048 đối với CD-ROM.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
50/174
Quaview
Quaview
Lớp nhà cung cấp thiết bị USB
Nhà cung cấp thiết bị USB đã hết hạnview Nhu cầu tài nguyên lớp nhà cung cấp thiết bị USB từ cấu hình lớp nhà cung cấp thiết bị USB lõi Hướng dẫn lập trình lớp nhà cung cấp thiết bị USB Lớp nhà cung cấp cho phép bạn xây dựng các thiết bị dành riêng cho nhà cung cấp có thể triển khai giao thức độc quyền. Nó dựa vào một cặp điểm cuối hàng loạt để truyền dữ liệu giữa máy chủ và thiết bị. Truyền hàng loạt rất tiện lợi để truyền lượng lớn dữ liệu phi cấu trúc và cung cấp khả năng trao đổi dữ liệu đáng tin cậy bằng cách sử dụng cơ chế phát hiện lỗi và thử lại. Ngoài các điểm cuối hàng loạt, lớp nhà cung cấp cũng có thể sử dụng một cặp điểm cuối ngắt tùy chọn. Bất kỳ hệ điều hành (OS) nào cũng có thể hoạt động với lớp nhà cung cấp với điều kiện là hệ điều hành đó có trình điều khiển để xử lý lớp nhà cung cấp. Tùy thuộc vào OS, trình điều khiển có thể là gốc hoặc dành riêng cho nhà cung cấp. Ví dụ: trong Microsoft Windows®, ứng dụng của bạn tương tác với trình điều khiển WinUSB do Microsoft cung cấp để giao tiếp với thiết bị của nhà cung cấp.
Nhà cung cấp thiết bị USB đã hết hạnview
Hình – Kiến trúc chung giữa máy chủ Windows và lớp nhà cung cấp cho thấy kiến trúc chung giữa máy chủ và thiết bị sử dụng lớp nhà cung cấp. Trong ví dụ nàyample, hệ điều hành máy chủ là MS Windows.
Hình – Kiến trúc chung giữa lớp máy chủ MS Windows và lớp nhà cung cấp
Trên hệ điều hành MS Windows, ứng dụng giao tiếp với thiết bị của nhà cung cấp bằng cách tương tác với thư viện USB. Các thư viện, chẳng hạn như libusb, cung cấp API để quản lý thiết bị và các đường ống liên quan, cũng như giao tiếp với thiết bị thông qua các điểm cuối điều khiển, khối lượng lớn và ngắt.
Về phía thiết bị, lớp Nhà cung cấp bao gồm các điểm cuối sau:
Một cặp điểm cuối IN và OUT điều khiển được gọi là điểm cuối mặc định. Một cặp điểm cuối IN và OUT số lượng lớn.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
51/174
Quaview
Một cặp điểm cuối IN và OUT ngắt. Cặp này là tùy chọn. Bảng dưới đây cho biết cách sử dụng các điểm cuối khác nhau:
Bảng – Sử dụng điểm cuối của lớp nhà cung cấp
Hướng điểm cuối
Kiểm soát TRONG
Điều khiển
NGOÀI
ĐẦU VÀO HÀNG LOẠT
Thiết bị-đến-máy chủ
>Máy chủ đến thiết bị
Thiết bị-đến-máy chủ
Xuất hàng loạt
Ngắt VÀO
Ngắt
NGOÀI
Máy chủ đến thiết bị
Thiết bị-đến-máy chủ
Máy chủ đến thiết bị
Cách sử dụng
Yêu cầu tiêu chuẩn để liệt kê và yêu cầu cụ thể của nhà cung cấp.
Yêu cầu tiêu chuẩn để liệt kê và yêu cầu cụ thể của nhà cung cấp.
Truyền dữ liệu thô. Dữ liệu có thể được cấu trúc theo một giao thức độc quyền.
Truyền dữ liệu thô. Dữ liệu có thể được cấu trúc theo một giao thức độc quyền.
Truyền thông hoặc thông báo dữ liệu thô. Dữ liệu có thể được cấu trúc theo một giao thức độc quyền. Truyền thông hoặc thông báo dữ liệu thô. Dữ liệu có thể được cấu trúc theo một giao thức độc quyền.
Ứng dụng thiết bị có thể sử dụng các điểm cuối bulk và interrupt để gửi hoặc nhận dữ liệu đến hoặc từ máy chủ. Nó chỉ có thể sử dụng điểm cuối mặc định để giải mã các yêu cầu cụ thể của nhà cung cấp do máy chủ gửi. Các yêu cầu tiêu chuẩn được quản lý nội bộ bởi lớp Core của Thiết bị USB Silicon Labs.
Nhu cầu tài nguyên của lớp nhà cung cấp thiết bị USB từ Core
Mỗi khi bạn thêm một thể hiện lớp nhà cung cấp vào cấu hình thông qua hàm sl_usbd_vendor_add_to_configuration() , các tài nguyên sau sẽ được phân bổ từ lõi.
Tài nguyên
Giao diện Giao diện thay thế Điểm cuối Nhóm giao diện
Số lượng
1 1 2 (4 nếu bạn đã bật điểm cuối ngắt) 0
Lưu ý rằng những con số này được tính theo từng cấu hình. Khi thiết lập các giá trị cấu hình SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY và SL_USBD_DESCRIPTOR_QUANTITY, đừng quên tính đến số lượng cấu hình mà lớp sẽ được thêm vào. Đối với giá trị cấu hình SL_USBD_OPEN_ENDPOINTS_QUANTITY, vì các điểm cuối chỉ được mở khi cấu hình được máy chủ thiết lập, bạn chỉ cần tính đến số lượng điểm cuối cần thiết cho một thể hiện của lớp.
Cấu hình lớp nhà cung cấp thiết bị USB
Hai nhóm tham số cấu hình được sử dụng để cấu hình lớp Nhà cung cấp:
Cấu hình ứng dụng cụ thể của lớp nhà cung cấp thiết bị USB Cấu hình phiên bản lớp nhà cung cấp thiết bị USB
Cấu hình ứng dụng cụ thể của nhà cung cấp thiết bị USB
Trước tiên, để sử dụng mô-đun lớp Nhà cung cấp thiết bị USB của Silicon Labs, hãy điều chỉnh các định nghĩa cấu hình thời gian biên dịch của Nhà cung cấp theo nhu cầu ứng dụng của bạn. Chúng được nhóm lại bên trong tiêu đề sl_usbd_core_config.h file trong phần Nhà cung cấp. Mục đích của cấu hình số lượng là thông báo cho mô-đun thiết bị USB về số lượng đối tượng Nhà cung cấp USB cần phân bổ.
Bảng dưới đây mô tả từng cấu hình được xác định.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
52/174
Quaview
Bảng – Định nghĩa cấu hình nhà cung cấp thiết bị USB
Tên cấu hình
Sự miêu tả
Giá trị mặc định
SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Số lượng thể hiện lớp bạn sẽ phân bổ thông qua lệnh gọi đến 2 hàm sl_usbd_vendor_create_instance() .
SL_USBD_VENDOR_CONFIGURATION_QUANTITY Số lượng cấu hình. Các thể hiện lớp nhà cung cấp có thể được thêm vào một hoặc nhiều cấu hình thông qua lệnh gọi hàm sl_usbd_vendor_add_to_configuration().
Cấu hình phiên bản lớp nhà cung cấp thiết bị USB
Phần này định nghĩa các cấu hình liên quan đến các phiên bản lớp Nhà cung cấp.
Tạo phiên bản lớp intr_en interval p_vendor_callbacks
Tạo phiên bản lớp
Việc tạo một thể hiện lớp Vendor được thực hiện bằng cách gọi hàm sl_usbd_vendor_create_instance() , hàm này sử dụng ba đối số cấu hình được mô tả bên dưới.
intr_en
Boolean cho biết liệu có nên thêm một cặp điểm cuối ngắt hay không.
Giá trị
đúng sai
Sự miêu tả
Một cặp điểm cuối IN/OUT sẽ được thêm vào và cung cấp cho ứng dụng nhúng. Không có điểm cuối ngắt nào được thêm vào. Chỉ có một cặp điểm cuối Bulk IN/OUT khả dụng.
khoảng thời gian
Nếu bạn đặt intr_en thành true, bạn có thể chỉ định khoảng thời gian thăm dò điểm cuối ngắt (tính bằng mili giây). Nếu bạn đặt intr_en thành false, bạn có thể đặt khoảng thời gian thành 0 vì lớp sẽ bỏ qua nó.
p_vendor_callbacks
p_vendor_callbacks là một con trỏ đến biến cấu trúc hàm gọi lại mà bạn có thể chỉ định để xử lý các yêu cầu điều khiển cụ thể của lớp. Nếu bạn không sử dụng bất kỳ yêu cầu cụ thể nào của lớp hoặc cần bật/tắt thông báo, bạn có thể đặt giá trị này thành NULL.
Người cũampbên dưới cung cấp chữ ký dự kiến của trình xử lý yêu cầu cụ thể của lớp bạn.
Example – Chữ ký của hàm yêu cầu dành riêng cho lớp
void app_usbd_vendor_req_handle(uint8_t
lớp_nbr, (1)
const sl_usbd_setup_req_t *p_setup_req); (2)
sl_usbd_vendor_callbacks_t app_usbd_vendor_callback_functions =
{
.enable = NULL, .disable = NULL, .setup_req = app_usbd_vendor_req_handle,
};
(1) Số hiệu lớp nhà cung cấp.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
53/174
Quaview
(2) Con trỏ đến yêu cầu thiết lập đã nhận từ máy chủ.
Hướng dẫn lập trình lớp nhà cung cấp thiết bị USB
Phần này giải thích cách sử dụng lớp Nhà cung cấp. Khởi tạo Lớp Nhà cung cấp Thiết bị USB Thêm một Phiên bản Lớp Nhà cung cấp Thiết bị USB vào Thiết bị của bạn Giao tiếp bằng Lớp Nhà cung cấp Thiết bị USB
Khởi tạo lớp nhà cung cấp thiết bị USB
Để thêm chức năng Lớp nhà cung cấp vào thiết bị của bạn, trước tiên hãy khởi tạo lớp bằng cách gọi hàm USBD_Vendor_Init(). Ví dụampbên dưới cho thấy cách gọi sl_usbd_vendor_init() .
Example – Gọi sl_usbd_vendor_init()
sl_status_t trạng thái;
trạng thái = sl_usbd_vendor_init(); nếu (trạng thái ! SL_STATUS_OK) { /* Đã xảy ra lỗi. Cần thêm chức năng xử lý lỗi vào đây. */ }
Thêm một phiên bản lớp nhà cung cấp thiết bị USB vào thiết bị của bạn
Để thêm chức năng lớp nhà cung cấp vào thiết bị của bạn, trước tiên bạn phải tạo một phiên bản, sau đó thêm phiên bản đó vào cấu hình của thiết bị.
Tạo phiên bản lớp nhà cung cấp Thêm phiên bản lớp nhà cung cấp vào cấu hình thiết bị của bạn
Tạo một thể hiện lớp nhà cung cấp
Tạo một thể hiện lớp Nhà cung cấp bằng cách gọi hàm sl_usbd_vendor_create_instance() . Ví dụampTài liệu bên dưới hướng dẫn cách gọi sl_usbd_vendor_create_instance() bằng các đối số mặc định. Để biết thêm thông tin về các đối số cấu hình cần truyền cho sl_usbd_vendor_create_instance(), hãy xem Cấu hình Phiên bản Lớp Nhà cung cấp Thiết bị USB.
Example – Gọi sl_usbd_vendor_create_instance()
uint8_t class_nbr; sl_status_t trạng thái;
trạng thái = sl_usbd_vendor_create_instance(sai,
(1)
0u,
(2)
app_usbd_vendor_callback_functions, (3)
&class_nbr);
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
(1) Không có điểm cuối Ngắt nào với thể hiện lớp này. (2) Khoảng thời gian bị bỏ qua vì điểm cuối Ngắt bị vô hiệu hóa.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
54/174
Quaview
(3) Hàm gọi lại là một phần của ứng dụng, xử lý các yêu cầu lớp cụ thể của nhà cung cấp. Xem mục Giao tiếp bằng Lớp Nhà cung cấp Thiết bị USB để biết thêm thông tin. Thêm Phiên bản Lớp Nhà cung cấp vào Cấu hình Thiết bị của Bạn Sau khi tạo một phiên bản lớp nhà cung cấp, bạn có thể thêm nó vào cấu hình bằng cách gọi hàm USBD_Vendor_ConfigAdd(). Ví dụampbên dưới cho thấy cách gọi sl_usbd_vendor_add_to_configuration() bằng cách sử dụng các đối số mặc định.
Example – Gọi sl_usbd_vendor_add_to_configuration()
sl_status_t trạng thái;
trạng thái = sl_usbd_vendor_add_to_configuration(class_nbr,
(1)
config_nbr_fs);
(2)
nếu (trạng thái ! SL_STATUS_OK) {
/* Đã xảy ra lỗi. Cần thêm phần xử lý lỗi vào đây. */
}
(1) Số lớp để thêm vào cấu hình được trả về bởi sl_usbd_vendor_create_instance() . (2) Số cấu hình (ở đây thêm vào cấu hình Tốc độ đầy đủ).
Giao tiếp bằng cách sử dụng lớp nhà cung cấp thiết bị USB
Giao tiếp Đồng bộ Chung Giao tiếp Không đồng bộ Yêu cầu Nhà cung cấp Chung Lớp Nhà cung cấp cung cấp các hàm sau để giao tiếp với máy chủ. Để biết thêm chi tiết về các tham số của hàm, hãy xem API Nhà cung cấp Thiết bị USB.
Bảng – Tóm tắt API giao tiếp với nhà cung cấp
Tên hàm
sl_usb d _v e nd o r_ re ad _b ulk_sy nc() sl_usb d _v e nd o r_write _b ulk_sy nc() sl_usb d _v e nd o r_re ad _b ulk_asy nc() sl_usb d _v e nd o r_write _b ulk_asy nc() sl_usb d _v e nd o r_re ad _inte rrup t_sy nc() sl_usb d _v e nd o r_write _inte rrup t_sy nc() sl_usb d _v e nd o r_re ad _inte rrup t_asy nc
()
sl_usb d _v e nd o r_write _inte rrup t_asy nc
()
Operation Receives data from host through bulk OUT endpoint. This function is blocking. Sends data to host through bulk IN endpoint. This function is blocking. Receives data from host through bulk OUT endpoint. This function is non-blocking. Sends data to host through bulk IN endpoint. This function is non-blocking. Receives data from host through interrupt OUT endpoint. This function is blocking. Sends data to host through interrupt IN endpoint. This function is blocking. Receives data from host through interrupt OUT endpoint. This function is non-
chặn.
Sends data to host through interrupt IN endpoint. This function is non-blocking.
The vendor requests are also another way to communicate with the host. When managing vendor requests sent by the host, the application can receive or send data from or to the host using the control endpoint; you will need to provide an application callback passed as a parameter of sl_usbd_vendor_create_instance() . Synchronous Communication
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
55/174
Quaview
Synchronous communication means that the transfer is blocking. When a function is called, the application blocks until the transfer completes with or without an error. A timeout can be specified to avoid waiting forever. The example below shows a read and write that receives data from the host using the bulk OUT endpoint and sends data to the host using the bulk IN endpoint.
Example – Synchronous Bulk Read and Write
__ĐÃ CĂN CHỈNH(4) uint8_t rx_buf[2];
__ĐÃ CĂN CHỈNH(4) uint8_t tx_buf[2];
uint32_t
xfer_len;
sl_status_t
trạng thái;
status = sl_usbd_vendor_read_bulk_sync(class_nbr,
(1)
(void *)&rx_buf[0],
(2)
2u,
0u,
(3)
&xfer_len);
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Xử lý lỗi. */
}
status = sl_usbd_vendor_write_bulk_sync( class_nbr,
(1)
(void *)&tx_buf[0],
(4)
2u,
0u,
(3)
false,
(5)
&xfer_len);
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Xử lý lỗi. */
}
(1) The class instance number created with sl_usbd_vendor_create_instance() provides an internal reference to the Vendor class to route the transfer to the proper bulk OUT or IN endpoint.
(2) The application must ensure that the buffer provided to the function is large enough to accommodate all the data. Otherwise, synchronization issues might happen.
(3) In order to avoid an infinite blocking situation, a timeout expressed in milliseconds can be specified. A value of 809 makes the application task wait forever.
(4) Ứng dụng cung cấp bộ đệm truyền đã khởi tạo.
(5) If this flag is set to true , and the transfer length is multiple of the endpoint maximum packet size, the device stack will send a zero-length packet to the host to signal the end of the transfer.
The use of interrupt endpoint communication functions, sl_usbd_vendor_read_interrupt_sync() and sl_usbd_vendor_write_interrupt_sync() , is similar to bulk endpoint communication functions presented in Example – Synchronous Bulk Read and Write.
Truyền thông không đồng bộ
Asynchronous communication means that the transfer is non-blocking. When a function is called, the application passes the transfer information to the device stack and does not block. Other application processing can be done while the transfer is in progress over the USB bus. Once the transfer has completed, a callback function is called by the device stack to inform the application about the transfer completion. The example below shows asynchronous read and write.
Example – Asynchronous Bulk Read and Write
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
56/174
Quaview
void app_usbd_vendor_comm (uint8_t class_nbr)
{
__ĐÃ CĂN CHỈNH(4) uint8_t rx_buf[2];
__ĐÃ CĂN CHỈNH(4) uint8_t tx_buf[2];
sl_status_t
trạng thái;
status = sl_usbd_vendor_read_bulk_async(class_nbr,
(void *)&rx_buf[0],
(2)
2u,
app_usbd_vendor_rx_completed,
NULL);
(4)
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Xử lý lỗi. */
}
status = sl_usbd_vendor_write_bulk_async(class_nbr,
(void *)&tx_buf[0],
(5)
2u,
app_usbd_vendor_tx_completed,
VÔ GIÁ TRỊ,
(4)
false);
(6)
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Xử lý lỗi. */
}
}
(1) (3)
(1) (3)
static void app_usbd_vendor_rx_completed(uint8_t class_nbr,
(3)
void *p_buf,
uint32_t buf_len,
uint32_t xfer_len,
void *p_callback_arg,
sl_status_t status)
{
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Do some processing. */
} khác {
/* $$$$ Xử lý lỗi. */
}
}
static void app_usbd_vendor_tx_completed(uint8_t class_nbr,
(3)
void *p_buf,
uint32_t buf_len,
uint32_t xfer_len,
void *p_callback_arg,
sl_status_t status)
{
nếu (trạng thái ! SL_STATUS_OK) {
/* $$$$ Do some processing. */
} khác {
/* $$$$ Xử lý lỗi. */
}
}
(1) The class instance number provides an internal reference to the Vendor class to route the transfer to the proper bulk OUT or IN endpoint. (2) The application must ensure that the buffer provided is large enough to accommodate all the data. Otherwise, there may be synchronization issues. (3) The application provides a callback function pointer passed as a parameter. Upon completion of the transfer, the device stack calls this callback function so that the application can finalize the transfer by analyzing the transfer result. For instance, on completion of a read operation, the application might perform processing on the received data. Upon write completion, the application can indicate if the write was successful and how many bytes were sent.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
57/174
Quaview
(4) An argument associated with the callback can be also passed. Then in the callback context, some private information can be retrieved. (5) The application provides the initialized transmit buffer. (6) If this flag is set to true , and the transfer length is a multiple of the endpoint maximum packet size, the device stack will send a zero-length packet to the host to signal the end of transfer. The use of interrupt endpoint communication functions, sl_usbd_vendor_read_interrupt_async() and sl_usbd_vendor_write_interrupt_async() , is similar to the bulk endpoint communication functions presented in Example Asynchronous Bulk Read and Write.
Vendor Request
The USB 2.0 specification defines three types of requests: standard, class, and vendor. All standard requests are handled directly by the core layer, while class requests are managed by the proper associated class. Vendor requests can be processed by the vendor class. To process vendor requests, you must provide an application callback as a parameter of sl_usbd_vendor_create_instance() . After a vendor request is received by the USB device, it must be decoded properly. The example below shows vendor request decoding. Certain requests may be required to receive from or send to the host during the data stage of a control transfer. If no data stage is present, you only have to decode the Setup packet. This example shows the three types of data stage management: no data, data OUT and data IN.
Example – Vendor Request Decoding
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
58/174
Quaview
#define APP_VENDOR_REQ_NO_DATA
0x01u
#define APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST 0x02u
#define APP_VENDOR_REQ_SEND_DATA_TO_HOST 0x03u
#define APP_VENDOR_REQ_DATA_BUF_SIZE
50u
static uint8_t app_vendor_req_buf[APP_VENDOR_REQ_DATA_BUF_SIZE];
static bool app_usbd_vendor_req (uint8_t
class_nbr,
const sl_usbd_setup_req_t *p_setup_req)
(1)
{
bool valid;
sl_status_t trạng thái;
uint16_t req_len;
uint32_t xfer_len;
(void)class_nbr;
switch(p_setup_req->bRequest) { case APP_VENDOR_REQ_NO_DATA: valid = true; break;
(2) (3)
case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:
(4)
req_len = p_setup_req->wLength;
if (req_len > APP_VENDOR_REQ_DATA_BUF_SIZE) {
// Not enough room to receive data.
return (false);
}
// Receive data via Control OUT EP. // Wait transfer completion forever. status = sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, &xfer_len); if (status ! SL_STATUS_OK) { valid = false; } else { valid = true; } break;
case APP_VENDOR_REQ_SEND_DATA_TO_HOST:
(5)
req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;
// Fill buf with a pattern. Mem_Set((void *)&AppVendorReqBuf[0u],
'MỘT',
req_len);
// Send data via Control IN EP. // Wait transfer completion forever. status = sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, false, &xfer_len); if (status ! SL_STATUS_OK) { valid = DEF_FAIL; } else { valid = DEF_OK; } break;
mặc định:
(6)
// Request is not supported.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
59/174
Quaview
valid =true;break;
case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:(4) req_len = p_setup_req->wLength;if(req_len > APP_VENDOR_REQ_DATA_BUF_SIZE){// Not enough room to receive data.return(false);}// Receive data via Control OUT EP.// Wait transfer completion forever. status =sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,&xfer_len);if(status ! SL_STATUS_OK){ valid =false;}else{ valid =true;}break;
case APP_VENDOR_REQ_SEND_DATA_TO_HOST:(5) req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;// Fill buf with a pattern.Mem_Set((void *)&AppVendorReqBuf[0u],’A’,
req_len);// Send data via Control IN EP.// Wait transfer completion forever. status =sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,false,&xfer_len);if(status ! SL_STATUS_OK){ valid = DEF_FAIL;}else{ valid = DEF_OK;}break;
default:(6)// Request is not supported. valid = DEF_FAIL;break;}return(valid);}
(1) The core will pass the Setup packet content to your application. The structure sl_usbd_setup_req_t contains the same fields as defined by the USB 2.0 specification (refer to section “9.3 USB Device Requests” of the specification for more details):
Kiểu định nghĩa cấu trúc {
uint8_t bmRequestType; /* Characteristics of request.
*/
uint8_t bRequest; /* Specific request.
*/
uint16_t wValue; /* Varies according to request.
*/
uint16_t wIndex; /* Varies according to request; typically used as index.*/
uint16_t wLength; /* Transfer length if data stage hiện tại.
*/
} sl_usbd_setup_req_t;
(2) Determine the request. You may use a switch statement if you are using different requests. In this example, there are three different requests corresponding to the three types of the data stage: APP_VENDOR_REQ_NO_DATA, APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST, and APP_VENDOR_REQ_SEND_DATA_TO_HOST.
(3) If no data stage is present, you only need to decode the other fields. The presence of a data stage or not is indicated by the field wLength being non-null or null.
(4) If the host sends data to the device, you must call the function sl_usbd_core_read_control_sync() . The buffer provided should be able to contain up to wLength bytes. If any error occurs, return false to the core that will stall the status stage of the control transfer, indicating to the host that the request cannot be processed. true is returned in case of success.
(5) If the host receives data from the device, you must call the function sl_usbd_core_write_control_sync() . If any error occurs, return false to the core that will stall the status stage of the control transfer, indicating to the host that the request cannot be processed. true is returned in case of success.
(6) In this example, all requests not recognized are marked by returning false to the core. This one will stall the data or status stage of the control transfer indicating to the host that the request is not supported.
The host sends vendor requests through a host vendor application. USb libraries, such as libusb, can be used to help you develop your custom host vendor application.
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
60/174
Tài liệu API
Tài liệu API
Tài liệu API
Danh sách các mô-đun
USB Device API USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API
Sự miêu tả
USB Device API USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
61/174
USB Device API
USB Device API
USB Device API
USB Device API.
Các mô-đun
USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
62/174
USB Device ACM API
USB Device ACM API
USB Device ACM API
USB Device CDC ACM API.
Các mô-đun
a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t
Chức năng
sl_status_t sl_status_t
sl_status_t sl_status_t sl_status_t
sl_status_t
sl_status_t
sl_status_t
sl_status_t sl_status_t sl_status_t sl_status_t sl_status_t
a sl_usbd_cdc_ cm_init(void)
GLOBAL VARIABLES.
ssll__uussbbdd__ccddcc__aaccmm__ccraellabtaec_kins_stta*npc_ea(cumin_tc1a6l_lbtalicnkes_,sutaintte8__int t*eprv_saul,bucinlats1s6__nt bcra)ll_mgmt_capabilities,
Add a new instance of the CDC ACM serial emulation subclass.
a a a a sl_usbd_cdc_ cm_ dd_to_configur tion(uint8_t subcl ss_nbr, uint8_t config_nbr)
Add a CDC ACM subclass class instance into USB device configuration.
a a sl_usbd_cdc_ cm_is_en bled(uint8_t subclass_nbr, bool *p_enabled)
Get the CDC ACM serial emulation subclass enable state.
a a a sl_usbd_cdc_ cm_re d(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t timeout, uint32_t
*p_xfer_len) Receive data on the CDC ACM serial emulation subclass.
a a a a sl_usbd_cdc_ cm_re d_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, a a a a sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_ rg)
Receive data on the CDC ACM serial emulation subclass asynchronously.
a a sl_usbd_cdc_ cm_write(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t timeout, uint32_t
*p_xfer_len) Send data on the CDC ACM serial emulation subclass.
a a a sl_usbd_cdc_ cm_write_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, a a a a sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_ rg)
Send data on the CDC ACM serial emulation subclass asynchronously.
a a a sl_usbd_cdc_ cm_get_line_control_st te(uint8_t subcl ss_nbr, uint8_t *p_line_ctrl)
Return the state of control lines.
a a a sl_usbd_cdc_ cm_get_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Get the current state of the line coding.
a a a sl_usbd_cdc_ cm_set_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Set a new line coding.
a a a sl_usbd_cdc_ cm_set_line_st te_event(uint8_t subcl ss_nbr, uint8_t events)
Set a line state event(s).
a a a a sl_usbd_cdc_ cm_cle r_line_st te_event(uint8_t subcl ss_nbr, uint8_t events)
Clear a line state event(s).
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
63/174
USB Device ACM API
Macro
#define SL_USBD_CDC_ACM_NBR_NONE 255u
MÔ ĐUN.
#define SL_USBD_CDC_ACM_PARITY_NONE 0u
PORT SETTINGS DEFINES.
#define SL_USBD_CDC_ACM_PARITY_ODD 1u #define SL_USBD_CDC_ACM_PARITY_EVEN 2u #define SL_USBD_CDC_ACM_PARITY_MARK 3u #define SL_USBD_CDC_ACM_PARITY_SPACE 4u #define SL_USBD_CDC_ACM_STOP_BIT_1 0u #define SL_USBD_CDC_ACM_STOP_BIT_1_5 1u #define SL_USBD_CDC_ACM_STOP_BIT_2 2u #define SL_USBD_CDC_ACM_CTRL_BREAK 0 01u
LINE EVENTS FLAGS DEFINES.
#define SL_USBD_CDC_ACM_CTRL_RTS 0 02u #define SL_USBD_CDC_ACM_CTRL_DTR 0 04u #define SL_USBD_CDC_ACM_STATE_DCD 0 01u #define SL_USBD_CDC_ACM_STATE_DSR 0 02u #define SL_USBD_CDC_ACM_STATE_BREAK 0 04u #define SL_USBD_CDC_ACM_STATE_RING 0 08u #define SL_USBD_CDC_ACM_STATE_FRAMING 0 10u #define SL_USBD_CDC_ACM_STATE_PARITY 0 20u #define SL_USBD_CDC_ACM_STATE_OVERUN 0 40u #define SL_USBD_CDC_ACM_CALL_MGMT_DEV 0 01u
CALL MANAGEMENT CAPABILITIES.
#define SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI 0 02u #define SL_USBD_CDC_ACM_CALL_MGMT_DATA_OVER_DCI 0 02u | 0 01u)
Function Documentation
sl_usbd_cdc_acm_init
sl_status_t sl_usbd_cdc_acm_init (void )
GLOBAL VARIABLES. Parameters
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
64/174
USB Device ACM API
Kiểu
vô hiệu
Direction N/A
Argument Name
MACROS GLOBAL CONSTANTS FUNCTION PROTOTYPES CDC ACM FUNCTIONS
Initialize the CDC ACM serial emulation subclass.
Trả lại
Returns SL_STATUS_OK on success or another SL_STATUS code on failure.
Sự miêu tả
sl_usbd_cdc_acm_create_instance
sl_status_t sl_usbd_cdc_acm_create_instance (uint16_t line_state_interval, uint16_t call_mgmt_capabilities, sl_usbd_cdc_acm_callbacks_t * p_acm_callbacks, uint8_t * p_subclass_nbr)
Add a new instance of the CDC ACM serial emulation subclass.
Các tham số
Kiểu
uint16_t
uint16_t
Direction Argument Name
Sự miêu tả
Không có
line_state_interval Line state notification interval in milliseconds (value must
be a power of 2).
Không có
call_mgmt_capabilities Call Management Capabilities bitmap. OR’ed of the
following flags:
SL_USBD_CDC_ACM_CALL_MGMT_DEV Device handles call management itself. SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI Device can send/receive call management information over a Data Class interface.
sl_usbd_cdc_acm_callbacks_t N/A
*
uint8_t *
Không có
p_acm_callbacks p_subclass_nbr
Optional pointers to callback functions to be called on various events.
Param to variable that will receive CDC ACM serial emulation subclass instance number.
Trả lại
Return SL_STATUS_OK on success or another SL_STATUS code on failure.
sl_usbd_cdc_acm_add_to_configuration
sl_status_t sl_usbd_cdc_acm_add_to_configuration (uint8_t subclass_nbr, uint8_t config_nbr)
Add a CDC ACM subclass class instance into USB device configuration.
Các tham số
Kiểu
uint8_t uint8_t
Direction N/A N/A
Argument Name
subclass_nbr config_nbr
Description CDC ACM serial emulation subclass instance number. Configuration index to add new test class interface to.
Trả lại
Bản quyền © 2025 Phòng thí nghiệm Silicon. Đã đăng ký Bản quyền.
65/174
USB Device ACM API
Returns SL_STATUS_OK on success or another SL_STATUS code on failure.
sl_usbd_cdc_acm_is_enabled
sl_status_t sl_usbd_cdc_acm_is_enabled (uint8_t subclass_nbr, bool * p_enabled)
Get the CDC ACM serial emulation subclass enable state.
Các tham số
Kiểu
Phương hướng
Argument Name
Sự miêu tả
uint8_t N/A
subclass_nbr CDC ACM serial emulation subclass instance number.
bool * N/A
p_enabled
Boolean to a variable that will receive enable status. The variable is set to true, CDC ACM serial emulation is enabled. The va
Tài liệu / Tài nguyên
![]() |
SILICON LABS USB Device Stack [tập tin pdf] Hướng dẫn sử dụng USB Device Stack, Device Stack, Stack |