Стек USB-пристроїв
Технічні характеристики
- Версія USB: 1.5.1
- Дата випуску: 21 липня 2025 р
- Версія пакета SDK Simplicity: 2025.6.1
Продукт закінченийview
Стек USB-пристроїв від Silicon Labs забезпечує універсальність та
просте у використанні USB-з’єднання для проектів Інтернету речей, що полегшує
зв'язок між мережевими співпроцесорами та хостами.
особливості
- Ефективний стек USB-пристроїв
- Ідеально підходить для проектів Інтернету речей
- Підтримка зв'язку між мережевими співпроцесорами та
господарі
Інструкція з використання продукту
Конфігурація USB-пристрою
Налаштуйте параметри USB-пристрою відповідно до вашого проекту
вимоги, звернувшись до розділу «Конфігурація USB-пристрою»
у документації.
Посібник з програмування USB-пристроїв
Дотримуйтесь інструкцій у Посібнику з програмування USB-пристроїв, щоб зрозуміти, як
програмувати та взаємодіяти з USB-пристроєм для різних цілей
програми.
Класи USB-пристроїв
Розділ «Класи USB-пристроїв» містить оглядview різних
класи, такі як CDC ACM, HID, MSC SCSI та Vendor Class. Виберіть
відповідний клас залежно від функціональності вашого пристрою.
Виправлення неполадок USB-пристроїв
Якщо у вас виникли проблеми з USB-пристроєм, зверніться до
Розділ «Виправлення неполадок USB-пристроїв» для пошуку рішень та налагодження
поради.
USB-хост ОС Microsoft Windows
Якщо ви використовуєте USB-пристрій з USB-пристроєм ОС Microsoft Windows
Господарю, обов’язково дотримуйтесь інструкцій, наведених у
документація для безперебійної інтеграції.
FAQ
Q: Які типові колишніampменше пристроїв, які я можу зібрати за допомогою
цей USB-стек?
A: Стек USB дозволяє створювати такі пристрої, як
USB-адаптери на послідовний порт, миші або клавіатури, знімні носії інформації
пристрої та користувацькі пристрої.
З: Чи є якісь особливі вимоги до програмного забезпечення для використання цього
Стек USB-пристроїв?
A: Сумісне програмне забезпечення включає Simplicity SDK, Simplicity
Studio, Simplicity Commander, GCC (Колекція компіляторів GNU),
Вбудований робочий простір IAR для 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
Документація API USB API USB-пристроїв API ACM USB-пристроїв a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t API CDC USB-пристроїв a sl_usbd_cdc_subcl ss_driver_t API ядра USB-пристроїв
sl_usbd_device_config_t sl_usbd_setup_req_t
API HID USB-пристроїв sl_usbd_cl ss_driver_t
sl_usbd_hid_callbacks_t API MSC USB-пристроїв
API sl_usbd_msc_subcl ss_driver_t USB-пристрій MSC SCSI
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
API постачальника USB-пристроїв sl_usbd_vendor_callbacks_t
Документація API Виправлення неполадок USB-пристроїв
закінченоview USB-хост ОС Microsoft Windows
закінченоview
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
2/174
закінченоview
закінченоview
USB-пристрій
USB — один із найуспішніших комунікаційних інтерфейсів в історії комп'ютерних систем і фактичний стандарт для підключення комп'ютерної периферії. Стек USB-пристроїв Silicon Labs — це модуль USB-пристроїв, розроблений спеціально для вбудованих систем. Розроблений з нуля з урахуванням якості, масштабованості та надійності Silicon Labs, він пройшов суворий процес перевірки відповідності специфікації USB 2.0. У цій документації описано, як ініціалізувати, запускати та використовувати стек USB-пристроїв Silicon Labs. У ній пояснюються різні значення конфігурації та їх використання. Вона також містить детальний опис...view технології, типи можливостей конфігурації, процедури впровадження таampменше типового використання для кожного доступного класу.
Щоб допомогти вам швидко зрозуміти концепції USB, у документації міститься багато прикладівampдиски USB з основними функціями. Ціamples нададуть вам платформу, яка дозволить вам швидко створювати пристрої. Ці exampвключають:
Адаптер 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 21 липня 2025 р. – Примітки до випуску
Версія пакета SDK Simplicity 2025.6.1
Ефективний стек USB-пристроїв Silicon Labs пропонує універсальне та просте у використанні USB-з’єднання, ідеальне для проектів Інтернету речей, включаючи зв’язок між мережевими співпроцесорами та хостами. Натисніть тут, щоб переглянути попередні випуски.
Підсумок випуску
Основні характеристики | Зміни API | Виправлення помилок | Підтримка чіпів
Ключові характеристики
Тільки зміни базової платформи.
Зміни API
Жодного.
Виправлення помилок
Жодного.
Активація чіпа
Жодного.
Ключові характеристики
Нові функції | Покращення | Видалені функції | Застарілі функції
Нові функції
Жодного.
Покращення
Тільки зміни базової платформи.
Видалені функції
Жодного.
Застарілі функції
Жодного.
Зміни API
Нові API | Змінені API | Видалені API | Застарілі API
Нові API
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
4/174
USB
Жодного.
Змінені API
Жодного.
Видалені API
Жодного.
Застарілі API
Жодного.
Виправлення помилок
Жодного.
Активація чіпа
Жодного.
Застосування Прampзміни
New Exampле | Модифікований Exampле | Видалено колишнєamples | Застарілий Exampлес
New Exampлес
Жодного.
Модифікований Exampлес
Жодного.
Видалено Прampлес
Жодного.
Застарілий Exampлес
Жодного.
Вплив змін у випуску
Заяви про вплив | Посібник з міграції
Заяви про вплив
Жодного.
Посібник з міграції
Жодного.
Відомі проблеми та обмеження
Жодного.
Використання цього випуску
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
5/174
USB
Що входить до релізу? | Сумісне програмне забезпечення | Встановлення та використання | Довідка та відгуки
Що входить до Релізу?
Застосування USB-пристроїв у стеку Exampлес
Сумісне програмне забезпечення
програмне забезпечення
Simplicity SDK, Simplicity Studio, Simplicity Commander GCC (Колекція компіляторів GNU), IAR, вбудований робочий стіл для 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.
Щоб отримати інформацію про інтеграцію із Secure Vault, див. статтю Secure Vault.
Повторноview Сповіщення щодо безпеки та програмного забезпечення, а також керування налаштуваннями сповіщень:
ò Перейдіть на сторінку https://community.silabs.com/. Ó Увійдіть, використовуючи дані свого облікового запису. ò Натисніть на свій професіоналfile значок у верхньому правому куті сторінки.
õ Виберіть «Сповіщення» у випадаючому меню. ö У розділі «Сповіщення» перейдіть на вкладку «Сповіщення про мої продукти», щобview історичні консультації з безпеки та програмного забезпечення
сповіщення
÷ Щоб керувати своїми налаштуваннями, скористайтеся вкладкою «Керування сповіщеннями», щоб налаштувати оновлення продуктів та рекомендації, які ви бажаєте отримувати.
отримати.
Рекомендовані параметри конфігурації див. тут.
Щоб дізнатися більше про програмне забезпечення в цьому випуску, ознайомтеся з нашою онлайн-документацією.
Довідка та відгук
Зверніться до служби підтримки Silicon Labs. Щоб скористатися нашим інструментом «Запитайте ШІ» для отримання відповідей, скористайтеся полем пошуку у верхній частині цієї сторінки.
Примітка: Ask AI є експериментальною функцією.
Отримайте допомогу від нашої спільноти розробників.
Політика випуску та обслуговування SDK
Дивіться нашу Політику випуску та підтримки SDK.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
6/174
закінченоview
закінченоview
Технічні характеристики
Відповідає «Специфікації універсальної послідовної шини, версія 2.0». Реалізує «Повідомлення про зміни в інженерії дескриптора асоціації інтерфейсів (ECN)». Типи передачі
Класи USB для керування масовими перериваннями Клас комунікаційних пристроїв (CDC) Абстрактна модель керування (ACM) Пристрій інтерфейсу користувача (HID) Клас масової пам'яті (MSC) Специфічна для постачальника структура класів
особливості
Масштабованість для включення лише необхідних функцій для мінімізації використання пам'яті. Підтримка повної швидкості (12 Мбіт/с). Підтримка складених (багатофункціональних) пристроїв. Підтримка пристроїв з кількома конфігураціями. Підтримка функцій енергозбереження USB (призупинення та відновлення роботи пристрою). Повна інтеграція класу Mass Storage Class в ОС Micrium. File Системний модуль розроблено з використанням рівня абстракції CMSIS-RTOS2 для роботи з різними ОС. Silicon Labs GSDK постачається з портами FreeRTOS та Micrium OS.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
7/174
закінченоview
закінченоview
Конфігурація USB-пристрою
У цьому розділі обговорюється, як налаштувати USB-пристрій Silicon Labs. Існує три групи параметрів конфігурації, а саме:
Конфігурація ядра USB-пристрою Конфігурація інформації про USB-пристрій Конфігурація апаратного забезпечення USB-пристрою
Конфігурація ядра USB-пристрою
USB-пристрій Silicon Labs можна налаштувати під час компіляції за допомогою набору #defines, розташованих у sl_usbd_core_config.h. fileUSB-пристрій використовує #defines, коли це можливо, оскільки вони дозволяють масштабувати розміри коду та даних під час компіляції залежно від увімкнених функцій. Це дозволяє налаштувати розміри постійної пам'яті (ROM) та оперативної пам'яті (RAM) USB-пристрою Silicon Labs відповідно до вимог вашої програми.
Рекомендовано: Розпочніть процес налаштування зі значеннями за замовчуванням (виділено жирним шрифтом).
Розділи нижче організовані відповідно до порядку в конфігурації шаблону file, sl_usbd_core_config.h.
Конфігурація основних класів конфігурації
Конфігурація ядра
Таблиця – Константи конфігурації ядра USB-пристрою
Константа Опис
Значення за замовчуванням
Розмір стека SL_USBD_TA SK_STACK_
Налаштовує розмір стека в байтах основного завдання USBD
4096
SL_USBD_TA SK_PRIORIT Так
Налаштовує пріоритет основного завдання USBD. Це пріоритет CMSIS-RTOS2.
Високий пріоритет os
SL_USBD_A АВТОМАТИЧНИЙ_ПУСК _USB_ПРИСТРОЮ E
Якщо ввімкнено, USB-пристрій буде автоматично запущено після запуску ядра, і це завдання ядра USBD буде заплановано на перший раз. Якщо вимкнено, вашій програмі потрібно буде викликати sl_usbd_core_start_device(), коли вона буде готова до виявлення USB-хостом.
SL_USBD_C Загальна кількість конфігурацій, які будуть додані за допомогою sl_usbd_add_configuration()
1
Функція ОНФІГУРАТІ.
ON_QUANTI
TY
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
8/174
закінченоview
Постійний
АНТИВІТАЦІЯ_ІНТЕРФЕЙСУ_SL_USBD
SL_USBD _ALT_INT_ERFACE_ КІЛЬКІСТЬ
TY
SL_USBD _INTERF ACE_GR
OUP_QU
АНТИТЕТ
SL_USBD _ОПИС
PTOR_Q
UANTITY
SL_USBD _STRING _QUANTI
TY
SL_USBD _ВІДКРИТО_E NDPOIN TS_QUANTITY
Опис Загальна кількість 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 під час компіляції, щоб встановити основну інформацію про ваш пристрій, таку як ідентифікатор постачальника/продукту, рядки пристрою тощо. У таблиці нижче описано кожен визначений параметр конфігурації інформації, доступний у цій конфігурації. file.
Таблиця – Визначення конфігурації інформації про USB-пристрій
Постійний
Ідентифікатор_постачальника_SL_USBD_ПРИСТРОЮ
ІДЕНТИФІКАТОР_ПРОДУКТУ_SL_USBD_ПРИСТРІЮ
Опис Ваш ідентифікаційний номер постачальника, наданий Форумом впроваджувачів USB. Щоб отримати додаткові відомості про те, як отримати ідентифікатор постачальника, див. 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_STRING
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_ITALIAN
– SL_USBD_LANG_ID_PORTUGUESE
– 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_PORT SL_USBD_DRIVER_VBUS_SENSE_PIN
опис
Порт GPIO для сигналу USB VBUS Sense на вашій платі. Контакт GPIO для сигналу USB VBUS Sense на вашій платі.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
10/174
закінченоview
закінченоview
Посібник з програмування USB-пристроїв
У цьому розділі пояснюється, як використовувати модуль USB-пристрою.
Початкове налаштування модуля USB-пристрою
У цьому розділі описано основні кроки, необхідні для ініціалізації модуля USB-пристрою, а також для додавання, підготовки та запуску пристрою. Ініціалізація модуля USB-пристрою Ініціалізація ядра USB-пристрою Ініціалізація aCl ss Додавання USB-пристрою Створення USB-пристрою Додавання конфігурації(й) Додавання функції(й) USB Запуск USB-пристрою
Функції перехоплення подій
Ініціалізація модуля USB-пристрою
Ініціалізація ядра USB-пристрою
Почніть з ініціалізації ядра модуля пристрою B, викликавши функцію sl_usbd_core_init(). Наведений нижче приклад показує виклик sl_usbd_core_init().
Example – Виклик sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* Сталася помилка. Тут слід додати обробку помилок. */
}
Ініціалізація класу(ів)
Після ініціалізації ядра модуля USB-пристрою необхідно ініціалізувати кожен клас, який ви плануєте використовувати. Див. розділ «Посібник з програмування» вашого(их) списку(ів) доступу(ів) для отримання додаткової інформації.
Збірка 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,
/* Максимальне споживання енергії: 100 мА.
*/
ШВИДКІСТЬ_SL_USBD_ПРИЙЖИВАННЯ_ПОВНА,
/* Конфігурація на повній швидкості.
*/
«Налаштувати додавання Ex»ampконфігурація "повна швидкість",
&config_nbr_fs);
якщо (статус ! SL_STATUS_OK) {
/* Сталася помилка. Тут слід додати обробку помилок. */
}
Додавання функцій USB
Після успішного додавання принаймні однієї конфігурації до вашого пристрою ви можете додати інтерфейси та кінцеві точки. Кожен клас USB має свої власні потреби щодо типу, кількості та інших параметрів інтерфейсу та кінцевих точок. Silicon Labs USB Device додає інтерфейси та кінцеві точки до класів, які пропонує.
З вашої програми ви можете створити екземпляр класу USB та додати його до конфігурації. Для отримання додаткової інформації про концепцію екземплярів класів пристроїв USB див. Класи пристроїв USB. Зверніть увагу, що ви можете створити екземпляр та додати багато різних екземплярів класів до конфігурації для створення багатофункціонального (композитного) пристрою.
КолишнійampУ наведеному нижче списку показано, як створити екземпляр класу та додати його до конфігурації.
Example – Додавання екземпляра класу до вашого пристрою
статус sl_status_t; uint8_t class_nbr;
/* Створіть екземпляр класу, який ви хочете використовувати.*/ /* Зверніть увагу, що залежно від класу ця функція може мати більше аргументів. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* Сталася помилка. Тут слід додати обробку помилок. */ }
/* Додати екземпляр класу до конфігурації Full-Speed. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Номер класу, повернутий sl_usbd_ _create_instance. */
config_nbr_fs); /* Номер конфігурації, повернутий функцією sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* Сталася помилка. Тут слід додати обробку помилок. */ }
Запуск USB-пристрою
За замовчуванням пристрій буде запущено автоматично завданням ядра USB-пристрою після завершення ініціалізації пристрою та запуску ядра. Щоб контролювати, коли пристрій запускається та стає видимим для USB-хоста, використовуйте конфігурацію define SL_USBD_AUTO_START_USB_DEVICE, щоб вимкнути функцію автоматичного запуску. Якщо ця функція вимкнена, після зібрання/підготовки пристрою ви можете запустити його та зробити видимим для USB-хоста, викликавши функцію sl_usbd_core_start_device().
КолишнійampУ наведеному нижче прикладі показано, як запустити пристрій за допомогою функції sl_usbd_core_start_device().
Exampле – Запуск пристрою
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
12/174
закінченоview
статус sl_status_t;
status = sl_usbd_core_start_device(); if (status ! SL_STATUS_OK) { /* Сталася помилка. Тут слід додати обробку помилок. */ }
Функції перехоплення подій
Основний модуль USB Device пропонує дві слабкі функції перехоплення, які ви можете перевизначити у своїй програмі. Їхнє призначення — повідомляти про події шини та конфігурації.
Таблиця – Функції перехоплення подій 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) { switch (подія) { case SL_USBD_EVENT_BUS_CONNECT:
// викликається, коли USB-кабель вставлено в хост-контролер break;
case SL_USBD_EVENT_BUS_DISCONNECT: // викликається, коли USB-кабель від'єднується від хост-контролера break;
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, uint8_t config_nbr) { switch (подія) { 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-пристроїв
Класи USB, доступні в Silicon Labs USB Device, мають деякі спільні характеристики. У цьому розділі пояснюються ці характеристики та їхня взаємодія з основним рівнем.
Щоб отримати докладнішу інформацію про певний клас, див. наступні статті:
Клас CDC ACM Клас HID Клас MSC SCSI Клас постачальника
Про екземпляри класів
Класи USB, доступні в USB Device, реалізують концепцію екземплярів класів. Екземпляр класу представляє одну функцію всередині пристрою. Функція може бути описана одним інтерфейсом або групою інтерфейсів і належить до певного класу.
Кожна реалізація класу USB має деякі спільні конфігурації та функції, засновані на концепції екземпляра класу. Загальні конфігурації та функції представлені в таблиці нижче. У заголовку стовпця «Константи або функції» заповнювач XXXX можна замінити назвою класу: CDC, HID, MSC, CDC_ACM або VENDOR (Vendor для назв функцій).
Таблиця – Константи та функції, пов’язані з концепцією кількох екземплярів класу
Константа або функція
SL_USBD_XXXX_CL ASS_INS TANCE_QUANTITY
SL_USBD_XXXX_CONFIGURATION_QUANTITY
sl_usb d _XXXX_create _instance ()
Ілюстрація sl_usbd_XXXX_add_to_conf()
опис
Налаштовує максимальну кількість екземплярів класу.
Налаштовує максимальну кількість конфігурацій. Під час ініціалізації класу створений екземпляр класу буде додано до однієї або кількох конфігурацій. Створює новий екземпляр класу.
Додає існуючий екземпляр класу до вказаної конфігурації пристрою.
Що стосується реалізації коду, клас оголошуватиме локальну глобальну змінну, яка містить структуру керування класом. Ця структура керування класом пов'язана з одним екземпляром класу та міститиме певну інформацію для керування екземпляром класу.
На наступних рисунках показано кілька сценаріїв. Кожен рисунок містить приклад кодуampщо відповідає сценарію випадку.
Рисунок – Кілька екземплярів класу – Пристрій FS (1 конфігурація з 1 інтерфейсом) представляє типовий USB-пристрій. Пристрій є повношвидкісним (FS) та містить одну конфігурацію. Функція пристрою описується одним інтерфейсом, що складається з пари кінцевих точок для передачі даних. Створюється один екземпляр класу, який дозволить вам керувати всім інтерфейсом з пов'язаною з ним кінцевою точкою.
Рисунок – Кілька екземплярів класу – Конфігурація FS Device 1 з 1 інтерфейсом)
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
15/174
закінченоview
Код, що відповідає рисунку – Кілька екземплярів класу – Пристрій FS (1 конфігурація з 1 інтерфейсом), показано в прикладі.ampнижче.
Example – Кілька екземплярів класу – конфігурація пристрою FS 1 з 1 інтерфейсом)
статус sl_status_t; uint8_t клас_0;
void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Обробка події ввімкнення класу. */ }
void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Обробка події вимкнення класу. */ }
sl_usbd_XXXX_callbacks_t class_callbacks = {
(1)
.enable = app_usbd_XXXX_enable,
.disable = app_usbd_XXXX_disable
};
статус = sl_usbd_XXXX_init();
(2)
якщо (статус ! SL_STATUS_OK) {
/* $$$$ Обробка помилки. */
}
статус = sl_usbd_XXXX_create_instance(&class_callbacks,
(3)
&клас_0);
якщо (статус ! SL_STATUS_OK) {
/* $$$$ Обробка помилки. */
}
статус = sl_usbd_XXXX_add_to_configuration(клас_0, конфігурація_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 клас_0; uint8_t клас_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(клас_0, cfg_0); статус = sl_usbd_XXXX_add_to_configuration(клас_1, cfg_0);
статус = sl_usbd_XXXX_add_to_configuration(клас_0, cfg_1); статус = sl_usbd_XXXX_add_to_configuration(клас_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 класу
Базовий клас CDC USB-пристрою понадview Потреби в ресурсах класу CDC ACM USB-пристрою від основного підкласу CDC ACM USB-пристроюview Конфігурація класу ACM для USB-пристроїв CDC Посібник з програмування класу ACM для USB-пристроїв CDC
У цьому розділі описано клас Communications Device Class (CDC) та пов'язаний з ним підклас CDC, що підтримується стеком USB-пристроїв Silicon Labs. USB-пристрій Silicon Labs наразі підтримує підклас Abstract Control Model (ACM), який зазвичай використовується для емуляції послідовного порту.
CDC включає різні телекомунікаційні та мережеві пристрої. Телекомунікаційні пристрої включають аналогові модеми, аналогові та цифрові телефони, термінальні адаптери ISDN тощо. НаприкладampНаприклад, мережеві пристрої містять ADSL та кабельні модеми, адаптери Ethernet та концентратори. CDC визначає структуру для інкапсуляції існуючих стандартів комунікаційних послуг, таких як V.250 (для модемів через телефонну мережу) та Ethernet (для пристроїв локальної мережі), за допомогою USB-з'єднання. Комунікаційний пристрій відповідає за керування пристроями, керування викликами за потреби та передачу даних.
CDC визначає сім основних груп пристроїв. Кожна група належить до моделі зв'язку, яка може включати кілька підкласів. Кожна група пристроїв має власний документ специфікації, окрім базового класу CDC. Ці сім груп:
Телефонна мережа загального користування (PSTN), пристрої, включаючи модеми голосового діапазону, телефони та пристрої послідовної емуляції. Пристрої цифрової мережі з інтегрованими послугами (ISDN), включаючи термінальні адаптери та телефони. Пристрої моделі керування Ethernet (ECM), включаючи пристрої, що підтримують сімейство IEEE 802 (наприклад: кабельні та ADSL-модеми, адаптери WiFi). Пристрої асинхронного режиму передачі (ATM), включаючи ADSL-модеми та інші пристрої, підключені до мереж ATM (робочі станції, маршрутизатори, комутатори локальної мережі). Пристрої бездротового мобільного зв'язку (WMC), включаючи багатофункціональні телефонні пристрої, що використовуються для керування голосовим зв'язком та передачею даних. Пристрої моделі емуляції Ethernet (EEM), які обмінюються даними, що обробляються за допомогою Ethernet. Пристрої моделі керування мережею (NCM), включаючи високошвидкісні мережеві пристрої (високошвидкісні модеми пакетного доступу, лінійне термінальне обладнання).
Реалізація CDC та пов'язаного з ним підкласу відповідає наступним специфікаціям:
Універсальна послідовна шина, визначення класів для комунікаційних пристроїв, версія 1.2, 3 листопада 2010 р. Універсальна послідовна шина, зв'язок, підклас для пристроїв PSTN, версія 1.2, 9 лютого 2007 р.
Базовий клас CDC USB-пристрою понадview
Пристрій CDC складається з таких інтерфейсів для реалізації комунікаційних можливостей:
Інтерфейс комунікаційного класу (CCI) відповідає за керування пристроями та, за бажанням, за керування викликами.
Керування пристроями дозволяє загальне налаштування та керування пристроєм, а також сповіщення про події на хості. Керування викликами дозволяє встановлювати та завершувати виклики. Керування викликами може бути мультиплексованим через DCI. CCI є обов'язковим для всіх пристроїв CDC. Він ідентифікує функцію CDC, вказуючи модель зв'язку, що підтримується пристроєм CDC. Інтерфейс(и) після CCI може бути будь-яким визначеним інтерфейсом класу USB, таким як аудіо або інтерфейс, специфічний для певного постачальника. Інтерфейс, специфічний для певного постачальника, представлений саме DCI.
Інтерфейс класу даних (DCI) відповідає за передачу даних. Дані, що передаються та/або отримуються, не відповідають певному
формат. Дані можуть бути необробленими даними з лінії зв'язку, даними, що відповідають власному формату тощо. Усі DCI, що йдуть після CCI, можна розглядати як підпорядковані інтерфейси.
Пристрій CDC повинен мати принаймні один CCI та нуль або більше DCI. Один CCI та будь-який підпорядкований DCI разом надають хосту певну функцію. Ця можливість також називається функцією. У композитному пристрої CDC може бути кілька...
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
19/174
закінченоview
функції. Таким чином, пристрій складатиметься з кількох наборів CCI та DCI, як показано на рисунку – Композитний пристрій CDC.
Рисунок – Композитний пристрій CDC
Пристрій CDC, ймовірно, використовуватиме таку комбінацію кінцевих точок:
Пара керуючих кінцевих точок IN та OUT, які називаються кінцевою точкою за замовчуванням. Додаткова кінцева точка IN для групового або переривання. Пара кінцевих точок IN та OUT для групового або ізохронного надсилання. Зверніть увагу, що стек USB-пристроїв Silicon Labs наразі не підтримує ізохронні кінцеві точки.
У таблиці нижче показано використання різних кінцевих точок та те, яким інтерфейсом CDC вони використовуються.
Таблиця – Використання кінцевої точки CDC
Кінцева точка
Контроль IN
Контроль OUT
Переривання або масовий вхід Масовий або ізохронний вхід Масовий або ізохронний вхід
OUT
Напрямок
Пристрій-хост
Від хоста до пристрою
Пристрій-хост
Пристрій-хост
Від хоста до пристрою
Використання інтерфейсу
CCI
Стандартні запити для перерахування, запити, специфічні для класу, запити для пристрою
управління та, за бажанням, управління викликами.
CCI
Стандартні запити для перерахування, запити, специфічні для класу, запити для пристрою
управління та, за бажанням, управління викликами.
CCI
Сповіщення про події, такі як виявлення дзвінка, стан послідовної лінії, стан мережі.
DCI
Обмін необробленими або відформатованими даними.
DCI
Обмін необробленими або відформатованими даними.
Більшість комунікаційних пристроїв використовують кінцеву точку переривання для сповіщення хоста про події. Ізохронні кінцеві точки не слід використовувати для передачі даних, коли власний протокол залежить від повторної передачі даних у разі помилок протоколу USB. Ізохронний зв'язок може призвести до втрати даних, оскільки він не має механізмів повторної спроби.
Сім основних моделей зв'язку охоплюють кілька підкласів. Підклас описує спосіб, яким пристрій повинен використовувати CCI для керування пристроєм та викликами. У таблиці нижче наведено всі можливі підкласи та моделі зв'язку, до яких вони належать.
Таблиця – Підкласи CDC
Підклас
Модель прямого лінійного керування Абстрактна модель керування
Модель комунікації
PSTN
PSTN
Example пристроїв, що використовують цей підклас
Модемні пристрої, що безпосередньо керуються USB-хостом
Пристрої емуляції послідовного порту, модемні пристрої, що керуються за допомогою набору послідовних команд
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
20/174
закінченоview
Підклас
Модель комунікації
Example пристроїв, що використовують цей підклас
Модель керування телефоном
PSTN
Модель багатоканального керування ISDN
Модель керування CAPI ISDN
Модель керування ECM мережі Ethernet
Мережа банкоматів
банкомат
Модель управління
Модель бездротового керування телефоном
WMC
Керування пристроями WMC
Модель прямої мобільної лінії
WMC
OBEX
WMC
Модель EEM емуляції Ethernet
Модель управління мережею
NCM
Пристрої голосової телефонії
Адаптери терміналів базового тарифу, адаптери терміналів основного тарифу, телефони
Адаптери терміналів базової ставки, адаптери терміналів первинної ставки, телефони, кабельні модеми DOC-SIS, ADSL-модеми з підтримкою емуляції PPPoE, адаптери Wi-Fi (сімейство IEEE 802.11), адаптери IEEE 802.3, ADSL-модеми
Мобільне термінальне обладнання, що підключається до бездротових пристроїв
Мобільне термінальне обладнання, що підключається до бездротових пристроїв Мобільне термінальне обладнання, що підключається до бездротових пристроїв
Мобільне термінальне обладнання, що підключається до бездротових пристроїв. Пристрої, що використовують кадри Ethernet як наступний рівень транспортування. Не призначені для пристроїв маршрутизації та підключення до Інтернету. Адаптери IEEE 802.3, що передають високошвидкісну пропускну здатність даних по мережі.
Потреби в ресурсах класу CDC ACM USB-пристрою від Core
Щоразу, коли ви додаєте екземпляр класу CDC ACM до конфігурації USB через виклик функції sl_usbd_cdc_acm_add_to_configuration(), з ядра будуть виділені такі ресурси.
Ресурс
Інтерфейси Альтернативні інтерфейси Кінцеві точки Групи інтерфейсів
Кількість
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), які детально обговорюються в розділі Базовий клас CDC USB-пристроїв.view У цьому розділі розглядається CCI типу ACM. Він складається з кінцевої точки за замовчуванням для елемента керування та кінцевої точки переривання для елемента сповіщення. Пара кінцевих точок масового використання використовується для передачі невизначених даних через DCI.
Підклас ACM використовується двома типами комунікаційних пристроїв:
Пристрої, що підтримують AT-команди (наприклад, модеми голосової смуги). Пристрої емуляції послідовного порту, які також називаються пристроями віртуального COM-порту.
Існує кілька специфічних для підкласу запитів для підкласу ACM. Вони дозволяють керувати пристроєм та налаштовувати його. Повний список та опис усіх запитів ACM можна знайти у специфікації.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
21/174
закінченоview Підклас для пристроїв PSTN, версія 1.2, 9 лютого 2007 р.=, розділ 6.2.2.
З цього списку, підклас Silicon Labs9 ACM підтримує наступне:
Таблиця – Запити ACM, що підтримуються Silicon Labs
Опис запиту підкласу
SetCommFeature GetCommFeature ClearCommFeature
Хост надсилає цей запит для керування налаштуваннями певної функції зв'язку. Не використовується для емуляції послідовного порту.
Хост надсилає цей запит, щоб отримати поточні налаштування для певної функції зв'язку. Не використовується для емуляції послідовного порту.
Хост надсилає цей запит для очищення налаштувань певної функції зв'язку. Не використовується для емуляції послідовного порту.
SetLineCoding
Хост надсилає цей запит для налаштування параметрів пристрою ACM: швидкості передачі даних, кількості стоп-бітів, типу парності та кількості бітів даних. Для емуляції послідовного порту цей запит автоматично надсилається послідовним терміналом щоразу, коли ви налаштовуєте параметри послідовного порту для відкритого віртуального COM-порту.
GetLineCoding
Хост надсилає цей запит, щоб отримати поточні налаштування ACM (швидкість передачі даних, стоп-біти, парність, біти даних). Для емуляції послідовного порту послідовні термінали надсилають цей запит автоматично під час відкриття віртуального COM-порту.
SetControlLineState Хост надсилає цей запит для керування несучою для напівдуплексних модемів та вказує, чи готове обладнання терміналу передачі даних (DTE). У випадку послідовної емуляції DTE є послідовним терміналом. Для послідовної емуляції деякі послідовні термінали дозволяють надсилати цей запит із встановленими елементами керування.
SetBreak
Хост надсилає цей запит для створення розриву типу RS-232. Для емуляції послідовного інтерфейсу деякі послідовні термінали дозволяють надсилати цей запит.
Підклас ACM Silicon Labs9 використовує кінцеву точку переривання IN для повідомлення хоста про поточний стан послідовної лінії. Послідовний порт
Стан лінії — це бітове зображення, яке інформує хост про:
Дані відкинуті через переповнення, помилку парності, помилку кадрування, стан виявлення кільцевого сигналу, стан механізму виявлення розриву, стан несучої передачі, стан виявлення несучої приймача.
Реалізація підкласу ACM Silicon Labs9 відповідає наступній специфікації:
Універсальна послідовна шина, зв'язок, підклас для пристроїв PSTN, версія 1.2, 9 лютого 2007 р.
Конфігурація класу ACM CDC USB-пристрою
У цьому розділі обговорюється, як налаштувати клас CDC ACM (клас комунікаційних пристроїв, абстрактна модель керування). Існує дві групи параметрів конфігурації:
Конфігурації для конкретного застосування класу CDC ACM USB-пристрою Конфігурації екземплярів класу CDC ACM USB-пристрою
Конфігурації USB-пристроїв CDC ACM класу для специфічних застосувань
Базовий клас CDC Підклас ACM
Базовий клас CDC
По-перше, щоб використовувати модуль класу CDC USB-пристрою Silicon Labs, вам потрібно буде налаштувати конфігурацію CDC під час компіляції #define-s відповідно до потреб вашої програми. Вони перегруповані всередині заголовка sl_usbd_core_config.h. file у розділі CDC. Їхнє призначення — повідомити модуль USB-пристрою про те, скільки об’єктів USB CDC потрібно виділити.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
22/174
закінченоview
У таблиці нижче описано кожне поле конфігурації, доступне в цій структурі конфігурації.
Таблиця – Визначення конфігурації CDC USB-пристрою
Назва конфігурації
SL_USBD_CDC_CL ЯК S_INSTANCE_QUANT ITY
КІЛЬКІСТЬ ІГУРАЦІЇ_КОНФІГУРАЦІЇ_SL_USBD_CDC
TY
КІЛЬКІСТЬ_ІНТЕРФЕЙСУ_ДАНИХ_SL_USBD_CDC
TY
опис
Кількість екземплярів класу, які ви виділите через виклик функції
sl_usbd_cdc_acm_create_instance().
Кількість конфігурацій. Екземпляри класу ACM можна додати до однієї або кількох конфігурацій aaaa через sl_usbd_cdc_acm_add_to_configuration().
Загальна кількість інтерфейсів даних (DCI) для всіх функцій CDC. Кожна функція CDC ACM, додана до функції sl_usbd_cdc_acm_create_instance(), додасть інтерфейс даних.
Значення за замовчуванням
2
1
2
Підклас ACM
Підклас ACM має одну конфігурацію часу компіляції, показану в таблиці нижче.
Таблиця – Визначення конфігурації ACM CDC USB-пристрою
Назва конфігурації
SL_USBD_CDC_ACM_SUBCL ASS_I NSTANCE_QUANTITY
опис
Налаштовує кількість екземплярів підкласу, які будуть виділені через виклик функції
функція sl_usbd_cdc_acm_create_instance().
Значення за замовчуванням
2
Конфігурації екземплярів класу ACM CDC USB-пристрою
У цьому розділі визначено конфігурації, пов'язані з екземплярами послідовного класу CDC ACM. Створення екземпляра класу, стан лінії, інтервал викликів, можливості керування, p_acm_callbacks
Створення екземпляра класу
Щоб створити екземпляр послідовного класу CDC ACM, викличте функцію T a sl_usbd_cdc_acm_create_instance(). Ця функція має три аргументи конфігурації, як описано тут.
інтервал_стану_лінії
Це інтервал (у мілісекундах), протягом якого ваш екземпляр послідовного класу CDC ACM повідомлятиме про стан лінії хосту T aa. Це значення має бути степенем двійки (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 набір функцій зворотного виклику, які будуть викликані, коли виникає подія CDC ACM. Не всі зворотні виклики є обов'язковими, і нульовий вказівник (NULL) можна передати в змінну структури callbacks, коли зворотний виклик не потрібен. У таблиці нижче описано кожне поле конфігурації, доступне в цій структурі конфігурації.
Таблиця – структура конфігурації sl_usbd_cdc_acm _callbacks_t
поля
опис
.enable
Викликається, коли екземпляр класу USB увімкнено.
успішно.
.вимкнути
Викликається, коли екземпляр класу USB вимкнено.
.line_control_changed Викликається, коли отримано зміну керування лінією.
line_coding_changed Викликається, коли отримано зміну лінійного кодування.
Підпис функції
недійсний app_usbd_cdc_acm_enable(uint8_t підклас_nbr);
недійсний app_usbd_cdc_acm_disable(uint8_t підклас_nbr);
void app_usbd_cdc_acm_line_control_changed(uint8_t підклас_nbr, uint8_t подія, uint8_t подія_chngd); bool app_usbd_cdc_acm_line_coding_changed(uint8_t підклас_nbr, subclass_nbr, sl_usbd_cdc_acm_line_coding_t)
*p_line_coding
Див. розділ Реєстрація зворотних викликів сповіщень про події для функцій зворотного виклику, наприкладample.
Посібник з програмування класу ACM CDC USB-пристрою
У цьому розділі пояснюється, як використовувати клас моделі абстрактного керування CDC. Ініціалізація класу CDC ACM USB-пристрою Додавання екземпляра класу CDC ACM USB-пристрою до вашого пристрою Зв'язок за допомогою класу CDC ACM
Ініціалізація класу ACM CDC USB-пристрою
Щоб додати функціональність класу CDC ACM до вашого пристрою, спочатку потрібно ініціалізувати базовий клас CDC та підклас ACM, виконавши функції sl_usbd_cdc_init() та sl_usbd_cdc_acm_init(). Наведений нижче приклад показує, як викликати 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) { /* Сталася помилка. Тут слід додати обробку помилок. */
}
Додавання екземпляра класу CDC ACM USB-пристрою до вашого пристрою
Щоб додати функціональність класу CDC ACM до вашого пристрою, потрібно створити екземпляр, а потім додати його до конфігурації(й) вашого пристрою.
Створення екземпляра класу CDC ACM
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
24/174
закінченоview
Додавання екземпляра класу CDC ACM до конфігурації(й) вашого пристрою. Реєстрація зворотних викликів сповіщень про події.
Створення екземпляра класу CDC ACM
Створіть інстанцію класу CDC AC, викликавши функцію sl_usbd_cdc_acm_create_instance(). Наведений нижче приклад показує, як створити інстанцію класу CDC AC за допомогою sl_usbd_cdc_acm_create_instance().
Example – Створення функції CDC ACM за допомогою sl_usbd_cdc_acm_create_instance()
uint8_t підклас_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);
якщо (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(підклас_nbr,
(1)
config_nbr_fs);
(2)
якщо (статус ! SL_STATUS_OK) {
/* Сталася помилка. Тут слід додати обробку помилок. */
}
aaa (1) Номер класу ss для додавання до конфігурації, повернутої функцією sl_usbd_cdc_acm_create_instance(). (2) Номер конфігурації (тут це додавання до конфігурації Full-Speed).
Реєстрація зворотних викликів сповіщень про події
Клас CDC ACM Serial може повідомляти вашу програму про будь-які зміни в керуванні лініями або кодуванні за допомогою функцій зворотного виклику сповіщень. Структуру функцій зворотного виклику можна передати як аргумент під час створення екземпляра ACM. Зверніть увагу, що ці зворотні виклики є необов'язковими. Наприкладample – Реєстрація зворотних викликів CDC ACM ілюструє використання функцій реєстрації зворотних викликів. Приклад.ample – Реалізація зворотних викликів CDC ACM показує exampрівень реалізації функцій зворотного виклику.
Example – Реєстрація зворотних викликів CDC ACM
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
25/174
закінченоview
uint8_t підклас_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_line_control_changed, app_usbd_cdc_acm_line_coding_changed, };
статус = 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, &nbdr_class);
якщо (status ! SL_STATUS_OK) { /* Сталася помилка. Тут слід додати обробку помилок. */ }
Example – Реалізація зворотних викликів CDC ACM
логічне значення app_usbd_cdc_acm_line_coding_changed (uint8_t
підклас_nbr,
sl_usbd_cdc_acm_line_coding_t *p_line_coding)
{
uint32_t нова_швидкість_передачі;
uint8_t нова_парність;
uint8_t стоп-бітс_новий;
uint8_t data_bits_new;
/* 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)
}
недійсний app_usbd_cdc_acm_line_control_changed (uint8_t підклас_nbr, uint8_t подія, uint8_t подія_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 : 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) Важливо повернути цій функції значення false, якщо застосування лінійного кодування не вдалося. В іншому випадку повернути значення true.
Спілкування за допомогою класу CDC ACM
Серійний статус
Кодування ліній, керування лініями
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
26/174
закінченоview
Зв'язок з екземплярами підкласу стану лінії
Серійний статус
Лінійне кодування
USB-хост контролює лінійне кодування (швидкість передачі даних, парність тощо) пристрою CDC ACM. За потреби, програма відповідає за налаштування лінійного кодування. Передбачено дві функції для отримання та налаштування поточного лінійного кодування, як описано в таблиці нижче.
Таблиця – Функції лінійного кодування CDC ACM
функція
sl_usbd_cdc_acm_ge t_line _co d ing ()
sl_usbd_cdc_acm_se t_line _co d ing ()
опис
Ваша програма може отримати поточні налаштування лінійного кодування або від хоста за допомогою запитів SetLineCoding, або за допомогою функції sl_usbd_cdc_acm_set_line_coding().
Ваша програма може встановити кодування ліній. Хост може отримати ці налаштування за допомогою запиту GetLineCoding.
Управління лінією
USB-хост керує керуванням лінії (виводи RTS та DTR, сигнал розриву тощо) пристрою CDC ACM. За потреби ваша програма відповідає за застосування керування лінією. Передбачена функція для отримання та встановлення поточних керування лінією, як описано в таблиці нижче.
Таблиця – Функції керування лінією CDC ACM
функція
sl_usb d _cd c_acm_g e t_line _contr o l_state ()
Ваша програма може отримати поточний стан лінії керування, встановлений хостом, за допомогою запиту SetControlLineState.
Стан лінії
USB-хост отримує стан лінії через регулярні проміжки часу. Ваша програма повинна оновлювати стан лінії щоразу, коли він змінюється. За потреби ваша програма відповідає за встановлення стану лінії. Для отримання та встановлення поточних елементів керування лінією передбачено дві функції, як описано в таблиці нижче.
Таблиця – Функції стану лінії S 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.
Зв'язок з екземплярами підкласу
Підклас ACM від Silicon Labs пропонує такі функції для зв'язку з хостом. Для отримання додаткової інформації про параметри functions9 див. довідник з функцій підкласу CDC ACM.
Назва функції
sl_usb d _cd c_acm_ read () sl_usb d _cd c_acm_write ()
Операція
Отримує дані від хоста через кінцеву точку масового надсилання (OUT). Ця функція блокує. Надсилає дані на хост через кінцеву точку масового надсилання (IN). Ця функція блокує.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
27/174
закінченоview
Таблиця – Зведення API зв'язку CDC ACM aaaaa sl_usbd_cdc_acm_read() та sl_usbd_cdc_acm_write() забезпечують синхронний зв'язок, що означає, що передача блокується. Іншими словами, після виклику функції програма блокується, доки передача не завершиться з помилкою або без неї. Можна вказати тайм-аут, щоб уникнути вічного очікування. Наприкладampнижче показано приклад читання та записуampфайл, який отримує дані від хоста за допомогою кінцевої точки bulk OUT та надсилає дані на хост за допомогою кінцевої точки bulk IN.
Лістинг – Послідовне читання та запис Example
__ALIGNED(4) uint8_t rx_buf[2];
__ALIGNED(4) uint8_t tx_buf[2];
uint32_t
xfer_len;
sl_status_t
статус;
статус = sl_usbd_cdc_acm_read(підклас_nbr,
(1)
rx_buf,
(2)
2u,
0u,
(3)
&довжина_xfer);
якщо (статус ! SL_STATUS_OK) {
/* Сталася помилка. Тут слід додати обробку помилок. */
}
статус = sl_usbd_cdc_acm_write(підклас_nbr,
(1)
tx_buf,
(4)
2u,
0u,
(3)
&довжина_xfer);
якщо (статус ! SL_STATUS_OK) {
/* Сталася помилка. Тут слід додати обробку помилок. */
}
T aaaaa M (1) Номер екземпляра класу ss, створений за допомогою 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 Потреби в ресурсах класу HID USB-пристрою від основного конфігурації класу HID USB-пристрою Посібник з програмування класу HID USB-пристрою Завдання періодичних звітів про вхідні дані HID
У цьому розділі описано клас пристроїв інтерфейсу людини (HID), що підтримуються USB-пристроєм Silicon Labs.
Клас HID охоплює пристрої, що використовуються людьми для керування комп'ютерними операціями, такі як клавіатури, миші, вказівні пристрої та ігрові консолі.
Клас HID також може використовуватися в складеному пристрої, який містить елементи керування, такі як ручки, перемикачі, кнопки та повзунки. НаприкладampРегулювання гучності, вимкнення звуку та відключення звуку в аудіогарнітурі здійснюється функцією HID гарнітури. Клас HID може обмінюватися даними для будь-яких цілей, використовуючи лише передачу керування та переривання.
Клас HID є одним із найстаріших і найпоширеніших класів USB. Усі основні операційні системи хостів надають власний драйвер для керування пристроями HID, тому різноманітні пристрої різних постачальників працюють із класом HID. Цей клас також включає різні типи вихідних елементів, такі як світлодіоди, аудіо, тактильний зворотний зв'язок тощо.
Реалізація HID відповідає наступним специфікаціям:
Визначення класу пристроїв для інтерфейсу людини (HID), 27.06.01, версія 1.11. Таблиці використання HID універсальної послідовної шини, 28.10.2004, версія 1.12.
Клас USB-пристрою HID понадview
закінченоview
Пристрій HID складається з таких кінцевих точок:
Пара кінцевих точок керування IN та OUT, які називаються кінцевою точкою за замовчуванням; кінцева точка переривання IN; необов'язкова кінцева точка переривання OUT.
У таблиці нижче описано використання різних кінцевих точок:
Таблиця – Використання кінцевих точок класу HID
Використання напрямку кінцевої точки
Контроль IN
КОНТРОЛЬ
OUT
Вхід переривання
Переривати
OUT
Пристрій-хост
Від хоста до пристрою
Пристрій-хост
Від хоста до пристрою
Стандартні запити на перерахування, запити, специфічні для класу, та передачу даних (вхідні дані, звіти про функції, що надсилаються хосту за допомогою запиту GET_REPORT). Стандартні запити на перерахування, запити, специфічні для класу, та передачу даних (вихідні дані, звіти про функції, отримані від хоста за допомогою запиту SET_REPORT). Передача даних (вхідні дані та звіти про функції).
Обмін даними (звіти про результати та функції).
звіт
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
29/174
закінченоview
Хост і пристрій HID обмінюються даними за допомогою звітів. Звіт містить відформатовані дані, що надають інформацію про елементи керування та інші фізичні об'єкти пристрою HID. Елемент керування може керувати користувачем і керує певним аспектом пристрою. НаприкладampНаприклад, елементом керування може бути кнопка миші або клавіатури, перемикач тощо. Інші сутності інформують користувача про стан певних функцій пристрою. НаприкладampНаприклад, світлодіоди на клавіатурі повідомляють користувача про увімкнений режим Caps Lock, активну цифрову клавіатуру тощо.
Формат та використання даних звіту розуміються хостом шляхом аналізу вмісту дескриптора звіту. Аналіз вмісту виконується синтаксичним аналізатором. Дескриптор звіту описує дані, що надаються кожним елементом керування в пристрої. Він складається з елементів, які є фрагментами інформації про пристрій та містять 1-байтовий префікс та змінну довжину.
дані. Щоб отримати докладнішу інформацію про формат елемента, див.
1.11=, розділ 5.6 та 6.2.2.
Існує три основні типи предметів:
Головний елемент визначає або групує певні типи полів даних.
Глобальний елемент описує характеристики даних елемента керування.
Локальний елемент описує характеристики даних елемента керування.
Кожен тип елемента визначається різними функціями. Функцію елемента також можна назвати tagФункцію елемента можна розглядати як піделемент, що належить до одного з трьох основних типів елементів. У таблиці нижче наведено короткий оглядview функцій елемента в кожному типі елемента. Повний опис елементів у кожній категорії див.
Таблиця – Опис функцій елемента для кожного типу елемента
Тип елемента Функція
опис
Основний вхід
Описує інформацію про дані, що надаються одним або кількома фізичними елементами керування.
Основний вихід Описує дані, що надсилаються на пристрій.
Основна особливість
Описує інформацію про конфігурацію пристрою, що надсилається на пристрій або отримується від нього, що впливає на загальну поведінку пристрою або одного з його компонентів.
Пов’язані елементи основної групи колекцій (вхідні, вихідні або функціональні).
Головний кінець закриває колекцію. Колекція
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
30/174
закінченоview
Тип елемента Функція
опис
Сторінка глобального використання
Визначає функцію, доступну в пристрої.
Глобальний логічний Визначає нижню межу повідомлюваних значень у логічних одиницях. Мінімальний
Глобальний логічний Визначає верхню межу повідомлюваних значень у логічних одиницях. Максимальний
Глобальний фізичний Визначає нижню межу повідомлених значень у фізичних одиницях, тобто логічний мінімум, виражений у фізичних одиницях.
Глобальне фізичне значення Визначає верхню межу повідомлюваних значень у фізичних одиницях, тобто логічний максимум, виражений у фізичних одиницях.
Глобальний підрозділ
Вказує показник одиниці в десятковій численні. Показник степеня має діапазон від -8 до +7.
Експонента
Глобальний підрозділ
Вказує одиницю вимірювання повідомлених значень. Наприклад, довжина, маса, одиниці температури тощо.
Глобальний розмір звіту
Вказує розмір полів звіту в бітах.
Глобальний ідентифікатор звіту вказує на префікс, доданий до певного звіту.
Глобальна кількість звітів
Вказує кількість полів даних для елемента.
Глобальний поштовх
Розміщує копію глобальної таблиці станів елементів у стеку процесора.
Глобальний поп
Замінює таблицю станів елементів останньою структурою зі стеку.
Локальне використання
Представляє індекс для позначення конкретного використання на сторінці використання. Він вказує на запропоноване постачальником використання для певного елемента керування або групи елементів керування. Використання надає розробнику застосунку інформацію про те, що фактично вимірює елемент керування.
Локальне використання
Визначає початкове використання, пов'язане з масивом або растровим зображенням.
мінімум
Локальне використання
Визначає кінцеве використання, пов'язане з масивом або растровим зображенням.
Максимум
Локальний позначення Визначає частину тіла, яка використовується для керування. Індекс вказує на позначення у фізичному
Індекс
дескриптор.
Локальний позначення Визначає індекс початкового позначення, пов'язаного з масивом або растровим зображенням. Мінімум
Локальний позначення Визначає індекс кінцевого позначення, пов'язаного з масивом або растровим зображенням. Максимум
Локальний рядковий індекс
Рядковий індекс для рядкового дескриптора. Він дозволяє пов'язати рядок з певним елементом або елементом керування.
Локальний рядок
Визначає перший індекс рядка під час призначення групи послідовних рядків елементам керування в масиві
Мінімальне або растрове зображення.
Місцевий Місцевий
Максимум рядка
роздільник
Вказує останній індекс рядка під час призначення групи послідовних рядків елементам керування в масиві або растровому зображенні.
Визначає початок або кінець набору локальних елементів.
Дані елемента керування повинні визначати щонайменше такі елементи:
Вхідні, вихідні або функціональні елементи Використання Локальний елемент Використання Сторінка Глобальний елемент Логічний мінімум Глобальний елемент Логічний максимум Глобальний елемент Розмір звіту Глобальний елемент
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
31/174
закінченоview
Глобальний елемент підрахунку звітів. У таблиці нижче показано представлення вмісту дескриптора звіту миші з точки зору синтаксичного аналізу HID хоста. Миша має три кнопки (ліву, праву та коліщатко). Код, представлений у прикладі...ampНижче наведено реалізацію коду, що відповідає цьому представленню дескриптора звіту миші.
Рисунок – Звіт про вміст дескриптора від парсера HID хоста View
(1) Функція елемента сторінки використання визначає загальну функцію пристрою. У цьому прикладіampтобто, пристрій HID належить до
універсальний елемент керування робочим столом.
(2) Колекція «Застосування» групує основні елементи, які мають спільне призначення та можуть бути знайомі застосункам. На діаграмі група складається з трьох основних елементів введення. Для цієї колекції запропонованим використанням елементів керування є миша, як зазначено в елементі «Використання». (3) Вкладені колекції можуть використовуватися для надання більш детальної інформації про використання одного елемента керування або групи елементів керування застосунками. У цьому прикладіampНаприклад, Фізична колекція, вкладена в Додаток колекції, складається з тих самих трьох вхідних елементів, що утворюють Додаток колекції. Фізична колекція використовується для набору елементів даних, які представляють точки даних, зібрані в одній геометричній точці. У прикладіampНаприклад, запропоноване використання – це вказівник, як зазначено в елементі «Використання». Тут використання вказівника стосується координат положення миші, а системне програмне забезпечення перетворюватиме координати миші на рух курсора на екрані. (4) Також можливі вкладені сторінки використання, які надають більше деталей про певний аспект загальної функції пристрою. У цьому випадку два елементи вводу згруповані та відповідають кнопкам миші. Один елемент вводу визначає три кнопки миші (праву, ліву та коліщатко) з точки зору кількості полів даних для елемента (елемент «Кількість звітів»), розміру поля даних (елемент «Розмір звіту») та можливих значень для кожного поля даних (елементи «Мінімум та максимум використання», «Логічний мінімум та максимум»). Інший елемент вводу – це 13-бітна константа, що дозволяє вирівнювати дані звіту вводу по межі байтів. Цей елемент вводу використовується лише для доповнення. (5) Інша вкладена сторінка використання, що стосується загального елемента керування робочого столу, визначена для координат положення миші. Для цієї сторінки використання елемент вводу описує поля даних, що відповідають осям x та y, як визначено двома елементами «Використання».
елементи.
Після аналізу попереднього вмісту дескриптора звіту миші, HID-парсер хоста може інтерпретувати дані вхідного звіту, надіслані пристроєм через переривання IN передачі або у відповідь на запит GET_REPORT. Дані вхідного звіту, що відповідають дескриптору звіту миші, показано на рисунку – Вміст дескриптора звіту від HID-парсера хоста. View is
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
32/174
закінченоview
показано в таблиці нижче. Загальний розмір даних звіту становить 4 байти. Через одну кінцеву точку можуть надсилатися різні типи звітів. Для розрізнення різних типів звітів до звіту з даними додається 1-байтовий префікс ідентифікатора звіту. Якщо ідентифікатор звіту використовувався вampзвіту миші, загальний розмір даних звіту становитиме 5 байтів.
Таблиця – Вхідний звіт, надісланий на хост і відповідний стану 3-кнопкової миші
Зміщення біта
0 1 2 3 16 24
Кількість бітів 1 1 1 13 8 8
Опис Кнопка 1 (ліва кнопка). Кнопка 2 (права кнопка). Кнопка 3 (кнопка коліщатка). Не використовується. Позиція на осі X. Позиція на осі Y.
Фізичний дескриптор вказує на частину або частини тіла, призначені для активації елемента керування або елементів керування. Програма може використовувати цю інформацію для призначення функціональності елементу керування пристрою. Фізичний дескриптор – це необов’язковий дескриптор, специфічний для класу, і більшість пристроїв мають невелику користь від його використання. Див.
Потреби в ресурсах класу HID USB-пристрою від Core
Щоразу, коли ви додаєте екземпляр класу HID до конфігурації USB через виклик функції sl_usbd_hid_add_to_configuration(), з ядра будуть виділені такі ресурси.
Ресурс
Інтерфейси Альтернативні інтерфейси Кінцеві точки Групи інтерфейсів
Кількість
1 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, оскільки кінцеві точки відкриваються лише тоді, коли хост встановлює конфігурацію, вам просто потрібно врахувати кількість необхідних кінцевих точок для екземпляра класу.
Конфігурація класу HID USB-пристрою
Для налаштування класу HID використовуються дві групи параметрів конфігурації:
Конфігурації класу HID USB-пристроїв, специфічні для програми Конфігурації екземплярів класу HID USB-пристроїв
Конфігурації класу HID USB-пристроїв для конкретних застосувань
Спочатку, щоб використовувати модуль класу HID USB-пристрою Silicon Labs, налаштуйте конфігурацію HID під час компіляції відповідно до потреб вашої програми. Вони перегруповані в заголовку sl_usbd_core_config.h. file у розділі HID. Їх можна розділити на два розділи: конфігурації кількості та конфігурації завдань HID. Мета конфігурацій кількості полягає в тому, щоб повідомити модуль USB-пристрою про те, скільки об'єктів USB HID потрібно виділити.
У таблиці нижче описано кожне визначення конфігурації.
Таблиця – Визначення конфігурації HID USB-пристрою
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
33/174
закінченоview
Назва конфігурації
SL_USBD_HID_CL ASS_I NSTANCE_QUANTITY
КІЛЬКІСТЬ_КОНФІГУРАЦІЇ_SL_USBD_HID
ЗВІТ_SL_USBD_HID_ІДЕНТИФІКАТОР_КІЛЬКІСТЬ
SL_USBD_HID_PUSH_P OP_ITEM_QUANTITY
SL_USBD_HID_TIMER_T ASK_STACK_SIZE
SL_USBD_HID_TIMER_T ASK_PRIORITY
опис
Кількість екземплярів класу, які ви виділите через виклик функції
sl_usbd_hid_create_instance().
Кількість конфігурацій. Екземпляри класу HID можна додати до однієї або кількох конфігурацій aaaa через функцію sl_usbd_hid_add_to_configuration(). Налаштовує загальну кількість ідентифікаторів звітів для виділення.
Налаштовує загальну кількість елементів Push/Pop для виділення.
Завдання таймера обробляє всі операції HID на основі таймера. Ця конфігурація дозволяє встановити розмір стека (у кількості байтів). Пріоритет завдання HID. Це пріоритет CMSIS-RTOS2.
Значення за замовчуванням
2 1 2 0 2048
Високий пріоритет os
Конфігурації екземплярів класу USB-пристрою HID Підклас створення екземплярів класу
протокол код_країни
interval_in та interval_out p_hid_callback Дескриптор звіту класу HID ExampУ цьому розділі визначено конфігурації, пов'язані з екземплярами класу HID.
Створення екземпляра класу
Створення екземпляра класу HID здійснюється шляхом виклику функції sl_usbd_hid_create_instance(), яка має кілька аргументів конфігурації, описаних нижче.
підклас
Код підкласу HID. Можливі значення:
SL_USBD_HID_SUBCL ASS_NONE SL_USBD_HID_SUBCL ASS_BOOT
Пристрій HID, що використовує підклас завантаження, повинен використовувати стандартні формати звітів. Для отримання додаткової інформації про коди підкласів див. розділ 4.2 специфікації HID версії 1.11.
протокол
Протокол, що використовується пристроєм 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. Для отримання додаткової інформації про коди підкласів див. розділ 4.3 специфікації HID версії 1.11.
код_країни
Ідентифікатор коду країни. Можливі значення:
SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
34/174
закінченоview
SL_USBD_HID_КОД_КРАЇНИ_АРАБСЬКА SL_USBD_HID_КОД_КРАЇНИ_БЕЛЬГІЙСЬКА SL_USBD_HID_КОД_КРАЇНИ_КАНАДА_ДВОМОВНА SL_USBD_HID_КОД_КРАЇНИ_КАНАДА_ФРАНЦУЗЬКА SL_USBD_HID_КОД_КРАЇНИ_ЧЕШСЬКА_РЕСПУБЛІКА SL_USBD_HID_КОД_КРАЇНИ_ДАТСЬКА SL_USBD_HID_КОД_КРАЇНИ_ФІНСЬКА SL_USBD_HID_КОД_КРАЇНИ_ФРАНЦУЗЬКА SL_USBD_HID_КОД_КРАЇНИ_НІМЕЦЬКА SL_USBD_HID_КОД_КРАЇНИ_ГРЕЦЬКА SL_USBD_HID_КОД_КРАЇНИ_ІВРІТ SL_USBD_HID_КОД_КРАЇНИ_УГОРЩИНА SL_USBD_HID_КОД_КРАЇНИ_МІЖНАРОДНА SL_USBD_HID_КОД_КРАЇНИ_ІТАЛІЙСЬКА SL_USBD_HID_КОД_КРАЇНИ_ЯПОНІЯ_КАТАКАНА SL_USBD_HID_КОД_КОРЕЙСЬКА SL_USBD_HID_КОД_КРАЇНИ_L АМЕРИКАНСЬКА SL_USBD_HID_КОД_КРАЇНИ_НІДЕРЛАНДИ ТА НІДЕРСЬКА SL_USBD_HID_КОД_КРАЇНИ_НОРВЕЖСЬКА SL_USBD_HID_КОД_КРАЇНИ_ПЕРСЬКА_ФАРСЬКА SL_USBD_HID_КОД_КРАЇНИ_ПОЛЬСЬКА ТА SL_USBD_HID_КОД_КРАЇНИ_ПОРТУГАЛЬСЬКА SL_USBD_HID_КОД_КРАЇНИ_РОСІЯ SL_USBD_HID_КОД_КРАЇНИ_СЛОВАЧЧИНА SL_USBD_HID_КОД_КРАЇНИ_ІСПАНСЬКА SL_USBD_HID_КОД_КРАЇНИ_ШВЕДСЬКА SL_USBD_HID_КОД_КРАЇНИ_ШВЕЙЦАРСЬКА_ФРАНЦУЗЬКА SL_USBD_HID_КОД_КРАЇНИ_ШВЕЙЦАРІЯ_НІМЕЦЬКА SL_USBD_HID_КОД_КРАЇНИ_ШВЕЙЦАРІЯ ТА SL_USBD_HID_КОД_КРАЇНИ_ТАЙВАНЬ SL_USBD_HID_КОД_КРАЇНИ_ТУРЕЦЬКА_Q SL_USBD_HID_КОД_КРАЇНИ_ВЕЛИКА БРИТАНІЯ SL_USBD_HID_КОД_КРАЇНИ_США SL_USBD_HID_КОД_КРАЇНИ_ЮГІЯ OSL AVIA SL_USBD_HID_КОД_КРАЇНИ_ТУРЕЦЬКА_F
Код країни визначає, для якої країни локалізовано обладнання. Більшість обладнання не локалізовано, тому цей варіант матиме вигляд SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). Однак, клавіатури можуть використовувати це поле для позначення мови літер клавіш.
Для отримання додаткової інформації про коди країн див. розділ 6.2.1 специфікації HID версії 1.11.
інтервал_входу та інтервал_виходу
interval_in та interval_out представляють інтервал опитування кінцевої точки переривання IN та кінцевої точки переривання OUT.
Це значення відображає інтервал опитування кінцевої точки в мілісекундах. Встановлення цього значення залежить від того, як часто ваш пристрій генерує новий звіт для хоста. Наприклад, якщо звіт генерується кожні 16 мілісекунд, інтервал має бути 16 або менше.
Значення має бути степенем числа 2 (1, 2, 4, 8, 16 тощо).
Значення interval_out v lue ігнорується, якщо для параметра ctrl_rd_en встановлено значення true.
p_hid_callback
p_hid_callback – це вказівник на структуру типу sl_usbd_hid_callbacks_t. Його призначення – надати класу HID набір функцій зворотного виклику, які будуть викликані, коли виникає подія HID.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
35/174
закінченоview
Не всі зворотні виклики є обов'язковими, і нульовий вказівник (NULL) можна передати в змінну структури callbacks, коли зворотний виклик не потрібен. У таблиці нижче описано кожне поле конфігурації, доступне в цій структурі конфігурації.
Таблиця – структура конфігурації sl_usbd_hid_callbacks_t
поля
опис
Підпис функції
.увімкнути .вимкнути .get_report_desc
.get_phy_desc
.set_output_report .get_feature_report .set_feature_report
Викликається, коли екземпляр класу USB успішно ввімкнено. Викликається, коли екземпляр класу USB вимкнено.
Викликається під час створення екземпляра HID для передачі вашого дескриптора звіту. Для кожної з ваших функцій HID необхідно надати дескриптор звіту. Дескриптор звіту вказує хосту, як слід обробляти періодичний звіт, який надсилатиметься пристроєм. Написання власного дескриптора звіту може бути складним, тому існують деякі ресурси, які можуть допомогти. Це єдина обов'язкова функція зворотного виклику. Викликається під час створення екземпляра HID для передачі вашого фізичного дескриптора. Фізичний дескриптор – це дескриптор, який надає інформацію про конкретну частину або частини людського тіла, які активують елемент керування або елементи керування. Для отримання додаткової інформації про фізичні дескриптори див. розділ 6.2.3 специфікації HID версії 1.11. Фізичний дескриптор є необов'язковим і здебільшого ігнорується. Буфер, що передається тут, може бути встановлений на NULL, а довжина – на 0. Викликається, коли хост встановлює звіт, як описано у вашому дескрипторі звіту (коли він надсилає звіт).
Викликається, коли хост запитує звіт про функцію, як описано у вашому дескрипторі звіту.
Викликається, коли хост встановлює звіт про функцію, як описано у вашому дескрипторі звіту.
втрата app_usbd_hid_enable(uint8_t class_nbr); втрата app_usbd_hid_disable(uint8_t class_nbr); втрата app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
втрата 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
Отримує поточний активний протокол.
недійсний app_usbd_hid_get_protocol(uint8_t class_nbr, uint8_t *p_protocol);
.set_protocol
Встановлює поточний активний протокол.
недійсний app_usbd_hid_set_protocol(uint8_t class_nbr, uint8_t protocol);
Дескриптор звіту класу HID Example
Клас HID від Silicon Labsampдодаток надає екс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_ОСНОВНА_КОЛЕКЦІЯ +1, ЗАСТОСУНОК_КОЛЕКЦІЇ_SL_USBD_HID,(4)
SL_USBD_HID_LOCAL_USAGE +1, SL_USBD_HID_CP_POINTER,(5)
SL_USBD_HID_ОСНОВНА_КОЛЕКЦІЯ +1, SL_USBD_HID_КОЛЕКЦІЯ_ФІЗИЧНА,(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_ОСНОВНИЙ_ВХІД +1, SL_USBD_HID_ОСНОВНІ_ДАНІ |
SL_USBD_HID_MAIN_VARIABLE |
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_ОСНОВНИЙ_ВХІД +1, SL_USBD_HID_ОСНОВНІ_ДАНІ |
SL_USBD_HID_MAIN_VARIABLE |
SL_USBD_HID_MAIN_RELATIVE,
SL_USBD_HID_MAIN_END COLLECTION,(10)
SL_USBD_HID_MAIN_ENDCOLLECTION
(11)};
(1) Таблиця, що представляє дескриптор звіту миші, ініціалізується таким чином, що кожен рядок відповідає короткому елементу. Останній формується з 1-байтового префікса та 1-байтових даних. Див. viewотримано за допомогою парсера HID хоста на рисунку – Звіт про вміст дескриптора від парсера HID хоста View.
(2) Використовується загальна сторінка використання робочого столу.
(3) На загальній сторінці використання робочого столу, використання tag говорить про те, що група елементів керування призначена для керування мишею. Колекція миші зазвичай складається з двох осей (X та Y) та однієї, двох або трьох кнопок.
(4) Розпочато збір мишей.
(5) У колекції mouse, використання 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 Descriptor Tool» разом з іншою інформацією про формат дескриптора звіту. Додаткову інформацію див. на сторінці http://www.usb.org/developers/hidpage/.
Посібник з програмування USB-пристроїв HID класу
У цьому розділі пояснюється, як використовувати клас HID. Ініціалізація класу HID USB-пристрою Додавання екземпляра класу HID USB-пристрою до вашого пристрою Зв'язок за допомогою класу HID USB-пристрою
Ініціалізація класу HID USB-пристрою
Щоб додати функціональність класу HID до вашого пристрою, спочатку потрібно ініціалізувати клас, викликавши функцію sl_usbd_hid_init(). НаприкладampУ наведеному нижче прикладі показано, як викликати 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) { /* Сталася помилка. Тут слід додати обробку помилок. */
}
Додавання екземпляра класу HID USB-пристрою до вашого пристрою
Щоб додати функціональність класу HID до вашого пристрою, потрібно створити екземпляр, а потім додати його до конфігурації(й) вашого пристрою.
Створення екземпляра класу HID
Створіть екземпляр класу HID, викликавши функцію sl_usbd_hid_create_instance(). НаприкладampУ наведеному нижче прикладі показано, як створити просту функцію миші за допомогою sl_usbd_hid_create_instance() з використанням аргументів за замовчуванням. Для отримання додаткової інформації про аргументи конфігурації, які потрібно передавати до sl_usbd_hid_create_instance(), див. Конфігурації екземплярів класу HID USB-пристрою.
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_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_VARIABLE | SL_USBD_HID_MAIN_ABSOLUTE, SL_USBD_HID_GLOBAL_REPORT_COUNT + 1, 001, SL_USBD_HID_GLOBAL_REPORT_SIZE + 1, 00D, 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, 081, 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_VARIABLE | SL_USBD_HID_MAIN_RELATIVE, SL_USBD_HID_MAIN_ENDCOLLECTION, SL_USBD_HID_MAIN_ENDCOLLECTION };
/* Локальні змінні.*/ 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 };
недійсний app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (недійсний)номер_класу;
*p_report_ptr = app_usbd_hid_mouse_report_desc; *p_report_len = розмір(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_HID_Mouse_ReportDesc, розмір(Ex_USBD_HID_Mouse_ReportDesc), 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(номер_класу,
(1)
config_nbr_fs); (2)
якщо (статус ! SL_STATUS_OK) {
/* Сталася помилка. Тут слід додати обробку помилок. */
}
(1) Номер класу, який потрібно додати до конфігурації, що повертається функцією sl_usbd_hid_create_instance(). (2) Номер конфігурації (тут його додавання до конфігурації Full-Speed).
Зв'язок за допомогою USB-пристрою класу HID
Зв'язок між екземплярами класу Синхронний зв'язок Зв'язок між екземплярами класу Клас HID пропонує такі функції для зв'язку з хостом.
Таблиця – Зведення API зв'язку HID
Назва функції
sl_usb d _hid _re ad _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
xfer_len;
sl_status_t
статус;
статус = sl_usbd_hid_read_sync(номер_класу,
(1)
(недійсний *)rx_buf,
(2)
2u,
0u,
(3)
&довжина_xfer);
якщо (статус ! 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. Клас HID, реалізований Silicon Labs, містить внутрішнє завдання, яке враховує обмеження частоти звітів, яке можна застосувати до одного або кількох вхідних звітів. На малюнку «Періодична задача звітів про вхідні дані» показано функціонування завдань періодичних звітів про вхідні дані.
Рисунок – Завдання періодичних звітів про вхідні дані
(1) Пристрій отримує запит SET_IDLE. Цей запит визначає тривалість простою для заданого ідентифікатора звіту. Докладніше про запит SET_IDLE див.
(2) Структура ідентифікатора звіту (виділена під час фази ініціалізації класу HID) оновлюється тривалістю простою. Лічильник тривалості простою ініціалізується значенням тривалості простою. Структура ідентифікатора звіту вставляється в кінець зв'язаного списку, що містить вхідні структури ідентифікаторів звітів. Значення тривалості простою виражається в одиницях 4 мс, що дає діапазон від 4 до 1020 мс.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
41/174
закінченоview
Якщо тривалість простою менша за інтервал опитування кінцевої точки переривання IN, звіти генеруються з інтервалом опитування.
(3) Кожні 4 мс завдання періодичного вхідного звіту переглядає список ідентифікаторів вхідних звітів. Для кожного ідентифікатора вхідного звіту завдання виконує одну з двох можливих операцій. Тривалість періоду завдання відповідає одиниці 4 мс, яка використовується для тривалості простою. Якщо хост не надіслав запитів SET_IDLE, список ідентифікаторів вхідних звітів порожній, і завдання не має чого обробляти. Завдання обробляє лише ідентифікатори звітів, які відрізняються від 0 та мають тривалість простою більше 0.
(4) Для заданого ідентифікатора звіту про вхідні дані завдання перевіряє, чи минув час простою. Якщо час простою не минув, лічильник зменшується, і звіт про вхідні дані не надсилається на хост.
(5) Якщо час простою минув (тобто лічильник часу простою досяг нуля), вхідний звіт надсилається на хост шляхом виклику функції sl_usbd_hid_write_sync() через кінцеву точку переривання IN.
(6) Вхідні дані звіту, що надсилаються завданням, надходять із внутрішнього буфера даних, виділеного для кожного вхідного звіту, описаного в дескрипторі звіту. Завдання програми може викликати функцію sl_usbd_hid_write_sync() для надсилання вхідного звіту. Після надсилання вхідних даних звіту sl_usbd_hid_write_sync() оновлює внутрішній буфер, пов'язаний з ідентифікатором вхідного звіту, щойно надісланими даними. Потім завдання періодичних вхідних звітів завжди надсилає ті самі вхідні дані звіту після кожного періоду простою та доки завдання програми не оновить дані у внутрішньому буфері. Існує певний механізм блокування, щоб уникнути пошкодження даних ідентифікатора вхідного звіту у разі модифікації, що відбувається саме в момент передачі, яку виконує завдання періодичних вхідних звітів.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
42/174
закінченоview
закінченоview
Клас MSC USB-пристрою
USB-пристрій MSC класу понадview Потреби в ресурсах класу MSC USB-пристрою від Core Конфігурація класу MSC USB-пристрою Посібник з програмування класу MSC USB-пристрою Драйвери сховища класу MSC USB-пристрою
У цьому розділі описано клас пристроїв масової пам'яті (MSC), що підтримуються USB-пристроєм Silicon Labs. MSC – це протокол, який дозволяє передавати інформацію між USB-пристроєм та хостом. Інформація, що передається, – це все, що можна зберігати в електронному вигляді, наприклад, виконувані програми, вихідний код, документи, зображення, дані конфігурації або інші текстові чи числові дані. USB-пристрій відображається як зовнішній носій інформації для хоста, що дозволяє передавати fileза допомогою перетягування.
A file система визначає, як fileорганізовані на носії інформації. Специфікація класу USB-накопичувачів великої ємності не вимагає жодних конкретних file система, яка використовуватиметься на сумісних пристроях. Натомість вона надає простий інтерфейс для читання та запису секторів даних за допомогою прозорого набору команд інтерфейсу малих комп'ютерних систем (SCSI). Таким чином, операційні системи можуть обробляти USB-накопичувач як жорсткий диск і форматувати його за допомогою будь-якого file система, яка їм подобається.
Клас USB-накопичувачів масової пам'яті підтримує два транспортні протоколи, а саме:
Транспорт керування/масив/переривання (CBI) лише для групового транспортування (BOT) (використовується лише для дисководів гнучких дисків)
Клас пристроїв масової пам'яті реалізує прозорий набір команд SCSI, використовуючи лише протокол BOT, що означає, що для передачі даних та інформації про стан використовуватимуться лише кінцеві точки масової передачі даних. Реалізація MSC підтримує кілька логічних пристроїв.
Реалізація MSC відповідає наступним специфікаціям:
Специфікація класу масового накопичувача універсальної послідовної шини (Universal Serial Bus Mass Storage Class)view, Версія 1.3 від 5 вересня 2008 р. Універсальна послідовна шина для масового зберігання даних класу масового зберігання, версія 1.0 від 31 вересня 1999 р.
USB-пристрій MSC aCl ss Overview
Кінцеві точки протоколу Запити класів Інтерфейс малих комп'ютерних систем (SCSI)
Протокол
У цьому розділі ми обговоримо протокол Bulk-Only Transport (BOT) класу Mass Storage. Протокол Bulk-Only Transport має триtages:
Транспорт команд Транспорт даних Транспорт стану
Команди масового накопичувача надсилаються хостом через структуру, яка називається обгорткою блоків команд (CBW). Для команд, що потребують передачі данихtagтобто, хост спробує надіслати або отримати від пристрою точну кількість байтів, зазначену в полях довжини та прапорця CBW. Після передачі данихtagтобто, хост намагається отримати від пристрою обгортку стану команди (CSW), яка детально описує стан команди, а також будь-які залишки даних (якщо
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
43/174
закінченоview
будь-який). Для команд, що не містять оператора передачі данихtagтобто, хост намагається отримати CSW безпосередньо після відправлення CBW. Протокол детально описано на рисунку – Протокол MSC.
Рисунок – Протокол MSC
Кінцеві точки
На стороні пристрою, відповідно до специфікації BOT, MSC складається з таких кінцевих точок: пара керуючих кінцевих точок IN та OUT, які називаються кінцевою точкою за замовчуванням. пара кінцевих точок IN та OUT для масового використання.
У таблиці нижче наведено різні способи використання кінцевих точок.
Таблиця – Використання кінцевої точки MSC
Кінцева точка
ВХІД керування Вихід керування Об'ємний вхід Об'ємний вихід
Напрямок
Пристрій-хост Від хоста до пристрою Від пристрою-хоста до пристрою
Використання
Перерахування та запити, специфічні для класу MSC Перерахування та запити, специфічні для класу MSC Надсилання CSW та даних Отримання CBW та даних
Запити на заняття
Для протоколу MSC BOT визначено два запити керування. Ці запити та їхні описи детально описані в таблиці нижче.
Таблиця – Запити класів масової пам’яті
Запити на заняття
Скидання даних для масового зберігання даних
опис
Цей запит використовується для скидання налаштувань пристрою масової пам'яті та пов'язаного з ним інтерфейсу. Цей запит готує пристрій до отримання наступного блоку команд.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
44/174
закінченоview
Запити на заняття
опис
Get Max. Цей запит використовується для повернення найбільшого номера логічного пристрою (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)
Потреби в ресурсах класу MSC USB-пристрою від Core
Щоразу, коли ви додаєте екземпляр класу MSC до конфігурації USB за допомогою функції sl_usbd_msc_add_to_configuration(), з ядра будуть виділені такі ресурси.
Ресурс
Інтерфейси Альтернативні інтерфейси Кінцеві точки Групи інтерфейсів
Кількість
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, оскільки кінцеві точки відкриваються лише тоді, коли хост встановлює конфігурацію, вам просто потрібно врахувати кількість необхідних кінцевих точок для екземпляра класу.
Конфігурація класу MSC USB-пристрою
Для налаштування класу MSC використовуються дві групи параметрів конфігурації:
Клас USB-пристрою MSC Конфігурації, специфічні для програми Клас USB-пристрою MSC Конфігурація логічного блоку
Конфігурації класу MSC USB-пристроїв, специфічні для програми
Конфігурації часу компіляції класу Створення екземпляра класу
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
45/174
закінченоview
Конфігурації часу компіляції класу
Клас MSC та підклас SCSI від Silicon Labs USB Device можна налаштувати під час компіляції за допомогою #defines, розташованих у sl_usbd_core_config.h. file.
Таблиця – Загальні константи конфігурації
Назва конфігурації
опис
SL_USBD_MSC_CLASS_INST Кількість екземплярів класу, які будуть виділені через виклик функції
ANCE_QUANTITY
sl_usbd_msc_scsi_create_instance().
SL_USBD_MSC_CONFIGURA Номер конфігурації, до якої екземпляр класу можна додати через виклик функції
КІЛЬКІСТЬ_ЦІЇ
функція sl_usbd_msc_scsi_add_to_configuration().
SL_USBD_MSC_LUN_QUANT Кількість логічних одиниць на екземпляр класу, які ви додасте через виклик функції
ITY
функція sl_usbd_msc_scsi_lun_add().
SL_USBD_MSC_SCSI_64_BIT Вмикає або вимикає підтримку логічної адреси блоків (LBA) розміром 64 біти.
_LBA_EN
SL_USBD_MSC_DATA_BUFF Розмір буфера даних на екземпляр класу в байтах ER_SIZE
Значення за замовчуванням
2
1
2
0
512
Створення екземпляра класу
Створення екземпляра класу USB-пристрою MSC SCSI здійснюється викликом функції sl_usbd_msc_scsi_create_instance(). Ця функція приймає один аргумент конфігурації, який описано нижче.
p_scsi_callbacks
p_scsi_callbacks – це вказівник на структуру конфігурації типу sl_usbd_msc_scsi_callbacks_t. Окрім поширених зворотних викликів класу USB-пристроїв connect/disconnect, він надає класу MSC набір додаткових функцій зворотного виклику, які викликаються, коли на логічному пристрої відбувається подія. Нульовий вказівник (NULL) можна передати цьому аргументу, якщо зворотні виклики не потрібні.
У таблиці нижче описано кожне поле конфігурації, доступне в цій структурі конфігурації.
Таблиця – структура конфігурації sl_usbd_msc_scsi_callbacks_t
поля
опис
.enable
Викликається, коли екземпляр класу 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);
Конфігурація логічного блоку класу MSC USB-пристрою
Додавання логічного блоку до екземпляра класу MSC здійснюється викликом функції sl_usbd_msc_lun_add(). Ця функція приймає один аргумент конфігурації, який описано нижче.
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 для отримання додаткової інформації про драйвери носіїв.
.ve nd o r_id _ p tr
.product_id_ptr
.product_ re v isi on_level .is_ read_only
Вказівник на рядок, що містить ідентифікатор постачальника логічного блоку. Максимальна довжина рядка — 8 символів. Вказівник на рядок, що містить ідентифікатор продукту логічного блоку. Максимальна довжина рядка — 16 символів. Рівень версії продукту.
Прапорець, який вказує, чи слід розглядати логічний блок як такий, що призначений лише для читання з точки зору view господаря (true) чи ні (false).
Посібник з програмування класу MSC USB-пристрою
У цьому розділі пояснюється, як використовувати клас MSC.
Ініціалізація класу MSC USB-пристрою Додавання екземпляра класу MSC SCSI USB-пристрою до вашого пристрою Обробка логічного блоку класу MSC USB-пристрою
Ініціалізація класу MSC USB-пристрою
Щоб додати функціональність класу MSC SCSI до вашого пристрою, спочатку ініціалізуйте базовий клас MSC та підклас SCSI, викликавши функції sl_usbd_msc_init() та sl_usbd_msc_scsi_init().
Колишній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) { /* Сталася помилка. Тут слід додати обробку помилок. */
}
Додавання екземпляра класу MSC SCSI USB-пристрою до вашого пристрою
Щоб додати функціональність класу MSC SCSI до вашого пристрою, спочатку створіть екземпляр, а потім додайте його до конфігурації(й) вашого пристрою. Ви повинні додати принаймні один логічний пристрій до вашого екземпляра.
Створення екземпляра класу MSC SCSI
Створіть екземпляр класу MSC SCSI, викликавши функцію sl_usbd_msc_scsi_create_instance().
КолишнійampУ наведеному нижче прикладі показано, як викликати 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);
якщо (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(номер_класу,
(1)
config_nbr_fs);
(2)
якщо (статус ! SL_STATUS_OK) {
/* Сталася помилка. Тут слід додати обробку помилок. */
}
(1) Номер класу, який потрібно додати до конфігурації, що повертається функцією sl_usbd_msc_scsi_create_instance(). (32) Номер конфігурації (тут його додавання до конфігурації Full-Speed).
Обробка логічних одиниць класу MSC USB-пристрою
Додавання логічного блоку Підключення/відключення носія інформації
Додавання логічного блоку
Під час додавання логічного пристрою до екземпляра класу MSC SCSI його необхідно прив'язати до носія інформації (RAM-диск, 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 = NULL;
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
= «Кремнієві лабораторії»;
lu_info.product_id_ptr
= “блоковий пристрій exampле”;
lu_info.рівень_ревізії_продукту = 0x1000u;
lu_info.is_read_only
= хибний;
статус = sl_usbd_msc_scsi_lun_add(номер_класу, &lu_info, &lu_object_ptr);
якщо (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
ШІ драйвера TPY aa визначається typedef sl_usbd_msc_scsi_lun_api_t. Наш sl_usbd_msc_scsi_lun_api_t має бути включений до вашого sl_usbd_msc_scsi_lun_info_t, параметр ssed, коли ви додаєте логічний блок за допомогою sl_usbd_msc_scsi_lun_add(). Див. розділ USB Device MSC SCSI API для отримання додаткової інформації про структури. Реалізація драйвера накопичувача може бути такою ж простою, як масив секторів в оперативній пам'яті. Типовий розмір сектора (тобто розмір блоку) становить 512 для пристроїв масової пам'яті та 2048 для CD-ROM.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
50/174
закінченоview
закінченоview
Клас постачальника USB-пристроїв
Клас постачальника USB-пристроїв понадview Потреби в ресурсах класу постачальника USB-пристроїв з основної конфігурації класу постачальника USB-пристроїв Посібник з програмування класу постачальника USB-пристроїв Клас постачальника дозволяє створювати пристрої, специфічні для певного постачальника, які можуть реалізовувати власний протокол. Він спирається на пару кінцевих точок масової передачі для передачі даних між хостом і пристроєм. Масові передачі зручні для передачі великих обсягів неструктурованих даних і забезпечують надійний обмін даними за допомогою механізму виявлення помилок і повторної спроби. Окрім кінцевих точок масової передачі, клас постачальника також може використовувати додаткову пару кінцевих точок переривання. Будь-яка операційна система (ОС) може працювати з класом постачальника за умови, що ОС має драйвер для обробки класу постачальника. Залежно від ОС, драйвер може бути власним або специфічним для певного постачальника. Наприклад, у Microsoft Windows® ваша програма взаємодіє з драйвером WinUSB, наданим Microsoft, для зв'язку з пристроєм постачальника.
Клас постачальника USB-пристроїв понадview
Рисунок – Загальна архітектура між хостом Windows та класом Vendor показує загальну архітектуру між хостом та пристроєм за допомогою класу Vendor. У цьому прикладіampтобто, хост-операційною системою є MS Windows.
Рисунок – Загальна архітектура між хостом MS Windows та класом постачальника
На стороні MS Windows програма взаємодіє з пристроєм постачальника, взаємодіючи з бібліотекою USB. Бібліотеки, такі як libusb, пропонують API для керування пристроєм та пов'язаними з ним каналами, а також для зв'язку з пристроєм через кінцеві точки керування, масової обробки та переривання.
На стороні пристрою клас Vendor складається з таких кінцевих точок:
Пара керуючих кінцевих точок IN та OUT, які називаються кінцевою точкою за замовчуванням. Пара групових кінцевих точок IN та OUT.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
51/174
закінченоview
Пара кінцевих точок переривання IN та OUT. Ця пара необов'язкова. У таблиці нижче показано використання різних кінцевих точок:
Таблиця – Використання кінцевих точок класу постачальника
Напрямок кінцевої точки
Контроль IN
КОНТРОЛЬ
OUT
Масове введення
Пристрій-хост
>Від хоста до пристрою
Пристрій-хост
Масове виведення
Вхід переривання
Переривати
OUT
Від хоста до пристрою
Пристрій-хост
Від хоста до пристрою
Використання
Стандартні запити на перерахування та запити, специфічні для постачальника.
Стандартні запити на перерахування та запити, специфічні для постачальника.
Обмін необробленими даними. Дані можуть бути структуровані відповідно до власного протоколу.
Обмін необробленими даними. Дані можуть бути структуровані відповідно до власного протоколу.
Передача необроблених даних або сповіщення. Дані можуть бути структуровані відповідно до власного протоколу. Передача необроблених даних або сповіщення. Дані можуть бути структуровані відповідно до власного протоколу.
Програма пристрою може використовувати кінцеві точки масової обробки та переривання для надсилання або отримання даних на хост або від нього. Вона може використовувати лише кінцеву точку за замовчуванням для декодування запитів, специфічних для постачальника, надісланих хостом. Стандартні запити керуються внутрішньо основним рівнем USB-пристрою Silicon Labs.
Потреби в ресурсах класу постачальників USB-пристроїв від Core
Щоразу, коли ви додаєте екземпляр класу постачальника до конфігурації за допомогою функції 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-пристроїв
Для налаштування класу Постачальник використовуються дві групи параметрів конфігурації:
Клас постачальника USB-пристроїв Конфігурації для конкретного застосування Конфігурації екземплярів класу постачальника USB-пристроїв
Клас постачальника USB-пристроїв, конфігурації для конкретних застосувань
Спочатку, щоб використовувати модуль класу USB-пристрою Vendor від Silicon Labs, налаштуйте конфігурацію Vendor під час компіляції відповідно до потреб вашої програми. Вони перегруповані в заголовку sl_usbd_core_config.h. file у розділі «Постачальник». Мета конфігурацій кількості полягає в тому, щоб повідомити модуль USB-пристрою про те, скільки об’єктів USB-постачальника потрібно виділити.
У таблиці нижче описано кожне визначення конфігурації.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
52/174
закінченоview
Таблиця – Визначення конфігурації постачальника USB-пристроїв
Назва конфігурації
опис
Значення за замовчуванням
SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Кількість екземплярів класу, які будуть виділені через виклик функції sl_usbd_vendor_create_instance().
SL_USBD_VENDOR_CONFIGURATION_QUANTITY Кількість конфігурацій. Екземпляри класу постачальника можна додати до однієї або кількох конфігурацій за допомогою виклику функції sl_usbd_vendor_add_to_configuration().
Конфігурації екземплярів класу постачальника USB-пристроїв
У цьому розділі визначено конфігурації, пов'язані з екземплярами класу Vendor.
Створення екземпляра класу intr_en інтервал p_vendor_callbacks
Створення екземпляра класу
Створення екземпляра класу Vendor здійснюється шляхом виклику функції sl_usbd_vendor_create_instance(), яка приймає три аргументи конфігурації, описані нижче.
intr_en
Логічне значення, яке вказує, чи слід додавати пару кінцевих точок переривання, чи ні.
Значення
правда брехня
опис
Пара кінцевих точок IN/OUT буде додана та доступна для вбудованої програми. Кінцева точка переривання не буде додана. Доступна буде лише пара кінцевих точок Bulk IN/OUT.
інтервал
Якщо встановити intr_en на true, можна вказати інтервал опитування кінцевих точок переривання (у мілісекундах). Якщо встановити intr_en на false, можна встановити interval на 0, оскільки клас ігноруватиме його.
p_vendor_callbacks
p_vendor_callbacks – це вказівник на структурну змінну функцій зворотного виклику, яку можна вказати для обробки запитів керування, специфічних для класу. Якщо ви не використовуєте жодних запитів, специфічних для класу, або потребуєте ввімкнення/вимкнення сповіщень, ви можете встановити це значення на NULL.
КолишнійampУ наведеному нижче файлі наведено очікуваний підпис обробника запитів, специфічних для вашого класу.
Example – Підпис функції запиту, специфічної для класу
недійсний app_usbd_vendor_req_handle(uint8_t)
клас_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) Номер екземпляра класу постачальника.
Авторське право © 2025 Silicon Laboratories. Всі права захищені.
53/174
закінченоview
(2) Вказівник на отриманий запит на налаштування від хоста.
Посібник з програмування класу постачальників USB-пристроїв
У цьому розділі пояснюється, як використовувати клас Vendor. Ініціалізація класу USB-пристрою Vendor Додавання екземпляра класу USB-пристрою Vendor до вашого пристрою Зв'язок за допомогою класу USB-пристрою Vendor
Ініціалізація класу постачальника USB-пристроїв
Щоб додати функціональність класу постачальника до вашого пристрою, спочатку ініціалізуйте клас, викликавши функцію USBD_Vendor_Init(). НаприкладampУ наведеному нижче прикладі показано, як викликати sl_usbd_vendor_init().
Example – Виклик sl_usbd_vendor_init()
статус sl_status_t;
status = sl_usbd_vendor_init(); if (status ! SL_STATUS_OK) { /* Сталася помилка. Тут слід додати обробку помилок. */ }
Додавання екземпляра класу постачальника USB-пристроїв до вашого пристрою
Щоб додати функціональність класу постачальника до вашого пристрою, спочатку потрібно створити екземпляр, а потім додати його до конфігурації(й) вашого пристрою.
Створення екземпляра класу постачальника Додавання екземпляра класу постачальника до конфігурації(й) вашого пристрою
Створення екземпляра класу постачальника
Створіть екземпляр класу Vendor, викликавши функцію sl_usbd_vendor_create_instance(). НаприкладampУ наведеному нижче прикладі показано, як викликати 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(хибний,
(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(номер_класу,
(1)
config_nbr_fs);
(2)
якщо (статус ! SL_STATUS_OK) {
/* Сталася помилка. Тут слід додати обробку помилок. */
}
(1) Номер класу, який потрібно додати до конфігурації, що повертається функцією sl_usbd_vendor_create_instance(). (2) Номер конфігурації (тут його додавання до конфігурації Full-Speed).
Зв'язок за допомогою класу постачальника USB-пристроїв
Загальні відомості про синхронний зв'язок Асинхронний зв'язок Запит постачальника Загальні відомості Клас Vendor пропонує такі функції для зв'язку з хостом. Докладніше про параметри функції див. у розділі API постачальника USB-пристроїв.
Таблиця – Зведення API зв’язку з постачальниками
Назва функції
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-
блокування.
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
xfer_len;
sl_status_t
статус;
status = sl_usbd_vendor_read_bulk_sync(class_nbr,
(1)
(void *)&rx_buf[0],
(2)
2u,
0u,
(3)
&довжина_xfer);
якщо (статус ! SL_STATUS_OK) {
/* $$$$ Обробка помилки. */
}
status = sl_usbd_vendor_write_bulk_sync( class_nbr,
(1)
(void *)&tx_buf[0],
(4)
2u,
0u,
(3)
false,
(5)
&довжина_xfer);
якщо (статус ! 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],
"А",
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):
typedef struct {
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
опис
N/A
line_state_interval Line state notification interval in milliseconds (value must
be a power of 2).
N/A
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 *
N/A
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 |