USB裝置堆疊
規格
- USB 版本:1.5.1
- 發售日期:21 年 2025 月 XNUMX 日
- Simplicity SDK 版本:2025.6.1
產品結束view
Silicon Labs 的 USB 裝置堆疊提供多功能和
易於使用的 USB 連接,適用於物聯網項目,方便
網路協處理器和主機之間的通訊。
特徵
- 高效的 USB 裝置堆疊
- 非常適合物聯網項目
- 支援網路協處理器和
主機
產品使用說明
USB裝置配置
根據您的專案配置 USB 裝置設置
參考 USB 裝置設定部分
在文檔中。
USB裝置程式設計指南
請按照 USB 裝置編程指南來了解如何
編程並與 USB 裝置互動以實現各種
應用程式.
USB 裝置類別
USB 裝置類別部分提供了view 不同的
類別,例如 CDC ACM、HID、MSC SCSI 和供應商類別。選擇
根據您的設備功能選擇適當的類別。
USB 裝置故障排除
如果您遇到任何 USB 裝置問題,請參閱
USB 裝置故障排除部分,提供解決方案和除錯
尖端。
Microsoft Windows 作業系統 USB 主機
如果您使用具有 Microsoft Windows OS USB 的 USB 設備
主持人,請務必遵循
無縫整合的文檔。
常問問題
Q:常見的ex有哪些amp我可以使用的設備數量
這個 USB 堆疊?
答:USB 堆疊允許您建置以下設備:
USB 轉串列轉接器、滑鼠或鍵盤、可移動存儲
設備和自訂設備。
Q:使用此軟體有什麼特定的要求嗎?
USB 裝置堆疊?
答:相容軟體包括 Simplicity SDK、Simplicity
Studio、Simplicity Commander、GCC(GNU 編譯器集合)、
IAR Embedded Workbench for ARM 和 IAR EWARM。
通用序列匯流排 USB
通用序列匯流排 USB
USB 介面view 超過view
發行說明 USB
規格和特點view
USB 裝置設定結束view
USB 裝置程式設計指南結束view
USB 裝置類別view CDC ACM 課程結束view HID 等級結束view MSC SCSI 級結束view 供應商類別結束view
USB API API 文件 USB 裝置 API USB 裝置 ACM API a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t USB 裝置 CDC API a sl_usbd_cdc_subclss_driver_t USB 裝置核心 API
sl_usbd_device_config_t sl_usbd_setup_req_t
sl_usbd_cl ss_driver_t USB 裝置 HID API
sl_usbd_hid_callbacks_t USB 裝置 MSC API
sl_usbd_msc_subcl ss_driver_t USB 裝置 MSC SCSI API
sl_usbd_msc_scsi_callbacks_t
版權所有 © 2025 Silicon Laboratories。版權所有。
1/174
通用序列匯流排 USB
sl_usbd_msc_scsi_lun_ pi
sl_usbd_msc_scsi_lun_info sl_usbd_msc_scsi_lun
USB 設備供應商 API sl_usbd_vendor_callbacks_t
API 文件 USB 裝置故障排除
超過view Microsoft Windows 作業系統 USB 主機
超過view
版權所有 © 2025 Silicon Laboratories。版權所有。
2/174
超過view
超過view
USB裝置
USB 是電腦系統史上最成功的通訊介面之一,也是連接電腦週邊的事實標準。 Silicon Labs USB 裝置堆疊是一款專為嵌入式系統設計的 USB 裝置模組。它完全基於 Silicon Labs 的品質、可擴展性和可靠性構建,並經過了嚴格的驗證流程,符合 USB 2.0 規範。本文檔介紹如何初始化、啟動和使用 Silicon Labs USB 設備堆疊,解釋了各種配置值及其用途,還包含一個完整的view 技術、配置可能性的類型、實作程序和範例amp每個可用類別的典型用法。
為了幫助您快速理解 USB 概念,文件提供了許多範例amp具有基本功能的 USB 檔案。這些範例amples 將為您提供一個框架,讓您可以快速建造設備。這些範例amp其中包括:
USB 轉串列適配器(通訊設備類別) 滑鼠或鍵盤(人機介面設備類別) 可移動儲存裝置(大容量儲存類別) 自訂設備(供應商類別)
以下是完結view 文檔部分:
規格與特性 USB 裝置設定 USB 裝置程式設計指南 USB 裝置類別
CDC ACM 類別 HID 類別 MSC SCSI 類別 供應商類別 USB 裝置故障排除 Microsoft Windows 作業系統 USB 主機
版權所有 © 2025 Silicon Laboratories。版權所有。
3/174
USB
USB
USB 版本 1.5.1 2025 年 7 月 21 日 – 發行說明
Simplicity SDK 版本 2025.6.1
Silicon Labs 高效的 USB 裝置堆疊提供多功能、易於使用的 USB 連接,非常適合物聯網項目,包括網路協處理器和主機之間的通訊。點擊此處查看早期版本。
發布摘要
主要功能 | API 變更 | 錯誤修復 | 晶片支援
主要特點
僅底層平台發生變化。
API 變更
沒有任何。
錯誤修復
沒有任何。
晶片支援
沒有任何。
主要特點
新功能 | 增強功能 | 已刪除的功能 | 已棄用的功能
新功能
沒有任何。
增強功能
僅底層平台發生變化。
已刪除的功能
沒有任何。
已棄用的功能
沒有任何。
API 變更
新的 API | 修改後的 API | 刪除的 API | 棄用的 API
新 API
版權所有 © 2025 Silicon Laboratories。版權所有。
4/174
USB
沒有任何。
修改後的 API
沒有任何。
已刪除的 API
沒有任何。
已棄用的 API
沒有任何。
錯誤修復
沒有任何。
晶片支援
沒有任何。
應用實例amp變化
新前任amples | 修改後的 Examples | 已刪除 Examples | 棄用的 Examp萊斯
新前任amp萊斯
沒有任何。
修改版amp萊斯
沒有任何。
刪除前amp萊斯
沒有任何。
已棄用的 Examp萊斯
沒有任何。
版本變更的影響
影響聲明 | 遷移指南
影響陳述
沒有任何。
遷移指南
沒有任何。
已知問題和限制
沒有任何。
使用此版本
版權所有 © 2025 Silicon Laboratories。版權所有。
5/174
USB
此版本包含哪些內容? | 相容軟體 | 安裝與使用 | 幫助與回饋
此次發布包含哪些內容?
USB 裝置堆疊應用程式範例amp萊斯
相容軟體
軟體
Simplicity SDK Simplicity Studio Simplicity Commander GCC(GNU 編譯器集合) IAR Embedded Workbench for ARM IAR EWARM
相容版本或變體
2025.6.0 5.11.0 1.18.2(隨 Simplicity Studio 提供) 12.2.1(隨 Simplicity Studio 提供) 9.40.1(隨 Simplicity Studio 提供)
安裝與使用
要開始您的開發,請參閱:
USB 裝置程式設計指南。 API 文件。
有關安全保險庫整合的信息,請參閱安全保險庫。
重新view 安全性和軟體公告通知並管理您的通知偏好:
ò 前往 https://community.silabs.com/。 ó 使用您的帳戶憑證登入。 ô 點選您的專業file 頁面右上角的圖示。
õ 從下拉式選單中選擇「通知」。 ö 在「通知」部分,前往「我的產品通知」標籤以重新view 歷史安全與軟體諮詢
通知
÷ 若要管理您的偏好設置,請使用「管理通知」標籤自訂您要接收的產品更新和建議
收到。
有關建議的配置設置,請參閱此處。
要了解有關此版本軟體的更多信息,請深入了解我們的線上文件。
幫助和回饋
聯絡 Silicon Labs 支援團隊。如需使用我們的 Ask AI 工具取得答案,請查看本頁面頂部的搜尋列。
注意:Ask AI 尚處於實驗階段。
從我們的開發者社群獲得幫助。
SDK發布及維護政策
請參閱我們的 SDK 發布和維護政策。
版權所有 © 2025 Silicon Laboratories。版權所有。
6/174
超過view
超過view
規格
符合「通用序列匯流排規範修訂版 2.0」 實施「介面關聯描述符工程變更通知 (ECN)」 傳輸類型
控制批量中斷 USB 類別 通訊設備類別 (CDC) 抽象控制模型 (ACM) 人機介面設備 (HID) 大容量儲存類別 (MSC) 供應商特定的類別框架
特徵
可擴充至僅包含所需功能,以最大限度地減少記憶體佔用 支援全速(12 Mbit/s) 支援複合(多功能)裝置 支援多組態裝置 支援 USB 省電功能(裝置掛起和復原) 將大容量儲存類別完全整合到 Micrium OS 中 File 系統模組採用 CMSIS-RTOS2 抽象層開發,以便與不同的作業系統相容。 Silicon Labs GSDK 隨附 FreeRTOS 和 Micrium OS 連接埠。
版權所有 © 2025 Silicon Laboratories。版權所有。
7/174
超過view
超過view
USB裝置配置
本節討論如何設定 Silicon Labs USB 裝置。配置參數有三組,如下圖所示:
USB 裝置核心配置 USB 裝置資訊配置 USB 裝置硬體配置
USB裝置核心配置
Silicon Labs USB 裝置可以在編譯時透過位於 sl_usbd_core_config.h 中的一組 #define 進行配置 fileUSB 裝置盡可能使用 #define,因為它們允許在編譯時根據啟用的功能調整程式碼和資料大小。這使得 Silicon Labs USB 裝置的唯讀記憶體 (ROM) 和隨機存取記憶體 (RAM) 佔用空間可以根據您的應用需求進行調整。
建議:使用預設值(以粗體突出顯示)開始設定程序。
以下部分根據範本配置中的順序進行組織 file,sl_usbd_core_config.h。
核心配置類別配置
核心配置
表 – USB 裝置核心配置常數
常數描述
預設值
SL_USBD_TASK_STACK_大小
配置 USBD 核心任務的堆疊大小(以位元組為單位)
4096
SL_USBD_任務優先權
配置 USBD 核心任務的優先順序。這是 CMSIS-RTOS2 優先權。
作業系統優先權高
SL_USBD_A UTO_START _USB_設備
如果啟用,USB 裝置將在核心啟動並首次調度 1 個 USBD 核心任務後自動啟動。如果停用,您的應用程式需要在準備好被 USB 主機偵測時呼叫 sl_usbd_core_start_device()。
SL_USBD_C 將透過 sl_usbd_add_configuration() 新增的設定總數
1
ONFIGURATI 功能。
ON_QUANTI
TY
版權所有 © 2025 Silicon Laboratories。版權所有。
8/174
超過view
持續的
SL_USBD _INTERF ACE_數量
SL_USBD _ALT_INT ERFACE_ QUANTI
TY
SL_USBD _介面_GR
OUP_QU
安蒂
SL_USBD _描述
PTOR_Q
實用性
SL_USBD _字串 _數量
TY
SL_USBD _OPEN_ENDPOIN TS_QUA NTITY
描述:所有配置中需要新增的 USB 介面總數。這很大程度上取決於所使用的類別。有關類別實例所需介面數量的更多信息,請參閱類別的“核心資源需求”部分。
您的所有配置中需要新增的 USB 備用介面總數。這在很大程度上取決於所使用的類別。此值必須永遠等於或大於 SL_USBD_INTERFACE_QUANTITY 。有關類別實例需要多少個備用介面的更多信息,請參閱您的類別的“核心資源需求”部分。
您的所有配置中將會新增的 USB 介面組總數。這很大程度上取決於所使用的類別。有關每個類別實例需要多少個介面組的更多信息,請參閱您的類別的“核心資源需求”部分。
將為所有組態新增的端點描述符總數。這在很大程度上取決於所使用的類別。有關類別實例需要多少個端點描述符的更多信息,請參閱類別的“核心資源需求”部分中的“端點數量”。請注意,此處無需考慮控制端點。 USB 字串的總數。將數量設為零將禁用該功能。停用此功能將導致裝置不儲存從應用程式傳遞的任何 USB 描述字串。這意味著主機將無法檢索描述字串(例如製造商和產品名稱)。每個配置打開的端點總數。裝置至少需要兩個開啟的端點才能進行控制傳輸,但您也必須新增所用類別的端點。有關類別實例需要多少個打開的端點的更多信息,請參閱類別的“核心資源需求”部分中的“端點數量”。
預設值
10 10
2
20 30 20
類別配置
類別具有特定的編譯時配置。有關更多信息,請參閱 USB 裝置類別。
USB裝置資訊配置
sl_usbd_device_config.h 配置 file 重新組合編譯時#define-s來設定有關設備的基本信息,例如供應商/產品ID、設備字串等。下表描述了此配置中可用的每個資訊配置定義 file.
表 – USB 裝置資訊配置定義
持續的
SL_USBD_設備_供應商_ID
SL_USBD_設備_產品_ID
描述:USB 實施者論壇 (USB Implementers Forum) 提供的供應商識別號碼。有關如何獲取供應商 ID 的更多信息,請訪問 http://www.usb.org/developers/vendor/ 。您的產品識別號碼。
版權所有 © 2025 Silicon Laboratories。版權所有。
9/174
超過view
持續的
描述
SL_USBD_DEVICE_RELEASE 您的裝置的版本號碼。 _NUMBER
SL_USBD_DEVICE_MANUFA 字串,描述設備製造商。當
CTURER_STRING
配置 SL_USBD_STRING_QUANTITY 設定為 0。
SL_USBD_DEVICE_PRODUC 描述您的產品的字串。配置
T_字串
SL_USBD_STRING_QUANTITY 設定為 0。
SL_USBD_DEVICE_SERIAL_N 包含裝置序號的字串。當
NUMBER_STRING
配置 SL_USBD_STRING_QUANTITY 設定為 0。
SL_USBD_DEVICE_LANGUA 設備字串語言的識別號碼。可能的值包括:
GE_ID
– 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_葡萄牙語
– SL_USBD_LANG_ID_SANSKRIT
當配置 SL_USBD_STRING_QUANTITY 設定為 0 時,此配置將被忽略。
USB裝置硬體配置
根據您使用的 Silicon Labs 設備,您可能需要設定 GPIO 引腳和連接埠來接收 USB VBUS Sense 訊號。配置定義位於 sl_usbd_hardware_config.h 頭檔中。 file.
持續的
SL_USBD_DRIVER_VBUS_SENSE_連接埠 SL_USBD_DRIVER_VBUS_SENSE_PIN
描述
開發板上 USB VBUS Sense 訊號的 GPIO 連接埠。開發板上 USB VBUS Sense 訊號的 GPIO 接腳。
版權所有 © 2025 Silicon Laboratories。版權所有。
10/174
超過view
超過view
USB裝置程式設計指南
本節介紹如何使用 USB 裝置模組。
USB設備模組的初始設置
本節介紹初始化 USB 裝置模組以及新增、準備和啟動裝置的基本步驟。初始化 USB 裝置模組 初始化 USB 裝置核心 初始化 aCl ss 新增 USB 裝置 建置 USB 裝置 新增設定 新增 USB 功能 啟動 USB 設備
事件鉤子函數
初始化USB設備模組
初始化USB設備核心
首先透過呼叫函數 sl_usbd_core_init() 初始化 B 裝置模組核心。下面的範例顯示如何呼叫 sl_usbd_core_init() 。
Example – 呼叫 sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
初始化類別
USB 裝置模組核心初始化完成後,您必須初始化每個要使用的類別。有關更多信息,請參閱您的 acl 文件的“編程指南”部分。
建立您的 USB 設備
新增配置
成功初始化裝置後,即可開始新增 USB 功能,先從新組態開始。每個設備必須至少有一個配置。若要新增配置,請呼叫 sl_usbd_core_dd_configuration() 函數。每個要新增的配置都必須呼叫此函數。範例amp下面的文件顯示如何增加全速。
Example – 為您的裝置新增配置
版權所有 © 2025 Silicon Laboratories。版權所有。
11/174
超過view
sl_status_t 狀態;uint8_t config_nbr_fs;
/* 在設備上新增全速配置。 */
狀態 = sl_usbd_core_add_configuration(0,
/* 配置沒有特殊屬性。 */
100u,
/* 最大耗電量:100mA。
*/
SL_USBD_設備_速度_滿速,
/* 全速配置。
*/
“配置新增 Example 全速配置”,
&config_nbr_fs);
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
新增 USB 功能
成功新增至少一個配置後,即可將介面和端點新增至設備。每個 USB 類別在介面和端點的類型、數量以及其他參數方面都有各自的需求。 Silicon Labs USB 裝置會在其提供的類別中新增介面和端點。
您可以在應用程式中實例化一個 USB 類別並將其新增至設定。有關 USB 裝置類別實例概念的更多信息,請參閱 USB 裝置類別。請注意,您可以實例化多個不同的類別實例並將其新增至配置中,以建立多功能(複合)設備。
前任amp下面的文件展示瞭如何建立類別實例並將其新增至組態。
Example – 為您的裝置新增類別實例
sl_status_t 狀態;uint8_t class_nbr;
/* 建立您想要使用的類別的實例。 */ /* 請注意,根據類別的不同,此函數可以有更多參數。 */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */}
/* 將類別實例新增至全速配置。 */ status = sl_usbd_ _add_to_configuration(class_nbr, /* sl_usbd_ 傳回的類別號_創建_實例。 */
config_nbr_fs); /* 由 sl_usbd_core_add_configuration() 傳回的設定編號。 */ if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */}
啟動您的 USB 設備
預設情況下,裝置初始化完成且核心啟動後,USB 裝置核心任務會自動啟動裝置。若要控制裝置何時啟動並使其對 USB 主機可見,請使用設定定義 SL_USBD_AUTO_START_USB_DEVICE 停用自動啟動功能。停用後,在建置/準備好裝置後,您可以透過呼叫函數 sl_usbd_core_start_device() 來啟動裝置並使其對 USB 主機可見。
前任amp下面的檔案展示如何使用 sl_usbd_core_start_device() 函數啟動您的裝置。
Example – 啟動您的設備
版權所有 © 2025 Silicon Laboratories。版權所有。
12/174
超過view
sl_status_t 狀態;
status = sl_usbd_core_start_device(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */}
事件鉤子函數
USB 裝置核心模組提供了兩個弱鉤子函數,您可以在應用程式中重新定義它們。它們的作用是當總線和配置事件發生時發出通知。
表 – USB 事件掛鉤函數
事件
描述
公車
當 USB 總線事件發生時調用
配置 當 USB 配置事件發生時調用
函數簽名
void sl_usbd_on_bus_event(sl_usbd_bus_event_t 事件);void sl_usbd_on_config_event(sl_usbd_config_event_t 事件,uint8_t config_nbr);
Example – 事件鉤子函數
void sl_usbd_on_bus_event(sl_usbd_bus_event_t event) { switch (event) { case SL_USBD_EVENT_BUS_CONNECT:
// 當 USB 纜線插入主機控制器中斷時呼叫;
case SL_USBD_EVENT_BUS_DISCONNECT: //當 USB 纜線從主機控制器斷開時呼叫;
case SL_USBD_EVENT_BUS_RESET: //當主機傳送重設指令時呼叫 break;
case SL_USBD_EVENT_BUS_SUSPEND: //當主機傳送暫停指令時呼叫 break;
case SL_USBD_EVENT_BUS_RESUME: //當主機傳送喚醒指令時呼叫 break;
預設:中斷;} }
void sl_usbd_on_config_event(sl_usbd_config_event_t event, uint8_t config_nbr) { switch (event) { case SL_USBD_EVENT_CONFIG_SET:
// 當主機設定配置中斷時呼叫;
case SL_USBD_EVENT_CONFIG_UNSET: // 當設定未設定時呼叫 break;
預設:中斷;} }
版權所有 © 2025 Silicon Laboratories。版權所有。
13/174
超過view
版權所有 © 2025 Silicon Laboratories。版權所有。
14/174
超過view
超過view
USB 裝置類別
Silicon Labs USB 裝置中提供的 USB 類別具有一些共同的特性。本節介紹這些特性及其與核心層的交互作用。
有關特定類別的更多信息,請參閱以下內容:
CDC ACM 類別 HID 類別 MSC SCSI 類別 供應商類
關於類別實例
USB 裝置中提供的 USB 類別實作了類別實例的概念。一個類別實例代表設備中的一項功能。此功能可以由一個介面或一組介面描述,並且屬於某個特定的類別。
基於類別實例的概念,每個 USB 類別實作都有一些共同的配置和功能。下表列出了這些共同的配置和功能。在「常數或函數」列標題中,佔位符 XXXX 可以替換為類別的名稱:CDC、HID、MSC、CDC_ACM 或 VENDOR(函數名稱為供應商)。
表 – 與多個類別實例概念相關的常數和函數
常數或函數
SL_USBD_XXXX_CLASS_INSTANCE_QUANTITY
SL_USBD_XXXX_配置_數量
sl_usb d _XXXX_cre ate _insta nce ()
sl_usbd_XXXX_add_to_conf 配置()
描述
配置類別實例的最大數量。
配置最大配置數。在類別初始化期間,建立的類別實例將被添加到一個或多個配置中。建立一個新的類別實例。
將現有類別實例新增至指定的設備配置。
在程式碼實作方面,類別會宣告一個包含類別控制結構的局部全域變數。此類別控制結構與一個類別實例關聯,並包含用於管理該類別實例的特定資訊。
下圖展示了幾種情況。每幅圖都包含一個程式碼範例amp與案例場景相對應的 le。
圖 – 多個類別實例 – FS 裝置(1 個配置,1 個介面)代表一個典型的 USB 裝置。該設備為全速 (FS) 設備,包含單一配置。該設備的功能由一個介面描述,該介面由一對用於資料通訊的端點組成。系統會建立一個類別實例,讓您可以管理整個介面及其關聯的端點。
圖 – 多個類別實例 – FS 設備 1 配置(帶 1 個介面)
版權所有 © 2025 Silicon Laboratories。版權所有。
15/174
超過view
與圖 – 多個類別實例 – FS 設備(1 個配置,1 個介面)對應的程式碼顯示在 ex 中amp下面。
Example – 多個類別實例 – FS 設備 1 配置(附 1 個介面)
sl_status_t 狀態;uint8_t class_0;
void app_usbd_XXXX_enable(uint8_t class_nbr) { /* 處理類別啟用事件。 */}
void app_usbd_XXXX_disable(uint8_t class_nbr) { /* 處理類別停用事件。 */}
sl_usbd_XXXX_callbacks_t 類別回呼={
(1)
.啟用=app_usbd_XXXX_啟用,
.disable = app_usbd_XXXX_disable
};
狀態=sl_usbd_XXXX_init();
(2)
如果(狀態!SL_STATUS_OK){
/* $$$$ 處理錯誤。 */
}
狀態 = sl_usbd_XXXX_create_instance(&class_callbacks,
(3)
&class_0);
如果(狀態!SL_STATUS_OK){
/* $$$$ 處理錯誤。 */
}
狀態=sl_usbd_XXXX_add_to_configuration(class_0,config_0);
(4)
如果(狀態!SL_STATUS_OK){
/* $$$$ 處理錯誤。 */
}
(1) 每個類別都提供了一組回呼函數,用於處理設備連接/斷開事件以及類別特有的事件。回調結構體物件在使用 sl_usbd_XXXX_create_instance() 建立類別實例時會作為參數傳遞。
功能。
(1)初始化類別。所有內部變數、結構體和類別連接埠都將初始化。請注意,某些類別中的 Init() 函數可能會接受其他參數。
版權所有 © 2025 Silicon Laboratories。版權所有。
16/174
超過view
(2) 建立類別實例 class_0 。函數 sl_usbd_XXXX_create_instance() 指派與 class_0 關聯的類別控制結構。根據類別的不同,sl_usbd_XXXX_create_instance() 除了類別編號之外,可能還有其他參數,這些參數表示儲存在類別控制結構中的類別特定資訊。 aaa (3) 將類別實例 class_0 新增至指定的設定編號 config_0 。 sl_usbd_XXXX_add_to_configuration() 將建立介面 0 及其關聯的 IN 和 OUT 端點。因此,類別實例包含介面 0 及其端點。在介面 0 上進行的任何通訊都將使用類別實例編號 class_0 。圖 – 多個類別實例 – FS 設備(2 種配置和多個介面)表示一個更複雜的範例amp例如,一個全速設備由兩種配置組成。該設備有兩個屬於同一類別的功能,但每個功能由兩個介面描述,並具有一對雙向端點。在本例中amp例如,建立了兩個類別實例。每個類別實例都與一組介面相關聯,這與圖 - 多個類別實例 - FS 設備(1 個配置,1 個介面)和圖 - 多個類別實例 - FS 設備(2 個配置,多個介面)中類別實例僅與單一介面相關聯不同。
圖 – 多個類別實例 – FS 設備 2 配置和多個介面)
圖 – 多個類別實例 – FS 設備(2 個配置和多個介面)對應的程式碼如下amp如下。為了清楚起見,省略了錯誤處理。
Example – 多個類別實例 – FS 設備 2 設定和多個介面)
版權所有 © 2025 Silicon Laboratories。版權所有。
17/174
超過view
sl_status_t 狀態;uint8_t class_0;uint8_t class_1;
狀態=sl_usbd_XXXX_init();
狀態 = sl_usbd_XXXX_create_instance(&class_0); 狀態 = sl_usbd_XXXX_create_instance(&class_1);
狀態 = sl_usbd_XXXX_add_to_configuration(class_0,cfg_0); 狀態 = sl_usbd_XXXX_add_to_configuration(class_1,cfg_0);
狀態 = sl_usbd_XXXX_add_to_configuration(class_0,cfg_1); 狀態 = sl_usbd_XXXX_add_to_configuration(class_1,cfg_1);
(1)
(2) (3)
(4) (5)
(6) (6)
(1)初始化類別。所有內部變數、結構體以及類別連接埠都將被初始化。
(2)建立類別實例 class_0 。函數 sl_usbd_XXXX_create_instance() 指派與 class_0 關聯的類別控制結構。
(3)建立類別實例 class_1 。函數 sl_usbd_XXXX_create_instance() 指派另一個與 class_1 關聯的類別控制結構。
(4)將類別實例 class_0 加入到設定 cfg_0 中。 sl_usbd_XXXX_add_to_configuration() 將建立介面 0、介面 1、備用介面以及關聯的 IN 和 OUT 端點。類別實例編號 class_0 將用於介面 0 或介面 1 上的任何資料通訊。
(5)將類別實例 class_1 加入到設定 cfg_0 中。 sl_usbd_XXXX_add_to_configuration() 將建立介面 2、介面 3 及其關聯的 IN 和 OUT 端點。類別實例編號 class_1 將用於介面 2 或介面 3 上的任何資料通訊。
(6)將相同的類別實例 class_0 和 class_1 加入到另一個設定 cfg_1 中。
每個類別都定義了 sl_usbd_XXXX_callbacks_t 類型的結構體。其目的是為每個類別提供一組回調函數,以便在事件發生時呼叫。每個類別中有兩個回調函數。它們如下表所示。
表 – 常用類別回呼函數
欄位描述 .enable 當 USB 類別實例成功啟用時呼叫。 .disable 當 USB 類別實例停用時呼叫。
函式簽章 void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);
版權所有 © 2025 Silicon Laboratories。版權所有。
18/174
超過view
超過view
USB 裝置 CDC ACM 類
USB 裝置 CDC 基類view USB 裝置 CDC ACM 類別資源需要來自核心 USB 裝置 CDC ACM 子類view USB 裝置 CDC ACM 類別設定 USB 裝置 CDC ACM 類別程式設計指南
本節介紹 Silicon Labs 的 USB 裝置堆疊支援的通訊裝置類別 (CDC) 及其相關的 CDC 子類別。 Silicon Labs 的 USB 裝置目前支援抽象控制模型 (ACM) 子類,該子類通常用於串行模擬。
CDC 涵蓋各種電信和網路設備。電信設備包括類比調變解調器、類比和數位電話、ISDN 終端適配器等。例如amp例如,網路設備包括 ADSL 和電纜數據機、乙太網路適配器和集線器。 CDC 定義了一個框架,用於封裝現有的通訊服務標準,例如 V.250(用於電話網路上的數據機)和乙太網路(用於區域網路設備),並使用 USB 連結。通訊設備負責設備管理、必要時的呼叫管理和資料傳輸。
CDC 定義了七大類設備。每類設備都屬於一種通訊模型,該模型可能包含多個子類別。除了 CDC 基類之外,每類設備都有各自的規範文件。這七大類設備分別是:
公共交換電話網路 (PSTN),包括語音頻帶數據機、電話和序列模擬設備在內的設備。綜合業務數位網路 (ISDN) 設備,包括終端適配器和電話。乙太網路控制模型 (ECM) 設備,包括支援 IEEE 802 系列的設備(例如:電纜和 ADSL 數據機、WiFi 適配器)。非同步傳輸模式 (ATM) 設備,包括 ADSL 數據機和連接到 ATM 網路的其他設備(工作站、路由器、LAN 交換器)。無線行動通訊 (WMC) 設備,包括用於管理語音和數據通訊的多功能通訊手機設備。乙太網路模擬模型 (EEM) 設備,用於交換乙太網路訊框資料。網路控制模型 (NCM) 設備,包括高速網路設備(高速分組存取數據機、線路終端設備)
CDC 和相關子類別實作符合以下規範:
通用序列匯流排,通訊設備類別定義,修訂版 1.2,2010 年 11 月 3 日。通用序列匯流排,通信,PSTN 設備子類,修訂版 1.2,2007 年 2 月 9 日。
USB 裝置 CDC 基類view
CDC設備由以下介面組成,實現通訊能力:
通訊類別介面 (CCI) 負責設備管理,並可選擇地負責呼叫管理。
設備管理支援設備的常規配置和控制,並向主機發送事件通知。呼叫管理支援建立和終止呼叫。呼叫管理可以透過 DCI 進行多路復用。所有 CDC 設備都必須具備 CCI。 CCI 透過指定 CDC 設備支援的通訊模型來識別 CDC 功能。 CCI 之後的接口可以是任何已定義的 USB 類別接口,例如音訊接口或供應商特定接口。供應商特定介面由 DCI 專門表示。
資料類介面 (DCI) 負責資料傳輸。發送和/或接收的資料不遵循特定的
格式。數據可以是來自通訊線路的原始數據,也可以是遵循專有格式的數據等。所有遵循CCI的DCI都可以看作是下屬介面。
CDC 設備必須至少有一個 CCI 和零個或多個 DCI。一個 CCI 和任何從屬 DCI 共同向主機提供一項功能。此功能也稱為函數。在 CDC 複合設備中,可以有多個
版權所有 © 2025 Silicon Laboratories。版權所有。
19/174
超過view
功能。因此,該設備將由多組 CCI 和 DCI 組成,如圖 - CDC 複合設備所示。
圖 – CDC 複合設備
CDC 裝置可能使用下列端點組合:
一對控制輸入和輸出端點,稱為預設端點。一個可選的批次或中斷輸入端點。一對批次或等時輸入和輸出端點。請注意,Silicon Labs USB 裝置堆疊目前不支援等時端點。
下表顯示了不同端點的用途以及它們透過 CDC 的哪個介面使用。
表 – CDC 端點使用情況
端點
控制輸入
控制輸出
中斷或批量 輸入 批量或等時 輸入 批量或等時
出去
方向
設備到主機
主機到裝置
設備到主機
設備到主機
主機到裝置
接口使用
CCI
標準枚舉請求、特定類別請求、設備
管理,以及可選的呼叫管理。
CCI
標準枚舉請求、特定類別請求、設備
管理,以及可選的呼叫管理。
CCI
事件通知,例如振鈴偵測、序列線路狀態、網路狀態。
DCI
原始或格式化的資料通訊。
DCI
原始或格式化的資料通訊。
大多數通訊設備使用中斷端點通知主機事件。當專有協定依賴在 USB 協定錯誤時進行資料重傳時,不應使用等時端點進行資料傳輸。由於等時通訊沒有重試機制,因此它本身可能會遺失資料。
七種主要的通訊模型包含多個子類別。子類別描述了設備應如何使用 CCI 來處理設備管理和呼叫管理。下表列出了所有可能的子類別及其所屬的通訊模型。
表 – CDC 子類
子類別
直線控制模型抽象控制模型
溝通模型
公共電話網絡
公共電話網絡
Examp使用此子類別的設備列表
由 USB 主機直接控制的數據機設備
串行仿真設備、透過串行命令集控制的數據機設備
版權所有 © 2025 Silicon Laboratories。版權所有。
20/174
超過view
子類別
溝通模型
Examp使用此子類別的設備列表
電話控制模型
公共電話網絡
多通道控制ISDN模型
CAPI 控制模型 ISDN
乙太網路ECM控制模型
ATM網路
自動提款機
控制模型
無線手持控制模型
世界醫學中心
設備管理 WMC
移動直連模式
世界醫學中心
對象交換
世界醫學中心
乙太網路模擬EEM模型
網絡控制模型
NCM
語音電話設備
基本速率終端適配器、一次群組速率終端適配器、電話
基本速率終端適配器、一次速率終端適配器、電話 DOC-SIS 電纜數據機、支援 PPPoE 模擬的 ADSL 調製解調器、Wi-Fi 適配器(IEEE 802.11 系列)、IEEE 802.3 適配器 ADSL 調製解調器
連接無線設備的行動終端設備
連接無線設備的行動終端設備 連接無線設備的行動終端設備
連接無線設備的行動終端設備使用乙太網路幀作為下一層傳輸的設備。不適用於路由及網際網路連線設備在網路上承載高速資料頻寬的IEEE 802.3轉接器
核心的 USB 裝置 CDC ACM 類別資源需求
每次透過呼叫函數 sl_usbd_cdc_acm_add_to_configuration() 將 CDC ACM 類別實例新增至 USB 設定時,都會從核心指派下列資源。
資源
介面 備用介面 端點 介面組
數量
2 2 3 1
請注意,這些數字是針對每個配置的。設定 SL_USBD_INTERFACE_QUANTITY 、 SL_USBD_ALT_INTERFACE_QUANTITY 、 SL_USBD_INTERFACE_GROUP_QUANTITY 和 SL_USBD_DESCRIPTOR_QUANTITY 設定值時,請不要忘記該類別會新增多少個設定。對於 SL_USBD_OPEN_ENDPOINTS_QUANTITY 配置值,由於只有在主機設定配置時才會開啟端點,因此您只需考慮類別實例所需的端點數量。
USB 裝置 CDC ACM 子類view
CDC 基底類別由通訊類別介面 (CCI) 和資料類別介面 (DCI) 組成,詳細討論請參閱 USB 裝置 CDC 基底類view 本節討論 ACM 類型的 CCI。它由管理元素的預設端點和通知元素的中斷端點組成。一對批次端點用於在 DCI 上傳輸未指定的資料。
ACM 子類別由兩種類型的通訊設備使用:
支援 AT 命令的裝置(例如,語音數據機)。串行仿真設備,也稱為虛擬 COM 連接埠設備。
ACM 子類別有多個特定於子類別的請求。它們允許您控制和配置設備。所有 ACM 請求的完整清單和描述可以在規格中找到。
版權所有 © 2025 Silicon Laboratories。版權所有。
21/174
超過view PSTN 設備子類,修訂版 1.2,2007 年 2 月 9 日,第 6.2.2 節。
從此列表中,Silicon Labs9 ACM 子類別支援以下內容:
表格 – Silicon Labs 支援的 ACM 請求
子類請求描述
設定通訊特徵 取得通訊特徵 清除通訊特徵
主機發送此請求以控制特定通訊功能的設定。不用於串行仿真。
主機發送此請求以取得給定通訊功能的當前設定。不用於串行仿真。
主機發送此請求以清除指定通訊功能的設定。不用於串行仿真。
設定行編碼
主機發送此請求來配置 ACM 設備設定:波特率、停止位數、奇偶校驗類型和資料位數。對於串行仿真,每次為開啟的虛擬 COM 連接埠配置串行設定時,串行終端都會自動發送此請求。
取得線路編碼
主機發送此請求以取得當前 ACM 設定(波特率、停止位元、奇偶校驗、資料位元)。對於串行仿真,串行終端會在虛擬 COM 連接埠開啟期間自動發送此要求。
SetControlLineState 主機發送此請求來控制半雙工數據機的載波,並指示資料終端設備 (DTE) 是否已準備就緒。在串行仿真的情況下,DTE 是一個串行終端。對於串行仿真,某些串行終端允許您在設定了控制的情況下發送此請求。
設定中斷
主機發送此請求以產生 RS-232 類型的中斷。對於串行仿真,某些串行終端允許您發送此請求。
Silicon Labs9 ACM 子類別使用中斷 IN 端點通知主機目前串列線路狀態。序列
線路狀態是一個位圖,用於通知主機:
因逾限而丟棄的資料 奇偶校驗錯誤 訊框錯誤 振鈴訊號偵測狀態 斷線偵測機制狀態 傳送載波狀態 接收器載波偵測狀態
Silicon Labs9 ACM 子類實作符合以下規範:
通用序列匯流排、通訊、PSTN 設備子類,修訂版 1.2,2007 年 2 月 9 日。
USB 裝置 CDC ACM 類別配置
本節討論如何配置 CDC ACM 類別(通訊設備類,抽象控制模型)。配置參數有兩組:
USB 裝置 CDC ACM 類別應用程式特定配置 USB 裝置 CDC ACM 類別執行個體配置
USB 裝置 CDC ACM 類別應用程式特定配置
CDC 基底類 ACM 子類
CDC 基類
首先,要使用 Silicon Labs USB 裝置 CDC 類別模組,您需要根據應用程式需求調整 CDC 編譯時配置 #define-s。它們在 sl_usbd_core_config.h 頭檔中進行了重新分組。 file 在 CDC 部分下。它們的目的是通知 USB 裝置模組需要分配多少個 USB CDC 物件。
版權所有 © 2025 Silicon Laboratories。版權所有。
22/174
超過view
下表描述了此配置結構中可用的每個配置欄位。
表 – USB 裝置 CDC 設定定義
配置名稱
SL_USBD_CDC_CLAS S_INSTANCE_QUANT ITY
SL_USBD_CDC_CONF IGURATION_QUANTI
TY
SL_USBD_CDC_資料_介面_數量
TY
描述
透過呼叫函數分配的類別實例數量
sl_usbd_cdc_acm_create_instance() 。
配置數量。 ACM 類別實例可以加入到一個或多個 aaaa 配置中,vi c ll 到 sl_usbd_cdc_acm_add_to_configuration() 。
所有 CDC 函數的資料介面 (DCI) 總數。每個 CDC ACM 函數(新增至 sl_usbd_cdc_acm_create_instance() 函數)都會新增 dt 介面。
預設值
2
1
2
ACM 子類
ACM 子類別具有編譯時配置,如下表所示。
表 – USB 裝置 CDC ACM 設定定義
配置名稱
SL_USBD_CDC_ACM_SUBCL ASS_I NSTANCE_QUANTITY
描述
配置您將透過呼叫分配的子類別實例的數量
函數 sl_usbd_cdc_acm_create_instance() 。
預設值
2
USB 裝置 CDC ACM 類別執行個體配置
本節定義與 CDC ACM 串列類別實例相關的配置。類別實例建立線路狀態間隔呼叫管理功能 p_acm_callbacks
類別實例創建
若要建立 CDC ACM 序列類別實例,請呼叫函數 T a sl_usbd_cdc_acm_create_instance() 。此函數需要三個配置參數,如下所述。
線路狀態間隔
這是您的 CDC ACM 序列類別實例向 T aa 主機報告線路狀態通知的間隔(以毫秒為單位)。此值必須是 2 的冪次方(1、2、4、8、16 等)。
呼叫管理功能
呼叫管理功能點陣圖。該點陣圖的可能值如下:
值(位元)
SL_USBD_ACM_SERIAL_CALL_MGMT_DEV
SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI _DCI
描述
設備自行處理呼叫管理。設備可以透過資料類介面發送/接收呼叫管理資訊。
p_acm_callbacks
版權所有 © 2025 Silicon Laboratories。版權所有。
23/174
超過view
aa M aa p_acm_callbacks 是指向 sl_usbd_cdc_acm_callbacks_t 類型結構體的指標。其目的是為 CDC AC Cl ss 提供一組回呼函數,以便在發生 CDC ACM 事件時呼叫。並非所有回呼都是必要的,當不需要回呼時,可以在回呼結構體變數中傳遞空指標 ( NULL )。下表描述了此配置結構體中可用的每個配置欄位。
表 – sl_usbd_cdc_acm _callbacks_t 配置結構
領域
描述
。使能夠
當 USB 類別實例啟用時調用
成功地。
.禁用
當 USB 類別實例被停用時呼叫。
.line_control_changed 當收到線路控制變化時呼叫。
line_coding_changed 當收到線路編碼變更時呼叫。
函數簽名
無效 app_usbd_cdc_acm_enable(uint8_t subclass_nbr);
無效 app_usbd_cdc_acm_disable(uint8_t subclass_nbr);
void app_usbd_cdc_acm_line_control_變
*p_line_coding
請參閱註冊事件通知回呼部分,以了解回呼函數範例amp勒。
USB 裝置 CDC ACM 類別程式設計指南
本節介紹如何使用 CDC 抽象控制模型類別。初始化 USB 裝置 CDC ACM 類別;將 USB 裝置 CDC ACM 類別執行個體新增至裝置;使用 CDC ACM 類別進行通訊
初始化 USB 裝置 CDC ACM 類
要將 CDC ACM 類別功能新增至您的設備,您必須先透過呼叫函數 sl_usbd_cdc_init() 和 sl_usbd_cdc_acm_init() 來初始化 CDC 基底類別和 ACM 子類別。下面的範例顯示如何使用預設參數呼叫 sl_usbd_cdc_init() 和 sl_usbd_cdc_acm_init()。
Example – CDC ACM 類別的初始化
sl_status_t 狀態;
status = sl_usbd_cdc_init(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
status = sl_usbd_cdc_acm_init(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
將 USB 設備 CDC ACM 類別實例新增至您的設備
若要將 CDC ACM 類別功能新增至您的設備,您必須建立一個實例,然後將其新增至您的設備配置中。
建立 CDC ACM 類別實例
版權所有 © 2025 Silicon Laboratories。版權所有。
24/174
超過view
將 CDC ACM 類別實例新增至裝置配置中註冊事件通知回調
建立 CDC ACM 類別實例
透過呼叫函數 sl_usbd_cdc_acm_create_instance() 建立 CDC AC 類別實例。下面的範例顯示如何使用 sl_usbd_cdc_acm_create_instance() 建立 CDC AC 類別實例。
Example – 透過 sl_usbd_cdc_acm_create_instance() 建立 CDC ACM 函數
uint8_t subclass_nbr;sl_status_t 狀態;
狀態 = 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 (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
將 CDC ACM 類別實例新增至設備配置中
建立 CDC ACM 類別實例後,可以透過呼叫函數將其新增至配置中
sl_usbd_cdc_acm_add_to_configuration() 。
下面的範例展示如何呼叫 sl_usbd_cdc_acm_add_to_configuration()。
Example – 呼叫 USBD ACM sl_usbd_cdc_acm_add_to_configuration()
sl_status_t 狀態;
狀態 = sl_usbd_cdc_acm_add_to_configuration(子類別號,
(1)
配置_nbr_fs);
(2)
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
aaa (1) 要新增到 sl_usbd_cdc_acm_create_instance() 傳回的設定中的 Clss 編號。 (2) 配置編號(此處將其新增至全速配置)。
註冊事件通知回調
CDC ACM Serial 類別可以透過通知回呼函數將線路控製或編碼的任何變更通知您的應用程式。回調函數結構可以在 ACM 實例建立期間作為參數傳遞。請注意,這些回調是可選的。例如ample – CDC ACM 回呼註冊示範了回呼註冊函數的使用。例如ample – CDC ACM 回調實作展示了一個範例amp回調函數的實作檔。
Example – CDC ACM 回檔註冊
版權所有 © 2025 Silicon Laboratories。版權所有。
25/174
超過view
uint8_t subclass_nbr;sl_status_t 狀態;
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_Lapp };
狀態 = 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_ncallbacks;
if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */}
Example – CDC ACM 回檔實現
bool app_usbd_cdc_acm_line_coding_changed (uint8_t
子類編號,
sl_usbd_cdc_acm_line_coding_t *p_line_coding)
{
uint32_t 波特率_新;
uint8_t parity_new;
uint8_t 停止位_新;
uint8_t 資料位_新;
/* TODO 應用新線編碼。 */ 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;
返回(真);
(1)
}
void app_usbd_cdc_acm_line_control_changed(uint8_t subclass_nbr,uint8_t event,uint8_t event_changed)
{ bool rts_state; bool rts_state_changed; bool dtr_state; bool dtr_state_changed; bool brk_state; bool brk_state_changed;
/* TODO 應用新線路控制。 */ 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 : falsea d:Dstate_False; 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) ?event; SL_USBD_CDC_ACM_CTRL_BREAK) !0) ? true : false;
}
(1)如果線路編碼應用失敗,則傳回 false。否則,傳回 true。
使用 CDC ACM 類別進行通信
序列狀態
線路編碼線路控制
版權所有 © 2025 Silicon Laboratories。版權所有。
26/174
超過view
線路狀態子類別實例通信
序列狀態
線路編碼
USB 主機控制 CDC ACM 裝置的線路編碼(波特率、奇偶校驗等)。必要時,應用程式負責設定線路編碼。提供了兩個函數用於檢索和設定當前線路編碼,如下表所述。
表 – CDC ACM 線路編碼函數
功能
sl_usbd_cdc_acm_get_line_co d ing()
sl_usbd_cdc_acm_set_line_coding()
描述
您的應用程式可以透過 SetLineCoding 請求或函數 sl_usbd_cdc_acm_set_line_coding() 從主機取得目前線路編碼設定。
您的應用程式可以設定線路編碼。主機可以使用 GetLineCoding 請求檢索設定。
線路控制
USB 主機控制 CDC ACM 裝置的線路控制(RTS 和 DTR 接腳、中斷訊號等)。必要時,您的應用程式負責應用線路控制。我們提供了一個函數來檢索和設定目前的線路控制,如下表所述。
表 – CDC ACM 線路控制功能
功能
sl_usb d _cd c_acm_get_line _control_state()
您的應用程式可以透過 SetControlLineState 請求取得主機設定的目前控制線狀態。
線路狀態
USB 主機會定期擷取線路狀態。您的應用程式必須在線路狀態每次變更時更新線路狀態。必要時,您的應用程式負責設定線路狀態。我們提供兩個函數用於檢索和設定目前線路控制,如下表所述。
表 – CDC ACM 線路狀態函數
功能
sl_usb d _cd c_acm_se t _line _state _e ve nt()
sl_usbd_cdc_acm_cle ar_line _state _e ve nt()
您的應用程式可以設定任何線路狀態事件。設定線路狀態時,會傳送中斷 IN 傳輸,以通知其序列線路狀態變更。
應用程式可以清除線路狀態的兩個事件:傳輸載波和接收載波偵測。所有其他事件均由 ACM 串行模擬子類自行清除。
子類實例通信
Silicon Labs 的 ACM 子類別提供以下函數用於與主機通訊。有關 functions9 參數的更多詳細信息,請參閱 CDC ACM 子類函數參考。
函數名稱
sl_usb d _cd c_acm_ 讀取 () sl_usb d _cd c_acm_寫入 ()
手術
透過批次 OUT 端點從主機接收資料。此函數是阻塞的。透過批次 IN 端點向主機發送資料。此函數是阻塞的。
版權所有 © 2025 Silicon Laboratories。版權所有。
27/174
超過view
表 – CDC ACM 通訊 API 摘要 aaaaa sl_usbd_cdc_acm_read() 和 sl_usbd_cdc_acm_write() 提供同步通信,這表示傳輸是阻塞的。換句話說,在呼叫該函數後,應用程式將阻塞,直到傳輸完成(無論是否出現錯誤)。可以指定超時時間,以避免永遠等待。範例amp下面顯示了一個讀寫範例amp使用批次 OUT 端點從主機接收資料並使用批次 IN 端點向主機發送資料的檔案。
清單 – 序列讀寫範例ample
__ALIGNED(4) uint8_t rx_buf[2];
__ALIGNED(4) uint8_t tx_buf[2];
uint32_t
轉接長度;
sl_status_t
地位;
狀態 = sl_usbd_cdc_acm_read(subclass_nbr,
(1)
rx_buf,
(2)
2u,
0u,
(3)
&xfer_len);
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
狀態 = sl_usbd_cdc_acm_write(subclass_nbr,
(1)
tx_buf,
(4)
2u,
0u,
(3)
&xfer_len);
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
T aaaaa M (1) 使用 sl_usbd_cdc_acm_create_instance() 建立的類別實例號提供了對 AC 子類別的內部引用,用於將傳輸路由到正確的批次 OUT 或 IN 端點。 (2) 您的應用程式必須確保提供給函數的緩衝區足夠大,能夠容納所有資料。否則,可能會出現同步問題。 (3) 為避免無限阻塞情況,請指定以毫秒為單位的超時時間。值為 809 表示應用程式任務永遠等待。 (4) 應用程式提供初始化的傳輸緩衝區。
版權所有 © 2025 Silicon Laboratories。版權所有。
28/174
超過view
超過view
USB 裝置 HID 類
USB 裝置 HID 類別結束view 核心的 USB 裝置 HID 類別資源需求 USB 裝置 HID 類別設定 USB 裝置 HID 類別程式設計指南 HID 定期輸入報告任務
本節介紹 Silicon Labs USB 裝置支援的人機介面裝置 (HID) 類別。
HID 類別包含人類用來控制電腦操作的設備,例如鍵盤、滑鼠、指點設備和遊戲設備。
HID 類別也可用於包含旋鈕、開關、按鈕和滑桿等控制的複合設備。例如amp音訊耳機中的靜音和音量控制由耳機的 HID 功能控制。 HID 類別可以僅使用控制和中斷傳輸來交換任何用途的資料。
HID 類別是最古老、使用最廣泛的 USB 類別之一。所有主流主機作業系統都提供原生驅動程式來管理 HID 設備,因此各種供應商特定的設備都可以與 HID 類別相容。此類還包含各種類型的輸出項目,例如 LED、音訊、觸覺回饋等。
HID 實作符合以下規範:
人機介面設備 (HID) 的設備類別定義,01 年 6 月 27 日,版本 1.11。通用序列匯流排 HID 使用表,2004 年 10 月 28 日,版本 1.12。
USB 裝置 HID 類別結束view
超過view
HID 設備由以下端點組成:
一對控制 IN 和 OUT 端點(稱為預設端點) 一個中斷 IN 端點 一個可選中斷 OUT 端點
下表描述了不同端點的用法:
表 – HID 類別端點使用情況
端點方向使用
控制輸入
控制
出去
中斷輸入
打斷
出去
設備到主機
主機到裝置
設備到主機
主機到裝置
標準枚舉請求、特定類別請求和資料通訊(輸入、透過 GET_REPORT 請求傳送到主機的功能報告)。標準枚舉請求、特定類別請求和資料通訊(輸出、透過 SET_REPORT 請求從主機接收的功能報告)。數據通訊(輸入和功能報告)。
數據通訊(輸出和特徵報告)。
報告
版權所有 © 2025 Silicon Laboratories。版權所有。
29/174
超過view
主機和 HID 設備使用報告交換資料。報告包含格式化的數據,提供有關 HID 設備的控制項和其他實體實體的資訊。控制項可由使用者操作,並用於操作設備的某個方面。例如amp例如,控制可以是滑鼠或鍵盤上的按鈕、開關等。其他實體則告知使用者某些設備功能的狀態。例如amp例如,鍵盤上的 LED 會通知使用者大寫鎖定已開啟、數字鍵盤已啟動等。
主機透過分析報告描述符的內容來理解報告資料的格式和用途。內容分析由解析器完成。報告描述符描述了設備中每個控制項提供的資料。它由一些項目組成,這些項目是有關設備的資訊片段,由一個位元組的前綴和可變長度的
數據。有關項目格式的更多詳細信息,請參閱
1.11=,第 5.6 和 6.2.2 節。
主要有三種類型的項目:
主項定義或分組某些類型的資料欄位。
全域項描述控制項的資料特徵。
本地項描述控制項的資料特徵。
每個項目類型由不同的函數定義。項目函數也可以稱為 tag。項目功能可以看作是屬於三種主要項目類型之一的子項目。下表簡單介紹了view 每種物品類型中物品的功能。有關每種類別物品的完整描述,請參閱
表格 – 每種物品類型的物品功能描述
項目 項目類型 功能
描述
主輸入
描述有關一個或多個實體控制項提供的資料的資訊。
主輸出描述傳送到裝置的資料。
主要特點
描述發送到設備或從設備接收的設備配置訊息,這些訊息會影響設備或其某個組件的整體行為。
主要收藏組相關項目(輸入、輸出或功能)。
主要結束 關閉集合。集合
版權所有 © 2025 Silicon Laboratories。版權所有。
30/174
超過view
項目 項目類型 功能
描述
全球使用頁面
識別設備內可用的功能。
全域邏輯 定義邏輯單位中報告值的下限。最小值
全域邏輯 定義報告值的邏輯單位上限。最大值
全域物理定義物理單位報告值的下限,即以物理單位表示的邏輯最小值。
全域物理定義以物理單位表示的報告值的上限,即以物理單位表示的邏輯最大值。
全球單位
以10為底的單位指數,取值範圍為-8~+7。
指數
全球單位
指示報告值的單位。例如長度、質量、溫度單位等。
全球報告規模
指示報告欄位的大小(以位元為單位)。
全域報告 ID 表示新增到特定報告的前綴。
全球報告數量
指示項目的資料字段數。
全球推進
將全域項狀態表的副本放置在 CPU 堆疊上。
全球流行音樂
使用堆疊中的最後一個結構取代項目狀態表。
本地使用
表示用於指定使用情況頁面中特定使用情況的索引。它指示供應商對特定控製或控制組的建議用途。使用情況為應用程式開發人員提供有關控制項實際測量內容的資訊。
本地使用
定義與陣列或點陣圖相關的起始用途。
最低限度
本地使用
定義與陣列或點陣圖相關的結束用途。
最大限度
本地標識符決定了用於控制的身體部位。索引指向物理
指數
描述符。
本機標誌符定義與陣列或點陣圖關聯的起始標誌符的索引。最小
本機標誌符定義與陣列或點陣圖關聯的結束標誌符的索引。最大值
本地字串索引
字串描述符的字串索引。它允許將字串與特定項目或控制項關聯。
本地字串
當將一組連續的字串指派給數組中的控制項時,指定第一個字串索引
最小或點陣圖。
本地 本地
字串最大值
分隔符
當將一組連續字串指派給陣列或位圖中的控制項時,指定最後一個字串索引。
定義一組本地專案的開始或結束。
控制項的資料必須至少定義以下項目:
輸入、輸出或功能主要項目使用情況本地項目使用情況頁面全域項目邏輯最小值全域項目邏輯最大值全域項目報告大小全域項目
版權所有 © 2025 Silicon Laboratories。版權所有。
31/174
超過view
報告計數全域項下表從主機 HID 解析器的角度展示了滑鼠報告描述符內容的表示。滑鼠有三個按鈕(左鍵、右鍵和滾輪)。範例程式碼中顯示的程式碼amp以下是與此滑鼠報告描述符表示相對應的程式碼實作。
圖 – 來自主機 HID 解析器的報告描述子內容 View
(1)使用頁面中的「功能」項目指定了設備的一般功能。在本例中,amp例如,HID 設備屬於
通用桌面控制。
(2) 應用程式集合 (Collection Application) 將具有共同用途且可能為應用程式所熟悉的「主項」分組。在圖中,該組由三個「輸入主項」組成。對於此集合,建議將控制項用作滑鼠,如“用法”項目所示。 (3) 嵌套集合可用於向應用程式提供更多有關單一控制項或控制項群組使用情況的詳細資訊。在本例中amp例如,Collection Physical 嵌套在 Collection Application 中,由構成 Collection Application 的三個相同的輸入項目組成。 Collection Physical 用於表示在一個幾何點收集的資料點的一組資料項。在 examp例如,建議使用指針,如使用項所示。此處,指標使用指的是滑鼠位置座標,系統軟體將根據螢幕遊標的移動來轉換滑鼠座標。 (4) 嵌套使用頁面也是可能的,並提供有關設備一般功能中某個方面的更多詳細資訊。在本例中,兩個輸入項被分組,並對應於滑鼠的按鈕。一個輸入項根據該項的資料欄位數量(報告計數項)、資料欄位的大小(報告大小項)以及每個資料欄位的可能值(使用最小值和最大值、邏輯最小值和最大值項)定義了滑鼠的三個按鈕(右鍵、左鍵和滾輪)。另一個輸入項是 13 位元常數,允許輸入報告資料在位元組邊界上對齊。此輸入項僅用於填充目的。 (5) 為滑鼠位置座標定義了另一個嵌套使用頁面,該頁面引用通用桌面控制項。對於此使用頁面,輸入項描述了與 x 軸和 y 軸對應的資料字段,例如兩個使用
專案.
分析完先前的滑鼠報告描述符內容後,主機的 HID 解析器能夠解析設備透過中斷 IN 傳輸或回應 GET_REPORT 請求發送的輸入報告資料。滑鼠報告描述符對應的輸入報告資料如圖 - 主機 HID 解析器的報告描述符內容所示。 View is
版權所有 © 2025 Silicon Laboratories。版權所有。
32/174
超過view
如下表所示。報告資料的總大小為 4 個位元組。不同類型的報告可以透過同一個端點發送。為了區分不同類型的報告,會在資料報告中加入 1 位元組的報告 ID 前綴。如果在範例中使用的是報告 ID,則amp滑鼠報告文件,報告資料的總大小為 5 個位元組。
表格 – 傳送至主機並對應 3 鍵滑鼠狀態的輸入報告
位偏移
0 1 2 3 16 24
位數 1 1 1 13 8 8
描述 按鈕 1(左鍵)。按鈕 2(右鍵)。按鈕 3(滾輪鍵)。未使用。位於 X 軸。位於 Y 軸。
物理描述符指示用於啟動一個或多個控制項的身體部位。應用程式可以使用此資訊為裝置的控制項指派功能。物理描述符是可選的類別特定描述符,大多數設備使用它並沒有好處。請參閱
核心的 USB 裝置 HID 類別資源需求
每次透過呼叫函數 sl_usbd_hid_add_to_configuration() 將 HID 類別實例新增至 USB 配置時,都會從核心指派下列資源。
資源
介面 備用介面 端點 介面組
數量
1 1 1 (如果中斷 OUT 端點啟用,則為 2) 0
請注意,這些數字是針對每個配置的。設定 SL_USBD_INTERFACE_QUANTITY 、 SL_USBD_ALT_INTERFACE_QUANTITY 、 SL_USBD_INTERFACE_GROUP_QUANTITY 和 SL_USBD_DESCRIPTOR_QUANTITY 設定值時,請不要忘記該類別會新增多少個設定。對於 SL_USBD_OPEN_ENDPOINTS_QUANTITY 配置值,由於只有在主機設定配置時才會開啟端點,因此您只需考慮類別實例所需的端點數量。
USB 裝置 HID 類別配置
兩組配置參數用於配置HID類:
USB 裝置 HID 類別應用程式特定配置 USB 裝置 HID 類別實例配置
USB 裝置 HID 類別應用程式特定配置
首先,若要使用 Silicon Labs USB 裝置 HID 類別模組,請根據應用程式需求調整 HID 編譯時設定定義。這些定義在 sl_usbd_core_config.h 頭檔中進行了重新分組。 file 在 HID 部分下。它們可以分為兩部分:數量配置和 HID 任務配置。數量配置的目的是告知 USB 裝置模組需要分配多少個 USB HID 物件。
下表描述了每個配置定義。
表 – USB 裝置 HID 設定定義
版權所有 © 2025 Silicon Laboratories。版權所有。
33/174
超過view
配置名稱
SL_USBD_HID_CLASS_I NSTANCE_QUANTITY
SL_USBD_HID_CONFIG URATION_QUANTITY
SL_USBD_HID_REPORT_ID_QUANTITY
SL_USBD_HID_PUSH_P OP_ITEM_QUANTITY
SL_USBD_HID_TIMER_T 詢問堆疊大小
SL_USBD_HID_TIMER_T 詢問_優先權
描述
透過呼叫函數分配的類別實例數量
sl_usbd_hid_create_instance() 。
配置數量。 HID 類別實例可以加入到一個或多個 aaaa 配置中,並加入到函數 sl_usbd_hid_add_to_configuration() 中。配置要指派的報告 ID 總數。
配置要指派的 Push/Pop 項目的總數。
定時器任務處理所有基於定時器的 HID 操作。此配置可讓您設定堆疊大小(以位元組數為單位)。 HID 任務的優先順序。這是 CMSIS-RTOS2 優先權。
預設值
2 1 2 0 2048
作業系統優先權高
USB 裝置 HID 類別實例設定類別實例建立子類
協議國家代碼
interval_in 和 interval_out p_hid_callback HID 類別報告描述符 Example 本節定義與 HID 類別實例相關的配置。
類別實例創建
透過呼叫函數 sl_usbd_hid_create_instance() 來建立 HID 類別實例,該函數使用下面描述的幾個配置參數。
子類別
HID 子類別的程式碼。可能的值包括:
SL_USBD_HID_SUBCL ASS_NONE SL_USBD_HID_SUBCL ASS_BOOT
使用啟動子類別的 HID 設備必須使用標準報告格式。有關子類代碼的更多信息,請參閱 HID 規範修訂版 1.11 的第 4.2 節。
協定
HID 設備使用的協定。可能的值包括:
SL_USBD_HID_PROTOCOL_NONE SL_USBD_HID_PROTOCOL_KBD SL_USBD_HID_PROTOCOL_MOUSE
如果您的 HID 功能是滑鼠,則應將協定設為 SL_USBD_HID_PROTOCOL_MOUSE 。如果是鍵盤,則應設定為 SL_USBD_HID_PROTOCOL_KBD 。否則,應將協定設定為 SL_USBD_HID_PROTOCOL_NONE 。有關子類代碼的更多信息,請參閱 HID 規範修訂版 1.11 的第 4.3 節。
國家/地區代碼
國家代碼ID,可能值為:
SL_USBD_HID_COUNTRY_CODE_不支持
版權所有 © 2025 Silicon Laboratories。版權所有。
34/174
超過view
SL_USBD_HID_COUNTRY_CODE_ARABIC SL_USBD_HID_COUNTRY_CODE_BELGIAN SL_USBD_HID_COUNTRY_CODE_CANADIAN_BILINGUAL SL_USBD_HID_COUNTRY_CODE_CANADIAN_BILINGUAL SL_USBD_HID_COUNTRY_CODE_CANADIAN_CHf SL_USBD_HID_COUNTRY_CODE_DANISH SL_USBD_HID_COUNTRY_CODE_FINNISH SL_USBD_HID_COUNTRY_CODE_FRENCH SL_USBD_HID_COUNTRY_CODE_GERMAN 7_USBD_HD_USBD_HID4COUNTRY_CODE_GERMAN 7_USBD_H4_USBD_HRYDCOUNTRY_CODE_HIT_US SL_USBD_HID_COUNTRY_CODE_HUNGARY SL_USBD_HID_COUNTRY_CODE_INTERNATIONAL SL_USBD_HID_COUNTRY_CODE_ITALIAN SL_USBD_HID_COUNTRY_CODE_JA_PANKATAK_JA_PANUm_O_COUNTRYP_JA_PAN_U4_JA_PAN_SL_JA_JA_BUU_JA_A_UUP_JA_PAN_SL_JA_A_UUPU_JA_PAN_c. SL_USBD_HID_COUNTRY_CODE_L ATIN_AMERICAN SL_USBD_HID_COUNTRY_CODE_NETHERL ANDS_DUTCH SL_USBD_HID_COUNTRY_CODE_NORWEGIAN SL_USBD_HID_COUNTRY_CO_PERSPER. SL_USBD_HID_COUNTRY_CODE_PORTUGUESE SL_USBD_HID_COUNTRY_CODE_RUSSIA SL_USBD_HID_COUNTRY_CODE_SLOVAKIA SL_USBD_HID_COUNTRY_CODE_SISH ISH SL_SL_HID_USBD_HID_COUNTRY_CODE_SISH ISH SL_ISHA_PID_DEFSL_EU_UUTRY_COIT_UISH SL_USBD_HID_COUNTRY_CODE_SWISS_FRENCH SL_USBD_HID_COUNTRY_CODE_SWISS_GERMAN SL_USBD_HID_COUNTRY_CODE_SWITZERL AND SL_USBD_HID_COUNTRY_CODE_CON _ISH_CODE_HIT_ISH_CO 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
國家/地區代碼標識硬體的本地化國家。大多數硬體未進行本地化,因此此值應為 SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0)。但是,鍵盤可以使用此欄位來指示鍵帽的語言。
有關國家代碼的更多信息,請參閱 HID 規範修訂版 1.11 的第 6.2.1 節。
interval_in 和 interval_out
interval_in和interval_out分別表示IN中斷端點和OUT中斷端點的輪詢間隔。
這表示端點的輪詢間隔(以毫秒為單位)。此值的設定取決於裝置向主機產生新報告的頻率。例如,如果每 16 毫秒產生一次報告,則間隔應為 16 毫秒或更短。
該值必須是 2 的冪次方(1、2、4、8、16 等)。
如果 ctrl_rd_en 設定為 true,則會忽略 interval_out v lue。
p_hid_callback
aaaa p_hid_callback 是指向 sl_usbd_hid_callbacks_t 類型結構的指標。其目的是為 HID Cl ss 提供一組在發生 HID 事件時要呼叫的回呼函數。
版權所有 © 2025 Silicon Laboratories。版權所有。
35/174
超過view
並非所有回呼都是必要的,當不需要回呼時,可以在回呼結構變數中傳遞空指標 ( NULL )。下表描述了此配置結構中可用的每個配置欄位。
表 – sl_usbd_hid_callbacks_t 配置結構
領域
描述
函數簽名
.啟用 .停用 .取得報告描述
.取得_phy_描述
.設定輸出報告 .取得功能報告 .設定功能報告
當 USB 類別實例成功啟用時呼叫。當 USB 類別實例被停用時呼叫。
在建立 HID 實例期間調用,以傳遞您的報告描述符。對於每個 HID 函數,您必須提供一個報告描述符。報告描述符指示主機應如何解析裝置將發送的定期報告。編寫您自己的報告描述符可能具有挑戰性,因此有一些資源可以提供幫助。這是唯一必要的回呼函數。在建立 HID 實例期間調用,以傳遞您的實體描述符。物理描述符是一種描述符,它提供有關正在啟動一個或多個控制項的人體特定部位的資訊。有關物理描述符的更多信息,請參閱 HID 規範修訂版 1.11 的第 6.2.3 節。物理描述符是可選的,大多數情況下會被忽略。此處傳遞的緩衝區可以設定為 NULL,長度設定為 0。當主機按照報告描述符中的描述設定報告時(即發送報告時)呼叫。
當主機請求報告描述符中描述的功能報告時呼叫。
當主機依照報告描述符中所述設定功能報告時呼叫。
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,constfid_hid_get_reportf_F);
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_nPint_08_F8_F8_reporto_nint *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);
.獲取協議
檢索目前活動協定。
無效 app_usbd_hid_get_protocol(uint8_t class_nbr,uint8_t *p_protocol);
.設定協議
設定當前活動協議。
void app_usbd_hid_set_protocol(uint8_t class_nbr,uint8_t 協定);
HID 類別報告描述符 Example
Silicon Labs 的 HID 類ample 應用程式提供了一個範例amp簡單滑鼠的報告描述符檔案。範例amp下面顯示了滑鼠報告描述符。
Example – 滑鼠報告描述符
靜態 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)
版權所有 © 2025 Silicon Laboratories。版權所有。
36/174
超過view
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_PHYSICAL,(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 |
SL_USBD_HID_MAIN_變數 |
SL_USBD_HID_MAIN_ABSOLUTE,
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 |
SL_USBD_HID_MAIN_變數 |
SL_USBD_HID_MAIN_RELATIVE,
SL_USBD_HID_MAIN_ENDCOLLECTION,(10)
SL_USBD_HID_MAIN_ENDCOLLECTION
(11)};
(1)表示滑鼠報告描述符的表格以這樣的方式初始化:每行對應一個短項。後者由一個位元組的前綴和一個位元組的資料組成。請參閱 view由主機 HID 解析器編輯,如圖 – 主機 HID 解析器的報告描述符內容所示 View.
(2)使用通用桌面使用頁面。
(3)在通用桌面使用頁面中,使用 tag 表示該控制組用於控制滑鼠。滑鼠集合通常由兩個軸(X 和 Y)以及一個、兩個或三個按鈕組成。
(4)開始收集小鼠。
(5)在小鼠模型中,使用 tag 更具體地說,滑鼠控制屬於指標集合。指標集合是軸的集合,它產生一個值來指示、指示或將使用者意圖指向應用程式。
(6)開始指針收集。
(7)按鈕使用頁定義了一個由三個1位元欄位組成的輸入項。每個1位元欄位分別代表滑鼠的1、2、3號按鈕,並可以傳回0或1的值。
(8)按鈕使用頁面的輸入項目以另外 13 位元填滿。
(9)另一個通用桌面使用頁面用於描述滑鼠位置,其座標為 X 軸和 Y 軸。輸入項由兩個 8 位元欄位組成,其值介於 -127 和 127 之間。
(10)指標集合關閉。
(11)小鼠收集已關閉。
USB.org HID 頁面
版權所有 © 2025 Silicon Laboratories。版權所有。
37/174
超過view
USB 實施者論壇 (USB-IF) 提供了一個名為「HID 描述符工具」的工具,以及有關報告描述符格式的其他資訊。更多信息,請訪問 http://www.usb.org/developers/hidpage/。
USB 裝置 HID 類別程式設計指南
本節介紹如何使用 HID 類別。初始化 USB 裝置 HID 類別;將 USB 裝置 HID 類別執行個體新增至裝置;使用 USB 裝置 HID 類別進行通訊
初始化 USB 裝置 HID 類
要將 HID 類別功能新增至設備,必須先透過呼叫函數 sl_usbd_hid_init() 來初始化該類別。 examp下面的 le 展示如何使用預設參數呼叫 sl_usbd_hid_init() 。有關傳遞給 sl_usbd_hid_init() 的配置參數的更多信息,請參閱 USB 裝置 HID 類別應用程式特定配置 。
Example – 呼叫 sl_usbd_hid_init()
sl_status_t 狀態;
status = sl_usbd_hid_init(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
將 USB 裝置 HID 類別執行個體新增至您的裝置
若要將 HID 類別功能新增至您的設備,您必須建立一個實例,然後將其新增至您的設備配置中。
建立 HID 類別實例
透過呼叫函數 sl_usbd_hid_create_instance() 來建立 HID 類別實例。範例amp下面的 le 展示如何使用預設參數透過 sl_usbd_hid_create_instance() 建立一個簡單的滑鼠函數。有關傳遞給 sl_usbd_hid_create_instance() 的配置參數的更多信息,請參閱 USB 裝置 HID 類別實例配置 。
Example – 透過 sl_usbd_hid_create_instance() 新增滑鼠功能
版權所有 © 2025 Silicon Laboratories。版權所有。
38/174
超過view
/* 全域常數。 */ 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_COLLECTION_HID_MAIN_COLLECTION + 1、SL_USBD_HID_COLLECTION_PBD_AL、SL_GLfUUUUS_US2; 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 + 19000 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 ID_MAIN_DATA 1,SL_USBD_HID_MAIN_DATA 編號 | SL_USBD_HID_MAIN_ABSOLUTE,SL_USBD_HID_GLOBAL_REPORT_COUNT + 1,0 01,SL_USBD_HID_GLOBAL_REPORT_SIZE + 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_SLID_SL_USBD_HID_LOCAL_USAGE + 1,SL_USBD_HID_DVX 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_MAX + 1, 0 7F, SL_USBD_HID_GLOBAL_REPORT_SIZE + 1, 0 08,37_PORT, 08,45_4SIZE + 1, 10 02, SL_USBD_HID_MAIN_INPUT + 1, SL_USBD_HID_MAIN_DATA | SL_USBD_HID_MAIN_VARIABLE | SL_USBD_HID_MAIN_RELATIVE, SL_USBD_HID_MAIN_ENDCOLL,
/* 局部變數。 */ uint8_t class_nbr; sl_status_t status;
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); }
狀態 = sl_usbd_hid_create_instance(SL_USBD_HID_SUBCLASS_BOOT, SL_USBD_HID_PROTOCOL_MOUSE, SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED, Ex_USBD_HBD_Mo_Reform( 2u, 2u, true, &app_usbd_hid_callbacks, &class_nbr);
版權所有 © 2025 Silicon Laboratories。版權所有。
39/174
超過view
/* 發生錯誤。應在此處新增錯誤處理。 */}
將 HID 類別實例新增至裝置配置中建立 HID 類別實例後,可以透過呼叫函數將其新增至配置中
sl_usbd_hid_add_to_configuration() 。
前任amp下面的檔案展示如何呼叫 sl_usbd_hid_add_to_configuration() 。
Example – 呼叫 sl_usbd_hid_add_to_configuration()
sl_status_t 狀態;
sl_usbd_hid_add_to_configuration(class_nbr,
(1)
配置_nbr_fs); (2)
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
(1) 要新增至 sl_usbd_hid_create_instance() 傳回的設定中的類別編號。 (2) 設定編號(此處將其新增至全速設定)。
使用 USB 裝置 HID 類別進行通信
類別實例通訊同步通訊類別實例通訊 HID 類別提供下列函數與主機進行通訊。
表 – HID 通訊 API 摘要
函數名稱
sl_usb d _hid _ read _sy nc() sl_usb d _hid _write _sy nc()
操作:透過中斷 OUT 端點從主機接收資料。該函數是阻塞的。透過中斷 IN 端點向主機發送資料。該函數是阻塞的。
同步通訊 同步通訊意味著傳輸是阻塞的。函數呼叫後,應用程式將阻塞,直到傳輸完成(無論是否出現錯誤)。可以指定超時時間,以避免永遠等待。範例amp下面的檔案顯示了使用中斷 OUT 端點從主機接收資料並使用中斷 IN 端點向主機發送資料的讀寫操作。
Example – 同步 HID 讀寫
__ALIGNED(4) uint8_t rx_buf[2];
__ALIGNED(4) uint8_t tx_buf[2];
uint32_t
轉接長度;
sl_status_t
地位;
狀態 = sl_usbd_hid_read_sync(class_nbr,
(1)
(無效*)rx_buf,
(2)
2u,
0u,
(3)
&xfer_len);
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
版權所有 © 2025 Silicon Laboratories。版權所有。
40/174
超過view
status =sl_usbd_hid_read_sync(class_nbr,(1)(void *)rx_buf,(2)2u,0u,(3)&xfer_len);if(status !SL_STATUS_OK){/* 發生錯誤。應在此處新增錯誤處理。 */}
status =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status !SL_STATUS_OK){/* 發生錯誤。應在此處新增錯誤處理。 */}
(1)從 sl_usbd_hid_create_instance() 建立的類別實例號碼為 HID 類別提供了內部引用,以將傳輸路由到正確的中斷 OUT 或 IN 端點。
(2) 應用程式必須確保提供給該函數的緩衝區足夠大,能夠容納所有資料。否則,可能會出現同步問題。在內部,讀取操作是透過控制端點或中斷端點完成的,取決於呼叫 sl_usbd_hid_create_instance() 時設定的控制讀取標誌。
(3)為了避免無限阻塞的情況,可以指定以毫秒為單位的超時時間。值為 809 表示應用程式任務永遠等待。
(4)應用程式提供初始化的傳送緩衝區。
HID 定期輸入報告任務
為了節省頻寬,主機可以透過限制報告頻率來抑制來自中斷 IN 端點的報告。為此,主機必須傳送 SET_IDLE 請求。 Silicon Labs 實作的 HID 類別包含一個內部任務,該任務遵循報告頻率限制,您可以將其套用於一個或多個輸入報告。圖「週期性輸入報告任務」顯示了週期性輸入報告任務的運作方式。
圖 – 定期輸入報告任務
(1)設備收到 SET_IDLE 請求。此請求指定給定報告 ID 的空閒時長。有關 SET_IDLE 請求的更多詳細信息,請參閱
(2)使用空閒時長更新報告 ID 結構(在 HID 類別初始化階段分配)。使用空閒時長值初始化空閒時長計數器。報告 ID 結構插入到包含輸入報告 ID 結構的鍊錶末尾。空閒時長值以 4 毫秒為單位,範圍為 4 至 1020 毫秒。
版權所有 © 2025 Silicon Laboratories。版權所有。
41/174
超過view
如果空閒時間小於中斷 IN 端點的輪詢間隔,則依照輪詢間隔產生報告。
(3)每 4 毫秒,週期性輸入報告任務會瀏覽一次輸入報告 ID 清單。對於每個輸入報告 ID,該任務會執行下列兩種可能的操作之一。任務週期的持續時間與空閒持續時間的單位 4 毫秒相符。如果主機未傳送任何 SET_IDLE 請求,則輸入報告 ID 清單為空,任務無需處理任何內容。此任務僅處理 ID 非 0 且空閒持續時間大於 0 的報告 ID。
(4)對於給定的輸入報告 ID,任務會驗證空閒時間是否已到。如果空閒時間尚未到,則計數器遞減,並且不會向主機發送輸入報告。
(5)如果空閒持續時間已經過去(即空閒持續時間計數器已達到零),則透過中斷 IN 端點呼叫 sl_usbd_hid_write_sync() 函數向主機發送輸入報告。
(6) 任務發送的輸入報告資料來自為報告描述符中描述的每個輸入報告分配的內部資料緩衝區。應用任務可以呼叫 sl_usbd_hid_write_sync() 函數發送輸入報告。傳送輸入報表資料後,sl_usbd_hid_write_sync() 會使用剛剛傳送的資料更新與輸入報表 ID 關聯的內部緩衝區。之後,週期性輸入報告任務始終在每個空閒時間過去後發送相同的輸入報告數據,直到應用任務更新內部緩衝區中的數據。存在某種鎖定機制,以防止在週期性輸入報告任務進行傳輸時發生修改而導致輸入報告 ID 資料損壞。
版權所有 © 2025 Silicon Laboratories。版權所有。
42/174
超過view
超過view
USB 裝置 MSC 類別
USB 裝置 MSC 類別view 核心 USB 裝置 MSC 類別資源需求 USB 裝置 MSC 類別配置 USB 裝置 MSC 類別程式指南 USB 裝置 MSC 類別儲存驅動程式
本節介紹 Silicon Labs USB 裝置支援的大容量儲存裝置類別 (MSC)。 MSC 是一種協議,用於在 USB 裝置和主機之間傳輸資訊。傳輸的資訊可以是任何可以電子方式儲存的內容,例如可執行程式、原始程式碼、文件、圖像、配置資料或其他文字或數位資料。 USB 裝置對主機而言就像一個外部儲存介質,支援傳輸 file透過拖放操作。
A file 系統定義了 files 在儲存媒體中組織。 USB 大容量儲存類別規格不要求任何特定的 file 系統無法在符合標準的設備上使用。相反,它提供了一個簡單的接口,可以使用小型電腦系統接口 (SCSI) 透明命令集來讀寫資料扇區。因此,作業系統可以將 USB 驅動器視為硬碟驅動器,並可以使用任何格式對其進行格式化。 file 他們喜歡的系統。
USB大容量儲存裝置類別支援兩種傳輸協議,如下所示:
僅批量傳輸 (BOT) 控制/批量/中斷 (CBI) 傳輸(僅用於軟碟機)
大容量儲存裝置類別僅使用 BOT 協定實作 SCSI 透明命令集,這表示僅使用批次端點來傳輸資料和狀態資訊。 MSC 實作支援多個邏輯單元。
MSC 實施符合以下規範:
通用序列匯流排大容量儲存類別規範view,修訂版 1.3,2008 年 9 月 5 日。通用序列匯流排大容量儲存類別批次傳輸,修訂版 1.0,1999 年 9 月 31 日。
USB 裝置 MSC aCl ss Overview
協定端點類別請求小型電腦系統介面 (SCSI)
協定
在本節中,我們將討論大容量儲存類別的批次傳輸 (BOT) 協定。批量傳輸協定有三個tages:
指令傳輸 資料傳輸 狀態傳輸
大容量儲存命令由主機透過稱為命令塊包裝器 (CBW) 的結構發送。對於需要資料傳輸的命令tage,主機將嘗試根據 CBW 的長度和標誌欄位指定的數量,從裝置發送或接收精確的位元組數。資料傳輸完成後tage,主機嘗試從設備接收命令狀態包裝器(CSW),其中詳細說明了命令的狀態以及任何資料殘留(如果
版權所有 © 2025 Silicon Laboratories。版權所有。
43/174
超過view
任何)。對於不包含資料傳輸的命令tage. 主機在CBW發送後立即嘗試接收CSW。該協議的詳細說明請參閱圖-MSC協議。
圖 – MSC 協議
端點
在裝置端,遵循BOT規範,MSC由以下端點組成:一對控制IN和OUT端點,稱為預設端點。一對批量IN和OUT端點。
下表列出了端點的不同用途。
表格 – MSC 端點使用情況
端點
控制輸入 控制輸出 批次輸入 批次輸出
方向
設備到主機 主機到設備 設備到主機 主機到
用法
枚舉和 MSC 特定類別請求 枚舉和 MSC 特定類別請求 發送 CSW 和數據 接收 CBW 和數據
課程請求
MSC BOT 協定定義了兩種控制請求。這些請求及其描述詳見下表。
表 – 大容量儲存類別請求
課程請求
僅批量大容量儲存重置
描述
此請求用於重置大容量儲存設備及其相關介面。此請求使設備準備好接收下一個命令塊。
版權所有 © 2025 Silicon Laboratories。版權所有。
44/174
超過view
課程請求
描述
取得最大值 此請求用於傳回裝置支援的最大邏輯單元號碼 (LUN)。例如amp樂,一個
邏輯單元號
具有 LUN 0 和 LUN 1 的設備將傳回值 1。具有單一邏輯單元的裝置將返回 0 或停止
請求。可回傳的最大值為 15。
小型電腦系統介面 SCSI
在程式介面層面,MSC 設備實現了標準儲存媒體通訊協定之一,例如 SCSI 和 SFF-8020i (ATAPI)。 「編程介面」指定了具體實現的協議,並幫助主機作業系統載入合適的裝置驅動程式來與 USB 儲存裝置進行通訊。 SCSI 是 USB MSC 儲存裝置最常用的協定。我們提供了 MSC SCSI 子類別的實現,可供 GSDK 用戶開箱即用。
SCSI 是一套用於處理電腦與週邊設備之間通訊的標準。這些標準包括命令、協定、電氣介面和光纖介面。使用其他硬體介面(例如 USB)的儲存設備使用 SCSI 命令來取得設備/主機資訊、控制設備的操作以及在儲存媒體中傳輸資料塊。
SCSI 指令涵蓋了廣泛的裝置類型和功能,因此裝置需要這些指令的子集。通常,以下命令對於基本通訊是必需的:
查詢讀取容量(10)讀取(10)請求感測測試單元就緒寫入(10)
核心的 USB 裝置 MSC 類別資源需求
每次透過函數 sl_usbd_msc_add_to_configuration() 將 MSC 類別實例新增至 USB 配置時,都會從核心指派下列資源。
資源
介面 備用介面 端點 介面組
數量
1 1 2 0
請注意,這些數字是針對每個配置的。設定 SL_USBD_INTERFACE_QUANTITY 、 SL_USBD_ALT_INTERFACE_QUANTITY 、 SL_USBD_INTERFACE_GROUP_QUANTITY 和 SL_USBD_DESCRIPTOR_QUANTITY 設定值時,請不要忘記該類別會新增多少個設定。對於 SL_USBD_OPEN_ENDPOINTS_QUANTITY 配置值,由於只有在主機設定配置時才會開啟端點,因此您只需考慮類別實例所需的端點數量。
USB 裝置 MSC 類別配置
兩組配置參數用於配置MSC類別:
USB 裝置 MSC 類別應用程式特定配置 USB 裝置 MSC 類別邏輯單元配置
USB 裝置 MSC 類別應用程式特定配置
類別編譯時配置類別實例創建
版權所有 © 2025 Silicon Laboratories。版權所有。
45/174
超過view
類別編譯時配置
Silicon Labs USB 裝置 MSC 類別和 SCSI 子類別可在編譯時透過位於 sl_usbd_core_config.h 中的 #defines 進行配置 file.
表 – 通用配置常數
配置名稱
描述
SL_USBD_MSC_CLASS_INST 透過呼叫函數分配的類別實例數量
ANCE_QUANTITY
sl_usbd_msc_scsi_create_instance() 。
SL_USBD_MSC_CONFIGURA 可以透過呼叫來新增類別實例的配置數量
TION_QUANTITY
函數 sl_usbd_msc_scsi_add_to_configuration() 。
SL_USBD_MSC_LUN_QUANT 透過呼叫新增的每個類別實例的邏輯單元數
性
函數 sl_usbd_msc_scsi_lun_add() 。
SL_USBD_MSC_SCSI_64_BIT 啟用或停用對 64 位元邏輯區塊位址 (LBA) 的支援。
_LBA_EN
SL_USBD_MSC_DATA_BUFF 每個類別實例的資料緩衝區大小(以位元組為單位)ER_SIZE
預設值
2
1
2
0
512
類別實例創建
透過呼叫 sl_usbd_msc_scsi_create_instance() 函數來建立 USB 裝置 MSC SCSI 類別實例。此函數接受一個配置參數,如下所述。
p_scsi_回呼函數
p_scsi_callbacks 是指向 sl_usbd_msc_scsi_callbacks_t 類型的配置結構體的指標。除了常見的 USB 裝置類別回調連接/斷開連接之外,它還為 MSC 類別提供了一組可選的回調函數,這些函數會在邏輯單元發生事件時呼叫。如果不需要回調,則可以將空指標 ( NULL ) 傳遞給此參數。
下表描述了此配置結構中可用的每個配置欄位。
表 – sl_usbd_msc_scsi_callbacks_t 配置結構
領域
描述
。使能夠
當 USB 類別實例成功啟用時呼叫。
.disable 當 USB 類別實例被停用時呼叫。
.host_eject 當邏輯單元從主機彈出時呼叫的函數。
函數簽名
無效 app_usbd_msc_scsi_enable(uint8_t class_nbr);
無效 app_usbd_msc_scsi_disable(uint8_t class_nbr);無效 app_usbd_msc_scsi_host_eject(uint8_t class_nbr,uint8_t lu_nbr);
USB 裝置 MSC 類別邏輯單元配置
透過呼叫函數 sl_usbd_msc_lun_add() ,可以將邏輯單元加入 MSC 類別實例。此函數接受一個配置參數,如下所述。
p_lu_info
p_lu_info 是一個指向 sl_usbd_msc_scsi_lun_info_t 類型結構的指標。其目的是向 MSC 類別提供有關邏輯單元的資訊。
下表描述了此配置結構中可用的每個配置欄位。
表 – sl_usbd_msc_scsi_lun_info_t 配置結構
版權所有 © 2025 Silicon Laboratories。版權所有。
46/174
超過view
場地
描述
場地
.scsi_lun_api_p tr
描述
指向將處理此邏輯單元的媒體驅動程式 API。有關儲存驅動程式的更多信息,請參閱 USB 裝置 MSC 類儲存驅動程式。
.vend o r_id _ p tr
.product_id_ptr
.產品版本 .is_read_only
指向包含邏輯單元供應商識別的字串的指標。該字串的最大長度為 8 個字元。指向包含邏輯單元產品標識的字串的指標。該字串的最大長度為 16 個字元。產品修訂等級。
指示邏輯單元是否應被視為唯讀的標誌 view 是( true )還是不是( false )。
USB 裝置 MSC 類別程式設計指南
本節介紹如何使用 MSC 類別。
初始化 USB 裝置 MSC 類別 將 USB 裝置 MSC SCSI 類別執行個體新增至您的裝置 USB 裝置 MSC 類別邏輯單元處理
初始化 USB 裝置 MSC 類
若要將 MSC SCSI 類別功能新增至您的設備,請先透過呼叫函數 sl_usbd_msc_init() 和 sl_usbd_msc_scsi_init() 初始化 MSC 基底類別和 SCSI 子類別。
前任amp下面的檔案展示如何呼叫 sl_usbd_msc_init() 和 sl_usbd_msc_scsi_init() 。
Example – 呼叫 sl_usbd_msc_init() 和 sl_usbd_msc_scsi_init()
sl_status_t 狀態;
status = sl_usbd_msc_init(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
status = sl_usbd_msc_scsi_init(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
將 USB 設備 MSC SCSI 類別執行個體新增至您的設備
若要將 MSC SCSI 類別功能新增至您的設備,請先建立一個實例,然後將其新增至設備的配置中。您必須在實例中新增至少一個邏輯單元。
建立 MSC SCSI 類別實例
透過呼叫函數 sl_usbd_msc_scsi_create_instance() 建立 MSC SCSI 類別實例。
前任amp下面的 le 展示如何使用預設參數呼叫 sl_usbd_msc_scsi_create_instance() 。有關傳遞給 sl_usbd_msc_scsi_create_instance() 的配置參數的更多信息,請參閱 USB 設備 MSC 類別應用程式特定配置 。
Example – 呼叫 sl_usbd_msc_scsi_create_instance()
版權所有 © 2025 Silicon Laboratories。版權所有。
47/174
超過view
uint8_t class_nbr;sl_status_t 狀態;
sl_usbd_msc_scsi_callbacks_t app_usbd_msc_scsi_callbacks = { .enable = NULL, .disable = NULL, .host_eject = NULL };
狀態 = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */}
將 MSC 類別實例新增至設備配置中
建立 MSC 類別實例後,可以透過呼叫函數將其新增至配置中
sl_usbd_msc_add_to_configuration() 。
前任amp下面的程式碼展示如何使用預設參數呼叫 sl_usbd_msc_scsi_add_to_configuration()。
Example – 呼叫 sl_usbd_msc_scsi_add_to_configuration()
sl_status_t 狀態;
狀態 = sl_usbd_msc_scsi_add_to_configuration(class_nbr,
(1)
配置_nbr_fs);
(2)
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
(1)要新增至 sl_usbd_msc_scsi_create_instance() 傳回的設定中的類別編號。 (32)配置編號(此處將其新增至全速配置)。
USB 裝置 MSC 類別邏輯單元處理
新增邏輯單元 連接/分離儲存介質
新增邏輯單元
在 MSC SCSI 類別實例中新增邏輯單元時,必須將其綁定到儲存媒體(RAMDisk、SD 卡、快閃記憶體等)。 MSC 類別使用儲存驅動程式與儲存媒體通訊。新增邏輯單元時需要提供此驅動程式。
前任amp下面的檔案展示如何透過 sl_usbd_msc_scsi_lun_add() 新增邏輯單元。
Example – 透過 sl_usbd_msc_scsi_lun_add() 新增邏輯單元
版權所有 © 2025 Silicon Laboratories。版權所有。
48/174
超過view
sl_usbd_msc_scsi_lun_t *lu_object_ptr = 空;
sl_usbd_msc_scsi_lun_info_t lu_info;
sl_status_t
地位;
lu_info.sl_usbd_msc_scsi_lun_api_t = &app_usbd_scsi_storage_block_device_api;
lu_info.vendor_id_ptr
=“Silicon Labs”;
lu_info.product_id_ptr
=“區塊設備 examp樂」;
lu_info.product_revision_level = 0x1000u;
lu_info.is_read_only
=假;
狀態 = sl_usbd_msc_scsi_lun_add(class_nbr,&lu_info,&lu_object_ptr);
if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */}
連接/移除儲存媒體
新增邏輯單元後,必須連接儲存媒體才能從主機端存取。 MSC 類別提供了兩個函數來控制儲存媒體與邏輯單元的關聯:sl_usbd_msc_scsi_lun_attach() 和 sl_usbd_msc_scsi_lun_detach()。這些函數可讓您模擬儲存裝置的移除,以便在必要時重新獲得嵌入式應用程式的存取權限。
前任amp下面的檔案顯示如何使用函數 sl_usbd_msc_scsi_lun_attach() 和 sl_usbd_msc_scsi_lun_detach() 。
Example – 媒體連結/分離
sl_status_t 狀態;
status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */
}
…
(1)
狀態 = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); 如果 (狀態!SL_STATUS_OK) {
/* 發生錯誤。應在此處新增錯誤處理。 */
}
…
(2)
狀態 = sl_usbd_msc_scsi_lun_attach(lu_object_ptr) 如果 (狀態!SL_STATUS_OK) {
/* 發生錯誤。應在此處新增錯誤處理。 */
}
…
(3)
(1)從此刻起,如果 MSC 設備連接到主機,則可以存取儲存媒體。
(2)如果 MSC 裝置已連線至主機,則媒體現在將顯示為不可用。此時,可以從嵌入式應用程式對媒體執行操作。
(3)同樣,如果 MSC 設備已連接到主機,則儲存媒體將顯示為已連接。
USB 裝置 MSC 類別儲存驅動程式
USB 裝置 MSC 類別需要儲存驅動程式才能與儲存媒體通訊。目前,Silicon Labs 不提供驅動程式。
版權所有 © 2025 Silicon Laboratories。版權所有。
49/174
超過view
驅動程式 AI 由 typedef sl_usbd_msc_scsi_lun_api_t 定義。使用 sl_usbd_msc_scsi_lun_add() 新增邏輯單元時,必須將 sl_usbd_msc_scsi_lun_api_t 新增至 sl_usbd_msc_scsi_lun_info_t 中,該參數為 p ssed 參數。有關這些結構的更多詳細信息,請參閱“USB 設備 MSC SCSI API”部分。儲存驅動程式的實作可以像 RAM 中的磁區數組一樣簡單。大容量儲存裝置的典型磁區大小(即區塊大小)為 512,CD-ROM 的典型磁區大小為 2048。
版權所有 © 2025 Silicon Laboratories。版權所有。
50/174
超過view
超過view
USB 設備供應商類別
USB 裝置供應商類別結束view USB 裝置供應商類別資源需求來自核心 USB 裝置供應商類別設定 USB 裝置供應商類別程式設計指南 Vendor 類別可讓您建立可實現專有協定的特定於供應商的裝置。它依靠一對批量端點在主機和設備之間傳輸資料。大量傳輸適用於傳輸大量非結構化數據,並透過使用錯誤檢測和重試機制提供可靠的數據交換。除了批次端點之外,Vendor 類別還可以使用一對可選的中斷端點。任何作業系統 (OS) 都可以使用 Vendor 類,只要該作業系統具有處理 Vendor 類別的驅動程式。根據作業系統的不同,驅動程式可以是本機的,也可以是特定於供應商的。例如,在 Microsoft Windows® 下,您的應用程式與 Microsoft 提供的 WinUSB 驅動程式互動以與供應商裝置通訊。
USB 裝置供應商類別結束view
圖 – Windows 主機和供應商類別之間的通用架構展示了使用供應商類別的主機和裝置之間的通用架構。在本例中amp例如,主機作業系統是MS Windows。
圖 – MS Windows 主機和供應商類別之間的通用架構
在 MS Windows 端,應用程式透過與 USB 庫互動來與供應商裝置通訊。像 libusb 這樣的函式庫提供了 API 來管理設備及其關聯的管道,並透過控制端點、批次端點和中斷端點與設備通訊。
在裝置端,Vendor 類別由以下端點組成:
一對控制 IN 和 OUT 端點(稱為預設端點)。一對批量 IN 和 OUT 端點。
版權所有 © 2025 Silicon Laboratories。版權所有。
51/174
超過view
一對中斷 IN 和 OUT 端點。此端點對是可選的。下表列出了不同端點的用法:
表 – 供應商類別端點使用情況
端點方向
控制輸入
控制
出去
大量輸入
設備到主機
>主機到設備
設備到主機
大量輸出
中斷輸入
打斷
出去
主機到裝置
設備到主機
主機到裝置
用法
標準枚舉請求和特定於供應商的請求。
標準枚舉請求和特定於供應商的請求。
原始數據通訊。數據可以根據專有協定進行建置。
原始數據通訊。數據可以根據專有協定進行建置。
原始數據通信或通知。數據可以根據專有協定進行結構化。原始數據通信或通知。數據可以根據專有協定進行結構化。
設備應用程式可以使用批次端點和中斷端點向主機發送或從主機接收資料。它只能使用預設端點來解碼主機發送的特定於供應商的請求。標準請求由 Silicon Labs USB 裝置的核心層內部管理。
核心的 USB 裝置供應商類資源需求
每次透過函數 sl_usbd_vendor_add_to_configuration() 將供應商類別實例新增至設定時,都會從核心指派下列資源。
資源
介面 備用介面 端點 介面組
數量
1 1 2 (如果啟用了中斷端點則為 4) 0
請注意,這些數字是針對每個配置的。設定 SL_USBD_INTERFACE_QUANTITY 、 SL_USBD_ALT_INTERFACE_QUANTITY 、 SL_USBD_INTERFACE_GROUP_QUANTITY 和 SL_USBD_DESCRIPTOR_QUANTITY 設定值時,請不要忘記該類別會新增多少個設定。對於 SL_USBD_OPEN_ENDPOINTS_QUANTITY 配置值,由於只有在主機設定配置時才會開啟端點,因此您只需考慮類別實例所需的端點數量。
USB 裝置供應商類別配置
兩組配置參數用於配置Vendor類別:
USB 裝置供應商類別應用程式特定配置 USB 裝置供應商類別實例配置
USB 裝置供應商類別應用程式特定配置
首先,若要使用 Silicon Labs USB 裝置 Vendor 類別模組,請根據應用程式需求調整 Vendor 編譯時設定定義。它們在 sl_usbd_core_config.h 頭檔中進行了重新分組。 file 在供應商部分下。數量配置的目的是告知 USB 裝置模組需要分配多少個 USB 供應商物件。
下表描述了每個配置定義。
版權所有 © 2025 Silicon Laboratories。版權所有。
52/174
超過view
表 – USB 裝置供應商配置定義
配置名稱
描述
預設值
SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY 透過呼叫 2 函數 sl_usbd_vendor_create_instance() 指派的類別實例數量。
SL_USBD_VENDOR_CONFIGURATION_QUANTITY 配置數量。可以透過呼叫函數 sl_usbd_vendor_add_to_configuration() 將供應商類別實例新增至一個或多個配置。
USB 裝置供應商類別實例配置
本節定義與 Vendor 類別實例相關的配置。
類別實例建立 intr_en 間隔 p_vendor_callbacks
類別實例創建
透過呼叫函數 sl_usbd_vendor_create_instance() 來建立 Vendor 類別實例,該函數需要下面描述的三個配置參數。
intr_en
布林值,指示是否應新增一對中斷端點。
價值
真假
描述
將新增一對 IN/OUT 端點,並提供給嵌入式應用程式使用。不會新增任何中斷端點。僅一對批次 IN/OUT 端點可用。
間隔
如果將 intr_en 設為 true ,則可以指定中斷端點輪詢間隔(以毫秒為單位)。如果將 intr_en 設為 false ,則可以將 interval 設為 0 ,因為它會被類別忽略。
p_vendor_callbacks
p_vendor_callbacks 是指向回呼函數結構體變數的指針,您可以指定該變數來處理特定於類別的控制請求。如果您不使用任何特定於類別的請求或需要啟用/停用通知,可以將其設定為 NULL 。
前任amp下面提供了類別特定請求處理程序的預期簽名。
Example – 特定類別請求函數的簽名
void app_usbd_vendor_req_handle(uint8_t
類號,(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)供應商類別實例編號。
版權所有 © 2025 Silicon Laboratories。版權所有。
53/174
超過view
(2)指向從主機接收的設定請求的指標。
USB 裝置供應商類別程式設計指南
本節介紹如何使用 Vendor 類別。初始化 USB 裝置 Vendor 類別;將 USB 裝置 Vendor 類別實例新增至裝置;使用 USB 裝置 Vendor 類別進行通訊
初始化 USB 裝置供應商類
若要將供應商類別功能新增至您的設備,請先透過呼叫函數 USBD_Vendor_Init() 來初始化該類別。 examp下面的檔案展示如何呼叫 sl_usbd_vendor_init() 。
Example – 呼叫 sl_usbd_vendor_init()
sl_status_t 狀態;
status = sl_usbd_vendor_init(); if (status ! SL_STATUS_OK) { /* 發生錯誤。應在此處新增錯誤處理。 */}
將 USB 設備供應商類別實例新增至您的設備
若要為您的裝置新增供應商類別功能,您必須先建立一個實例,然後將其新增至裝置的配置中。
建立供應商類別實例將供應商類別實例新增至您的設備配置中
建立供應商類別實例
透過呼叫函數 sl_usbd_vendor_create_instance() 來建立 Vendor 類別實例。 examp下面的 le 展示如何使用預設參數呼叫 sl_usbd_vendor_create_instance() 。有關傳遞給 sl_usbd_vendor_create_instance() 的配置參數的更多信息,請參閱 USB 設備供應商類別實例配置 。
Example – 呼叫 sl_usbd_vendor_create_instance()
uint8_t class_nbr;sl_status_t 狀態;
狀態 = sl_usbd_vendor_create_instance(false,
(1)
0u,
(2)
app_usbd_vendor_callback_functions,(3)
&類別編號);
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
(1)此類實例沒有中斷端點。 (2)由於中斷端點被停用,因此忽略間隔。
版權所有 © 2025 Silicon Laboratories。版權所有。
54/174
超過view
(3)回調函數,它是應用程式的一部分,用於處理特定於供應商的類別請求。有關更多信息,請參閱使用 USB 設備供應商類進行通訊。將供應商類別實例新增至設備配置。建立供應商類別實例後,可以透過呼叫函數 USBD_Vendor_ConfigAdd() 將其新增至組態。範例amp下面的檔案展示如何使用預設參數呼叫 sl_usbd_vendor_add_to_configuration()。
Example – 呼叫 sl_usbd_vendor_add_to_configuration()
sl_status_t 狀態;
狀態 = sl_usbd_vendor_add_to_configuration(class_nbr,
(1)
配置_nbr_fs);
(2)
如果(狀態!SL_STATUS_OK){
/* 發生錯誤。應在此處新增錯誤處理。 */
}
(1)要新增至 sl_usbd_vendor_create_instance() 傳回的設定中的類別編號。 (2)配置編號(此處將其新增至全速配置)。
使用 USB 裝置供應商類別進行通信
常規 同步通訊 非同步通訊 供應商請求 常規 Vendor 類別提供以下函數用於與主機通訊。有關該函數參數的詳細信息,請參閱 USB 裝置供應商 API。
表格 – 供應商通訊 API 摘要
函數名稱
sl_usb d _v e nd o r_ read _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_ read _b ulk_asy nca_y_asy nca_w_asy nc() sl_usb d _v e nd o r_ read _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_ read _in t_sy nc() sl_usb d _v e nd o r_ read _inte rrup_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-
阻塞。
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
版權所有 © 2025 Silicon Laboratories。版權所有。
55/174
超過view
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
__ALIGNED(4) uint8_t rx_buf[2];
__ALIGNED(4) uint8_t tx_buf[2];
uint32_t
轉接長度;
sl_status_t
地位;
status = sl_usbd_vendor_read_bulk_sync(class_nbr,
(1)
(void *)&rx_buf[0],
(2)
2u,
0u,
(3)
&xfer_len);
如果(狀態!SL_STATUS_OK){
/* $$$$ 處理錯誤。 */
}
status = sl_usbd_vendor_write_bulk_sync( class_nbr,
(1)
(void *)&tx_buf[0],
(4)
2u,
0u,
(3)
false,
(5)
&xfer_len);
如果(狀態!SL_STATUS_OK){
/* $$$$ 處理錯誤。 */
}
(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)應用程式提供初始化的傳送緩衝區。
(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.
非同步通信
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
版權所有 © 2025 Silicon Laboratories。版權所有。
56/174
超過view
void app_usbd_vendor_comm (uint8_t class_nbr)
{
__ALIGNED(4) uint8_t rx_buf[2];
__ALIGNED(4) uint8_t tx_buf[2];
sl_status_t
地位;
status = sl_usbd_vendor_read_bulk_async(class_nbr,
(void *)&rx_buf[0],
(2)
2u,
app_usbd_vendor_rx_completed,
NULL);
(4)
如果(狀態!SL_STATUS_OK){
/* $$$$ 處理錯誤。 */
}
status = sl_usbd_vendor_write_bulk_async(class_nbr,
(void *)&tx_buf[0],
(5)
2u,
app_usbd_vendor_tx_completed,
空值,
(4)
false);
(6)
如果(狀態!SL_STATUS_OK){
/* $$$$ 處理錯誤。 */
}
}
(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)
{
如果(狀態!SL_STATUS_OK){
/* $$$$ Do some processing. */
} 別的 {
/* $$$$ 處理錯誤。 */
}
}
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)
{
如果(狀態!SL_STATUS_OK){
/* $$$$ Do some processing. */
} 別的 {
/* $$$$ 處理錯誤。 */
}
}
(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.
版權所有 © 2025 Silicon Laboratories。版權所有。
57/174
超過view
(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
版權所有 © 2025 Silicon Laboratories。版權所有。
58/174
超過view
#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 狀態;
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],
'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;
預設:
(6)
// Request is not supported.
版權所有 © 2025 Silicon Laboratories。版權所有。
59/174
超過view
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):
類型定義結構{
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 現在。
*/
} 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.
版權所有 © 2025 Silicon Laboratories。版權所有。
60/174
API文件
API文件
API文件
模組列表
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
描述
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
版權所有 © 2025 Silicon Laboratories。版權所有。
61/174
USB Device API
USB Device API
USB Device API
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
版權所有 © 2025 Silicon Laboratories。版權所有。
62/174
USB Device ACM API
USB Device ACM API
USB Device ACM API
USB Device CDC ACM API.
模組
a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_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 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).
版權所有 © 2025 Silicon Laboratories。版權所有。
63/174
USB Device ACM API
宏
#define SL_USBD_CDC_ACM_NBR_NONE 255u
模塊。
#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
版權所有 © 2025 Silicon Laboratories。版權所有。
64/174
USB Device ACM API
類型
空白
Direction N/A
Argument Name
MACROS GLOBAL CONSTANTS FUNCTION PROTOTYPES CDC ACM FUNCTIONS
Initialize the CDC ACM serial emulation subclass.
退貨
Returns SL_STATUS_OK on success or another SL_STATUS code on failure.
描述
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.
參數
類型
uint16_t
uint16_t
Direction Argument Name
描述
不適用
line_state_interval Line state notification interval in milliseconds (value must
be a power of 2).
不適用
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 *
不適用
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.
退貨
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.
參數
類型
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.
退貨
版權所有 © 2025 Silicon Laboratories。版權所有。
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.
參數
類型
方向
Argument Name
描述
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
文件/資源
![]() |
SILICON LABS USB Device Stack [pdf] 使用說明書 USB Device Stack, Device Stack, Stack |