Stiva de dispozitive USB
Specificații
- Versiune USB: 1.5.1
- Data lansării: 21 iulie 2025
- Versiunea SDK-ului Simplicity: 2025.6.1
Produs terminatview
Stiva de dispozitive USB de la Silicon Labs oferă versatilă și
Conectivitate USB ușor de utilizat pentru proiecte IoT, facilitând
comunicarea dintre coprocesoarele rețelei și gazde.
Caracteristici
- Stivă eficientă de dispozitive USB
- Ideal pentru proiecte IoT
- Suport pentru comunicarea între coprocesoarele de rețea și
gazde
Instrucțiuni de utilizare a produsului
Configurarea dispozitivului USB
Configurați setările dispozitivului USB în funcție de proiectul dvs.
cerințele consultând secțiunea Configurare dispozitiv USB
în documentație.
Ghid de programare a dispozitivelor USB
Urmați Ghidul de programare a dispozitivelor USB pentru a înțelege cum să
programați și interacționați cu dispozitivul USB pentru diverse
aplicatii.
Clase de dispozitive USB
Secțiunea Clase de dispozitive USB oferă o prezentare generalăview de diferite
clase precum CDC ACM, HID, MSC SCSI și Vendor Class. Alegeți
clasa corespunzătoare în funcție de funcționalitatea dispozitivului dumneavoastră.
Depanarea dispozitivelor USB
Dacă întâmpinați probleme cu dispozitivul USB, consultați
Secțiunea de depanare a dispozitivelor USB pentru soluții și depanare
sfaturi.
Gazdă USB pentru sistemul de operare Microsoft Windows
Dacă utilizați dispozitivul USB cu un sistem de operare Microsoft Windows
Gazdă, asigură-te că respecți instrucțiunile furnizate în
documentație pentru o integrare perfectă.
FAQ
Î: Care sunt unele dintre exampmai multe dispozitive pe care le pot construi folosind
această stivă USB?
R: Stiva USB vă permite să construiți dispozitive precum
Adaptoare USB-serial, mouse sau tastaturi, stocare detașabilă
dispozitive și dispozitive personalizate.
Î: Există cerințe software specifice pentru utilizarea acestui
Stiva de dispozitive USB?
R: Software-ul compatibil include Simplicity SDK, Simplicity
Studio, Simplicity Commander, GCC (Colecția de compilatoare GNU),
IAR Embedded Workbench pentru ARM și IAR EWARM.
USB de magistrală serială universală
USB de magistrală serială universală
USB prinview Pesteview
Note de lansare USB
Specificații și caracteristici de mai susview
Configurarea dispozitivului USB pesteview
Ghid de programare a dispozitivelor USBview
Clase de dispozitive USB pesteview Clasa CDC ACM depășităview Clasa HID depășităview Clasa MSC SCSI Overview Clasa furnizorului terminatăview
Documentație API USB API dispozitiv USB API ACM dispozitiv USB a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t API CDC dispozitiv USB a sl_usbd_cdc_subcl ss_driver_t API nucleu dispozitiv USB
sl_usbd_device_config_t sl_usbd_setup_req_t
o API HID pentru dispozitive USB sl_usbd_cl ss_driver_t
API-ul MSC pentru dispozitive USB sl_usbd_hid_callbacks_t
o API SCSI MSC pentru dispozitiv USB sl_usbd_msc_subcl ss_driver_t
sl_usbd_msc_scsi_callbacks_t
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
1/174
USB de magistrală serială universală
un sl_usbd_msc_scsi_lun_pi
sl_usbd_msc_scsi_lun_info sl_usbd_msc_scsi_lun
API-ul furnizorului de dispozitive USB sl_usbd_vendor_callbacks_t
Depanarea dispozitivelor USB din documentația API
Pesteview Gazdă USB pentru sistemul de operare Microsoft Windows
Pesteview
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
2/174
Pesteview
Pesteview
Dispozitiv USB
USB este una dintre cele mai de succes interfețe de comunicație din istoria sistemelor informatice și este standardul de facto pentru conectarea perifericelor computerului. Stack-ul USB Device de la Silicon Labs este un modul de dispozitiv USB conceput special pentru sistemele integrate. Construit de la zero cu calitatea, scalabilitatea și fiabilitatea Silicon Labs, acesta a trecut printr-un proces riguros de validare pentru a se conforma specificației USB 2.0. Această documentație descrie cum se inițializează, se pornește și se utilizează stiva USB Device de la Silicon Labs. Aceasta explică diversele valori de configurare și utilizările acestora. De asemenea, include o prezentare generală...view a tehnologiei, tipurile de posibilități de configurare, procedurile de implementare și exampmai puține utilizări tipice pentru fiecare clasă disponibilă.
Pentru a vă ajuta să înțelegeți rapid conceptele USB, documentația conține multe exempleampporturi USB cu funcții de bază. Aceste exempleampFișierele vă vor oferi un cadru care vă permite să construiți rapid dispozitive. Aceste exempleampfișierele includ:
Adaptor USB-serial (clasa Dispozitive de comunicații) Mouse sau tastatură (clasa Dispozitive cu interfață umană) Dispozitiv de stocare amovibil (clasa Stocare în masă) Dispozitiv personalizat (clasa Furnizor)
Următorul este terminatview din secțiunile de documentație:
Specificații și caracteristici Configurarea dispozitivului USB Ghid de programare a dispozitivelor USB Clase de dispozitive USB
Clasa CDC ACM Clasa HID Clasa MSC SCSI Clasa furnizorului Depanare dispozitiv USB Sistem de operare Microsoft Windows Gazdă USB
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
3/174
USB
USB
USB versiunea 1.5.1 21 iulie 2025 – Note de lansare
SDK-ul Simplicity versiunea 2025.6.1
Stiva eficientă de dispozitive USB de la Silicon Labs oferă conectivitate USB versatilă și ușor de utilizat, ideală pentru proiecte IoT, inclusiv comunicarea între coprocesoarele de rețea și gazde. Faceți clic aici pentru versiuni anterioare.
Rezumatul lansării
Caracteristici cheie | Modificări API | Corecții de erori | Activare cip
Caracteristici cheie
Doar modificările platformei subiacente.
Modificări API
Nici unul.
Remedieri de erori
Nici unul.
Activare cip
Nici unul.
Caracteristici cheie
Funcții noi | Îmbunătățiri | Funcții eliminate | Funcții învechite
Caracteristici noi
Nici unul.
Îmbunătățiri
Doar modificările platformei subiacente.
Funcții eliminate
Nici unul.
Caracteristici depreciate
Nici unul.
Modificări API
API-uri noi | API-uri modificate | API-uri eliminate | API-uri depreciate
API-uri noi
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
4/174
USB
Nici unul.
API-uri modificate
Nici unul.
API-uri eliminate
Nici unul.
API-uri depreciate
Nici unul.
Remedieri de erori
Nici unul.
Activare cip
Nici unul.
Aplicație ExampSchimbările
Ex. nouamples | Ex modificatamples | Ex eliminatamples | Ex depreciatamples
Ex. nouamples
Nici unul.
Ex. modificatamples
Nici unul.
Eliminat Examples
Nici unul.
Ex depreciatamples
Nici unul.
Impactul modificărilor de lansare
Declarații de impact | Ghid de migrare
Declarații de impact
Nici unul.
Ghid de migrare
Nici unul.
Probleme și limitări cunoscute
Nici unul.
Folosind această versiune
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
5/174
USB
Ce se află în această versiune? | Software compatibil | Instalare și utilizare | Ajutor și feedback
Ce conține lansarea?
Aplicație USB Device Stack Examples
Software compatibil
Software
SDK Simplicity Simplicity Studio Simplicity Commander GCC Colecția de compilatoare GNU) IAR Embedded Workbench pentru ARM IAR EWARM
Versiune sau variantă compatibilă
2025.6.0 5.11.0 1.18.2 (furnizat cu Simplicity Studio) 12.2.1 (furnizat cu Simplicity Studio) 9.40.1 (furnizat cu Simplicity Studio)
Instalare și utilizare
Pentru a începe dezvoltarea ta, consultă:
Ghid de programare a dispozitivelor USB. Documentație API.
Pentru informații despre integrarea Secure Vault, consultați Secure Vault.
Pentru a review Notificări privind avertismentele de securitate și software și gestionarea preferințelor de notificare:
Accesați https://community.silabs.com/. Conectați-vă cu datele contului dvs. de utilizator. Faceți clic pe pro-ul dvs.file pictograma din colțul din dreapta sus al paginii.
õ Selectați Notificări din meniul derulant. ö În secțiunea Notificări, accesați fila Notificările produsului meu pentru aview Consultanță istorică în domeniul securității și software-ului
notificări
÷ Pentru a vă gestiona preferințele, utilizați fila Gestionare notificări pentru a personaliza actualizările și avertismentele de produs pe care le doriți
primi.
Pentru setările de configurare recomandate, consultați aici.
Pentru a afla mai multe despre software-ul din această versiune, consultați documentația noastră online.
Ajutor și feedback
Contactați serviciul de asistență Silicon Labs. Pentru a utiliza instrumentul nostru Ask AI pentru a obține răspunsuri, consultați câmpul de căutare din partea de sus a acestei pagini.
Notă: Ask AI este o funcție experimentală.
Obțineți ajutor de la comunitatea noastră de dezvoltatori.
Politica de lansare și întreținere SDK
Consultați Politica noastră privind lansarea și întreținerea SDK-ului.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
6/174
Pesteview
Pesteview
Specificații
Respectă specificațiile „Universal Serial Bus revizia 2.0” Implementează „Interface Association Descriptor Engineering Change Notice (ECN)” Tipuri de transfer
Clase USB cu întreruperi în masă de control Clasa dispozitivelor de comunicare (CDC) Model abstract de control (ACM) Dispozitiv de interfață umană (HID) Clasa de stocare în masă (MSC) Cadrul de clase specific furnizorului
Caracteristici
Scalabil pentru a include doar funcțiile necesare pentru a minimiza amprenta memoriei Suportă viteză completă (12 Mbit/s) Suportă dispozitive compozite (multifuncționale) Suportă dispozitive cu configurație multiplă Suportă funcționalități USB de economisire a energiei (suspendare și reluare dispozitiv) Integrare completă a clasei de stocare în masă (Mass Storage Class) în sistemul de operare Micrium File Modul de sistem dezvoltat cu stratul de abstractizare CMSIS-RTOS2, astfel încât să poată funcționa cu diferite sisteme de operare. Silicon Labs GSDK vine cu porturi FreeRTOS și Micrium OS.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
7/174
Pesteview
Pesteview
Configurarea dispozitivului USB
Această secțiune prezintă modul de configurare a dispozitivului USB Silicon Labs. Există trei grupuri de parametri de configurare, după cum urmează:
Configurarea principală a dispozitivului USB Configurarea informațiilor despre dispozitivul USB Configurarea hardware-ului dispozitivului USB
Configurația nucleului dispozitivului USB
Dispozitivul USB Silicon Labs poate fi configurat la compilare printr-un set de #defines situate în fișierul sl_usbd_core_config.h fileDispozitivele USB utilizează #defines atunci când este posibil, deoarece permit scalarea dimensiunilor codului și datelor la momentul compilării, în funcție de funcțiile activate. Acest lucru permite ajustarea amprentelor memoriei read-only (ROM) și memoriei cu acces aleatoriu (RAM) ale dispozitivului USB Silicon Labs în funcție de cerințele aplicației.
Recomandat: Începeți procesul de configurare cu valorile implicite (evidențiate cu caractere aldine).
Secțiunile de mai jos sunt organizate în funcție de ordinea din configurația șablonului file, sl_usbd_core_config.h.
Configurarea claselor de configurare de bază
Configurație de bază
Tabel – Constante de configurare a nucleului dispozitivului USB
Descrierea constantei
Valoare implicită
SL_USBD_TA SK_STACK_ SIZE
Configurează dimensiunea stivei în octeți a sarcinii principale USBD
4096
SL_USBD_TA SK_PRIORITATE Y
Configurează prioritatea sarcinii principale USBD. Aceasta este o prioritate CMSIS-RTOS2.
Prioritate ridicată a sistemului de operare
SL_USBD_A UTO_START _USB_DEVIC E
Dacă este activat, dispozitivul USB va porni automat odată ce kernelul este pornit și acea sarcină a nucleului USBD este programată pentru prima dată. Dacă este dezactivat, aplicația va trebui să apeleze sl_usbd_core_start_device() atunci când este gata să fie detectată de gazda USB.
SL_USBD_C Numărul total de configurații care vor fi adăugate prin intermediul funcției sl_usbd_add_configuration()
1
Funcția ONFIGURATI.
ON_QUANTI
TY
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
8/174
Pesteview
Constant
SL_USBD _INTERF ACE_QU ANTITY
SL_USBD _ALT_INT ERFACE_ QUANTI
TY
SL_USBD _INTERF ACE_GR
OUP_QU
ANTITATE
SL_USBD _DESCRI
PTOR_Q
UNANTITATE
SL_USBD _ȘIR _CANTITATE
TY
SL_USBD _OPEN_E NDPOIN TS_CANTITATE
Descriere Numărul total de interfețe USB care vor fi adăugate pentru toate configurațiile. Acest lucru depinde în mare măsură de clasa (clasele) utilizată(e). Pentru mai multe informații despre câte interfețe necesită o instanță de clasă, consultați secțiunea „Nevoi de resurse din nucleu” a clasei (claselor) dumneavoastră.
Numărul total de interfețe USB alternative care vor fi adăugate pentru toate configurațiile dvs. Acest lucru depinde în mare măsură de clasa (clasele) utilizată(e). Această valoare trebuie să fie întotdeauna egală sau mai mare decât SL_USBD_INTERFACE_QUANTITY. Pentru mai multe informații despre câte interfețe alternative necesită o instanță de clasă, consultați secțiunea „Nevoi de resurse din nucleu” a clasei (claselor) dvs.
Numărul total de grupuri de interfețe USB care vor fi adăugate pentru toate configurațiile dvs. Acest lucru depinde în mare măsură de clasa (clasele) utilizată(e). Pentru mai multe informații despre câte grupuri de interfețe necesită o instanță de clasă, consultați secțiunea „Nevoi de resurse din nucleu” a clasei (claselor) dvs.
Numărul total de descriptori de endpoint-uri care vor fi adăugați pentru toate configurațiile dvs. Acest lucru depinde în mare măsură de clasa (clasele) utilizată(e). Pentru mai multe informații despre câte descriptori de endpoint-uri necesită o instanță de clasă, consultați „Numărul de endpoint-uri” din secțiunea „Nevoi de resurse din Core” a clasei (claselor) dvs. Rețineți că endpoint-urile de control nu trebuie luate în considerare aici. Numărul total de șiruri USB. Setarea cantității la zero va dezactiva funcția. Dezactivarea acestei opțiuni va face ca dispozitivul să nu stocheze niciun șir de descriere USB transmis de aplicație. Aceasta înseamnă că gazda nu va putea prelua șirurile de descriere (cum ar fi producătorul și numele produsului). Numărul total de endpoint-uri deschise per configurație. Un dispozitiv necesită cel puțin două endpoint-uri deschise pentru transferurile de control, dar trebuie să adăugați și endpoint-urile clasei (claselor) utilizate. Pentru mai multe informații despre câte endpoint-uri deschise necesită o instanță de clasă, consultați „Numărul de endpoint-uri” din secțiunea „Nevoi de resurse din Core” a clasei (claselor) dvs.
Valoare implicită
10 10
2
20 30 20
Configurarea claselor
Clasele au configurații specifice la compilare. Consultați Clasele de dispozitive USB pentru mai multe informații.
Configurarea informațiilor despre dispozitivul USB
Configurația sl_usbd_device_config.h file regrupează #define-urile la compilare pentru a seta informații de bază despre dispozitivul dvs., cum ar fi ID-ul furnizorului/produsului, șirurile de dispozitiv etc. Tabelul de mai jos descrie fiecare configurație de informații definită disponibilă în această configurație. file.
Tabel – Definiții de configurare a informațiilor despre dispozitivele USB
Constant
SL_USBD_DEVIC E_VENDOR_ID
SL_USBD_DEVIC E_PRODUCT_ID
Descriere Numărul dvs. de identificare a furnizorului, așa cum a fost furnizat de USB Implementers Forum. Pentru mai multe informații despre cum puteți obține un ID de furnizor, consultați http://www.usb.org/developers/vendor/. Numărul dvs. de identificare a produsului.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
9/174
Pesteview
Constant
Descriere
SL_USBD_DEVICE_RELEASE Numărul de lansare al dispozitivului dvs. _NUMBER
SL_USBD_DEVICE_MANUFA Șir de caractere care descrie producătorul dispozitivului dumneavoastră. Această configurație este ignorată atunci când
CTURER_STRING
Configurația SL_USBD_STRING_QUANTITY este setată la 0.
SL_USBD_DEVICE_PRODUC Șir de caractere care descrie produsul dumneavoastră. Această configurație este ignorată atunci când configurația
T_STRING
SL_USBD_STRING_QUANTITY este setat la 0.
SL_USBD_DEVICE_SERIAL_N Șir de caractere care conține numărul de serie al dispozitivului. Această configurație este ignorată atunci când
UMBER_STRING
Configurația SL_USBD_STRING_QUANTITY este setată la 0.
SL_USBD_DEVICE_LANGUA Numărul de identificare al limbii șirurilor de caractere ale dispozitivului. Valorile posibile sunt:
ID_GE
– SL_USBD_LANG_ID_ARABIC_ARABIA_SAUDITĂ
– SL_USBD_LANG_ID_CHINEZĂ_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_GREECE
– SL_USBD_LANG_ID_ITALIAN
– SL_USBD_LANG_ID_PORTUGHEZĂ
– SL_USBD_LANG_ID_SANSKRIT
Această configurație este ignorată când configurația SL_USBD_STRING_QUANTITY este setată la 0.
Configurarea hardware-ului dispozitivului USB
În funcție de dispozitivul Silicon Labs pe care îl utilizați, este posibil să aveți pinul și portul GPIO de configurat pentru semnalul USB VBUS Sense. Definițiile de configurare se află în antetul sl_usbd_hardware_config.h. file.
Constant
SL_USBD_DRIVER_VBUS_SENSE_PORT SL_USBD_DRIVER_VBUS_SENSE_PIN
Descriere
Port GPIO pentru semnalul USB VBUS Sense de pe placă. Pin GPIO pentru semnalul USB VBUS Sense de pe placă.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
10/174
Pesteview
Pesteview
Ghid de programare a dispozitivelor USB
Această secțiune explică modul de utilizare a modulului Dispozitiv USB.
Configurarea inițială a modulului dispozitivului USB
Această secțiune descrie pașii de bază necesari pentru inițializarea modulului dispozitivului USB și pentru adăugarea, pregătirea și pornirea unui dispozitiv. Inițializarea modulului dispozitivului USB Inițializarea nucleului dispozitivului USB Inițializarea ss-urilor aCl Adăugarea dispozitivului USB Construirea dispozitivului USB Adăugarea configurației(ilor) Adăugarea funcției(ilor) USB Pornirea dispozitivului USB
Funcții de hook pentru evenimente
Inițializarea modulului dispozitivului USB
Inițializarea nucleului dispozitivului USB
Începeți prin inițializarea nucleului modulului dispozitivului B apelând funcția sl_usbd_core_init(). Exemplul de mai jos arată apelarea funcției sl_usbd_core_init().
Example – Apelarea funcției sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. */
}
Inițializarea clasei (claselor)
După ce nucleul modulului dispozitivului USB a fost inițializat, trebuie să inițializați fiecare clasă pe care intenționați să o utilizați. Consultați secțiunea „Ghid de programare” din fișierele ACL ss pentru mai multe informații.
Construirea dispozitivului USB
Adăugarea configurației (configurațiilor)
După ce inițializați cu succes dispozitivul, puteți începe să adăugați funcțiile USB la acesta, începând cu o nouă configurație. Un dispozitiv trebuie să aibă cel puțin o configurație. Pentru a adăuga o configurație (sau mai multe configurații), apelați funcția sl_usbd_core_dd_configuration(). Această funcție trebuie apelată pentru fiecare configurație pe care doriți să o adăugați.ampMai jos se arată cum se adaugă o conexiune Full-speed.
Example – Adăugarea configurației (configurațiilor) la dispozitivul dvs.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
11/174
Pesteview
sl_status_t stare; uint8_t config_nbr_fs;
/* Adăugarea unei configurații de viteză maximă la dispozitiv. */
stare = sl_usbd_core_add_configuration(0,
/* Nu există atribute speciale pentru configurație. */
100u,
Consum maxim de energie: 100mA.
*/
SL_USBD_DEVICE_SPEED_FULL,
/* Configurație la viteză maximă.
*/
„Configurare Adăugare Ex”amp„Configurația Full-Speed”,
&config_nbr_fs);
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
Adăugarea funcțiilor USB
După ce ați adăugat cu succes cel puțin o configurație la dispozitiv, puteți adăuga interfețele și punctele finale la dispozitiv. Fiecare clasă USB are propriile nevoi în ceea ce privește tipul, cantitatea și alți parametri ai interfeței și punctelor finale. Silicon Labs USB Device adaugă interfețe și puncte finale în clasele pe care le oferă.
Din aplicația dvs., puteți instanția o clasă USB și o puteți adăuga la o configurație. Pentru mai multe informații despre conceptul de instanțe de clasă de dispozitive USB, consultați Clase de dispozitive USB. Rețineți că puteți instanția și adăuga mai multe instanțe de clasă diferite la o configurație pentru a crea un dispozitiv multifuncțional (compozit).
ExampMai jos arată cum se creează o instanță de clasă și cum se adaugă la o configurație.
Example – Adăugarea unei instanțe de clasă la dispozitivul dvs.
sl_status_t stare; uint8_t număr_clasă;
/* Creați o instanță a clasei pe care doriți să o utilizați.*/ /* Rețineți că, în funcție de clasă, această funcție poate avea mai multe argumente. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. */ }
/* Adăugați instanța clasei la configurația Full-Speed. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Numărul clasei returnat de sl_usbd_ _creează_instanță. */
config_nbr_fs); /* Numărul de configurare returnat de sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. */ }
Pornirea dispozitivului USB
În mod implicit, dispozitivul va fi pornit automat de sarcina nucleului dispozitivului USB după finalizarea inițializării dispozitivului și pornirea kernelului. Pentru a controla momentul în care dispozitivul este pornit și devine vizibil de către gazda USB, utilizați definiția de configurare SL_USBD_AUTO_START_USB_DEVICE pentru a dezactiva funcția de pornire automată. Când este dezactivată, după ce ați construit/pregătit dispozitivul, îl puteți porni și face vizibil pentru gazda USB apelând funcția sl_usbd_core_start_device().
ExampMai jos vă arată cum să porniți dispozitivul folosind funcția sl_usbd_core_start_device().
Example – Pornirea dispozitivului
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
12/174
Pesteview
stare sl_status_t;
status = sl_usbd_core_start_device(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. */ }
Funcții de hook pentru evenimente
Modulul principal al dispozitivului USB oferă două funcții de conectare slabe pe care le puteți redefini în aplicație. Scopul lor este de a notifica când apar evenimente de configurare și de magistrală.
Tabel – Funcții de hook pentru evenimente USB
Eveniment
Descriere
Autobuz
Apelat când apare un eveniment USB Bus
Configurare apelată când are loc evenimentul de configurare USB
Semnătura funcției
void sl_usbd_on_bus_event(sl_usbd_bus_event_t eveniment); void sl_usbd_on_config_event(sl_usbd_config_event_t eveniment, uint8_t config_nbr);
Example – Funcții de hook pentru evenimente
void sl_usbd_on_bus_event(sl_usbd_bus_event_t eveniment) { comutator (eveniment) { caz SL_USBD_EVENT_BUS_CONNECT:
// apelat când cablul USB este introdus într-o pauză a controlerului gazdă;
case SL_USBD_EVENT_BUS_DISCONNECT: // apelat când cablul USB este deconectat de la un controler gazdă break;
case SL_USBD_EVENT_BUS_RESET: // apelat când gazda trimite comanda de resetare break;
case SL_USBD_EVENT_BUS_SUSPEND: // apelată când gazda trimite comanda de suspendare break;
case SL_USBD_EVENT_BUS_RESUME: // apelat când gazda trimite comanda de trezire break;
implicit: pauză; } }
void sl_usbd_on_config_event(sl_usbd_config_event_t event, uint8_t config_nbr) { switch (event) { case SL_USBD_EVENT_CONFIG_SET:
// apelat când gazda setează o pauză de configurare;
case SL_USBD_EVENT_CONFIG_UNSET: // apelat când o configurație este nesetată break;
implicit: pauză; } }
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
13/174
Pesteview
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
14/174
Pesteview
Pesteview
Clase de dispozitive USB
Clasele USB disponibile în Silicon Labs USB Device au câteva caracteristici comune. Această secțiune explică aceste caracteristici și interacțiunile lor cu stratul central.
Pentru mai multe informații despre o anumită clasă, consultați următoarele:
Clasa CDC ACM Clasa HID Clasa MSC SCSI Clasa furnizorului
Despre instanțele de clasă
Clasele USB disponibile în USB Device implementează conceptul de instanțe de clasă. O instanță de clasă reprezintă o funcție în cadrul unui dispozitiv. Funcția poate fi descrisă de o interfață sau de un grup de interfețe și aparține unei clase specifice.
Fiecare implementare a clasei USB are anumite configurații și funcții comune, bazate pe conceptul de instanță de clasă. Configurațiile și funcțiile comune sunt prezentate în tabelul de mai jos. În coloana „Constante sau funcție”, caracterul provizoriu XXXX poate fi înlocuit cu numele clasei: CDC, HID, MSC, CDC_ACM sau VENDOR (Vendor pentru numele funcțiilor).
Tabel – Constante și funcții legate de conceptul de instanțe multiple de clasă
Constantă sau funcție
SL_USBD_XXXX_CL ASS_INS TANCE_QUANTITY
SL_USBD_XXXX_CONFIGURARE_CANTITATE
sl_usb d _XXXX_creează_instanță ()
sl_usbd_XXXX_add_to_conf iguration()
Descriere
Configurează numărul maxim de instanțe ale clasei.
Configurează numărul maxim de configurații. În timpul inițializării clasei, o instanță de clasă creată va fi adăugată la una sau mai multe configurații. Creează o nouă instanță de clasă.
Adaugă o instanță de clasă existentă la configurația specificată a dispozitivului.
În ceea ce privește implementarea codului, clasa va declara o variabilă globală locală care conține o structură de control a clasei. Această structură de control a clasei este asociată cu o instanță a clasei și va conține informații specifice pentru gestionarea instanței clasei.
Următoarele figuri prezintă mai multe scenarii de caz. Fiecare figură include un exemplu de codampcare corespunde scenariului de caz.
Figura – Instanțe multiple de clasă – Dispozitivul FS (1 configurație cu 1 interfață) reprezintă un dispozitiv USB tipic. Dispozitivul este Full-Speed (FS) și conține o singură configurație. Funcția dispozitivului este descrisă de o interfață compusă dintr-o pereche de puncte finale pentru comunicarea de date. O instanță de clasă este creată și vă va permite să gestionați întreaga interfață cu punctul final asociat.
Figura – Instanțe multiple de clasă – Configurația dispozitivului FS 1 cu 1 interfață)
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
15/174
Pesteview
Codul corespunzător Figurii – Instanțe multiple de clasă – Dispozitiv FS (1 configurație cu 1 interfață) este prezentat în exemplulample de mai jos.
Example – Instanțe multiple de clasă – Configurație dispozitiv FS 1 cu 1 interfață)
sl_status_t stare; uint8_t clasă_0;
void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Gestionează evenimentul de activare a clasei. */ }
void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Gestionează evenimentul de dezactivare a clasei. */ }
sl_usbd_XXXX_callbacks_t class_callbacks = {
(1)
.enable = app_usbd_XXXX_enable,
.disable = app_usbd_XXXX_disable
};
stare = sl_usbd_XXXX_init();
(2)
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Gestionează eroarea. */
}
stare = sl_usbd_XXXX_create_instance(&class_callbacks,
(3)
&clasa_0);
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Gestionează eroarea. */
}
stare = sl_usbd_XXXX_add_to_configuration(class_0, config_0);
(4)
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Gestionează eroarea. */
}
(1) Fiecare clasă oferă un set de funcții de apel invers pentru evenimentele de conectare/deconectare a dispozitivelor și pentru evenimentele specifice clasei. Obiectul structural de apel invers este transmis ca argument la crearea instanței clasei cu sl_usbd_XXXX_create_instance()
funcţie.
(1) Inițializați clasa. Toate variabilele interne, structurile și porturile clasei vor fi inițializate. Rețineți că funcția Init() din unele clase poate accepta și alte argumente.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
16/174
Pesteview
(2) Creați instanța clasei, care este class_0. Funcția sl_usbd_XXXX_create_instance() alocă o structură de control al clasei asociată cu class_0. În funcție de clasă, sl_usbd_XXXX_create_instance() poate avea parametri suplimentari pe lângă numărul clasei, care reprezintă informații specifice clasei stocate în structura de control al clasei. aaa (3) Adăugați instanța clasei, class_0, la numărul de configurare specificat, config_0. sl_usbd_XXXX_add_to_configuration() va crea interfața 0 și punctele finale IN și OUT asociate. Ca rezultat, instanța clasei cuprinde interfața 0 și punctele finale. Orice comunicare efectuată pe interfața 0 va utiliza numărul instanței clasei, class_0. Figura – Instanțe multiple de clasă – Dispozitivul FS (2 configurații și interfețe multiple) reprezintă un exemplu mai complex.ampAdică, un dispozitiv de viteză maximă este compus din două configurații. Dispozitivul are două funcții care aparțin aceleiași clase, dar fiecare funcție este descrisă de două interfețe și are o pereche de puncte finale bidirecționale. În acest exempluampAdică, sunt create două instanțe de clasă. Fiecare instanță de clasă este asociată cu un grup de interfețe, spre deosebire de Figura – Instanțe multiple de clasă – Dispozitiv FS (1 configurație cu 1 interfață) și Figura – Instanțe multiple de clasă – Dispozitiv FS (2 configurații și interfețe multiple), unde instanța de clasă era asociată cu o singură interfață.
Figura – Instanțe multiple de clasă – Configurații ale dispozitivului FS 2 și interfețe multiple)
Codul corespunzător Figurii – Instanțe multiple de clasă – Dispozitiv FS (2 configurații și interfețe multiple) este prezentat în exemplulampmai jos. Tratarea erorilor este omisă pentru claritate.
Example – Instanțe multiple de clasă – Configurații ale dispozitivului FS 2 și interfețe multiple)
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
17/174
Pesteview
sl_status_t stare; uint8_t clasa_0; uint8_t clasa_1;
stare = sl_usbd_XXXX_init();
stare = sl_usbd_XXXX_create_instance(&class_0); stare = sl_usbd_XXXX_create_instance(&class_1);
stare = sl_usbd_XXXX_add_to_configuration(class_0, cfg_0); stare = sl_usbd_XXXX_add_to_configuration(class_1, cfg_0);
stare = sl_usbd_XXXX_add_to_configuration(class_0, cfg_1); stare = sl_usbd_XXXX_add_to_configuration(class_1, cfg_1);
(1)
(2) (3)
(4) (5)
(6) (6)
(1) Inițializați clasa. Orice variabile interne, structuri și porturi ale clasei vor fi inițializate.
(2) Creați instanța clasei, class_0. Funcția sl_usbd_XXXX_create_instance() alocă o structură de control a clasei asociată cu class_0.
(3) Creați instanța clasei, class_1. Funcția sl_usbd_XXXX_create_instance() alocă o altă structură de control a clasei asociată cu class_1.
(4) Adăugați instanța clasei, class_0, la configurația cfg_0. sl_usbd_XXXX_add_to_configuration() va crea interfața 0, interfața 1, interfețele alternative și punctele finale IN și OUT asociate. Numărul instanței clasei, class_0, va fi utilizat pentru orice comunicare de date pe interfața 0 sau interfața 1.
(5) Adăugați instanța clasei, class_1, la configurația cfg_0. sl_usbd_XXXX_add_to_configuration() va crea interfața 2, interfața 3 și punctele finale IN și OUT asociate. Numărul instanței clasei, class_1, va fi utilizat pentru orice comunicare de date pe interfața 2 sau interfața 3.
(6) Adăugați aceleași instanțe de clasă, class_0 și class_1, la cealaltă configurație, cfg_1.
Fiecare clasă definește o structură de tip sl_usbd_XXXX_callbacks_t. Scopul său este de a oferi fiecărei clase un set de funcții callback care să fie apelate la apariția unui eveniment. În fiecare clasă sunt prezente două funcții callback. Acestea sunt prezentate în tabelul de mai jos.
Tabel – Funcții comune de apel invers al clasei
Câmpuri Descriere .enable Apelată când instanța clasei USB este activată cu succes. .disable Apelată când instanța clasei USB este dezactivată.
Semnătura funcției void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
18/174
Pesteview
Pesteview
Dispozitiv USB CDC Clasa ACM
Dispozitiv USB CDC Clasa de bază Pesteview Necesități de resurse ale clasei CDC ACM pentru dispozitive USB din subclasa CDC ACM a dispozitivului USB principalview Configurarea dispozitivului USB CDC ACM Class Ghid de programare a dispozitivului USB CDC ACM Class
Această secțiune descrie clasa Communications Device Class (CDC) și subclasa CDC asociată, suportată de stiva USB Device de la Silicon Labs. Silicon Labs USB-Device acceptă în prezent subclasa Abstract Control Model (ACM), care este utilizată în mod obișnuit pentru emularea serială.
CDC include diverse dispozitive de telecomunicații și rețea. Dispozitivele de telecomunicații includ modemuri analogice, telefoane analogice și digitale, adaptoare de terminal ISDN etc. De exempluampAdică, dispozitivele de rețea conțin modemuri ADSL și prin cablu, adaptoare Ethernet și hub-uri. CDC definește un cadru pentru a încapsula standardele existente pentru servicii de comunicații, cum ar fi V.250 (pentru modemuri prin rețeaua telefonică) și Ethernet (pentru dispozitive de rețea locală), utilizând o legătură USB. Un dispozitiv de comunicații este responsabil de gestionarea dispozitivelor, gestionarea apelurilor atunci când este necesar și transmiterea datelor.
CDC definește șapte grupuri majore de dispozitive. Fiecare grup aparține unui model de comunicare, care poate include mai multe subclase. Fiecare grup de dispozitive are propriul document de specificații pe lângă clasa de bază CDC. Cele șapte grupuri sunt:
Rețea telefonică publică comutată (PSTN), dispozitive inclusiv modemuri cu bandă vocală, telefoane și dispozitive de emulare serială. Dispozitive de rețea digitală cu servicii integrate (ISDN), inclusiv adaptoare de terminal și telefoane. Dispozitive Ethernet Control Model (ECM), inclusiv dispozitive care acceptă familia IEEE 802 (de exemplu: modemuri prin cablu și ADSL, adaptoare WiFi). Dispozitive Asincron Transfer Mode (ATM), inclusiv modemuri ADSL și alte dispozitive conectate la rețele ATM (stații de lucru, routere, switch-uri LAN). Dispozitive Wireless Mobile Communications (WMC), inclusiv dispozitive telefonice multifuncționale utilizate pentru gestionarea comunicațiilor vocale și de date. Dispozitive Ethernet Emulation Model (EEM) care schimbă date încadrate în Ethernet. Dispozitive Network Control Model (NCM), inclusiv dispozitive de rețea de mare viteză (modemuri High Speed Packet Access, echipamente terminale de linie).
CDC și implementarea subclasei asociate respectă următoarele specificații:
Magistrală serială universală, definiții de clase pentru dispozitive de comunicații, revizia 1.2, 3 noiembrie 2010. Magistrală serială universală, comunicații, subclasă pentru dispozitive PSTN, revizia 1.2, 9 februarie 2007.
Dispozitiv USB CDC Clasa de bază Pesteview
Un dispozitiv CDC este compus din următoarele interfețe pentru a implementa capacitatea de comunicare:
Interfața de Clasă de Comunicații (CCI) este responsabilă pentru gestionarea dispozitivelor și, opțional, pentru gestionarea apelurilor.
Gestionarea dispozitivelor permite configurarea și controlul general al dispozitivului și notificarea evenimentelor către gazdă. Gestionarea apelurilor permite stabilirea și terminarea apelurilor. Gestionarea apelurilor poate fi multiplexată printr-un DCI. Un CCI este obligatoriu pentru toate dispozitivele CDC. Acesta identifică funcția CDC prin specificarea modelului de comunicare acceptat de dispozitivul CDC. Interfața (interfețele) care urmează după CCI pot fi orice interfață de clasă USB definită, cum ar fi audio sau o interfață specifică furnizorului. Interfața specifică furnizorului este reprezentată în mod specific de un DCI.
Interfața de clasă de date (DCI) este responsabilă pentru transmiterea datelor. Datele transmise și/sau primite nu respectă un anumit
Datele pot fi date brute de pe o linie de comunicație, date care urmează un format proprietar etc. Toate DCI-urile care urmează CCI pot fi considerate interfețe subordonate.
Un dispozitiv CDC trebuie să aibă cel puțin un CCI și zero sau mai multe DCI-uri. Un CCI și orice DCI subordonat oferă împreună o funcție gazdei. Această capacitate este denumită și funcție. Într-un dispozitiv compozit CDC, ați putea avea mai multe
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
19/174
Pesteview
funcții. Prin urmare, dispozitivul ar fi compus din mai multe seturi de CCI și DCI, așa cum se arată în Figura – Dispozitiv compozit CDC.
Figura – Dispozitiv compozit CDC
Un dispozitiv CDC va utiliza probabil următoarea combinație de puncte finale:
O pereche de puncte finale de control IN și OUT numite punct final implicit. Un punct final opțional de IN în bloc sau întrerupere. O pereche de puncte finale de IN și OUT în bloc sau izocrone. Rețineți că stiva de dispozitive USB Silicon Labs nu acceptă în prezent puncte finale izocrone.
Tabelul de mai jos prezintă utilizarea diferitelor endpoint-uri și interfața CDC prin care sunt utilizate acestea.
Tabel – Utilizarea endpoint-ului CDC
Punct final
Control IN
Control OUT
Întrerupere sau intrare în vrac IN intrare în vrac sau izocron IN intrare în vrac sau izocron
OUT
Direcţie
De la dispozitiv la gazdă
Gazdă-dispozitiv
De la dispozitiv la gazdă
De la dispozitiv la gazdă
Gazdă-dispozitiv
Utilizarea interfeței
CCI
Cereri standard pentru enumerare, cereri specifice clasei, dispozitive
gestionarea apelurilor și, opțional, gestionarea apelurilor.
CCI
Cereri standard pentru enumerare, cereri specifice clasei, dispozitive
gestionarea apelurilor și, opțional, gestionarea apelurilor.
CCI
Notificare evenimente, cum ar fi detectarea soneriei, starea liniei seriale, starea rețelei.
DCI
Comunicare de date brute sau formatate.
DCI
Comunicare de date brute sau formatate.
Majoritatea dispozitivelor de comunicații utilizează un punct final de întrerupere pentru a notifica gazda despre evenimente. Punctele finale izocrone nu ar trebui utilizate pentru transmiterea datelor atunci când un protocol proprietar se bazează pe retransmiterea datelor în cazul erorilor protocolului USB. Comunicarea izocronă poate pierde în mod inerent date, deoarece nu are mecanisme de reîncercare.
Cele șapte modele majore de comunicare cuprind mai multe subclase. O subclasă descrie modul în care dispozitivul ar trebui să utilizeze CCI pentru a gestiona dispozitivul și apelurile. Tabelul de mai jos prezintă toate subclasele posibile și modelul de comunicare căruia îi aparțin.
Tabel – Subclase CDC
Subclasă
Model de control liniar direct Model abstract de control
Model de comunicare
PSTN
PSTN
Exampnumărul de dispozitive care utilizează această subclasă
Dispozitive modem controlate direct de gazda USB
Dispozitive de emulare serială, dispozitive modem controlate printr-un set de comenzi seriale
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
20/174
Pesteview
Subclasă
Model de comunicare
Exampnumărul de dispozitive care utilizează această subclasă
Model de control telefonic
PSTN
Model ISDN cu control multicanal
Model de control CAPI ISDN
Model de control ECM pentru rețele Ethernet
Rețea ATM
ATM
Model de control
Model de control al telecomenzii fără fir
WMC
Gestionare dispozitive WMC
Model de linie directă mobilă
WMC
OBEX
WMC
Model EEM de emulare Ethernet
Modelul de control al rețelei
NCM
Dispozitive de telefonie vocală
Adaptoare terminale cu tarif de bază, adaptoare terminale cu tarif primar, telefoane
Adaptoare terminale cu rată de bază, adaptoare terminale cu rată primară, modemuri de cablu DOC-SIS pentru telefoane, modemuri ADSL care acceptă emularea PPPoE, adaptoare Wi-Fi (familia IEEE 802.11), adaptoare IEEE 802.3, modemuri ADSL
Echipamente terminale mobile care se conectează la dispozitive fără fir
Echipamente terminale mobile care se conectează la dispozitive fără fir Echipamente terminale mobile care se conectează la dispozitive fără fir
Echipamente terminale mobile care se conectează la dispozitive wireless. Dispozitive care utilizează cadre Ethernet ca următor nivel de transport. Nu sunt destinate dispozitivelor de rutare și conectivitate la internet. Adaptoare IEEE 802.3 care transportă lățime de bandă de date de mare viteză în rețea.
Necesități de resurse pentru dispozitive USB CDC ACM din partea nucleului
De fiecare dată când adăugați o instanță a clasei CDC ACM la o configurație USB printr-un apel al funcției sl_usbd_cdc_acm_add_to_configuration(), următoarele resurse vor fi alocate din nucleu.
Resursă
Interfețe Interfețe alternative Puncte finale Grupuri de interfețe
Cantitate
2 2 3 1
Rețineți că aceste numere sunt per configurație. Când configurați valorile de configurare SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY și SL_USBD_DESCRIPTOR_QUANTITY, nu uitați să luați în considerare câte configurații vor fi adăugate la clasă. Pentru valoarea de configurare SL_USBD_OPEN_ENDPOINTS_QUANTITY, deoarece punctele de acces sunt deschise numai atunci când o configurație este setată de gazdă, trebuie doar să luați în considerare numărul de puncte de acces necesare pentru o instanță de clasă.
Subclasa CDC ACM a dispozitivului USB pesteview
Clasa de bază CDC este compusă dintr-o interfață de clasă de comunicare (CCI) și o interfață de clasă de date (DCI), care este discutată în detaliu în secțiunea Clasa de bază CDC pentru dispozitive USB.view Această secțiune prezintă un CCI de tip ACM. Acesta constă dintr-un punct final implicit pentru elementul de gestionare și un punct final de întrerupere pentru elementul de notificare. O pereche de puncte finale în bloc este utilizată pentru a transporta date nespecificate prin DCI.
Subclasa ACM este utilizată de două tipuri de dispozitive de comunicații:
Dispozitive care acceptă comenzi AT (de exemplu, modemuri cu bandă vocală). Dispozitive de emulare serială, numite și dispozitive cu port COM virtual.
Există mai multe cereri specifice subclasei pentru subclasa ACM. Acestea vă permit să controlați și să configurați dispozitivul. Lista completă și descrierea tuturor cererilor ACM pot fi găsite în specificație.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
21/174
Pesteview Subclasă pentru dispozitive PSTN, revizia 1.2, 9 februarie 2007=, secțiunea 6.2.2.
Din această listă, subclasa ACM din Silicon Labs9 acceptă următoarele:
Tabel – Cereri ACM acceptate de Silicon Labs
Descrierea solicitării subclasei
SetCommFeature GetCommFeature ClearCommFeature
Gazda trimite această solicitare pentru a controla setările pentru o anumită funcție de comunicații. Nu este utilizată pentru emularea serială.
Gazda trimite această solicitare pentru a obține setările curente pentru o anumită funcție de comunicații. Nu este utilizată pentru emularea serială.
Gazda trimite această solicitare pentru a șterge setările pentru o anumită funcție de comunicații. Nu este utilizată pentru emularea serială.
SetLineCoding
Gazda trimite această solicitare pentru a configura setările dispozitivului ACM: rata baud, numărul de biți de stop, tipul de paritate și numărul de biți de date. Pentru o emulare serială, această solicitare este trimisă automat de un terminal serial de fiecare dată când configurați setările seriale pentru un port COM virtual deschis.
GetLineCoding
Gazda trimite această solicitare pentru a obține setările ACM curente (rata baud, biți de stop, paritate, biți de date). Pentru o emulare serială, terminalele seriale trimit această solicitare automat în timpul deschiderii portului COM virtual.
SetControlLineState Gazda trimite această cerere pentru a controla purtătoarea pentru modemurile half-duplex și pentru a indica dacă echipamentul terminal de date (DTE) este pregătit sau nu. În cazul emulării seriale, DTE este un terminal serial. Pentru o emulare serială, anumite terminale seriale vă permit să trimiteți această cerere cu controalele setate.
SetBreak
Gazda trimite această cerere pentru a genera o pauză de tip RS-232. Pentru o emulare serială, anumite terminale seriale vă permit să trimiteți această cerere.
Subclasa ACM din Silicon Labs9 folosește punctul final de întrerupere IN pentru a notifica gazda despre starea curentă a liniei seriale. Linia serială
Starea liniei este o hartă de biți care informează gazda despre:
Date eliminate din cauza depășirii erorii de paritate eroare de încadrare Starea detectării semnalului de apel Starea mecanismului de detectare a întreruperii Starea purtătoarei de transmisie Starea detectării purtătoarei receptorului
Implementarea subclasei ACM din Silicon Labs9 respectă următoarele specificații:
Magistrală serială universală, Comunicații, Subclasă pentru dispozitive PSTN, revizia 1.2, 9 februarie 2007.
Configurarea clasei CDC ACM pentru dispozitivul USB
Această secțiune prezintă modul de configurare a clasei CDC ACM (Communication Device Class, Abstract Control Model). Există două grupuri de parametri de configurare:
Configurații specifice aplicației pentru clasa CDC ACM a dispozitivului USB Configurații ale instanței clasei CDC ACM a dispozitivului USB
Configurații specifice aplicației pentru dispozitive USB CDC ACM Class
Subclasa ACM a clasei de bază CDC
Clasa de bază CDC
În primul rând, pentru a utiliza modulul de clasă CDC al dispozitivului USB Silicon Labs, va trebui să ajustați configurația CDC la momentul compilării #define-s în funcție de nevoile aplicației dvs. Acestea sunt regrupate în antetul sl_usbd_core_config.h file în secțiunea CDC. Scopul lor este de a informa modulul dispozitivului USB despre câte obiecte CDC USB să aloce.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
22/174
Pesteview
Tabelul de mai jos descrie fiecare câmp de configurare disponibil în această structură de configurare.
Tabel – Definiții ale configurației CDC pentru dispozitive USB
Nume configurație
SL_USBD_CDC_CL CA CANTITATE_INSTANȚĂ
SL_USBD_CDC_CONF IGURAȚIE_CANTITATE
TY
SL_USBD_CDC_DATA _INTERFACE_QUANTI
TY
Descriere
Numărul de instanțe de clasă pe care le veți aloca printr-un apel al funcției
sl_usbd_cdc_acm_create_instance().
Număr de configurații. Instanțele clasei ACM pot fi adăugate la una sau mai multe configurații aaaa prin intermediul funcției sl_usbd_cdc_acm_add_to_configuration().
Numărul total de interfețe de date (DCI) pentru toate funcțiile CDC. Fiecare funcție CDC ACM adăugată la funcția sl_usbd_cdc_acm_create_instance() va adăuga o interfață de date.
Valoare implicită
2
1
2
Subclasa ACM
Subclasa ACM are o configurație la compilare, așa cum este prezentată în tabelul de mai jos.
Tabel – Definirea configurației CDC ACM a dispozitivului USB
Nume configurație
SL_USBD_CDC_ACM_SUBCL ASS_INSTANCE_QUANTITY
Descriere
Configurează numărul de instanțe ale subclasei pe care le veți aloca printr-un apel către
funcția sl_usbd_cdc_acm_create_instance().
Valoare implicită
2
Configurații ale instanței de clasă CDC ACM pentru dispozitive USB
Această secțiune definește configurațiile legate de instanțele clasei seriale CDC ACM. Crearea instanței de clasă, starea liniei, intervalul de apel, capabilitățile de gestionare a apelurilor, p_acm_callbacks
Crearea instanței de clasă
Pentru a crea o instanță a clasei seriale CDC ACM, apelați funcția Ta sl_usbd_cdc_acm_create_instance(). Această funcție are trei argumente de configurare, așa cum este descris aici.
interval_stare_linie
Acesta este intervalul (în milisecunde) în care instanța clasei seriale CDC ACM va raporta notificările de stare a liniei către gazda T aa. Această valoare trebuie să fie o putere de doi (1, 2, 4, 8, 16 etc.).
capacități_de_gestionare_apeluri
Harta bit a capacităților de gestionare a apelurilor. Valorile posibile ale hărții bit sunt următoarele:
Valoare (bit)
SL_USBD_ACM_SERIAL_CALL_MGMT_DEV
SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI _DCI
Descriere
Dispozitivul se ocupă singur de gestionarea apelurilor. Dispozitivul poate trimite/primi informații despre gestionarea apelurilor printr-o interfață Data Class.
p_acm_callbacks
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
23/174
Pesteview
`p_acm_callbacks` este un pointer către o structură de tip sl_usbd_cdc_acm_callbacks_t. Scopul său este de a oferi CDC AC Clss un set de funcții callback care să fie apelate atunci când apare un eveniment CDC ACM. Nu toate callback-urile sunt obligatorii și un pointer nul (NULL) poate fi transmis în variabila de structură callbacks atunci când callback-ul nu este necesar. Tabelul de mai jos descrie fiecare câmp de configurare disponibil în această structură de configurare.
Tabel – Structura de configurare sl_usbd_cdc_acm _callbacks_t
Câmpuri
Descriere
.permite
Apelată când instanța clasei USB este activată
cu succes.
dezactivare
Apelată când instanța clasei USB este dezactivată.
.line_control_changed Apelată când se primește o modificare de control al liniei.
line_coding_changed Apelată când se primește o modificare a codului de linie.
Semnătura funcției
void app_usbd_cdc_acm_enable(uint8_t subclasa_nbr);
void app_usbd_cdc_acm_disable(uint8_t subclasa_nbr);
void app_usbd_cdc_acm_line_control_changed(uint8_t subclasă_nbr, uint8_t event, uint8_t event_chngd); bool app_usbd_cdc_acm_line_coding_changed(uint8_t subclasă_nbr, subclasă_nbr, sl_usbd_cdc_acm_line_coding_t
*p_line_coding
Consultați secțiunea Înregistrarea apelurilor inverse pentru notificări de evenimente pentru funcțiile de apel invers, de ex.ample.
Ghid de programare pentru dispozitive USB CDC ACM Class
Această secțiune explică modul de utilizare a clasei CDC Abstract Control Model. Inițializarea clasei CDC ACM a dispozitivului USB Adăugarea unei instanțe a clasei CDC ACM a dispozitivului USB la dispozitivul dvs. Comunicarea utilizând clasa CDC ACM
Inițializarea dispozitivului USB CDC ACM Class
Pentru a adăuga funcționalitatea clasei CDC ACM la dispozitivul dvs., trebuie mai întâi să inițializați clasa de bază CDC și subclasa ACM prin executarea funcțiilor sl_usbd_cdc_init() și sl_usbd_cdc_acm_init(). Exemplul de mai jos arată cum se apelează sl_usbd_cdc_init() și sl_usbd_cdc_acm_init() folosind argumente implicite.
Example – Inițializarea clasei CDC ACM
stare sl_status_t;
status = sl_usbd_cdc_init(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Trebuie adăugată gestionarea erorilor aici. */
}
status = sl_usbd_cdc_acm_init(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
Adăugarea unei instanțe de clasă CDC ACM pentru dispozitive USB la dispozitivul dvs.
Pentru a adăuga funcționalitatea clasei CDC ACM pe dispozitivul dvs., trebuie să creați o instanță, apoi să o adăugați la configurația (configurațiile) dispozitivului.
Crearea unei instanțe de clasă CDC ACM
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
24/174
Pesteview
Adăugarea instanței de clasă CDC ACM la configurația(ile) dispozitivului dvs. Înregistrarea apelurilor inverse pentru notificări de evenimente
Crearea unei instanțe de clasă CDC ACM
Creați o instanță de clss CDC AC apelând funcția sl_usbd_cdc_acm_create_instance(). Exemplul de mai jos arată cum se creează o instanță de clss CDC AC prin intermediul funcției sl_usbd_cdc_acm_create_instance().
Example – Crearea unei funcții CDC ACM prin sl_usbd_cdc_acm_create_instance()
uint8_t subclass_nbr; sl_status_t stare;
stare = 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);
dacă (status ! SL_STATUS_OK) { /* A apărut o eroare. Trebuie adăugată aici gestionarea erorilor. */
}
Adăugarea instanței de clasă CDC ACM la configurația(ile) dispozitivului dvs.
După ce ați creat o instanță a clasei CDC ACM, o puteți adăuga la o configurație apelând funcția
sl_usbd_cdc_acm_add_to_configuration().
Exemplul de mai jos arată cum se apelează funcția sl_usbd_cdc_acm_add_to_configuration().
Example – Apel către USBD ACM sl_usbd_cdc_acm_add_to_configuration()
stare sl_status_t;
stare = sl_usbd_cdc_acm_add_to_configuration(număr_subclasă,
(1)
config_nbr_fs);
(2)
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
aaa (1) Numărul clasei ss de adăugat la configurația returnată de sl_usbd_cdc_acm_create_instance(). (2) Numărul configurației (aici se adaugă la o configurație Full-Speed).
Înregistrarea apelurilor inverse pentru notificări de evenimente
Clasa CDC ACM Serial poate notifica aplicația dvs. despre orice modificări ale controlului liniei sau ale codării prin intermediul funcțiilor de apel invers de notificare. O structură a funcțiilor de apel invers poate fi transmisă ca argument în timpul creării instanței ACM. Rețineți că aceste apeluri inverse sunt opționale. Ex.ampDe exemplu, înregistrarea apelurilor inverse CDC ACM ilustrează utilizarea funcțiilor de înregistrare a apelurilor inverse.ampImplementarea apelurilor inverse CDC ACM arată un exempluampimplementarea funcțiilor de callback.
ExampÎnregistrare apeluri inverse CDC ACM
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
25/174
Pesteview
uint8_t subclass_nbr; sl_status_t stare;
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, };
stare = sl_usbd_cdc_acm_create_instance(64u, SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI | SL_USBD_ACM_SERIAL_CALL_MGMT_DEV, &sli_usbd_cdc_acm_callbacks, &subclass_nbr);
dacă (status ! SL_STATUS_OK) { /* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. */ }
ExampImplementarea apelurilor inverse CDC ACM
bool app_usbd_cdc_acm_line_coding_changed (uint8_t
subclasă_nbr,
sl_usbd_cdc_acm_line_coding_t *p_line_coding)
{
uint32_t baudrate_new;
uint8_t paritate_nouă;
uint8_t stop_bits_new;
uint8_t biți_de_date_noi;
/* TODO Se aplică codarea pentru o linie nouă.*/ 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;
return (adevărat);
(1)
}
void app_usbd_cdc_acm_line_control_changed (uint8_t subclasă_nbr, uint8_t eveniment, uint8_t eveniment_modificat)
{ bool rts_state; bool rts_state_changed; bool dtr_state; bool dtr_state_changed; bool brk_state; bool brk_state_changed;
/* TODO Aplică controlul pentru o linie nouă. */ 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) ? adevărat : fals;
}
(1) Este important să se returneze valoarea false pentru această funcție dacă aplicarea codării pe linie a eșuat. În caz contrar, se returnează valoarea true.
Comunicarea utilizând clasa CDC ACM
Stare serială
Codare linie Control linie
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
26/174
Pesteview
Comunicare instanță subclasă stare linie
Stare serială
Codare pe linii
Gazda USB controlează codarea liniei (rata baud, paritatea etc.) a dispozitivului CDC ACM. Atunci când este necesar, aplicația este responsabilă pentru setarea codării liniei. Există două funcții pentru a recupera și seta codarea liniei curentă, așa cum este descris în tabelul de mai jos.
Tabel – Funcții de codare a liniilor CDC ACM
Funcţie
sl_usbd_cdc_acm_g e t_line _co d ing ()
sl_usbd_cdc_acm_s et_line _co d ing ()
Descriere
Aplicația ta poate obține setările curente de codare a liniei fie de la gazdă cu cereri SetLineCoding, fie cu funcția sl_usbd_cdc_acm_set_line_coding().
Aplicația dvs. poate seta codarea liniei. Gazda poate recupera setările cu ajutorul solicitării GetLineCoding.
Control linie
Gazda USB controlează controlul liniei (pinii RTS și DTR, semnalul de întrerupere etc.) ale dispozitivului CDC ACM. Atunci când este necesar, aplicația dvs. este responsabilă de aplicarea controalelor liniei. Este furnizată o funcție pentru a recupera și seta controalele liniei curente, așa cum este descris în tabelul de mai jos.
Tabel – Funcții de control al liniei CDC ACM
Funcţie
sl_usb d _cd c_acm_g e t_line _control_state ()
Aplicația dvs. poate obține starea curentă a liniei de control setată de gazdă cu ajutorul solicitării SetControlLineState.
Stare linie
Gazda USB preia starea liniei la intervale regulate. Aplicația dumneavoastră trebuie să actualizeze starea liniei de fiecare dată când aceasta se modifică. Atunci când este necesar, aplicația dumneavoastră este responsabilă pentru setarea stării liniei. Sunt furnizate două funcții pentru a preia și seta controalele curente ale liniei, așa cum este descris în tabelul de mai jos.
Tabel – Funcții de stare a liniei CDC ACM
Funcţie
sl_usb d _cd c_acm_set _line _state _event()
sl_usbd_cdc_acm_cle ar_line _state _e ve nt()
Aplicația dumneavoastră poate seta orice eveniment de stare a liniei. În timpul setării stării liniei, un transfer de întrerupere IN este trimis către gazdă pentru a o informa despre o modificare a stării liniei seriale.
Aplicația poate șterge două evenimente legate de starea liniei: detectarea purtătoarei de transmisie și detectarea purtătoarei receptorului. Toate celelalte evenimente sunt auto-șterse de subclasa de emulare serială ACM.
Comunicare instanță subclasă
Subclasa ACM de la Silicon Labs oferă următoarele funcții pentru a comunica cu gazda. Pentru mai multe detalii despre parametrii functions9, consultați referința Funcțiilor subclasei ACM de la CDC.
Numele funcției
sl_usb d _cd c_acm_ read () sl_usb d _cd c_acm_write ()
Operațiunea
Primește date de la gazdă printr-un endpoint bulk OUT. Această funcție este blocantă. Trimite date către gazdă printr-un endpoint bulk IN. Această funcție este blocantă.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
27/174
Pesteview
Tabel – Rezumatul API-ului de comunicare CDC ACM aaaaa sl_usbd_cdc_acm_read() și sl_usbd_cdc_acm_write() oferă comunicare sincronă, ceea ce înseamnă că transferul este blocant. Cu alte cuvinte, la apelarea funcției, aplicația se blochează până când transferul este complet, cu sau fără o eroare. Se poate specifica un timeout pentru a evita așteptarea la nesfârșit. ExampMai jos se prezintă un exemplu de citire și scriereampși care primește date de la gazdă folosind endpoint-ul bulk OUT și trimite date către gazdă folosind endpoint-ul bulk IN.
Listare – Ex de citire și scriere serialăample
__ALIGNED(4) uint8_t rx_buf[2];
__ALIGNED(4) uint8_t tx_buf[2];
uint32_t
xfer_len;
sl_status_t
statut;
stare = sl_usbd_cdc_acm_read(număr_subclasă,
(1)
rx_buf,
(2)
2u,
0u,
(3)
&xfer_len);
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
stare = sl_usbd_cdc_acm_write(număr_subclasă,
(1)
tx_buf,
(4)
2u,
0u,
(3)
&xfer_len);
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
(1) Numărul de instanță al clasei creat cu sl_usbd_cdc_acm_create_instance() oferă o referință internă la subclasa AC pentru a ruta transferul către endpoint-ul bulk OUT sau IN corespunzător. (2) Aplicația dumneavoastră trebuie să se asigure că buffer-ul furnizat funcției este suficient de mare pentru a găzdui toate datele. În caz contrar, pot apărea probleme de sincronizare. (3) Pentru a evita o situație de blocare infinită, specificați un timeout exprimat în milisecunde. O valoare de 809 face ca sarcina aplicației să aștepte la nesfârșit. (4) Aplicația furnizează buffer-ul de transmisie inițializat.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
28/174
Pesteview
Pesteview
Dispozitiv USB Clasa HID
Dispozitiv USB HID Class Overview Necesități de resurse pentru clasa HID a dispozitivului USB din partea nucleului Configurarea clasei HID a dispozitivului USB Ghid de programare a clasei HID a dispozitivului USB Sarcină Rapoarte periodice de intrare HID
Această secțiune descrie clasa de dispozitive cu interfață umană (HID) acceptată de dispozitivele USB Silicon Labs.
Clasa HID cuprinde dispozitive utilizate de oameni pentru a controla operațiunile computerului, cum ar fi tastaturi, mouse-uri, dispozitive de indicare și dispozitive de jocuri.
Clasa HID poate fi utilizată și într-un dispozitiv compozit care conține comenzi precum butoane, comutatoare, butoane și cursoare. De exempluampComenzile de dezactivare a sunetului și de volum dintr-o cască audio sunt controlate de funcția HID a căștilor. Clasa HID poate face schimb de date în orice scop folosind doar transferuri de control și întrerupere.
Clasa HID este una dintre cele mai vechi și mai utilizate clase USB. Toate sistemele de operare gazdă majore oferă un driver nativ pentru gestionarea dispozitivelor HID, motiv pentru care o varietate de dispozitive specifice furnizorului funcționează cu clasa HID. Această clasă include, de asemenea, diverse tipuri de elemente de ieșire, cum ar fi LED-uri, audio, feedback tactil etc.
Implementarea HID respectă următoarele specificații:
Definiția clasei de dispozitive pentru dispozitive cu interfață umană (HID), 27.06.2001, versiunea 1.11. Tabele de utilizare HID pe magistrala serială universală, 28.10.2004, versiunea 1.12.
Dispozitiv USB HID Class Overview
Pesteview
Un dispozitiv HID este compus din următoarele puncte finale:
O pereche de puncte finale de control IN și OUT numite punct final implicit Un punct final de întrerupere IN Un punct final de întrerupere opțional OUT
Tabelul de mai jos descrie utilizarea diferitelor puncte finale:
Tabel – Utilizarea endpointurilor clasei HID
Utilizarea direcției punctului final
Control IN
Controla
OUT
Întrerupere IN
Întrerupe
OUT
De la dispozitiv la gazdă
Gazdă-dispozitiv
De la dispozitiv la gazdă
Gazdă-dispozitiv
Cereri standard pentru enumerare, cereri specifice clasei și comunicare de date (Intrare, rapoarte de caracteristici trimise către gazdă cu solicitarea GET_REPORT). Cereri standard pentru enumerare, cereri specifice clasei și comunicare de date (Ieșire, rapoarte de caracteristici primite de la gazdă cu solicitarea SET_REPORT). Comunicare de date (Intrare și rapoarte de caracteristici).
Comunicare de date (rapoarte de ieșire și caracteristici).
Raport
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
29/174
Pesteview
O gazdă și un dispozitiv HID fac schimb de date folosind rapoarte. Un raport conține date formatate care oferă informații despre comenzi și alte entități fizice ale dispozitivului HID. Un control poate fi manipulat de utilizator și operează un aspect al dispozitivului. De exempluampDe exemplu, un control poate fi un buton de pe un mouse sau o tastatură, un comutator etc. Alte entități informează utilizatorul despre starea anumitor caracteristici ale dispozitivului. De exempluampDe exemplu, LED-urile de pe o tastatură notifică utilizatorul despre activarea tastei majuscule, activarea tastaturii numerice etc.
Formatul și utilizarea datelor unui raport sunt înțelese de către gazdă prin analizarea conținutului unui descriptor de raport. Analiza conținutului se face de către un parser. Descriptorul de raport descrie datele furnizate de fiecare control dintr-un dispozitiv. Acesta este compus din elemente care sunt informații despre dispozitiv și constau dintr-un prefix de 1 octet și o lungime variabilă.
date. Pentru mai multe detalii despre formatul articolului, consultați
1.11=, secțiunea 5.6 și 6.2.2.
Există trei tipuri principale de articole:
Elementul principal definește sau grupează anumite tipuri de câmpuri de date.
Elementul global descrie caracteristicile datelor unui control.
Elementul local descrie caracteristicile datelor unui control.
Fiecare tip de element este definit de funcții diferite. O funcție de element poate fi numită și tagO funcție de element poate fi văzută ca un subelement care aparține unuia dintre cele trei tipuri principale de elemente. Tabelul de mai jos oferă o scurtă trecere în revistă.view funcțiilor elementului9 din fiecare tip de element. Pentru o descriere completă a elementelor din fiecare categorie, consultați
Tabel – Descrierea funcției elementului pentru fiecare tip de element
Tip de articol Funcție
Descriere
Intrare principală
Descrie informații despre datele furnizate de unul sau mai multe controale fizice.
Ieșirea principală Descrie datele trimise către dispozitiv.
Caracteristica principală
Descrie informațiile de configurare a dispozitivului trimise către sau primite de la dispozitiv, care influențează comportamentul general al dispozitivului sau al uneia dintre componentele sale.
Elemente legate de grupul principal de colecții (intrare, ieșire sau caracteristică).
Capătul principal al Închide o colecție. Colecție
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
30/174
Pesteview
Tip de articol Funcție
Descriere
Pagina de utilizare globală
Identifică o funcție disponibilă în cadrul dispozitivului.
Global Logic Definește limita inferioară a valorilor raportate în unități logice. Minim
Global Logic Definește limita superioară a valorilor raportate în unități logice. Maxim
Global Physical Definește limita inferioară a valorilor raportate în unități fizice, adică Minimul Logic exprimat în unități fizice.
Global Physical Definește limita superioară a valorilor raportate în unități fizice, adică Maximul Logic Maxim exprimat în unități fizice.
Unitate globală
Indică exponentul unității în baza 10. Exponentul variază de la -8 la +7.
Exponent
Unitate globală
Indică unitatea de măsură a valorilor raportate. De exemplu, unități de măsură pentru lungime, masă, temperatură etc.
Dimensiunea raportului global
Indică dimensiunea câmpurilor raportului în biți.
ID raport global Indică prefixul adăugat unui anumit raport.
Număr global de rapoarte
Indică numărul de câmpuri de date pentru un element.
Împingere globală
Plasează o copie a tabelului global de stare a elementelor pe stiva CPU.
Pop global
Înlocuiește tabelul de stări al elementelor cu ultima structură din stivă.
Utilizare locală
Reprezintă un index pentru a desemna o anumită utilizare în cadrul unei pagini de utilizare. Indică utilizarea sugerată de furnizor pentru un anumit control sau grup de controale. O utilizare furnizează informații unui dezvoltator de aplicații despre ceea ce măsoară de fapt un control.
Utilizare locală
Definește utilizarea inițială asociată cu o matrice sau o imagine bitmap.
Minim
Utilizare locală
Definește utilizarea finală asociată cu o matrice sau o matrice de bitmap.
Maxim
Indicator local Determină partea corpului utilizată pentru un control. Indexul indică un indicator din mediul fizic
Index
descriptor.
Indicator local Definește indexul indicatorului inițial asociat cu o matrice sau o hartă de bit. Minim
Indicator local Definește indexul indicatorului final asociat cu o matrice sau o hartă de bit. Maxim
Indexul șirurilor locale
Index de șir pentru un descriptor String. Acesta permite asocierea unui șir cu un anumit element sau control.
Șir local
Specifică primul index de șir atunci când se atribuie un grup de șiruri secvențiale controalelor dintr-o matrice
Minim sau bitmap.
Local Local
Maxim șir
Delimitator
Specifică indexul ultimului șir de caractere atunci când se atribuie un grup de șiruri secvențiale controalelor dintr-o matrice sau o hartă de bit.
Definește începutul sau sfârșitul unui set de elemente locale.
Datele unui control trebuie să definească cel puțin următoarele elemente:
Intrare, Ieșire sau Caracteristică Elemente principale Utilizare Element local Utilizare Pagină Element global Minim logic Element global Maxim logic Element global Dimensiune raport Element global
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
31/174
Pesteview
Element global Număr raport Tabelul de mai jos prezintă reprezentarea conținutului unui descriptor de raport Mouse din perspectiva unui parser HID gazdă. Mouse-ul are trei butoane (stânga, dreapta și rotița). Codul prezentat în exemplulampMai jos este o implementare de cod corespunzătoare acestei reprezentări a descriptorului Report pentru mouse.
Figura – Raportează conținutul descriptorului dintr-un parser HID gazdă View
(1) Funcția elementului Pagină de utilizare specifică funcția generală a dispozitivului. În acest exempluampadică, dispozitivul HID aparține unui
control generic pe desktop.
(2) Colecția Aplicație grupează elementele principale care au un scop comun și pot fi familiare aplicațiilor. În diagramă, grupul este compus din trei elemente principale de intrare. Pentru această colecție, utilizarea sugerată pentru controale este un mouse, așa cum este indicat de elementul Utilizare. (3) Colecțiile imbricate pot fi utilizate pentru a oferi mai multe detalii despre utilizarea unui singur control sau a unui grup de controale în aplicații. În acest exempluampAdică, elementul fizic al colecției, integrat în aplicația de colecție, este compus din aceleași trei elemente de intrare care formează aplicația de colecție. Elementul fizic al colecției este utilizat pentru un set de elemente de date care reprezintă puncte de date colectate într-un punct geometric. În exemplulampDe exemplu, utilizarea sugerată este un indicator, așa cum este indicat de elementul Utilizare. Aici, utilizarea indicatorului se referă la coordonatele poziției mouse-ului, iar software-ul sistemului va traduce coordonatele mouse-ului în mișcarea cursorului de pe ecran. (4) Sunt posibile și pagini de utilizare imbricate, care oferă mai multe detalii despre un anumit aspect din cadrul funcției generale a dispozitivului. În acest caz, două elemente de Intrări sunt grupate și corespund butoanelor mouse-ului. Un element de Intrare definește cele trei butoane ale mouse-ului (dreapta, stânga și rotița) în ceea ce privește numărul de câmpuri de date pentru element (elementul Număr raport), dimensiunea unui câmp de date (elementul Dimensiune raport) și valorile posibile pentru fiecare câmp de date (elementele Utilizare minimă și maximă, Minim logic și Maxim). Celălalt element de Intrare este o constantă pe 13 biți care permite alinierea datelor raportului de intrare la o limită de octeți. Acest element de Intrare este utilizat doar în scopul umpluturii. (5) O altă pagină de utilizare imbricată care se referă la un control generic al desktopului este definită pentru coordonatele poziției mouse-ului. Pentru această pagină de utilizare, elementul de Intrare descrie câmpurile de date corespunzătoare axelor x și y, așa cum sunt specificate de cele două elemente de Utilizare.
articole.
După analizarea conținutului anterior al descriptorului Raport al mouse-ului, parserul HID al gazdei este capabil să interpreteze datele raportului de intrare trimise de dispozitiv printr-un transfer de întrerupere IN sau ca răspuns la o cerere GET_REPORT. Datele raportului de intrare corespunzătoare descriptorului Raport al mouse-ului sunt prezentate în Figura – Conținutul descriptorului raportului de la un parser HID al gazdei View is
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
32/174
Pesteview
așa cum se arată în tabelul de mai jos. Dimensiunea totală a datelor raportului este de 4 octeți. Diferite tipuri de rapoarte pot fi trimise prin același punct final. Pentru a distinge diferitele tipuri de rapoarte, la raportul de date se adaugă un prefix de ID de raport de 1 octet. Dacă în exemplulampÎn raportul mouse-ului, dimensiunea totală a datelor raportului ar fi de 5 octeți.
Tabel – Raport de intrare trimis către gazdă și corespunzător stării unui mouse cu 3 butoane
Bit Offset
0 1 2 3 16 24
Număr de biți 1 1 1 13 8 8
Descriere Buton 1 (buton stâng). Buton 2 (buton dreapta). Buton 3 (buton rotiță). Neutilizat. Poziție pe axa X. Poziție pe axa Y.
Un descriptor fizic indică partea sau părțile corpului destinate activării unui control sau a unor controale. O aplicație poate utiliza aceste informații pentru a atribui o funcționalitate controlului unui dispozitiv. Un descriptor fizic este un descriptor opțional specific clasei, iar majoritatea dispozitivelor au un câștig redus prin utilizarea sa. Consultați
Necesități de resurse pentru dispozitive USB din clasa HID din partea nucleului
De fiecare dată când adăugați o instanță a clasei HID la o configurație USB printr-un apel al funcției sl_usbd_hid_add_to_configuration(), următoarele resurse vor fi alocate din nucleu.
Resursă
Interfețe Interfețe alternative Puncte finale Grupuri de interfețe
Cantitate
1 1 1 (2 dacă punctul final de ieșire al întreruperii este activat) 0
Rețineți că aceste numere sunt per configurație. Când configurați valorile de configurare SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY și SL_USBD_DESCRIPTOR_QUANTITY, nu uitați să luați în considerare câte configurații vor fi adăugate la clasă. Pentru valoarea de configurare SL_USBD_OPEN_ENDPOINTS_QUANTITY, deoarece punctele de acces sunt deschise numai atunci când o configurație este setată de gazdă, trebuie doar să luați în considerare numărul de puncte de acces necesare pentru o instanță de clasă.
Configurarea clasei HID a dispozitivului USB
Două grupuri de parametri de configurare sunt utilizate pentru a configura clasa HID:
Configurații specifice aplicației pentru clasa HID a dispozitivului USB Configurații ale instanței clasei HID a dispozitivului USB
Configurații specifice aplicației din clasa HID pentru dispozitive USB
Mai întâi, pentru a utiliza modulul de clasă HID pentru dispozitive USB din Silicon Labs, ajustați configurația HID la compilare în funcție de nevoile aplicației dumneavoastră. Acestea sunt regrupate în antetul sl_usbd_core_config.h. file în secțiunea HID. Acestea pot fi împărțite în două secțiuni, configurațiile cantitative și configurațiile sarcinilor HID. Scopul configurațiilor cantitative este de a informa modulul dispozitivului USB despre câte obiecte USB HID să aloce.
Tabelul de mai jos descrie fiecare definiție de configurație.
Tabel – Definiții de configurare HID pentru dispozitive USB
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
33/174
Pesteview
Nume configurație
SL_USBD_HID_CL ASS_INSTANCE_QUANTITY
SL_USBD_HID_CONFIGURAȚIE_CANTITATE
SL_USBD_HID_REPORT_ID_CANTITATE
SL_USBD_HID_PUSH_P OP_ITEM_QUANTITY
SL_USBD_HID_TIMER_T ASK_STACK_SIZE
SL_USBD_HID_TIMER_T ASK_PRIORITY
Descriere
Numărul de instanțe de clasă pe care le veți aloca printr-un apel al funcției
sl_usbd_hid_create_instance().
Număr de configurații. Instanțele clasei HID pot fi adăugate la una sau mai multe configurații aaaa prin intermediul funcției sl_usbd_hid_add_to_configuration(). Configurează numărul total de ID-uri de raport care vor fi alocate.
Configurează numărul total de elemente Push/Pop care vor fi alocate.
Sarcina temporizator gestionează toate operațiunile HID bazate pe temporizator. Această configurație vă permite să setați dimensiunea stivei (în număr de octeți). Prioritatea sarcinii HID. Aceasta este o prioritate CMSIS-RTOS2.
Valoare implicită
2 1 2 0 2048
Prioritate ridicată a sistemului de operare
Configurații instanță clasă HID dispozitiv USB subclasă creare instanță clasă
codul_țarei_protocolului
interval_in și interval_out p_hid_callback Descriptor de raport de clasă HID ExampAceastă secțiune definește configurațiile legate de instanțele clasei HID.
Crearea instanței de clasă
Crearea unei instanțe de clasă HID se face prin apelarea funcției `aaa sl_usbd_hid_create_instance(), care generează mai multe argumente de configurare descrise mai jos.
subclasă
Codul subclasei HID. Valorile posibile sunt:
SL_USBD_HID_SUBCL ASS_NONE SL_USBD_HID_SUBCL ASS_BOOT
Un dispozitiv HID care utilizează subclasa de boot trebuie să utilizeze formate standard de raportare. Pentru mai multe informații despre codurile subclasei, consultați secțiunea 4.2 din specificația HID revizia 1.11.
protocol
Protocol utilizat de dispozitivul HID. Valorile posibile sunt:
SL_USBD_HID_PROTOCOL_NONE SL_USBD_HID_PROTOCOL_KBD SL_USBD_HID_PROTOCOL_MOUSE
Dacă funcția HID este un mouse, protocolul ar trebui setat la SL_USBD_HID_PROTOCOL_MOUSE. Dacă este o tastatură, ar trebui setat la SL_USBD_HID_PROTOCOL_KBD. În caz contrar, protocolul ar trebui setat la SL_USBD_HID_PROTOCOL_NONE. Pentru mai multe informații despre codurile subclasei, consultați secțiunea 4.3 din revizia 1.11 a specificației HID.
cod_țară
ID-ul codului țării. Valorile posibile sunt:
SL_USBD_HID_COD_ȚARĂ_NU_SUPORTAT
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
34/174
Pesteview
SL_USBD_HID_COD_ȚARĂ_ARABĂ SL_USBD_HID_COD_ȚARĂ_BELGIE SL_USBD_HID_COD_ȚARĂ_CANADIANĂ_BILINGVĂ SL_USBD_HID_COD_ȚARĂ_CANADIANĂ_FRENCHĂ SL_USBD_HID_COD_ȚARĂ_REPUBLICA CEHĂ SL_USBD_HID_COD_ȚARĂ_DANEZĂ SL_USBD_HID_COD_ȚARĂ_FINLANDEZĂ SL_USBD_HID_COD_ȚARĂ_FRANCĂ SL_USBD_HID_COD_ȚARĂ_GERMANĂ SL_USBD_HID_COD_ȚARĂ_GRECĂ SL_USBD_HID_COD_ȚARĂ_EBRARĂ SL_USBD_HID_COD_ȚARĂ_UNGARIE SL_USBD_HID_COD_ȚARĂ_INTERNAȚIONALĂ SL_USBD_HID_COD_ȚARĂ_ITALIANĂ SL_USBD_HID_COD_ȚARĂ_JAPONIA_KATAKANA SL_USBD_HID_COD_ȚARĂ_COREEANĂ SL_USBD_HID_COD_ȚARĂ_LATINĂ AMERICANĂ SL_USBD_HID_COD_ȚARĂ_NETHERLANDEZĂ ȘI OLANDEZĂ SL_USBD_HID_COD_ȚARĂ_NORVEGIANĂ SL_USBD_HID_COD_ȚARĂ_PERSANĂ_FARSI SL_USBD_HID_COD_ȚARĂ_POLONIA ȘI SL_USBD_HID_COD_ȚARĂ_PORTUGEZĂ SL_USBD_HID_COD_ȚARĂ_RUSIA SL_USBD_HID_COD_ȚARĂ_SLOVACIA SL_USBD_HID_COD_ȚARĂ_SPANIOLĂ SL_USBD_HID_COD_ȚARĂ_SUEDEZĂ SL_USBD_HID_COD_ȚARĂ_ELVEȚIANĂ_FRANCĂ SL_USBD_HID_COD_ȚARĂ_ELVEȚIA_GERMANĂ SL_USBD_HID_COD_ȚARĂ_ELVEȚIA ȘI SL_USBD_HID_COD_ȚARĂ_TAIWAN SL_USBD_HID_COD_ȚARĂ_TURCĂ_Q SL_USBD_HID_COD_ȚARĂ_UK SL_USBD_HID_COD_ȚARĂ_SUA SL_USBD_HID_COD_ȚARĂ_YUG OSL AVIA SL_USBD_HID_COD_ȚARĂ_TURCĂ_F
Codul țării identifică țara pentru care este localizat hardware-ul. Majoritatea hardware-ului nu este localizat și, prin urmare, această valoare ar fi SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). Cu toate acestea, tastaturile pot utiliza câmpul pentru a indica limba majusculelor tastelor.
Pentru mai multe informații despre codurile de țară, consultați secțiunea 6.2.1 din specificația HID revizia 1.11.
interval_in și interval_out
interval_in și interval_out reprezintă intervalul de interogare al punctului final de întrerupere IN și al punctului final de întrerupere OUT.
Aceasta reprezintă intervalul de interogare al punctului final, în milisecunde. Setarea acestei valori depinde de frecvența cu care dispozitivul dvs. este susceptibil să genereze un raport nou pentru gazdă. De exemplu, dacă un raport este generat la fiecare 16 milisecunde, intervalul ar trebui să fie de 16 sau mai puțin.
Valoarea trebuie să fie o putere a lui 2 (1, 2, 4, 8, 16 etc.).
O valoare pentru interval_out este ignorată dacă ctrl_rd_en este setată la true.
p_hid_callback
aaaa p_hid_callback este un pointer către o structură de tip sl_usbd_hid_callbacks_t. Scopul său este de a oferi clasei HID un set de funcții callback care să fie apelate atunci când apare un eveniment HID.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
35/174
Pesteview
Nu toate apelurile inverse sunt obligatorii și un pointer nul (NULL) poate fi transmis în variabila de structură a apelurilor inverse atunci când apelul invers nu este necesar. Tabelul de mai jos descrie fiecare câmp de configurare disponibil în această structură de configurare.
Tabel – Structura de configurare sl_usbd_hid_callbacks_t
Câmpuri
Descriere
Semnătura funcției
.activare .dezactivare .obține_descriere_raport
.get_phy_desc
.set_output_report .get_feature_report .set_feature_report
Apelată când instanța clasei USB este activată cu succes. Apelată când instanța clasei USB este dezactivată.
Apelată în timpul creării instanței HID pentru a transmite descriptorul raportului. Pentru fiecare dintre funcțiile HID, trebuie să furnizați un descriptor de raport. Descriptorul raportului indică gazdei modul în care ar trebui analizat raportul periodic care va fi trimis de dispozitiv. Scrierea propriului descriptor de raport poate fi dificilă și de aceea există câteva resurse care vă pot ajuta. Aceasta este singura funcție de apel invers obligatorie. Apelată în timpul creării instanței HID pentru a transmite descriptorul fizic. Descriptorul fizic este un descriptor care oferă informații despre partea sau părțile specifice ale corpului uman care activează unul sau mai multe controluri. Pentru mai multe informații despre descriptorii fizici, consultați secțiunea 6.2.3 din specificația HID revizia 1.11. Descriptorul fizic este opțional și, de cele mai multe ori, ignorat. Bufferul transmis aici poate fi setat la NULL, iar lungimea setată la 0. Apelată atunci când gazda setează un raport așa cum este descris în descriptorul raportului (când trimite un raport).
Apelat atunci când gazda solicită un raport de caracteristici așa cum este descris în descriptorul raportului.
Apelat atunci când gazda setează un raport de caracteristici așa cum este descris în descriptorul raportului.
void app_usbd_hid_enable(uint8_t număr_clasă); void app_usbd_hid_disable(uint8_t număr_clasă); void app_usbd_hid_get_report_desc(uint8_t număr_clasă, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_get_phy_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_set_output_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len); void app_usbd_hid_get_feature_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len); void app_usbd_hid_set_feature_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len);
.get_protocol
Preia protocolul activ curent.
void app_usbd_hid_get_protocol(uint8_t număr_clasă, uint8_t *p_protocol);
.set_protocol
Setează protocolul activ curent.
void app_usbd_hid_set_protocol(uint8_t class_nbr, uint8_t protocol);
Descriptor de raport de clasă HID Example
Clasa HID de la Silicon LabsampAplicația oferă un exempluampexemplul unui descriptor de raport pentru un mouse simplu. ExemplulampImaginea de mai jos prezintă un descriptor de raport pentru mouse.
Example – Descriptor de raport mouse
static 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)
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
36/174
Pesteview
SL_USBD_HID_MAIN_COLLECTION +1, SL_USBD_HID_COLLECTION_APPLICATION,(4)
SL_USBD_HID_LOCAL_USAGE +1, SL_USBD_HID_CP_POINTER,(5)
SL_USBD_HID_MAIN_COLLECTION +1, SL_USBD_HID_COLLECTION_PHYSICAL,(6)
SL_USBD_HID_GLOBAL_USAGE_PAGE +1, SL_USBD_HID_USAGE_PAGE_BUTTON,(7)
SL_USBD_HID_LOCAL_USAGE_MIN +1,0 01,
SL_USBD_HID_LOCAL_USAGE_MAX +1,0 03,
SL_USBD_HID_GLOBAL_LOG_MIN +1,0 00,
SL_USBD_HID_GLOBAL_LOG_MAX +1,0 01,
SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 03,
SL_USBD_HID_GLOBAL_REPORT_SIZE +1,0 01,
SL_USBD_HID_MAIN_INPUT +1, SL_USBD_HID_MAIN_DATA |
SL_USBD_HID_MAIN_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_MAIN_INPUT +1, SL_USBD_HID_MAIN_DATA |
SL_USBD_HID_MAIN_VARIABLE |
SL_USBD_HID_MAIN_RELATIVE,
SL_USBD_HID_MAIN_ENDCOLLECTION,(10)
SL_USBD_HID_MAIN_ENDCOLLECTION
(11)};
(1) Tabelul care reprezintă un descriptor de raport al mouse-ului este inițializat astfel încât fiecare linie să corespundă unui element scurt. Acesta din urmă este format dintr-un prefix de 1 octet și o dată de 1 octet. Consultați vieweditat de un parser HID gazdă în Figura – Raportarea conținutului descriptorului de la un parser HID gazdă View.
(2) Se utilizează pagina generică de utilizare a desktopului.
(3) În pagina de utilizare generică a desktopului, utilizarea tag sugerează că grupul de controale este destinat controlării unui mouse. O colecție de mouse constă de obicei din două axe (X și Y) și unul, două sau trei butoane.
(4) Colectarea șoarecilor a început.
(5) În cadrul colecției de șoareci, o utilizare tag sugerează mai precis că elementele de control ale mouse-ului aparțin colecției de pointeri. O colecție de pointeri este o colecție de axe care generează o valoare pentru a direcționa, indica sau indica intențiile utilizatorului către o aplicație.
(6) Colectarea pointerilor este pornită.
(7) Pagina de Utilizare a Butonilor definește un element de intrare compus din trei câmpuri de 1 bit. Fiecare câmp de 1 bit reprezintă butoanele 1, 2 și respectiv 3 ale mouse-ului și poate returna o valoare de 0 sau 1.
(8) Elementul de intrare pentru pagina de utilizare a butoanelor este completat cu alți 13 biți.
(9) O altă pagină generică de utilizare a desktopului este indicată pentru descrierea poziției mouse-ului cu axele X și Y. Elementul de intrare este compus din două câmpuri de 8 biți a căror valoare poate fi între -127 și 127.
(10) Colecția de pointeri este închisă.
(11) Colecția de șoareci este închisă.
Pagina HID USB.org
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
37/174
Pesteview
Forumul Implementatorilor USB (USB-IF) oferă un instrument numit „HID Descriptor Tool”, împreună cu alte informații despre formatul descriptorului raportului. Pentru mai multe informații, consultați http://www.usb.org/developers/hidpage/.
Ghid de programare pentru dispozitive USB din clasa HID
Această secțiune explică modul de utilizare a clasei HID. Inițializarea clasei HID a dispozitivului USB Adăugarea unei instanțe a clasei HID a dispozitivului USB la dispozitivul dvs. Comunicarea utilizând clasa HID a dispozitivului USB
Inițializarea clasei HID a dispozitivului USB
Pentru a adăuga funcționalitatea clasei HID la dispozitivul dvs., trebuie mai întâi să inițializați clasa apelând funcția sl_usbd_hid_init(). ExampMai jos se arată cum se apelează sl_usbd_hid_init() folosind argumente implicite. Pentru mai multe informații despre argumentele de configurare care trebuie transmise către sl_usbd_hid_init(), consultați Configurații specifice aplicației clasei HID pentru dispozitive USB.
Example – Apelarea funcției sl_usbd_hid_init()
stare sl_status_t;
status = sl_usbd_hid_init(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Trebuie adăugată gestionarea erorilor aici. */
}
Adăugarea unei instanțe de clasă HID pentru dispozitive USB la dispozitivul dvs.
Pentru a adăuga funcționalitatea clasei HID la dispozitivul dvs., trebuie să creați o instanță, apoi să o adăugați la configurația (configurațiile) dispozitivului.
Crearea unei instanțe de clasă HID
Creați o instanță a clasei HID apelând funcția sl_usbd_hid_create_instance(). ExampMai jos se arată cum se creează o funcție simplă de mouse prin intermediul comenzii sl_usbd_hid_create_instance() folosind argumente implicite. Pentru mai multe informații despre argumentele de configurare care trebuie transmise către sl_usbd_hid_create_instance(), consultați Configurații ale instanței de clasă HID pentru dispozitive USB.
Example – Adăugarea unei funcții mouse prin sl_usbd_hid_create_instance()
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
38/174
Pesteview
/* Constante globale. */ 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, 0 01, SL_USBD_HID_GLOBAL_REPORT_SIZE + 1, 0 0D, SL_USBD_HID_MAIN_INPUT + 1, SL_USBD_HID_MAIN_CONSTANT, SL_USBD_HID_GLOBAL_USAGE_PAGE + 1, SL_USBD_HID_USAGE_PAGE_GENERIC_DESKTOP_CONTROLS, SL_USBD_HID_LOCAL_USAGE + 1, SL_USBD_HID_DV_X, SL_USBD_HID_LOCAL_USAGE + 1, SL_USBD_HID_DV_Y, SL_USBD_HID_GLOBAL_LOG_MIN + 1, 0 81, SL_USBD_HID_GLOBAL_LOG_MAX + 1, 0 7F, SL_USBD_HID_GLOBAL_REPORT_SIZE + 1, 0 08, SL_USBD_HID_GLOBAL_REPORT_COUNT + 1, 0 02, SL_USBD_HID_MAIN_INPUT + 1, SL_USBD_HID_MAIN_DATA | SL_USBD_HID_MAIN_VARIABLE | SL_USBD_HID_MAIN_RELATIVE, SL_USBD_HID_MAIN_ENDCOLLECTION, SL_USBD_HID_MAIN_ENDCOLLECTION };
/* Variabile locale.*/ uint8_t class_nbr; sl_status_t status;
sl_usbd_hid_callbacks_t app_usbd_hid_callbacks = { NULL, NULL, app_usbd_hid_get_report_desc, NULL, NULL, NULL, NULL, NULL, NULL };
void app_usbd_hid_get_report_desc(uint8_t număr_clasă, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (void)număr_clasă;
*p_report_ptr = app_usbd_hid_mouse_report_desc; *p_report_len = sizeof(app_usbd_hid_mouse_report_desc); }
stare = sl_usbd_hid_create_instance(SL_USBD_HID_SUBCLASS_BOOT, SL_USBD_HID_PROTOCOL_MOUSE, SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED, Ex_USBD_HID_Mouse_ReportDesc, sizeof(Ex_USBD_HID_Mouse_ReportDesc), 2u, 2u, true, &app_usbd_hid_callbacks, &class_nbr);
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
39/174
Pesteview
/* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. *
Adăugarea instanței clasei HID la configurația(ile) dispozitivului După ce ați creat o instanță a clasei HID, o puteți adăuga la o configurație apelând funcția
sl_usbd_hid_add_to_configuration().
ExampImaginea de mai jos arată cum se apelează funcția sl_usbd_hid_add_to_configuration().
Example – Apelarea funcției sl_usbd_hid_add_to_configuration()
stare sl_status_t;
sl_usbd_hid_add_to_configuration(class_nbr,
(1)
config_nbr_fs); (2)
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
(1) Numărul clasei de adăugat la configurația returnată de sl_usbd_hid_create_instance(). (2) Numărul configurației (aici se adaugă la o configurație Full-Speed).
Comunicarea utilizând clasa HID pentru dispozitive USB
Comunicare între instanțe de clasă Comunicare sincronă Comunicare între instanțe de clasă Clasa HID oferă următoarele funcții pentru a comunica cu gazda.
Tabel – Rezumatul API-ului de comunicare HID
Numele funcției
sl_usb d _hid _ read _sy nc() sl_usb d _hid _write _sy nc()
Operațiune Primește date de la gazdă prin punctul final al întreruperii OUT. Această funcție este blocantă. Trimite date către gazdă prin punctul final al întreruperii IN. Această funcție este blocantă.
Comunicare sincronă. Comunicarea sincronă înseamnă că transferul este blocant. La apelul funcției, aplicația se blochează până când transferul este finalizat, cu sau fără o eroare. Se poate specifica un timeout pentru a evita așteptarea la nesfârșit.ampImaginea de mai jos prezintă o interfață de citire și scriere care primește date de la gazdă folosind punctul final de întrerupere OUT și trimite date către gazdă folosind punctul final de întrerupere IN.
ExampCitire și scriere HID sincronă
__ALIGNED(4) uint8_t rx_buf[2];
__ALIGNED(4) uint8_t tx_buf[2];
uint32_t
xfer_len;
sl_status_t
statut;
stare = sl_usbd_hid_read_sync(class_nbr,
(1)
(void *)rx_buf,
(2)
2u,
0u,
(3)
&xfer_len);
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
40/174
Pesteview
status =sl_usbd_hid_read_sync(class_nbr,(1)(void *)rx_buf,(2)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. *
status =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. *
(1) Numărul instanței clasei create din sl_usbd_hid_create_instance() oferă o referință internă pentru clasa HID pentru a ruta transferul către punctul final de întrerupere OUT sau IN corespunzător.
(2) Aplicația trebuie să se asigure că buffer-ul furnizat funcției este suficient de mare pentru a găzdui toate datele. În caz contrar, pot apărea probleme de sincronizare. Intern, operațiunea de citire se face fie cu endpoint-ul de control, fie cu endpoint-ul de întrerupere, în funcție de flag-ul de citire de control setat la apelarea funcției sl_usbd_hid_create_instance().
(3) Pentru a evita o situație de blocare infinită, se poate specifica un timeout exprimat în milisecunde. O valoare de 809 face ca sarcina aplicației să aștepte la nesfârșit.
(4) Aplicația furnizează bufferul de transmisie inițializat.
Sarcina Rapoarte Periodice de Intrare HID
Pentru a economisi lățime de bandă, gazda are capacitatea de a dezactiva rapoartele de la un punct final de intrare cu întrerupere prin limitarea frecvenței de raportare. Pentru a face acest lucru, gazda trebuie să trimită solicitarea SET_IDLE. Clasa HID implementată de Silicon Labs conține o sarcină internă care respectă limitarea frecvenței de raportare pe care o puteți aplica unuia sau mai multor rapoarte de intrare. Figura Task Rapoarte Periodice de Intrare prezintă funcționarea task-urilor rapoartelor periodice de intrare.
Figura – Sarcina Rapoartelor de Introducere Periodice
(1) Dispozitivul primește o solicitare SET_IDLE. Această solicitare specifică o durată de inactivitate pentru un anumit ID de raport. Pentru mai multe detalii despre solicitarea SET_IDLE, consultați
(2) O structură de ID raport (alocată în timpul fazei de inițializare a clasei HID) este actualizată cu durata de inactivitate. Un contor de durată de inactivitate este inițializat cu valoarea duratei de inactivitate. Structura de ID raport este inserată la sfârșitul unei liste înlănțuite care conține structuri de ID rapoarte de intrare. Valoarea duratei de inactivitate este exprimată în unități de 4 ms, ceea ce oferă un interval de la 4 la 1020 ms.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
41/174
Pesteview
Dacă durata de inactivitate este mai mică decât intervalul de interogare al punctului final de intrare a întreruperii, rapoartele sunt generate la intervalul de interogare.
(3) La fiecare 4 ms, sarcina de raportare periodică a intrărilor parcurge lista de ID-uri a rapoartelor de intrare. Pentru fiecare ID de raport de intrare, sarcina efectuează una dintre cele două operațiuni posibile. Durata perioadei sarcinii corespunde cu unitatea de 4 ms utilizată pentru durata de inactivitate. Dacă gazda nu a trimis solicitări SET_IDLE, lista de ID-uri a rapoartelor de intrare este goală, iar sarcina nu are nimic de procesat. Sarcina procesează doar ID-urile de rapoarte diferite de 0 și cu o durată de inactivitate mai mare de 0.
(4) Pentru un ID de raport de intrare dat, sarcina verifică dacă durata de inactivitate s-a scurs. Dacă durata de inactivitate nu s-a scurs, contorul este decrementat și niciun raport de intrare nu este trimis către gazdă.
(5) Dacă durata de inactivitate a expirat (adică, contorul duratei de inactivitate a ajuns la zero), un raport de intrare este trimis către gazdă prin apelarea funcției sl_usbd_hid_write_sync() prin intermediul punctului final de întrerupere IN.
(6) Datele raportului de intrare trimise de sarcină provin dintr-un buffer intern de date alocat pentru fiecare raport de intrare descris în descriptorul Raport. O sarcină de aplicație poate apela funcția sl_usbd_hid_write_sync() pentru a trimite un raport de intrare. După trimiterea datelor raportului de intrare, sl_usbd_hid_write_sync() actualizează bufferul intern asociat unui ID de raport de intrare cu datele tocmai trimise. Apoi, sarcina de rapoarte periodice de intrare trimite întotdeauna aceleași date de raport de intrare după fiecare perioadă de inactivitate și până când sarcina de aplicație actualizează datele din bufferul intern. Există un mecanism de blocare pentru a evita coruperea datelor ID-ului raportului de intrare în cazul unei modificări care are loc exact în momentul transmiterii efectuate de sarcina de raportare periodică de intrare.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
42/174
Pesteview
Pesteview
Dispozitiv USB Clasa MSC
Dispozitiv USB MSC Class Overview Necesități de resurse pentru clasa MSC pentru dispozitive USB din partea nucleului Configurarea clasei MSC pentru dispozitive USB Ghid de programare pentru clasa MSC pentru dispozitive USB Drivere de stocare pentru clasa MSC pentru dispozitive USB
Această secțiune descrie clasa de dispozitive de stocare în masă (MSC) acceptată de Silicon Labs USB Device. MSC este un protocol care permite transferul de informații între un dispozitiv USB și o gazdă. Informațiile transferate sunt orice poate fi stocat electronic, cum ar fi programe executabile, cod sursă, documente, imagini, date de configurare sau alte date text sau numerice. Dispozitivul USB apare ca un mediu de stocare extern pentru gazdă, permițând transferul de fileprin drag and drop.
A file sistemul definește modul în care filesunt organizate în mediul de stocare. Specificația clasei de stocare în masă USB nu necesită nicio specificație specială file sistem care să fie utilizat pe dispozitive conforme. În schimb, oferă o interfață simplă pentru citirea și scrierea sectoarelor de date utilizând setul de comenzi transparente SCSI (Small Computer System Interface). Ca atare, sistemele de operare pot trata unitatea USB ca pe un hard disk și o pot formata cu orice file sistemul care le place.
Clasa de dispozitive de stocare în masă USB acceptă două protocoale de transport, după cum urmează:
Transport în bloc (BOT) Control/Bulk/Interrupt (CBI) (utilizat numai pentru unitățile de dischetă)
Clasa de dispozitive de stocare în masă implementează setul de comenzi transparente SCSI folosind doar protocolul BOT, ceea ce semnifică faptul că doar punctele finale în bloc vor fi utilizate pentru a transmite date și informații de stare. Implementarea MSC acceptă mai multe unități logice.
Implementarea MSC respectă următoarele specificații:
Specificația clasei de stocare în masă a magistralei seriale universale (USB)view, Revizia 1.3, 5 septembrie 2008. Stocare în masă pe magistrală serială universală, transport în vrac, Revizia 1.0, 31 septembrie 1999.
Dispozitiv USB MSC aCl ss Overview
Protocol Puncte finale Cereri de clasă Interfață pentru sisteme informatice mici (SCSI)
Protocol
În această secțiune, vom discuta protocolul Bulk-Only Transport (BOT) al clasei de stocare în masă. Protocolul Bulk-Only Transport are trei funcțiitages:
Transportul de comenzi Transportul de date Transportul de stare
Comenzile de stocare în masă sunt trimise de gazdă printr-o structură numită Command Block Wrapper (CBW). Pentru comenzile care necesită un serviciu de transport de datetagDe exemplu, gazda va încerca să trimită sau să primească numărul exact de octeți de la dispozitiv, așa cum este specificat de câmpurile de lungime și flag ale CBW. După ce transportul de date se încheietagde exemplu, gazda încearcă să primească un Command Status Wrapper (CSW) de la dispozitiv care detaliază starea comenzii, precum și orice reziduuri de date (dacă
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
43/174
Pesteview
(orice). Pentru comenzile care nu includ un serviciu de transport de datetagadică, gazda încearcă să primească CSW-ul direct după ce CBW-ul este trimis. Protocolul este detaliat în Figura – Protocolul MSC.
Figura – Protocolul MSC
Puncte finale
Pe partea dispozitivului, în conformitate cu specificația BOT, MSC este compus din următoarele puncte finale: O pereche de puncte finale de control IN și OUT numite puncte finale implicite. O pereche de puncte finale de intrare și ieșire în bloc.
Tabelul de mai jos indică diferitele utilizări ale punctelor finale.
Tabel – Utilizarea endpoint-ului MSC
Punct final
INTRARE Control IEȘIRE Control INTRARE vrac IEȘIRE vrac
Direcţie
Dispozitiv către gazdă Gazdă către dispozitiv Dispozitiv către gazdă Gazdă către dispozitiv
Utilizare
Cereri specifice clasei de enumerare și MSC Cereri specifice clasei de enumerare și MSC Trimitere CSW și date Recepție CBW și date
Cereri de curs
Există două cereri de control definite pentru protocolul MSC BOT. Aceste cereri și descrierile lor sunt detaliate în tabelul de mai jos.
Tabel – Cereri de clasă de stocare în masă
Cereri de curs
Resetare stocare în masă doar în bloc
Descriere
Această solicitare este utilizată pentru a reseta dispozitivul de stocare în masă și interfața asociată. Această solicitare pregătește dispozitivul să primească următorul bloc de comenzi.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
44/174
Pesteview
Cereri de curs
Descriere
Obțineți valoarea maximă Această solicitare este utilizată pentru a returna cel mai mare număr de unitate logică (LUN) acceptat de dispozitiv. De exempluample, a
LUN
Un dispozitiv cu LUN 0 și LUN 1 va returna valoarea 1. Un dispozitiv cu o singură unitate logică va returna 0 sau va bloca
cerere. Valoarea maximă care poate fi returnată este 15.
Interfață SCSI pentru sisteme de calculatoare mici
La nivelul interfeței de programare, dispozitivul MSC implementează unul dintre protocoalele standard de comunicare pentru mediile de stocare, cum ar fi SCSI și SFF-8020i (ATAPI). „Interfața de programare” specifică protocolul implementat și ajută sistemul de operare gazdă să încarce driverul de dispozitiv adecvat pentru comunicarea cu dispozitivul de stocare USB. SCSI este cel mai comun protocol utilizat cu dispozitivele de stocare USB MSC. Oferim o implementare pentru subclasa MSC SCSI pe care utilizatorii noștri GSDK o pot utiliza direct din cutie.
SCSI este un set de standarde pentru gestionarea comunicării dintre computere și dispozitive periferice. Aceste standarde includ comenzi, protocoale, interfețe electrice și interfețe optice. Dispozitivele de stocare care utilizează alte interfețe hardware, cum ar fi USB, utilizează comenzi SCSI pentru a obține informații despre dispozitiv/gazdă și pentru a controla funcționarea dispozitivului, precum și pentru a transfera blocuri de date în mediul de stocare.
Comenzile SCSI acoperă o gamă vastă de tipuri și funcții de dispozitive și, ca atare, dispozitivele au nevoie de un subset al acestor comenzi. În general, următoarele comenzi sunt necesare pentru comunicarea de bază:
INTEROGAREA CAPACITĂȚII DE CITIRE (10) CITIRE (10) CERERE DETECTARE TEST UNITATE PREGĂTITĂ SCRIERE (10)
Necesități de resurse pentru dispozitive USB din clasa MSC din partea nucleului
De fiecare dată când adăugați o instanță a clasei MSC la o configurație USB prin intermediul funcției sl_usbd_msc_add_to_configuration(), următoarele resurse vor fi alocate din nucleu.
Resursă
Interfețe Interfețe alternative Puncte finale Grupuri de interfețe
Cantitate
1 1 2 0
Rețineți că aceste numere sunt per configurație. Când configurați valorile de configurare SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY și SL_USBD_DESCRIPTOR_QUANTITY, nu uitați să luați în considerare câte configurații vor fi adăugate la clasă. Pentru valoarea de configurare SL_USBD_OPEN_ENDPOINTS_QUANTITY, deoarece punctele de acces sunt deschise numai atunci când o configurație este setată de gazdă, trebuie doar să luați în considerare numărul de puncte de acces necesare pentru o instanță de clasă.
Configurarea clasei MSC a dispozitivului USB
Două grupuri de parametri de configurare sunt utilizate pentru a configura clasa MSC:
Configurații specifice aplicației din clasa MSC pentru dispozitive USB Configurație unitate logică din clasa MSC pentru dispozitive USB
Configurații specifice aplicației din clasa MSC pentru dispozitive USB
Configurații în timpul compilării clasei Crearea instanței de clasă
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
45/174
Pesteview
Configurații în timpul compilării clasei
Clasa MSC și subclasa SCSI de la Silicon Labs USB Device pot fi configurate la compilare prin intermediul comenzii #defines din fișierul sl_usbd_core_config.h. file.
Tabel – Constante de configurare generice
Nume configurație
Descriere
SL_USBD_MSC_CLASS_INST Numărul de instanțe de clasă pe care le veți aloca printr-un apel al funcției
CANTITATE_NUMĂR
sl_usbd_msc_scsi_create_instance().
SL_USBD_MSC_CONFIGURA Numărul de configurații la care poate fi adăugată o instanță de clasă printr-un apel către
CANTITATE_TION
funcția sl_usbd_msc_scsi_add_to_configuration().
SL_USBD_MSC_LUN_QUANT Numărul de unități logice per instanță de clasă pe care le veți adăuga printr-un apel către
ITY
funcția sl_usbd_msc_scsi_lun_add().
SL_USBD_MSC_SCSI_64_BIT Activează sau dezactivează suportul pentru adresa de bloc logic (LBA) pe 64 de biți.
_LBA_EN
SL_USBD_MSC_DATA_BUFF Dimensiunea bufferului de date per instanță de clasă în octeți ER_SIZE
Valoare implicită
2
1
2
0
512
Crearea instanței de clasă
Crearea unei instanțe a clasei SCSI MSC pentru dispozitive USB se face prin apelarea funcției sl_usbd_msc_scsi_create_instance(). Această funcție primește un argument de configurare descris mai jos.
p_scsi_callback-uri
`p_scsi_callbacks` este un pointer către o structură de configurare de tip `sl_usbd_msc_scsi_callbacks_t`. Pe lângă funcțiile comune de apelare `connect/disconnect` ale clasei de dispozitive USB, aceasta oferă clasei MSC un set de funcții de apelare opționale care sunt apelate atunci când are loc un eveniment pe unitatea logică. Un pointer nul (`NULL`) poate fi transmis acestui argument dacă nu sunt necesare apelări inverse.
Tabelul de mai jos descrie fiecare câmp de configurare disponibil în această structură de configurare.
Tabel – Structura de configurare sl_usbd_msc_scsi_callbacks_t
Câmpuri
Descriere
.permite
Apelată când instanța clasei USB este activată cu succes.
.disable Apelată când instanța clasei USB este dezactivată.
Funcția .host_eject este apelată atunci când o unitate logică este ejectată din gazdă.
Semnătura funcției
void app_usbd_msc_scsi_enable(uint8_t număr_de_clasă);
void app_usbd_mscsi_disable(uint8_t număr_clasă); void app_usbd_mscsi_host_eject(uint8_t număr_clasă, uint8_t număr_lu);
Configurația unității logice a clasei MSC a dispozitivului USB
Adăugarea unei unități logice la o instanță de clasă MSC se face prin apelarea funcției sl_usbd_msc_lun_add(). Această funcție primește un argument de configurare descris mai jos.
p_lu_info
`p_lu_info` este un pointer către o structură de tip `sl_usbd_msc_scsi_lun_info_t`. Scopul său este de a furniza informații despre unitatea logică clasei MSC.
Tabelul de mai jos descrie fiecare câmp de configurare disponibil în această structură de configurare.
Tabel – Structura de configurare sl_usbd_msc_scsi_lun_info_t
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
46/174
Pesteview
Domeniu
Descriere
Domeniu
.scsi_lun_api_p tr
Descriere
Indicator către API-ul driverului media care va gestiona această unitate logică. Consultați Drivere de stocare USB Device Class MSC pentru mai multe informații despre driverele de stocare.
.ve nd sau r_id _ p tr
.id_produs_ptr
.nivel_revizuire_produs .este_doar_citire
Indicator către un șir care conține identificarea furnizorului unității logice. Lungimea maximă a șirului este de 8 caractere. Indicator către un șir care conține identificarea produsului unității logice. Lungimea maximă a șirului este de 16 caractere. Nivel de revizie al produsului.
Indicator care indică dacă unitatea logică ar trebui văzută ca fiind doar de citire din punctul de view al gazdei (adevărat) sau nu (fals).
Ghid de programare pentru dispozitive USB din clasa MSC
Această secțiune explică modul de utilizare a clasei MSC.
Inițializarea clasei MSC a dispozitivului USB Adăugarea unei instanțe a clasei SCSI MSC a dispozitivului USB la dispozitivul dvs. Gestionarea unității logice a clasei MSC a dispozitivului USB
Inițializarea clasei MSC a dispozitivului USB
Pentru a adăuga funcționalitatea clasei SCSI MSC la dispozitivul dvs., inițializați mai întâi clasa de bază MSC și subclasa SCSI apelând funcțiile sl_usbd_msc_init() și sl_usbd_msc_scsi_init().
ExampMai jos arată cum se apelează funcțiile sl_usbd_msc_init() și sl_usbd_msc_scsi_init().
Example – Apelarea funcțiilor sl_usbd_msc_init() și sl_usbd_msc_scsi_init()
stare sl_status_t;
status = sl_usbd_msc_init(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Trebuie adăugată gestionarea erorilor aici. */
}
status = sl_usbd_msc_scsi_init(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Trebuie adăugată gestionarea erorilor aici. */
}
Adăugarea unei instanțe de clasă SCSI MSC pentru dispozitive USB la dispozitivul dvs.
Pentru a adăuga funcționalitatea clasei SCSI MSC la dispozitivul dvs., creați mai întâi o instanță, apoi adăugați-o la configurația (configurațiile) dispozitivului. Trebuie să adăugați cel puțin o unitate logică la instanța dvs.
Crearea unei instanțe de clasă SCSI MSC
Creați o instanță a clasei MSC SCSI apelând funcția sl_usbd_msc_scsi_create_instance().
ExampMai jos se arată cum se apelează sl_usbd_msc_scsi_create_instance() folosind argumente implicite. Pentru mai multe informații despre argumentele de configurare care trebuie transmise către sl_usbd_msc_scsi_create_instance(), consultați Configurații specifice aplicației clasei MSC pentru dispozitive USB.
Example – Apelarea funcției sl_usbd_msc_scsi_create_instance()
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
47/174
Pesteview
uint8_t class_nbr; sl_status_t stare;
sl_usbd_mscsi_callbacks_t app_usbd_mscsi_callbacks = { .enable = NULL, .disable = NULL, .host_eject = NULL };
stare = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
dacă (status ! SL_STATUS_OK) { /* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. */ }
Adăugarea instanței clasei MSC la configurația(ile) dispozitivului dvs.
După ce ați creat o instanță a clasei MSC, o puteți adăuga la o configurație apelând funcția
sl_usbd_msc_add_to_configuration().
ExampMai jos se arată cum se apelează metoda sl_usbd_msc_scsi_add_to_configuration() folosind argumente implicite.
Example – Apelarea funcției sl_usbd_msc_scsi_add_to_configuration()
stare sl_status_t;
stare = sl_usbd_msc_scsi_add_to_configuration(class_nbr,
(1)
config_nbr_fs);
(2)
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
(1) Numărul clasei de adăugat la configurația returnată de sl_usbd_msc_scsi_create_instance(). (32) Numărul configurației (aici se adaugă la o configurație Full-Speed).
Gestionarea unității logice a clasei MSC pentru dispozitive USB
Adăugarea unei unități logice Atașarea/Detașarea unui mediu de stocare
Adăugarea unei unități logice
Când adăugați o unitate logică la instanța clasei MSC SCSI, aceasta trebuie legată de un mediu de stocare (RAMDisk, card SD, memorie flash etc.). Clasa MSC utilizează un driver de stocare pentru a comunica cu mediul de stocare. Acest driver va trebui furnizat la adăugarea unității logice.
ExampMai jos arată cum se adaugă o unitate logică prin intermediul comenzii sl_usbd_msc_scsi_lun_add().
Example – Adăugarea unei unități logice prin sl_usbd_msc_scsi_lun_add()
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
48/174
Pesteview
sl_usbd_msc_scsi_lun_t *lu_object_ptr = NULL;
sl_usbd_msc_scsi_lun_info_t lu_info;
sl_status_t
statut;
lu_info.sl_usbd_mscsi_lun_api_t = &app_usbd_scsi_storage_block_device_api;
lu_info.vendor_id_ptr
= „Silicon Labs”;
lu_info.id_produs_ptr
= „exemplu de dispozitiv bloc”amp„le”;
lu_info.product_revision_level = 0x1000u;
lu_info.este_doar_în_lectură
= fals;
stare = sl_usbd_msc_scsi_lun_add(class_nbr, &lu_info, &lu_object_ptr);
dacă (status ! SL_STATUS_OK) { /* A apărut o eroare. Gestionarea erorilor ar trebui adăugată aici. */ }
Atașarea/Detașarea unui mediu de stocare
După ce unitatea logică a fost adăugată, trebuie atașat un mediu de stocare pentru a fi disponibil din partea gazdei. Clasa MSC oferă două funcții pentru a controla asocierea mediului de stocare cu unitatea logică: sl_usbd_msc_scsi_lun_attach() și sl_usbd_msc_scsi_lun_detach(). Aceste funcții vă permit să emulați eliminarea unui dispozitiv de stocare pentru a recâștiga accesul din aplicația încorporată, dacă este necesar.
ExampMai jos arată cum se utilizează funcțiile sl_usbd_msc_scsi_lun_attach() și sl_usbd_msc_scsi_lun_detach().
Example – Atașare/Detașare suport media
stare sl_status_t;
status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Trebuie adăugată gestionarea erorilor aici. */
}
…
(1)
stare = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
…
(2)
stare = sl_usbd_msc_scsi_lun_attach(lu_object_ptr) dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
…
(3)
(1) Din acest moment, dacă dispozitivul MSC este conectat la o gazdă, mediul de stocare este accesibil.
(2) Dacă dispozitivul MSC este conectat la o gazdă, suportul media va apărea acum ca indisponibil. În acest moment, operațiunile pot fi efectuate pe suportul media din aplicația încorporată.
(3) Din nou, dacă dispozitivul MSC este conectat la gazdă, mediul de stocare va apărea ca fiind conectat.
Drivere de stocare pentru dispozitive USB din clasa MSC
Dispozitivul USB din clasa MSC necesită un driver de stocare pentru a comunica cu un mediu de stocare. Deocamdată, Silicon Labs nu oferă drivere.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
49/174
Pesteview
Driverul AI este definit de typedef sl_usbd_msc_scsi_lun_api_t. Variabila noastră sl_usbd_msc_scsi_lun_api_t trebuie inclusă în variabila sl_usbd_msc_scsi_lun_info_t, utilizată în argument atunci când adăugați o unitate logică cu sl_usbd_msc_scsi_lun_add(). Consultați secțiunea API-ul SCSI pentru dispozitive USB pentru mai multe detalii despre structuri. Implementarea driverului de stocare poate fi la fel de simplă ca o matrice de sectoare în RAM. Dimensiunea tipică a sectorului (adică dimensiunea blocului) este de 512 pentru dispozitivele de stocare în masă și 2048 pentru CD-ROM-uri.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
50/174
Pesteview
Pesteview
Clasa furnizorilor de dispozitive USB
Clasa furnizorului de dispozitive USB depășităview Nevoi de resurse ale clasei furnizor de dispozitive USB din configurația principală a clasei furnizor de dispozitive USB Ghid de programare a clasei furnizor de dispozitive USB Clasa Vendor vă permite să construiți dispozitive specifice furnizorului care pot implementa un protocol proprietar. Se bazează pe o pereche de puncte finale în bloc pentru a transfera date între gazdă și dispozitiv. Transferurile în bloc sunt convenabile pentru transferul de cantități mari de date nestructurate și oferă un schimb fiabil de date utilizând un mecanism de detectare a erorilor și reîncercare. Pe lângă punctele finale în bloc, clasa Vendor poate utiliza și o pereche opțională de puncte finale de întrerupere. Orice sistem de operare (OS) poate funcționa cu clasa Vendor, cu condiția ca sistemul de operare să aibă un driver pentru a gestiona clasa Vendor. În funcție de sistemul de operare, driverul poate fi nativ sau specific furnizorului. De exemplu, în Microsoft Windows®, aplicația dvs. interacționează cu driverul WinUSB furnizat de Microsoft pentru a comunica cu dispozitivul furnizorului.
Clasa furnizorului de dispozitive USB depășităview
Figura – Arhitectura generală între gazda Windows și clasa Vendor prezintă arhitectura generală dintre gazdă și dispozitiv folosind clasa Vendor. În acest exempluampadică, sistemul de operare gazdă este MS Windows.
Figura – Arhitectură generală între gazda MS Windows și clasa furnizorului
Pe partea MS Windows, aplicația comunică cu dispozitivul furnizorului prin interacțiunea cu o bibliotecă USB. Bibliotecile, precum libusb, oferă o interfață API pentru gestionarea unui dispozitiv și a conductelor asociate acestuia și pentru comunicarea cu dispozitivul prin puncte finale de control, în bloc și întrerupere.
Pe partea de dispozitiv, clasa Vendor este compusă din următoarele puncte finale:
O pereche de puncte finale de control IN și OUT numite punct final implicit. O pereche de puncte finale de control IN și OUT în bloc.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
51/174
Pesteview
O pereche de puncte finale de intrare și ieșire de întrerupere. Această pereche este opțională. Tabelul de mai jos indică utilizarea diferitelor puncte finale:
Tabel – Utilizarea endpoint-urilor clasei furnizor
Direcția punctului final
Control IN
Controla
OUT
În vrac
De la dispozitiv la gazdă
>De la gazdă la dispozitiv
De la dispozitiv la gazdă
OUT în vrac
Întrerupere IN
Întrerupe
OUT
Gazdă-dispozitiv
De la dispozitiv la gazdă
Gazdă-dispozitiv
Utilizare
Cereri standard pentru enumerare și cereri specifice furnizorului.
Cereri standard pentru enumerare și cereri specifice furnizorului.
Comunicare de date brute. Datele pot fi structurate conform unui protocol proprietar.
Comunicare de date brute. Datele pot fi structurate conform unui protocol proprietar.
Comunicare sau notificare a datelor brute. Datele pot fi structurate conform unui protocol proprietar. Comunicare sau notificare a datelor brute. Datele pot fi structurate conform unui protocol proprietar.
Aplicația dispozitivului poate utiliza puncte finale de transfer în bloc și întrerupere pentru a trimite sau primi date către sau de la gazdă. Poate utiliza doar punctul final implicit pentru a decodifica solicitările specifice furnizorului trimise de gazdă. Solicitările standard sunt gestionate intern de nivelul central al dispozitivului USB Silicon Labs.
Necesități de resurse pentru clasa furnizorilor de dispozitive USB de la Core
De fiecare dată când adăugați o instanță a clasei vendor la o configurație prin intermediul funcției sl_usbd_vendor_add_to_configuration(), următoarele resurse vor fi alocate din nucleu.
Resursă
Interfețe Interfețe alternative Puncte finale Grupuri de interfețe
Cantitate
1 1 2 (4 dacă ați activat punctele finale de întrerupere) 0
Rețineți că aceste numere sunt per configurație. Când configurați valorile de configurare SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY și SL_USBD_DESCRIPTOR_QUANTITY, nu uitați să luați în considerare câte configurații vor fi adăugate la clasă. Pentru valoarea de configurare SL_USBD_OPEN_ENDPOINTS_QUANTITY, deoarece punctele de acces sunt deschise numai atunci când o configurație este setată de gazdă, trebuie doar să luați în considerare numărul de puncte de acces necesare pentru o instanță de clasă.
Configurarea clasei furnizorului de dispozitive USB
Două grupuri de parametri de configurare sunt utilizate pentru a configura clasa Vendor:
Configurații specifice aplicației clasei furnizorilor de dispozitive USB Configurații ale instanței clasei furnizorilor de dispozitive USB
Configurații specifice aplicației pentru clasa furnizorului de dispozitive USB
Mai întâi, pentru a utiliza modulul clasei Vendor pentru dispozitive USB din Silicon Labs, ajustați configurația Vendor la compilare în funcție de nevoile aplicației dvs. Acestea sunt regrupate în antetul sl_usbd_core_config.h. file în secțiunea Furnizor. Scopul configurațiilor cantitative este de a informa modulul dispozitivului USB despre câte obiecte USB Vendor să aloce.
Tabelul de mai jos descrie fiecare definiție de configurație.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
52/174
Pesteview
Tabel – Definiții ale configurației furnizorului de dispozitive USB
Nume configurație
Descriere
Valoare implicită
SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Numărul de instanțe de clasă pe care le veți aloca printr-un apel al funcției sl_usbd_vendor_create_instance().
SL_USBD_VENDOR_CONFIGURATION_QUANTITY Număr de configurații. Instanțele clasei Vendor pot fi adăugate 1 la una sau mai multe configurații printr-un apel al funcției sl_usbd_vendor_add_to_configuration().
Configurații ale instanței clasei furnizorului de dispozitive USB
Această secțiune definește configurațiile legate de instanțele clasei Vendor.
Crearea instanței de clasă intr_en interval p_vendor_callbacks
Crearea instanței de clasă
Crearea unei instanțe a clasei Vendor se face prin apelarea funcției sl_usbd_vendor_create_instance(), care primește trei argumente de configurare descrise mai jos.
intr_en
Boolean care indică dacă ar trebui adăugată sau nu o pereche de puncte finale de întrerupere.
Valoare
adevărat fals
Descriere
O pereche de puncte finale IN/OUT va fi adăugată și pusă la dispoziția aplicației încorporate. Nu va fi adăugat niciun punct final de întrerupere. Va fi disponibilă doar o pereche de puncte finale Bulk IN/OUT.
interval
Dacă setați intr_en la true, puteți specifica intervalul de interogare a punctelor finale de întrerupere (în milisecunde). Dacă setați intr_en la false, puteți seta intervalul la 0, deoarece acesta va fi ignorat de clasă.
p_vendor_callbacks
`p_vendor_callbacks` este un pointer către o variabilă de structură a funcțiilor callback, pe care o puteți specifica pentru a gestiona cererile de control specifice clasei. Dacă nu utilizați nicio cerere specifică clasei sau aveți nevoie să activați/dezactivați notificările, puteți seta această valoare la NULL.
ExampMai jos se oferă semnătura așteptată a tractorului de cereri specific clasei dumneavoastră.
Example – Semnătura funcției de solicitare specifică clasei
void app_usbd_vendor_req_handle(uint8_t
număr_clasă, (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) Numărul instanței clasei furnizorului.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
53/174
Pesteview
(2) Indicator către o cerere de configurare primită de la gazdă.
Ghid de programare pentru clasa furnizorului de dispozitive USB
Această secțiune explică modul de utilizare a clasei Vendor. Inițializarea clasei USB Device Vendor Adăugarea unei instanțe a clasei USB Device Vendor la dispozitivul dvs. Comunicarea utilizând clasa USB Device Vendor
Inițializarea clasei furnizorului de dispozitive USB
Pentru a adăuga o funcționalitate de tip Vendor Class la dispozitivul dvs., inițializați mai întâi clasa apelând funcția USBD_Vendor_Init(). Ex.ampImaginea de mai jos arată cum se apelează funcția sl_usbd_vendor_init().
Example – Apelarea funcției sl_usbd_vendor_init()
stare sl_status_t;
status = sl_usbd_vendor_init(); if (status ! SL_STATUS_OK) { /* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */ }
Adăugarea unei instanțe de clasă USB Device Vendor la dispozitivul dvs.
Pentru a adăuga funcționalități de clasă furnizor pe dispozitivul dvs., trebuie mai întâi să creați o instanță, apoi să o adăugați la configurația (configurațiile) dispozitivului.
Crearea unei instanțe de clasă Vendor Adăugarea instanței de clasă Vendor la configurația(ile) dispozitivului dvs.
Crearea unei instanțe de clasă Vendor
Creați o instanță a clasei Vendor apelând funcția sl_usbd_vendor_create_instance(). ExampMai jos se arată cum se apelează sl_usbd_vendor_create_instance() folosind argumente implicite. Pentru mai multe informații despre argumentele de configurare care trebuie transmise către sl_usbd_vendor_create_instance(), consultați Configurațiile instanței clasei furnizorului de dispozitive USB.
Example – Apelarea funcției sl_usbd_vendor_create_instance()
uint8_t class_nbr; sl_status_t stare;
stare = sl_usbd_vendor_create_instance(fals,
(1)
0u,
(2)
funcții_apel_recuperare_furnizor_app_usbd, (3)
&nr_clasă);
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
(1) Nu există puncte finale de întrerupere cu această instanță de clasă. (2) Intervalul este ignorat deoarece punctele finale de întrerupere sunt dezactivate.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
54/174
Pesteview
(3) Funcție de apel invers care face parte din aplicația dvs. și gestionează cererile de clasă specifice furnizorului. Consultați Comunicarea utilizând clasa furnizor de dispozitive USB pentru mai multe informații. Adăugarea instanței clasei furnizor la configurația(ile) dispozitivului dvs. După ce ați creat o instanță a clasei furnizor, o puteți adăuga la o configurație apelând funcția USBD_Vendor_ConfigAdd(). ExampImaginea de mai jos arată cum se apelează metoda sl_usbd_vendor_add_to_configuration() folosind argumente implicite.
Example – Apelarea funcției sl_usbd_vendor_add_to_configuration()
stare sl_status_t;
stare = sl_usbd_vendor_add_to_configuration(class_nbr,
(1)
config_nbr_fs);
(2)
dacă (stare ! SL_STATUS_OK) {
/* A apărut o eroare. Ar trebui adăugată aici gestionarea erorilor. */
}
(1) Numărul clasei de adăugat la configurația returnată de sl_usbd_vendor_create_instance(). (2) Numărul configurației (aici se adaugă la o configurație Full-Speed).
Comunicarea utilizând clasa furnizorului de dispozitive USB
Comunicare sincronă generală Comunicare asincronă Cerere furnizor Generalități Clasa Vendor oferă următoarele funcții pentru a comunica cu gazda. Pentru mai multe detalii despre parametrii funcției, consultați API-ul furnizorului de dispozitive USB.
Tabel – Rezumatul API-ului de comunicare cu furnizorul
Numele funcției
sl_usb d_ve nd o r_ read_b ulk_sy nc() sl_usb d_ve nd o r_write _b ulk_sy nc() sl_usb d_ve nd o r_ read_b ulk_asy nc() sl_usb d_ve nd o r_write _b ulk_asy nc() sl_usb d_ve nd o r_ read_inte rrup t_sy nc() sl_usb d_ve nd o r_write _inte rrup t_sy nc() sl_usb d_ve nd o r_ read_inte rrup t_asy nc
()
sl_usb d _vend sau 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-
blocare.
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
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
55/174
Pesteview
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
statut;
status = sl_usbd_vendor_read_bulk_sync(class_nbr,
(1)
(void *)&rx_buf[0],
(2)
2u,
0u,
(3)
&xfer_len);
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Gestionează eroarea. */
}
status = sl_usbd_vendor_write_bulk_sync( class_nbr,
(1)
(void *)&tx_buf[0],
(4)
2u,
0u,
(3)
false,
(5)
&xfer_len);
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Gestionează eroarea. */
}
(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) Aplicația furnizează bufferul de transmisie inițializat.
(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.
Comunicare asincronă
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
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
56/174
Pesteview
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
statut;
status = sl_usbd_vendor_read_bulk_async(class_nbr,
(void *)&rx_buf[0],
(2)
2u,
app_usbd_vendor_rx_completed,
NULL);
(4)
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Gestionează eroarea. */
}
status = sl_usbd_vendor_write_bulk_async(class_nbr,
(void *)&tx_buf[0],
(5)
2u,
app_usbd_vendor_tx_completed,
NUL,
(4)
false);
(6)
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Gestionează eroarea. */
}
}
(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)
{
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Do some processing. */
} altfel {
/* $$$$ Gestionează eroarea. */
}
}
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)
{
dacă (stare ! SL_STATUS_OK) {
/* $$$$ Do some processing. */
} altfel {
/* $$$$ Gestionează eroarea. */
}
}
(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.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
57/174
Pesteview
(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
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
58/174
Pesteview
#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;
stare sl_status_t;
uint16_t req_len;
uint32_t xfer_len;
(void)class_nbr;
switch(p_setup_req->bRequest) { case APP_VENDOR_REQ_NO_DATA: valid = true; break;
(2) (3)
case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:
(4)
req_len = p_setup_req->wLength;
if (req_len > APP_VENDOR_REQ_DATA_BUF_SIZE) {
// Not enough room to receive data.
return (false);
}
// Receive data via Control OUT EP. // Wait transfer completion forever. status = sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, &xfer_len); if (status ! SL_STATUS_OK) { valid = false; } else { valid = true; } break;
case APP_VENDOR_REQ_SEND_DATA_TO_HOST:
(5)
req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;
// Fill buf with a pattern. Mem_Set((void *)&AppVendorReqBuf[0u],
'A',
req_len);
// Send data via Control IN EP. // Wait transfer completion forever. status = sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, false, &xfer_len); if (status ! SL_STATUS_OK) { valid = DEF_FAIL; } else { valid = DEF_OK; } break;
implicit:
(6)
// Request is not supported.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
59/174
Pesteview
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 prezent.
*/
} 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.
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
60/174
Documentația API
Documentația API
Documentația API
Lista modulelor
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
Descriere
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
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
61/174
USB Device API
USB Device API
USB Device API
USB Device API.
Module
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
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
62/174
USB Device ACM API
USB Device ACM API
USB Device ACM API
USB Device CDC ACM API.
Module
a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t
Funcții
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).
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
63/174
USB Device ACM API
Macro-uri
#define SL_USBD_CDC_ACM_NBR_NONE 255u
MODUL.
#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
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
64/174
USB Device ACM API
Tip
gol
Direction N/A
Argument Name
MACROS GLOBAL CONSTANTS FUNCTION PROTOTYPES CDC ACM FUNCTIONS
Initialize the CDC ACM serial emulation subclass.
Retururi
Returns SL_STATUS_OK on success or another SL_STATUS code on failure.
Descriere
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.
Parametrii
Tip
uint16_t
uint16_t
Direction Argument Name
Descriere
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.
Retururi
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.
Parametrii
Tip
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.
Retururi
Copyright © 2025 Silicon Laboratories. Toate drepturile rezervate.
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.
Parametrii
Tip
Direcţie
Argument Name
Descriere
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
Documente/Resurse
![]() |
SILICON LABS USB Device Stack [pdfManual de instrucțiuni USB Device Stack, Device Stack, Stack |