Pila de dispositius USB de SILICON LABS

Especificacions

  • Versió USB: 1.5.1
  • Data de llançament: 21 de juliol de 2025
  • Versió del SDK de Simplicity: 2025.6.1

Producte acabatview

La pila de dispositius USB de Silicon Labs proporciona una connectivitat USB versàtil i fàcil d'utilitzar per a projectes d'IoT, facilitant la comunicació entre els coprocessadors de xarxa i els hosts.

Característiques

  • Pila de dispositius USB eficient
  • Ideal per a projectes d'IoT
  • Suport per a la comunicació entre coprocessadors de xarxa i hosts

Configuració del dispositiu USB

Configureu els paràmetres del dispositiu USB segons els requisits del vostre projecte consultant la secció Configuració del dispositiu USB de la documentació.

Guia de programació de dispositius USB
Seguiu la Guia de programació de dispositius USB per entendre com programar i interactuar amb el dispositiu USB per a diverses aplicacions.

Classes de dispositius USB
La secció Classes de dispositius USB ofereix més informacióview de diferents classes com ara CDC ACM, HID, MSC SCSI i Vendor Class. Trieu la classe adequada en funció de la funcionalitat del vostre dispositiu.

Resolució de problemes de dispositius USB
Si teniu algun problema amb el dispositiu USB, consulteu la secció Resolució de problemes de dispositius USB per obtenir solucions i consells de depuració.

Notes de la versió USB
Especificacions i característiques més amuntview
Configuració del dispositiu USB finalitzadaview
Guia de programació de dispositius USB Més amuntview
Classes de dispositius USB més enllàview Classificació ACM dels CDC superadaview Classe HID acabadaview Classe MSC SCSI sobrepassatview Classe de proveïdor acabadaview


API USB Documentació de l'API API de dispositius USB API ACM de dispositius USB a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t API CDC de dispositius USB a sl_usbd_cdc_subcl ss_driver_t API principal de dispositius USB
sl_usbd_device_config_t sl_usbd_setup_req_t
una API HID de dispositiu USB sl_usbd_cl ss_driver_t
API MSC de dispositius USB sl_usbd_hid_callbacks_t
una API SCSI MSC per a dispositius USB sl_usbd_msc_subcl ss_driver_t
sl_usbd_msc_scsi_callbacks_t

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

1/174

USB de bus sèrie universal
un sl_usbd_msc_scsi_lun_pi
sl_usbd_msc_scsi_lun_info sl_usbd_msc_scsi_lun
API del proveïdor de dispositius USB sl_usbd_vendor_callbacks_t
Documentació de l'API Resolució de problemes de dispositius USB
Acabatview Amfitrió USB del sistema operatiu Microsoft Windows
Acabatview

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

2/174

Acabatview
Acabatview
Dispositiu USB
L'USB és una de les interfícies de comunicació més reeixides de la història dels sistemes informàtics i és l'estàndard de facto per connectar perifèrics d'ordinador. La pila de dispositius USB de Silicon Labs és un mòdul de dispositiu USB dissenyat específicament per a sistemes integrats. Construït des de zero amb la qualitat, l'escalabilitat i la fiabilitat de Silicon Labs, ha passat per un rigorós procés de validació per complir amb l'especificació USB 2.0. Aquesta documentació descriu com inicialitzar, iniciar i utilitzar la pila de dispositius USB de Silicon Labs. Explica els diversos valors de configuració i els seus usos. També inclou una descripció general.view de la tecnologia, tipus de possibilitats de configuració, procediments d'implementació i examples d'ús típic per a cada classe disponible.


Per ajudar-vos a entendre ràpidament els conceptes USB, la documentació inclou molts exemplesamplectors d'USB amb funcions bàsiques. Aquests exemplesampels fitxers us proporcionaran un marc de treball que us permetrà construir dispositius ràpidament. Aquests exemplesamples inclouen:
Adaptador USB-serial (classe de dispositiu de comunicacions) Ratolí o teclat (classe de dispositiu d'interfície humana) Dispositiu d'emmagatzematge extraïble (classe d'emmagatzematge massiu) Dispositiu personalitzat (classe de proveïdor)
El següent s'ha acabatview de les seccions de documentació:
Especificacions i característiques Configuració de dispositius USB Guia de programació de dispositius USB Classes de dispositius USB
Classe CDC ACM Classe HID Classe MSC SCSI Classe de proveïdor Resolució de problemes de dispositius USB Sistema operatiu Microsoft Windows Amfitrió USB

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

3/174

USB
USB

Versió USB 1.5.1 21 de juliol de 2025: notes de la versió
Versió 2025.6.1 del SDK de Simplicity
La pila de dispositius USB eficient de Silicon Labs ofereix una connectivitat USB versàtil i fàcil d'utilitzar, ideal per a projectes d'IoT, inclosa la comunicació entre coprocessadors de xarxa i hosts. Feu clic aquí per a versions anteriors.
Resum de la versió
Característiques principals | Canvis a l'API | Correcció d'errors | Habilitació de xips
Característiques clau
Només els canvis subjacents de la plataforma.
Canvis de l'API
Cap.
Correccions d'errors
Cap.
Habilitació de xips
Cap.
Característiques clau
Noves funcions | Millores | Funcions eliminades | Funcions obsoletes
Noves funcions
Cap.
Millores
Només els canvis subjacents de la plataforma.
Funcions eliminades
Cap.
Funcions obsoletes
Cap.
Canvis de l'API
API noves | API modificades | API eliminades | API obsoletes
Noves API

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

4/174

USB
Cap.
API modificades
Cap.
API eliminades
Cap.
API obsoletes
Cap.
Correccions d'errors
Cap.
Habilitació de xips
Cap.
Aplicació Exampels canvis
Nou Examples | Ex modificatamples | Ex eliminatamples | Ex obsoletamples
Nou Examples
Cap.
Modificat Examples
Cap.
Eliminat Examples
Cap.
Ex obsoletamples
Cap.
Impacte dels canvis de llançament
Declaracions d'impacte | Guia de migració
Declaracions d'impacte
Cap.
Guia de Migració
Cap.
Problemes coneguts i limitacions
Cap.
Utilitzant aquesta versió

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

5/174

USB

Què inclou la versió? | Programari compatible | Instal·lació i ús | Ajuda i comentaris

Què hi ha a la publicació?

Aplicació de pila de dispositius USB Examples
Programari compatible

Programari
SDK de Simplicity Simplicity Studio Simplicity Commander GCC La col·lecció de compiladors GNU) IAR Embedded Workbench per a ARM IAR EWARM

Versió o variant compatible
2025.6.0 5.11.0 1.18.2 (inclòs amb Simplicity Studio) 12.2.1 (inclòs amb Simplicity Studio) 9.40.1 (inclòs amb Simplicity Studio)

Instal·lació i ús

Per iniciar el vostre desenvolupament, consulteu el nostre:
Guia de programació de dispositius USB. Documentació de l'API.
Per obtenir informació sobre la integració amb Secure Vault, consulteu Secure Vault.
Per tornarview Notificacions d'assessorament de seguretat i programari i gestió de les preferències de notificació:
ò Aneu a https://community.silabs.com/. ò Inicieu la sessió amb les credencials del vostre compte. ò Feu clic al vostre profile icona a la cantonada superior dreta de la pàgina.
õ Seleccioneu Notificacions al menú desplegable. ö A la secció Notificacions, aneu a la pestanya Notificacions del meu producte per tornar aview Assessorament històric de seguretat i programari
notificacions
÷ Per gestionar les vostres preferències, utilitzeu la pestanya Gestiona notificacions per personalitzar les actualitzacions i els avisos del producte que voleu
rebre.
Per veure els paràmetres de configuració recomanats, consulteu aquí.
Per obtenir més informació sobre el programari d'aquesta versió, consulteu la nostra documentació en línia.
Ajuda i comentaris

Poseu-vos en contacte amb el servei d'assistència de Silicon Labs. Per utilitzar la nostra eina Ask AI per obtenir respostes, consulteu el camp de cerca a la part superior d'aquesta pàgina.

Nota: Ask AI és experimental.

Obteniu ajuda de la nostra comunitat de desenvolupadors.
Política de llançament i manteniment de l'SDK
Consulteu la nostra Política de llançament i manteniment de l'SDK.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

6/174

Acabatview
Acabatview
Especificacions
Compleix amb la "revisió 2.0 de l'especificació del bus sèrie universal" Implementa la "Notificació de canvi d'enginyeria del descriptor d'associació d'interfície (ECN)" Tipus de transferència
Classes USB d'interrupció massiva de control Classe de dispositiu de comunicació (CDC) Model de control abstracte (ACM) Dispositiu d'interfície humana (HID) Classe d'emmagatzematge massiu (MSC) Marc de classes específic del proveïdor
Característiques
Escalable per incloure només les funcions necessàries per minimitzar l'empremta de memòria Admet velocitat completa (12 Mbit/s) Admet dispositius compostos (multifunció) Admet dispositius de configuració múltiple Admet funcionalitats d'estalvi d'energia USB (suspensió i represa del dispositiu) Integració completa de Mass Storage Class al sistema operatiu Micrium File Mòdul de sistema desenvolupat amb una capa d'abstracció CMSIS-RTOS2 per tal que pugui funcionar amb diferents sistemes operatius. El GSDK de Silicon Labs inclou ports per a sistemes operatius FreeRTOS i Micrium.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

7/174

Acabatview
Acabatview

Configuració del dispositiu USB

En aquesta secció es descriu com configurar el dispositiu USB de Silicon Labs. Hi ha tres grups de paràmetres de configuració, que són els següents:
Configuració principal del dispositiu USB Configuració de la informació del dispositiu USB Configuració del maquinari del dispositiu USB
Configuració del nucli del dispositiu USB
El dispositiu USB de Silicon Labs es pot configurar en temps de compilació mitjançant un conjunt de #defines que es troben a sl_usbd_core_config.h. file. El dispositiu USB utilitza #defines sempre que és possible perquè permeten escalar les mides del codi i les dades en temps de compilació en funció de les funcions que estiguin habilitades. Això permet ajustar l'espai de memòria de només lectura (ROM) i memòria d'accés aleatori (RAM) del dispositiu USB de Silicon Labs en funció dels requisits de l'aplicació.
Recomanat: Inicieu el procés de configuració amb els valors per defecte (ressaltats en negreta).
Les seccions següents estan organitzades segons l'ordre de la configuració de la plantilla file, sl_usbd_core_config.h.
Configuració principal de les classes
Configuració del nucli
Taula: Constants de configuració central del dispositiu USB

Descripció de la constant

Valor per defecte

SL_USBD_TA SK_STACK_ SIZE

Configura la mida de la pila en bytes de la tasca principal USBD.

4096

SL_USBD_TA SK_PRIORITAT Y

Configura la prioritat de la tasca principal de l'USBD. Aquesta és una prioritat de CMSIS-RTOS2.

PrioritatOfertaAlta

SL_USBD_A UTO_START _USB_DEVIC E

Si està habilitat, el dispositiu USB s'iniciarà automàticament un cop s'iniciï el nucli i es planifiqui la tasca del nucli USBD per primera vegada. Si està desactivat, l'aplicació haurà de cridar sl_usbd_core_start_device() quan estigui a punt per ser detectada per l'amfitrió USB.

SL_USBD_C El nombre total de configuracions que s'afegiran mitjançant sl_usbd_add_configuration()

1

Funció CONFIGURATI.

ON_QUANTI

TY

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

8/174

Acabatview

Constant
SL_USBD _INTERF ACE_QU ANTITY
SL_USBD _ALT_INT ERFACE_ QUANTI
TY
SL_USBD _INTERF ACE_GR
OUP_QU
ANTITAT
SL_USBD _DESCRIPCIÓ
PTOR_Q
UANTITAT
SL_USBD _STRING _QUANTI
TY
SL_USBD _OBERTURA_E NDPOIN TS_QUANTITAT

Descripció El nombre total d'interfícies USB que s'afegiran per a totes les vostres configuracions. Això depèn en gran mesura de la classe o classes utilitzades. Per obtenir més informació sobre quantes interfícies requereix una instància de classe, consulteu la secció "Necessitats de recursos del nucli" de la vostra classe o classes.
El nombre total d'interfícies USB alternatives que s'afegiran per a totes les vostres configuracions. Això depèn en gran mesura de la classe o classes utilitzades. Aquest valor sempre ha de ser igual o superior a SL_USBD_INTERFACE_QUANTITY. Per obtenir més informació sobre quantes interfícies alternatives requereix una instància de classe, consulteu la secció "Necessitats de recursos del nucli" de la vostra classe o classes.
El nombre total de grups d'interfície USB que s'afegiran per a totes les vostres configuracions. Això depèn en gran mesura de la classe o classes utilitzades. Per obtenir més informació sobre quants grups d'interfície requereix una instància de classe, consulteu la secció "Recursos necessaris del nucli" de la vostra classe o classes.
El nombre total de descriptors de punts finals que s'afegiran per a totes les vostres configuracions. Això depèn en gran mesura de la classe o classes utilitzades. Per obtenir més informació sobre quants descriptors de punts finals requereix una instància de classe, consulteu "Nombre de punts finals" a la secció "Necessitats de recursos del nucli" de la vostra classe o classes. Tingueu en compte que no cal tenir en compte els punts finals de control aquí. El nombre total de cadenes USB. Si establiu la quantitat a zero, es desactivarà la funció. Si ho desactiveu, el dispositiu no emmagatzemi cap cadena de descripció USB passada des de l'aplicació. Això significa que l'amfitrió no podrà recuperar les cadenes de descripció (com ara el fabricant i el nom del producte). El nombre total de punts finals oberts per configuració. Un dispositiu requereix almenys dos punts finals oberts per a les transferències de control, però també heu d'afegir els punts finals de la classe o classes utilitzades. Per obtenir més informació sobre quants punts finals oberts requereix una instància de classe, consulteu "Nombre de punts finals" a la secció "Necessitats de recursos del nucli" de la vostra classe o classes.

Valor per defecte
10 10
2
20 30 20

Configuració de classes
Les classes tenen configuracions específiques en temps de compilació. Consulteu Classes de dispositius USB per obtenir més informació.
Configuració de la informació del dispositiu USB

La configuració de sl_usbd_device_config.h file reagrupa els #define-s en temps de compilació per establir informació bàsica sobre el dispositiu, com ara l'ID del proveïdor/producte, les cadenes del dispositiu, etc. La taula següent descriu cada configuració d'informació definida disponible en aquesta configuració. file.

Taula: definició de la configuració de la informació del dispositiu USB

Constant
ID_PROVEÏDOR_SECCIONAL_USBD_SL
ID_PRODUCTE_E_DEVIC_USBD_SL

Descripció El vostre número d'identificació del proveïdor, tal com l'ha proporcionat l'USB Implementers Forum. Per obtenir més informació sobre com podeu obtenir un ID de proveïdor, consulteu http://www.usb.org/developers/vendor/. El vostre número d'identificació del producte.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

9/174

Acabatview

Constant

Descripció

SL_USBD_DEVICE_RELEASE Número de llançament del vostre dispositiu. _NUMBER

SL_USBD_DEVICE_MANUFA Cadena que descriu el fabricant del dispositiu. Aquesta configuració s'ignora quan

CTURER_STRING

La configuració SL_USBD_STRING_QUANTITY està establerta a 0.

SL_USBD_DEVICE_PRODUC Cadena que descriu el vostre producte. Aquesta configuració s'ignora quan la configuració

T_STRING

SL_USBD_STRING_QUANTITY està establert a 0.

SL_USBD_DEVICE_SERIAL_N Cadena que conté el número de sèrie del dispositiu. Aquesta configuració s'ignora quan

NUMBER_STRING

La configuració SL_USBD_STRING_QUANTITY està establerta a 0.

SL_USBD_DEVICE_LANGUA Número d'identificació de l'idioma de les cadenes del dispositiu. Els valors possibles són:
GE_ID

– SL_USBD_LANG_ID_ARABIC_Aràbia_Saudí

– SL_USBD_LANG_ID_XINÈS_TAIWAN

– SL_USBD_LANG_ID_ANGLÈS_EUA

– SL_USBD_LANG_ID_ANGLÈS_REG.

– SL_USBD_LANG_ID_FRANCÈS

– SL_USBD_LANG_ID_ALEMANY

– SL_USBD_LANG_ID_GREC

– SL_USBD_LANG_ID_ITALIÀ

– SL_USBD_LANG_ID_PORTUGUÈS

– SL_USBD_LANG_ID_SÀNSCRIT

Aquesta configuració s'ignora quan la configuració SL_USBD_STRING_QUANTITY està definida com a 0.

Configuració del maquinari del dispositiu USB

Depenent del dispositiu Silicon Labs que utilitzeu, possiblement tindreu el pin i el port GPIO per configurar per al senyal USB VBUS Sense. Les definicions de configuració es troben a la capçalera sl_usbd_hardware_config.h. file.

Constant
SL_USBD_DRIVER_VBUS_SENSE_PORT SL_USBD_DRIVER_VBUS_SENSE_PIN

Descripció
Port GPIO per al senyal USB VBUS Sense de la placa. Pin GPIO per al senyal USB VBUS Sense de la placa.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

10/174

Acabatview
Acabatview
Guia de programació de dispositius USB
Aquesta secció explica com utilitzar el mòdul de dispositiu USB.
Configuració inicial del mòdul de dispositiu USB
Aquesta secció descriu els passos bàsics necessaris per inicialitzar el mòdul de dispositiu USB i per afegir, preparar i iniciar un dispositiu. Inicialització del mòdul de dispositiu USB Inicialització del nucli del dispositiu USB Inicialització dels ss(s) aCl Addició del dispositiu USB Creació del dispositiu USB Addició de configuracions Addició de funcions USB Inici del dispositiu USB
Funcions d'enganxament d'esdeveniments
Inicialització del mòdul de dispositiu USB
Inicialització del nucli del dispositiu USB
Comenceu inicialitzant el nucli del mòdul del dispositiu B cridant la funció sl_usbd_core_init(). L'exemple següent mostra com cridar sl_usbd_core_init().
Example – Crida a sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}
Inicialització de la classe o classes
Després d'inicialitzar el nucli del mòdul de dispositiu USB, heu d'inicialitzar cada classe que vulgueu utilitzar. Vegeu la secció "Guia de programació" de les vostres instruccions d'accés (ss) per obtenir més informació.
Muntatge del dispositiu USB
Afegir configuració(ns)
Després d'inicialitzar correctament el dispositiu, podeu començar a afegir-hi les funcions USB, començant amb una nova configuració. Un dispositiu ha de tenir com a mínim una configuració. Per afegir una o més configuracions, crideu la funció sl_usbd_core_dd_configuration(). Aquesta funció s'ha de cridar per a cada configuració que vulgueu afegir. L'exampA continuació es mostra com afegir una velocitat completa.
Example – Afegir configuració(ns) al dispositiu

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

11/174

Acabatview

sl_status_t estat; uint8_t config_nbr_fs;

/* Afegint una configuració de velocitat completa al dispositiu. */

estat = sl_usbd_core_add_configuration(0,

/* No hi ha atributs especials a la configuració. */

100u,

/* Consum màxim d'energia: 100 mA.

*/

SL_USBD_DEVICE_SPEED_FULL,

/* Configuració a velocitat completa.

*/

"Configuració Afegeix Ex"ampla configuració de velocitat completa",

&config_nbr_fs);

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

Afegir funcions USB
Després d'afegir correctament com a mínim una configuració al dispositiu, podeu afegir-hi les interfícies i els punts finals. Cada classe USB té les seves pròpies necessitats pel que fa al tipus d'interfície i punts finals, la quantitat i altres paràmetres. El dispositiu USB de Silicon Labs afegeix interfícies i punts finals a les classes que ofereix.
Des de l'aplicació, podeu instanciar una classe USB i afegir-la a una configuració. Per obtenir més informació sobre el concepte d'instàncies de classe de dispositiu USB, consulteu Classes de dispositiu USB. Tingueu en compte que podeu instanciar i afegir moltes instàncies de classe diferents a una configuració per crear un dispositiu multifunció (compost).
L'exampLa següent imatge mostra com crear una instància de classe i afegir-la a una configuració.
Example – Afegir una instància de classe al dispositiu

sl_status_t estat; uint8_t número_de_classe;
/* Crea una instància de la classe que vols utilitzar.*/ /* Tingues en compte que, depenent de la classe, aquesta funció pot tenir més arguments. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */ }
/* Afegeix la instància de la classe a la configuració de velocitat completa. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Número de classe retornat per sl_usbd_ _crea_instància. */
config_nbr_fs); /* Número de configuració retornat per sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */ }
Inici del dispositiu USB
Per defecte, el dispositiu s'iniciarà automàticament mitjançant la tasca principal del dispositiu USB després que es completi la inicialització del dispositiu i s'iniciï el nucli. Per controlar quan s'inicia el dispositiu i esdevé visible per l'amfitrió USB, utilitzeu la configuració definida SL_USBD_AUTO_START_USB_DEVICE per desactivar la funció d'inici automàtic. Quan està desactivada, després d'haver creat/preparat el dispositiu, podeu iniciar-lo i fer-lo visible per a l'amfitrió USB cridant la funció sl_usbd_core_start_device().
L'exampA continuació es mostra com iniciar el dispositiu amb la funció sl_usbd_core_start_device().
Example – Inici del dispositiu

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

12/174

Acabatview

sl_status_t estat;
status = sl_usbd_core_start_device(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */ }

Funcions d'enganxament d'esdeveniments
El mòdul principal del dispositiu USB ofereix dues funcions d'enganxament febles que podeu redefinir a l'aplicació. El seu propòsit és notificar quan es produeixen esdeveniments de bus i configuració.
Taula: Funcions de ganxo d'esdeveniments USB

Esdeveniment

Descripció

Autobús

Es crida quan es produeix un esdeveniment de bus USB

Configuració cridada quan es produeix un esdeveniment de configuració USB

Signatura de funció
void sl_usbd_on_bus_event(esdeveniment sl_usbd_bus_event_t); void sl_usbd_on_config_event(esdeveniment sl_usbd_config_event_t, uint8_t config_nbr);

Example – Funcions de ganxo d'esdeveniments

void sl_usbd_on_bus_event(sl_usbd_bus_event_t esdeveniment) { commutador (esdeveniment) { cas SL_USBD_EVENT_BUS_CONNECT:
// cridat quan s'insereix un cable USB en un break del controlador amfitrió;
case SL_USBD_EVENT_BUS_DISCONNECT: // cridat quan es treu el cable USB d'una controladora amfitriona break;
case SL_USBD_EVENT_BUS_RESET: // cridat quan l'amfitrió envia l'ordre de reset break;
case SL_USBD_EVENT_BUS_SUSPEND: // cridat quan l'amfitrió envia l'ordre de suspensió break;
case SL_USBD_EVENT_BUS_RESUME: // cridat quan l'amfitrió envia l'ordre de despertador break;
per defecte: break; } }
void sl_usbd_on_config_event(sl_usbd_config_event_t esdeveniment, uint8_t config_nbr) { commutador (esdeveniment) { cas SL_USBD_EVENT_CONFIG_SET:
// cridat quan l'amfitrió estableix una interrupció de configuració;
case SL_USBD_EVENT_CONFIG_UNSET: // cridat quan una configuració no està definida break;
per defecte: break; } }

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

13/174

Acabatview

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

14/174

Acabatview
Acabatview

Classes de dispositius USB

Les classes USB disponibles a Silicon Labs USB Device comparteixen algunes característiques comunes. Aquesta secció explica aquestes característiques i les seves interaccions amb la capa central.
Per obtenir més informació sobre una classe específica, consulteu el següent:
Classe CDC ACM Classe HID Classe MSC SCSI Classe de proveïdor
Sobre les instàncies de classe
Les classes USB disponibles a USB Device implementen el concepte d'instàncies de classe. Una instància de classe representa una funció dins d'un dispositiu. La funció es pot descriure mitjançant una interfície o un grup d'interfícies i pertany a una classe específica.
Cada implementació de classe USB té algunes configuracions i funcions en comú, basades en el concepte d'instància de classe. Les configuracions i funcions comunes es presenten a la taula següent. Al títol de la columna "Constants o funció", el marcador de posició XXXX es pot substituir pel nom de la classe: CDC, HID, MSC, CDC_ACM o VENDOR (Vendor per a noms de funcions).
Taula: Constants i funcions relacionades amb el concepte d'instàncies de classe múltiple

Constant o funció
SL_USBD_XXXX_CL ASS_INST TANCE_QUANTITY
SL_USBD_XXXX_CONFIGUR ATION_QUANTITY
sl_usb d _XXXX_crea _instancia ()
sl_usbd_XXXX_add_to_conf iguration()

Descripció
Configura el nombre màxim d'instàncies de classe.
Configura el nombre màxim de configuracions. Durant la inicialització de la classe, una instància de classe creada s'afegirà a una o més configuracions. Crea una nova instància de classe.
Afegeix una instància de classe existent a la configuració del dispositiu especificada.

Pel que fa a la implementació del codi, la classe declararà una variable global local que conté una estructura de control de classe. Aquesta estructura de control de classe està associada a una instància de classe i contindrà informació específica per gestionar la instància de classe.
Les figures següents mostren diversos casos pràctics. Cada figura inclou un codi ex.ampque correspon a l'escenari del cas.
Figura – Instàncies de classe múltiple – El dispositiu FS (1 configuració amb 1 interfície) representa un dispositiu USB típic. El dispositiu és de velocitat completa (FS) i conté una única configuració. La funció del dispositiu es descriu mitjançant una interfície composta per un parell de punts finals per a la comunicació de dades. Es crea una instància de classe que us permetrà gestionar tota la interfície amb el seu punt final associat.
Figura – Instàncies de classe múltiple – Configuració del dispositiu FS 1 amb 1 interfície)

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

15/174

Acabatview

El codi corresponent a la Figura – Instàncies de classe múltiple – Dispositiu FS (1 configuració amb 1 interfície) es mostra a l'exempleampel més avall.
Example – Instàncies de classe múltiple – Configuració del dispositiu FS 1 amb 1 interfície)

sl_status_t estat; uint8_t classe_0;

void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Gestiona l'esdeveniment d'habilitació de classe. */ }

void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Gestiona l'esdeveniment de desactivació de la classe. */ }

sl_usbd_XXXX_callbacks_t class_callbacks = {

(1)

.enable = app_usbd_XXXX_enable,

.disable = app_usbd_XXXX_disable

};

estat = sl_usbd_XXXX_init();

(2)

si (estat ! SL_STATUS_OK) {

/* $$$$ Gestiona l'error. */

}

estat = sl_usbd_XXXX_create_instance(&class_callbacks,

(3)

&class_0);

si (estat ! SL_STATUS_OK) {

/* $$$$ Gestiona l'error. */

}

estat = sl_usbd_XXXX_add_to_configuration(classe_0, config_0);

(4)

si (estat ! SL_STATUS_OK) {

/* $$$$ Gestiona l'error. */

}

(1) Cada classe ofereix un conjunt de funcions de callback per a esdeveniments de connexió/desconnexió de dispositius i per a esdeveniments específics de la classe. L'objecte d'estructura de callback es passa com a argument en crear la instància de la classe amb sl_usbd_XXXX_create_instance()
funció.
(1) Inicialitzeu la classe. S'inicialitzaran totes les variables internes, estructures i ports de classe. Tingueu en compte que la funció Init() en algunes classes pot acceptar altres arguments.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

16/174

Acabatview
(2) Creeu la instància de classe, que és class_0. La funció sl_usbd_XXXX_create_instance() assigna una estructura de control de classe associada amb class_0. Depenent de la classe, sl_usbd_XXXX_create_instance() pot tenir paràmetres addicionals a part del número de classe que representen informació específica de la classe emmagatzemada a l'estructura de control de classe. aaa (3) Afegiu la instància de classe, class_0, al número de configuració especificat, config_0. sl_usbd_XXXX_add_to_configuration() crearà la interfície 0 i els seus punts finals d'entrada i sortida associats. Com a resultat, la instància de classe engloba la interfície 0 i els seus punts finals. Qualsevol comunicació realitzada a la interfície 0 utilitzarà el número d'instància de classe, class_0. Figura: instàncies de classe múltiples: el dispositiu FS (2 configuracions i interfícies múltiples) representa un exemple més complex.ampÉs a dir, un dispositiu de velocitat completa està compost de dues configuracions. El dispositiu té dues funcions que pertanyen a la mateixa classe, però cada funció es descriu mitjançant dues interfícies i té un parell de punts finals bidireccionals. En aquest exempleampÉs a dir, es creen dues instàncies de classe. Cada instància de classe s'associa amb un grup d'interfícies, a diferència de la Figura – Instàncies de classe múltiples – Dispositiu FS (1 configuració amb 1 interfície) i la Figura – Instàncies de classe múltiples – Dispositiu FS (2 configuracions i interfícies múltiples), on la instància de classe s'associava amb una única interfície.
Figura – Instàncies de classe múltiple – Configuracions del dispositiu FS 2 i interfícies múltiples)

El codi corresponent a la Figura – Instàncies de classe múltiple – Dispositiu FS (2 configuracions i interfícies múltiples) es mostra a l'exempleampa continuació. La gestió d'errors s'omet per a més claredat.
Example – Instàncies de classe múltiple – Configuracions del dispositiu FS 2 i interfícies múltiples)

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

17/174

Acabatview

sl_status_t estat; uint8_t classe_0; uint8_t classe_1;
estat = sl_usbd_XXXX_init();
estat = sl_usbd_XXXX_create_instance(&class_0); estat = sl_usbd_XXXX_create_instance(&class_1);
estat = sl_usbd_XXXX_add_to_configuration(classe_0, cfg_0); estat = sl_usbd_XXXX_add_to_configuration(classe_1, cfg_0);
estat = sl_usbd_XXXX_add_to_configuration(classe_0, cfg_1); estat = sl_usbd_XXXX_add_to_configuration(classe_1, cfg_1);

(1)
(2) (3)
(4) (5)
(6) (6)

(1) Inicialitzeu la classe. S'inicialitzaran totes les variables, estructures i ports de classe interns.
(2) Creeu la instància de classe, class_0. La funció sl_usbd_XXXX_create_instance() assigna una estructura de control de classe associada amb class_0.
(3) Creeu la instància de classe, class_1. La funció sl_usbd_XXXX_create_instance() assigna una altra estructura de control de classe associada amb class_1.
(4) Afegiu la instància de classe, class_0, a la configuració, cfg_0. sl_usbd_XXXX_add_to_configuration() crearà la interfície 0, la interfície 1, les interfícies alternatives i els punts finals d'entrada i sortida associats. El número d'instància de classe, class_0, s'utilitzarà per a qualsevol comunicació de dades a la interfície 0 o a la interfície 1.
(5) Afegiu la instància de classe, class_1, a la configuració, cfg_0. sl_usbd_XXXX_add_to_configuration() crearà la interfície 2, la interfície 3 i els seus punts finals d'entrada i sortida associats. El número d'instància de classe, class_1, s'utilitzarà per a qualsevol comunicació de dades a la interfície 2 o a la interfície 3.
(6) Afegiu les mateixes instàncies de classe, class_0 i class_1, a l'altra configuració, cfg_1.
Cada classe defineix una estructura de tipus sl_usbd_XXXX_callbacks_t. El seu propòsit és donar a cada classe un conjunt de funcions de callback que s'han de cridar quan es produeix un esdeveniment. Hi ha dues funcions de callback presents a cada classe. Es presenten a la taula següent.
Taula: Funcions de retrollamada de classe comunes

Camps Descripció .enable Es crida quan la instància de classe USB s'habilita correctament. .disable Es crida quan la instància de classe USB està desactivada.

Signatura de la funció void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

18/174

Acabatview
Acabatview
Dispositiu USB CDC Classe ACM
Dispositiu USB CDC Classe Base Overview Necessitats de recursos de la classe CDC ACM del dispositiu USB del nucli Subclasse CDC ACM del dispositiu USBview Configuració de la classe CDC ACM del dispositiu USB Guia de programació de la classe CDC ACM del dispositiu USB
Aquesta secció descriu la classe Communications Device Class (CDC) i la subclasse CDC associada compatible amb la pila USB Device de Silicon Labs. Actualment, USB-Device de Silicon Labs admet la subclasse Abstract Control Model (ACM), que s'utilitza habitualment per a l'emulació sèrie.
El CDC inclou diversos dispositius de telecomunicacions i xarxes. Els dispositius de telecomunicacions inclouen mòdems analògics, telèfons analògics i digitals, adaptadors de terminal RDSI, etc. Per exempleampÉs a dir, els dispositius de xarxa contenen mòdems ADSL i per cable, adaptadors Ethernet i concentradors. Els CDC defineixen un marc per encapsular els estàndards de serveis de comunicació existents, com ara V.250 (per a mòdems a través de la xarxa telefònica) i Ethernet (per a dispositius de xarxa d'àrea local), mitjançant un enllaç USB. Un dispositiu de comunicació s'encarrega de la gestió de dispositius, la gestió de trucades quan cal i la transmissió de dades.
El CDC defineix set grups principals de dispositius. Cada grup pertany a un model de comunicació, que pot incloure diverses subclasses. Cada grup de dispositius té el seu propi document d'especificació a més de la classe base del CDC. Els set grups són:
Xarxa telefònica pública commutada (PSTN), dispositius que inclouen mòdems de banda de veu, telèfons i dispositius d'emulació sèrie. Dispositius de xarxa digital de serveis integrats (XDSI), inclosos adaptadors de terminal i telèfons. Dispositius del model de control Ethernet (ECM), inclosos dispositius compatibles amb la família IEEE 802 (per exemple: mòdems de cable i ADSL, adaptadors WiFi). Dispositius de mode de transferència asíncrona (ATM), inclosos mòdems ADSL i altres dispositius connectats a xarxes ATM (estacions de treball, encaminadors, commutadors LAN). Dispositius de comunicacions mòbils sense fil (WMC), inclosos dispositius de comunicacions multifunció utilitzats per gestionar les comunicacions de veu i dades. Dispositius del model d'emulació Ethernet (EEM) que intercanvien dades enquadernades per Ethernet. Dispositius del model de control de xarxa (NCM), inclosos dispositius de xarxa d'alta velocitat (mòdems d'accés a paquets d'alta velocitat, equips terminals de línia).
El CDC i la implementació de la subclasse associada compleixen les especificacions següents:
Bus sèrie universal, definicions de classe per a dispositius de comunicació, revisió 1.2, 3 de novembre de 2010. Bus sèrie universal, comunicacions, subclasse per a dispositius PSTN, revisió 1.2, 9 de febrer de 2007.
Dispositiu USB CDC Classe Base Overview
Un dispositiu CDC està compost per les següents interfícies per implementar la capacitat de comunicació:
La interfície de classe de comunicació (CCI) és responsable de la gestió de dispositius i, opcionalment, de la gestió de trucades.
La gestió de dispositius permet la configuració i el control generals del dispositiu i la notificació d'esdeveniments a l'amfitrió. La gestió de trucades permet l'establiment i la finalització de trucades. La gestió de trucades es pot multiplexar a través d'un DCI. Un CCI és obligatori per a tots els dispositius CDC. Identifica la funció CDC especificant el model de comunicació compatible amb el dispositiu CDC. La interfície o interfícies que segueixen el CCI poden ser qualsevol interfície de classe USB definida, com ara àudio o una interfície específica del proveïdor. La interfície específica del proveïdor està representada específicament per un DCI.
La interfície de classe de dades (DCI) és responsable de la transmissió de dades. Les dades transmeses i/o rebudes no segueixen un criteri específic.
format. Les dades poden ser dades en brut d'una línia de comunicació, dades que segueixen un format propietari, etc. Tots els DCI que segueixen el CCI es poden veure com a interfícies subordinades.
Un dispositiu CDC ha de tenir com a mínim un CCI i zero o més DCI. Un CCI i qualsevol DCI subordinat proporcionen junts una funció a l'amfitrió. Aquesta capacitat també es coneix com a funció. En un dispositiu compost CDC, podeu tenir diversos

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

19/174

Acabatview
funcions. Per tant, el dispositiu estaria compost per diversos conjunts de CCI i DCI(s) tal com es mostra a la Figura – Dispositiu compost CDC.
Figura – Dispositiu compost dels CDC

És probable que un dispositiu dels CDC utilitzi la combinació de punts finals següent:
Un parell de punts finals d'entrada i sortida de control anomenats punts final per defecte. Un punt final d'entrada en bloc o d'interrupció opcional. Un parell de punts finals d'entrada i sortida en bloc o isòcron. Tingueu en compte que la pila de dispositius USB de Silicon Labs actualment no admet punts finals isòcron.
La taula següent mostra l'ús dels diferents punts finals i la interfície del CDC mitjançant la qual s'utilitzen.
Taula: Ús del punt final dels CDC

Punt final
Control IN
Control OUT
Interrupció o entrada en bloc Entrada en bloc o isòcrona
FORA

Direcció
Dispositiu-amfitrió
Host-to-dispositiu
Dispositiu-amfitrió
Dispositiu-amfitrió
Host-to-dispositiu

Ús de la interfície

CCI

Sol·licituds estàndard d'enumeració, sol·licituds específiques de classe, dispositiu

gestió i, opcionalment, gestió de trucades.

CCI

Sol·licituds estàndard d'enumeració, sol·licituds específiques de classe, dispositiu

gestió i, opcionalment, gestió de trucades.

CCI

Notificació d'esdeveniments, com ara detecció de timbre, estat de la línia sèrie, estat de la xarxa.

DCI

Comunicació de dades en brut o formatades.

DCI

Comunicació de dades en brut o formatades.

La majoria de dispositius de comunicació utilitzen un punt final d'interrupció per notificar els esdeveniments a l'amfitrió. Els punts finals isòcrons no s'han d'utilitzar per a la transmissió de dades quan un protocol propietari es basa en la retransmissió de dades en cas d'errors del protocol USB. La comunicació isòcrona pot perdre dades de manera inherent, ja que no té mecanismes de reintent.
Els set models principals de comunicació engloben diverses subclasses. Una subclasse descriu la manera com el dispositiu ha d'utilitzar el CCI per gestionar la gestió del dispositiu i la gestió de trucades. La taula següent mostra totes les possibles subclasses i el model de comunicació al qual pertanyen.
Taula – Subclasses de CDC

Subclasse
Model de control de línia directa Model de control abstracte

Model de comunicació
PSTN
PSTN

Exampel nombre de dispositius que utilitzen aquesta subclasse
Dispositius de mòdem controlats directament per l'amfitrió USB
Dispositius d'emulació sèrie, dispositius de mòdem controlats mitjançant un conjunt d'ordres sèrie

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

20/174

Acabatview

Subclasse

Model de comunicació

Exampel nombre de dispositius que utilitzen aquesta subclasse

Model de control telefònic

PSTN

Model RDSI de control multicanal

Model de control CAPI ISDN

Model de control ECM de xarxa Ethernet

Xarxa de caixers automàtics

caixer automàtic

Model de control

Model de control de telèfon sense fil

WMC

Gestió de dispositius WMC

Model de línia directa mòbil

WMC

OBEX

WMC

Model EEM d'emulació Ethernet

Model de control de xarxa

NCM

dispositius de telefonia de veu
Adaptadors de terminal de tarifa bàsica, adaptadors de terminal de tarifa primària, telèfons
Adaptadors de terminal de tarifa bàsica, adaptadors de terminal de tarifa primària, telèfons, mòdems de cable DOC-SIS, mòdems ADSL que admeten l'emulació PPPoE, adaptadors Wi-Fi (família IEEE 802.11), adaptadors IEEE 802.3, mòdems ADSL
Equips terminals mòbils que es connecten a dispositius sense fil
Equip terminal mòbil que es connecta a dispositius sense fil Equip terminal mòbil que es connecta a dispositius sense fil
Equips terminals mòbils que es connecten a dispositius sense fil Dispositius que utilitzen trames Ethernet com a següent capa de transport. No està pensat per a dispositius d'encaminament i connectivitat a Internet Adaptadors IEEE 802.3 que transporten amplada de banda de dades d'alta velocitat a la xarxa

Necessitats de recursos de la classe CDC ACM del dispositiu USB del nucli

Cada vegada que afegiu una instància de classe CDC ACM a una configuració USB mitjançant una crida a la funció sl_usbd_cdc_acm_add_to_configuration(), els recursos següents s'assignaran des del nucli.

Recurs
Interfícies Interfícies alternatives Punts finals Grups d'interfícies

Quantitat
2 2 3 1

Tingueu en compte que aquests números són per configuració. Quan configureu els valors de configuració SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY i SL_USBD_DESCRIPTOR_QUANTITY, no us oblideu de tenir en compte quantes configuracions s'afegiran a la classe. Pel que fa al valor de configuració SL_USBD_OPEN_ENDPOINTS_QUANTITY, com que els punts finals només s'obren quan l'amfitrió defineix una configuració, només cal tenir en compte el nombre de punts finals necessaris per a una instància de classe.
Subclasse CDC ACM del dispositiu USB sobreview

La classe base CDC està composta per una interfície de classe de comunicació (CCI) i una interfície de classe de dades (DCI), que es discuteix en detall a USB Device CDC Base Class Over.view Aquesta secció tracta un CCI de tipus ACM. Consta d'un punt final per defecte per a l'element de gestió i un punt final d'interrupció per a l'element de notificació. S'utilitza un parell de punts finals en bloc per transportar dades no especificades a través del DCI.
La subclasse ACM és utilitzada per dos tipus de dispositius de comunicació:
Dispositius que admeten ordres AT (per exemple, mòdems de banda de veu). Dispositius d'emulació sèrie que també s'anomenen dispositius de port COM virtual.
Hi ha diverses sol·licituds específiques de subclasse per a la subclasse ACM. Permeten controlar i configurar el dispositiu. La llista completa i la descripció de totes les sol·licituds ACM es poden trobar a l'especificació.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

21/174

Acabatview Subclasse per a dispositius PSTN, revisió 1.2, 9 de febrer de 2007=, secció 6.2.2.
D'aquesta llista, la subclasse ACM de Silicon Labs9 admet el següent:
Taula: sol·licituds ACM compatibles amb Silicon Labs

Descripció de la sol·licitud de subclasse

SetCommFeature GetCommFeature ClearCommFeature

L'amfitrió envia aquesta sol·licitud per controlar la configuració d'una funció de comunicacions determinada. No s'utilitza per a l'emulació en sèrie.
L'amfitrió envia aquesta sol·licitud per obtenir la configuració actual d'una funció de comunicacions determinada. No s'utilitza per a l'emulació en sèrie.
L'amfitrió envia aquesta sol·licitud per esborrar la configuració d'una funció de comunicacions determinada. No s'utilitza per a l'emulació en sèrie.

Codificació de línies de joc

L'amfitrió envia aquesta sol·licitud per configurar els paràmetres del dispositiu ACM: velocitat de transmissió, nombre de bits d'aturada, tipus de paritat i nombre de bits de dades. Per a una emulació sèrie, aquesta sol·licitud s'envia automàticament per un terminal sèrie cada vegada que configureu els paràmetres sèrie per a un port COM virtual obert.

GetLineCoding

L'amfitrió envia aquesta sol·licitud per obtenir la configuració actual de l'ACM (velocitat en bauds, bits d'aturada, paritat, bits de dades). Per a una emulació sèrie, els terminals sèrie envien aquesta sol·licitud automàticament durant l'obertura del port COM virtual.

SetControlLineState L'amfitrió envia aquesta sol·licitud per controlar la portadora per a mòdems semidúplex i indicar si l'equip terminal de dades (DTE) està a punt o no. En el cas de l'emulació en sèrie, el DTE és un terminal en sèrie. Per a una emulació en sèrie, certs terminals en sèrie permeten enviar aquesta sol·licitud amb els controls configurats.

SetBreak

L'amfitrió envia aquesta sol·licitud per generar una pausa d'estil RS-232. Per a una emulació sèrie, certs terminals sèrie permeten enviar aquesta sol·licitud.

La subclasse ACM de Silicon Labs9 utilitza el punt final d'interrupció IN per notificar a l'amfitrió l'estat actual de la línia sèrie. La línia sèrie
L'estat de la línia és un mapa de bits que informa a l'amfitrió sobre:

Dades descartades a causa d'un sobreeiximent Error de paritat Error d'enquadrament Estat de la detecció del senyal d'anell Estat del mecanisme de detecció de ruptures Estat de la portadora de transmissió Estat de la detecció de la portadora del receptor

La implementació de la subclasse ACM de Silicon Labs9 compleix amb l'especificació següent:
Bus sèrie universal, comunicacions, subclasse per a dispositius PSTN, revisió 1.2, 9 de febrer de 2007.
Configuració de la classe CDC ACM del dispositiu USB

En aquesta secció es descriu com configurar la classe ACM (classe de dispositiu de comunicació, model de control abstracte) de CDC. Hi ha dos grups de paràmetres de configuració:
Configuracions específiques de l'aplicació de la classe CDC ACM del dispositiu USB Configuracions d'instància de la classe CDC ACM del dispositiu USB
Configuracions específiques de l'aplicació de la classe CDC ACM del dispositiu USB

Subclasse ACM de la classe base dels CDC
Classe bàsica dels CDC

Primer, per utilitzar el mòdul de classe CDC del dispositiu USB de Silicon Labs, haureu d'ajustar la configuració de compilació del CDC #define-s segons les necessitats de l'aplicació. Estan reagrupades dins de la capçalera sl_usbd_core_config.h. file a la secció CDC. El seu propòsit és informar al mòdul de dispositiu USB sobre quants objectes CDC USB ha d'assignar.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

22/174

Acabatview

La taula següent descriu cada camp de configuració disponible en aquesta estructura de configuració.
Taula: definició de la configuració del CDC per a dispositius USB

Nom de la configuració
SL_USBD_CDC_CL COM A QUANTITAT_INSTÀNCIA
SL_USBD_CDC_CONF IGURACIÓ_QUANTITA
TY
SL_USBD_CDC_DATA _INTERFÍCIE_QUANTI
TY

Descripció
Nombre d'instàncies de classe que assignareu mitjançant una crida a la funció
sl_usbd_cdc_acm_create_instance().
Nombre de configuracions. Es poden afegir instàncies de la classe ACM a una o més configuracions aaaa, afegint-les a sl_usbd_cdc_acm_add_to_configuration().
Nombre total d'interfícies de dades (DCI) per a totes les funcions CDC. Cada funció CDC ACM afegida a la funció sl_usbd_cdc_acm_create_instance() afegirà una interfície de dades.

Valor per defecte
2
1
2

Subclasse ACM
La subclasse ACM té una configuració en temps de compilació que es mostra a la taula següent.
Taula: Definició de la configuració CDC ACM del dispositiu USB

Nom de la configuració
SL_USBD_CDC_ACM_SUBCL ASS_INSTANCE_QUANTITY

Descripció
Configura el nombre d'instàncies de subclasse que assignareu mitjançant una crida a
funció sl_usbd_cdc_acm_create_instance().

Valor per defecte
2

Configuracions d'instància de classe CDC ACM del dispositiu USB

Aquesta secció defineix les configuracions relacionades amb les instàncies de classe sèrie ACM de CDC. Creació d'instàncies de classe interval d'estat de línia capacitats de gestió de crides p_acm_callbacks
Creació d'instàncies de classe

Per crear una instància de classe sèrie CDC ACM, crideu la funció Ta sl_usbd_cdc_acm_create_instance(). Aquesta funció té tres arguments de configuració, tal com es descriu aquí.

interval_d'estat_línia
Aquest és l'interval (en mil·lisegons) en què la instància de la classe sèrie CDC ACM informarà de les notificacions d'estat de la línia a l'amfitrió T aa. Aquest valor ha de ser una potència de dos (1, 2, 4, 8, 16, etc.).

capacitats_de_gestió_de_crides
Mapa de bits de les capacitats de gestió de trucades. Els valors possibles del mapa de bits són els següents:

Valor (bit)
SL_USBD_ACM_SERIAL_CALL_MGMT_DEV
SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI _DCI

Descripció
El dispositiu gestiona la gestió de trucades per si mateix. El dispositiu pot enviar/rebre informació de gestió de trucades a través d'una interfície de classe de dades.

p_acm_callbacks

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

23/174

Acabatview

`p_acm_callbacks` és un punter a una estructura de tipus sl_usbd_cdc_acm_callbacks_t. El seu propòsit és proporcionar al CDC AC Clss un conjunt de funcions de callback que s'han de cridar quan es produeix un esdeveniment CDC ACM. No totes les callbacks són obligatòries i es pot passar un punter nul (NULL) a la variable d'estructura callbacks quan la callback no és necessària. La taula següent descriu cada camp de configuració disponible en aquesta estructura de configuració.
Taula – Estructura de configuració de sl_usbd_cdc_acm _callbacks_t

Camps

Descripció

.habilitar

Es crida quan la instància de la classe USB està habilitada

amb èxit.

.desactivar

Es crida quan la instància de la classe USB està desactivada.

.line_control_changed Es crida quan es rep un canvi de control de línia.

line_coding_changed Es crida quan es rep un canvi de codificació de línia.

Signatura de funció
void app_usbd_cdc_acm_enable(uint8_t subclasse_nbr);
void app_usbd_cdc_acm_disable(uint8_t subclasse_nbr);
void app_usbd_cdc_acm_line_control_changed(uint8_t subclass_nbr, uint8_t event, uint8_t event_chngd); bool app_usbd_cdc_acm_line_coding_changed(uint8_t subclass_nbr, subclass_nbr, sl_usbd_cdc_acm_line_coding_t
*p_line_coding

Vegeu la secció Registre de retrollamades de notificació d'esdeveniments per a les funcions de retrollamada, p. ex.ample.
Guia de programació de la classe CDC ACM per a dispositius USB

Aquesta secció explica com utilitzar la classe CDC Abstract Control Model. Inicialització de la classe CDC ACM del dispositiu USB Afegir una instància de la classe CDC ACM del dispositiu USB al dispositiu Comunicació mitjançant la classe CDC ACM
Inicialització del dispositiu USB de la classe CDC ACM

Per afegir la funcionalitat de la classe CDC ACM al vostre dispositiu, primer heu d'inicialitzar la classe base CDC i la subclasse ACM executant les funcions sl_usbd_cdc_init() i sl_usbd_cdc_acm_init(). L'exemple següent mostra com cridar sl_usbd_cdc_init() i sl_usbd_cdc_acm_init() utilitzant arguments per defecte.

Example – Inicialització de la classe CDC ACM

sl_status_t estat;
status = sl_usbd_cdc_init(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}
status = sl_usbd_cdc_acm_init(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}
Afegir una instància de classe CDC ACM de dispositiu USB al dispositiu
Per afegir la funcionalitat de la classe CDC ACM al dispositiu, heu de crear una instància i, a continuació, afegir-la a la configuració del dispositiu.
Creació d'una instància de classe CDC ACM

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

24/174

Acabatview
Afegir la instància de classe CDC ACM a la configuració del dispositiu Registrar retrollamades de notificació d'esdeveniments
Creació d'una instància de classe CDC ACM
Creeu la instància de classe CDC AC mitjançant la funció sl_usbd_cdc_acm_create_instance(). L'exemple següent mostra com crear la instància de classe CDC AC mitjançant sl_usbd_cdc_acm_create_instance().
Example – Creació d'una funció CDC ACM mitjançant sl_usbd_cdc_acm_create_instance()

uint8_t subclass_nbr; sl_status_t estat;
estat = sl_usbd_cdc_acm_create_instance(64u, SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI | SL_USBD_ACM_SERIAL_CALL_MGMT_DEV, NULL, &subclass_nbr);
if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}
Afegir la instància de classe CDC ACM a la configuració del dispositiu
Després de crear una instància de classe CDC ACM, podeu afegir-la a una configuració cridant la funció
sl_usbd_cdc_acm_add_to_configuration().
L'exemple següent mostra com cridar sl_usbd_cdc_acm_add_to_configuration().
Example – Crida a USBD ACM sl_usbd_cdc_acm_add_to_configuration()

sl_status_t estat;

estat = sl_usbd_cdc_acm_add_to_configuration(número_de_subclasse,

(1)

config_nbr_fs);

(2)

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

aaa (1) Número de classe ss que s'afegirà a la configuració retornada per sl_usbd_cdc_acm_create_instance(). (2) Número de configuració (aquí afegint-lo a una configuració de velocitat completa).
Registre de retrollamades de notificació d'esdeveniments
La classe CDC ACM Serial pot notificar a la vostra aplicació qualsevol canvi en el control de línia o la codificació mitjançant funcions de notificació de retorn de trucada. Es pot passar una estructura de funcions de retorn de trucada com a argument durant la creació de la instància ACM. Tingueu en compte que aquestes retorns de trucada són opcionals. Ex.ample – El registre de retrollamades CDC ACM il·lustra l'ús de les funcions de registre de retrollamades. Ex.ample – La implementació de retrollamades ACM de CDC mostra un exempleampd'implementació de les funcions de callback.
Example – Registre de retrollamades CDC ACM

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

25/174

Acabatview

uint8_t subclass_nbr; sl_status_t estat;
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, };
estat = 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);
si (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */ }
Example – Implementació de retrollamades ACM de CDC

bool app_usbd_cdc_acm_line_coding_changed (uint8_t

subclasse_nbr,

sl_usbd_cdc_acm_line_coding_t *p_line_coding)

{

uint32_t velocitat_en bauds_nova;

uint8_t paritat_nova;

uint8_t stop_bits_new;

uint8_t bits_de_dades_nous;

/* TODO Aplica la nova codificació de línia.*/ 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;

retorna (cert);

(1)

}

void app_usbd_cdc_acm_line_control_changed (uint8_t subclass_nbr, uint8_t event, uint8_t event_changed)
{ bool rts_state; bool rts_state_changed; bool dtr_state; bool dtr_state_changed; bool brk_state; bool brk_state_changed;

/* TODO Aplica el control de nova línia. */ rts_state = ((event & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? true : false; rts_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_RTS) ! 0) ? true : false; dtr_state = ((event & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? true : false; dtr_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_DTR) ! 0) ? true : false; brk_state = ((event & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? true : false; brk_state_changed = ((event_changed & SL_USBD_CDC_ACM_CTRL_BREAK) ! 0) ? true : false;
}

(1) És important retornar fals a aquesta funció si l'aplicació de la codificació de línia ha fallat. En cas contrari, retorna true.
Comunicació mitjançant la classe ACM de CDC
Estat de sèrie
Codificació de línia Control de línia

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

26/174

Acabatview

Comunicació d'instància de subclasse d'estat de línia
Estat de sèrie
Codificació de línies
L'amfitrió USB controla la codificació de línia (velocitat en bauds, paritat, etc.) del dispositiu CDC ACM. Quan cal, l'aplicació és responsable de configurar la codificació de línia. Hi ha dues funcions proporcionades per recuperar i configurar la codificació de línia actual, tal com es descriu a la taula següent.
Taula: Funcions de codificació de línia CDC ACM

Funció
sl_usbd_cdc_acm_g e t_line _co d ing ()
sl_usbd_cdc_acm_s e t_line _co d ing ()

Descripció
L'aplicació pot obtenir la configuració actual de la codificació de línia des de l'amfitrió amb sol·licituds SetLineCoding o amb la funció sl_usbd_cdc_acm_set_line_coding().
L'aplicació pot definir la codificació de línia. L'amfitrió pot recuperar la configuració amb la sol·licitud GetLineCoding.

Control de línia
L'amfitrió USB controla el control de línia (pins RTS i DTR, senyal de ruptura, etc.) del dispositiu CDC ACM. Quan cal, l'aplicació és responsable d'aplicar els controls de línia. Es proporciona una funció per recuperar i configurar els controls de línia actuals, tal com es descriu a la taula següent.
Taula: Funcions de control de línia CDC ACM

Funció
sl_usb d _cd c_acm_g e t_line _controlador d'estat de l'ordinador ()

L'aplicació pot obtenir l'estat actual de la línia de control establert per l'amfitrió amb la sol·licitud SetControlLineState.

Estat de la línia
L'amfitrió USB recupera l'estat de la línia a intervals regulars. L'aplicació ha d'actualitzar l'estat de la línia cada vegada que canvia. Quan cal, l'aplicació és responsable de definir l'estat de la línia. Es proporcionen dues funcions per recuperar i definir els controls de línia actuals, tal com es descriu a la taula següent.
Taula – Funcions d'estat de línia CDC ACM

Funció
sl_usb d _cd c_acm_set _line _state _event()
sl_usbd_cdc_acm_cle ar_line _state _e ve nt()

La vostra aplicació pot establir qualsevol esdeveniment d'estat de línia. Mentre s'estableix l'estat de la línia, s'envia una transferència d'interrupció IN a l'amfitrió per informar-lo d'un canvi en l'estat de la línia sèrie.
L'aplicació pot esborrar dos esdeveniments de l'estat de la línia: la detecció de la portadora de transmissió i la detecció de la portadora del receptor. Tots els altres esdeveniments s'esborren automàticament per la subclasse d'emulació sèrie ACM.

Comunicació d'instància de subclasse

La subclasse ACM de Silicon Labs ofereix les funcions següents per comunicar-se amb l'amfitrió. Per obtenir més informació sobre els paràmetres functions9, consulteu la referència de funcions de la subclasse ACM de CDC.

Nom de la funció
sl_usb d_cd c_acm_ read () sl_usb d_cd c_acm_write ()

Funcionament
Rep dades de l'amfitrió a través d'un punt final de sortida en bloc. Aquesta funció és bloquejant. Envia dades a l'amfitrió a través d'un punt final d'entrada en bloc. Aquesta funció és bloquejant.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

27/174

Acabatview

Taula: Resum de l'API de comunicació CDC ACM aaaaa sl_usbd_cdc_acm_read() i sl_usbd_cdc_acm_write() proporcionen comunicació síncrona, la qual cosa significa que la transferència està bloquejant. En altres paraules, en cridar la funció, l'aplicació es bloqueja fins que la transferència es completa amb o sense error. Es pot especificar un temps d'espera per evitar esperar per sempre. L'exampLa imatge següent mostra un exemple de lectura i escripturaampque rep dades de l'amfitrió mitjançant el punt final bulk OUT i envia dades a l'amfitrió mitjançant el punt final bulk IN.
Llistat – Ex de lectura i escriptura en sèrieample

__ALIGNED(4) uint8_t rx_buf[2];

__ALIGNED(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

estat;

estat = sl_usbd_cdc_acm_read(número_de_subclasse,

(1)

rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

estat = sl_usbd_cdc_acm_write(número_de_subclasse,

(1)

tx_buf,

(4)

2u,

0u,

(3)

&xfer_len);

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

T aaaaa M (1) El número d'instance de classe creat amb sl_usbd_cdc_acm_create_instance() proporciona una referència interna a la subclasse AC per encaminar la transferència al punt final OUT o IN en bloc adequat. (2) L'aplicació ha d'assegurar-se que el buffer proporcionat a la funció sigui prou gran per allotjar totes les dades. En cas contrari, es podrien produir problemes de sincronització. (3) Per evitar una situació de bloqueig infinit, especifiqueu un temps d'espera expressat en mil·lisegons. Un valor de 809 fa que la tasca de l'aplicació esperi per sempre. (4) L'aplicació proporciona el buffer de transmissió inicialitzat.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

28/174

Acabatview
Acabatview

Dispositiu USB classe HID

Dispositiu USB HID Class Overview Necessitats de recursos de la classe HID del dispositiu USB des del nucli Configuració de la classe HID del dispositiu USB Guia de programació de la classe HID del dispositiu USB Tasca d'informes d'entrada periòdics HID
Aquesta secció descriu la classe de dispositius d'interfície humana (HID) compatible amb els dispositius USB de Silicon Labs.
La classe HID engloba els dispositius utilitzats pels humans per controlar les operacions de l'ordinador, com ara teclats, ratolins, dispositius apuntadors i dispositius de jocs.
La classe HID també es pot utilitzar en un dispositiu compost que conté controls com ara botons, interruptors, botons i controls lliscants. Per exempleampEls controls de so, silenci i volum d'uns auriculars d'àudio es controlen mitjançant la funció HID dels auriculars. La classe HID pot intercanviar dades per a qualsevol propòsit utilitzant només transferències de control i interrupcions.
La classe HID és una de les classes USB més antigues i utilitzades. Tots els principals sistemes operatius amfitrions proporcionen un controlador natiu per gestionar dispositius HID, motiu pel qual diversos dispositius específics del proveïdor funcionen amb la classe HID. Aquesta classe també inclou diversos tipus d'elements de sortida com ara LED, àudio, retroalimentació tàctil, etc.
La implementació de HID compleix amb les especificacions següents:
Definició de classe de dispositiu per a dispositius d'interfície humana (HID), 27/6/01, versió 1.11. Taules d'ús de HID del bus sèrie universal, 28/10/2004, versió 1.12.
Dispositiu USB HID Class Overview
Acabatview
Un dispositiu HID està compost pels següents punts finals:
Un parell de punts finals d'entrada i sortida de control anomenats punts finals per defecte Un punt final d'entrada d'interrupció Un punt final de sortida d'interrupció opcional
La taula següent descriu l'ús dels diferents punts finals:
Taula: Ús dels punts finals de la classe HID

Ús de la direcció del punt final

Control IN
Control
FORA
Interrupció d'entrada
Interrupció
FORA

Dispositiu-amfitrió
Host-to-dispositiu
Dispositiu-amfitrió
Host-to-dispositiu

Sol·licituds estàndard d'enumeració, sol·licituds específiques de classe i comunicació de dades (entrada, informes de característiques enviats a l'amfitrió amb la sol·licitud GET_REPORT). Sol·licituds estàndard d'enumeració, sol·licituds específiques de classe i comunicació de dades (sortida, informes de característiques rebuts de l'amfitrió amb la sol·licitud SET_REPORT). Comunicació de dades (informes d'entrada i característiques).
Comunicació de dades (informes de resultats i característiques).

Informeu

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

29/174

Acabatview

Un amfitrió i un dispositiu HID intercanvien dades mitjançant informes. Un informe conté dades formatades que proporcionen informació sobre els controls i altres entitats físiques del dispositiu HID. Un control és manipulable per l'usuari i opera un aspecte del dispositiu. Per exemple,ampÉs a dir, un control pot ser un botó d'un ratolí o d'un teclat, un interruptor, etc. Altres entitats informen l'usuari sobre l'estat de certes funcions del dispositiu. Per exempleampés a dir, els LED d'un teclat notifiquen a l'usuari si el bloqueig de majúscules està activat, si el teclat numèric està actiu, etc.
L'amfitrió entén el format i l'ús de les dades d'un informe analitzant el contingut d'un descriptor d'informe. L'anàlisi del contingut la fa un analitzador sintàctic. El descriptor d'informe descriu les dades proporcionades per cada control d'un dispositiu. Està compost d'elements que són informació sobre el dispositiu i consten d'un prefix d'1 byte i de longitud variable.
dades. Per obtenir més informació sobre el format de l'element, consulteu
1.11=, secció 5.6 i 6.2.2.
Hi ha tres tipus principals d'elements:
L'element principal defineix o agrupa certs tipus de camps de dades.
L'element global descriu les característiques de les dades d'un control.
L'element local descriu les característiques de les dades d'un control.
Cada tipus d'element es defineix per diferents funcions. Una funció d'element també es pot anomenar tagUna funció d'element es pot veure com un subelement que pertany a un dels tres tipus d'elements principals. La taula següent ofereix una breu descripció.view de les funcions de l'element9 en cada tipus d'element. Per obtenir una descripció completa dels elements de cada categoria, vegeu
Taula: descripció de la funció de l'element per a cada tipus d'element

Ítem ​​Tipus d'ítem Funció

Descripció

Entrada principal

Descriu informació sobre les dades proporcionades per un o més controls físics.

Sortida principal Descriu les dades enviades al dispositiu.

Característica principal

Descriu la informació de configuració del dispositiu enviada o rebuda del dispositiu que influeix en el comportament general del dispositiu o d'un dels seus components.

Elements relacionats amb el grup de col·leccions principals (entrada, sortida o característica).

Final principal de Tanca una col·lecció. Col·lecció

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

30/174

Acabatview

Ítem ​​Tipus d'ítem Funció

Descripció

Pàgina d'ús global

Identifica una funció disponible dins del dispositiu.

Global Lògic Defineix el límit inferior dels valors reportats en unitats lògiques. Mínim

Global Lògic Defineix el límit superior dels valors reportats en unitats lògiques. Màxim

Físic global Defineix el límit inferior dels valors reportats en unitats físiques, és a dir, el mínim lògic expressat en unitats físiques.

Físic global Defineix el límit superior dels valors reportats en unitats físiques, és a dir, el màxim lògic expressat en unitats físiques.

Unitat Global

Indica l'exponent unitari en base 10. L'exponent oscil·la entre -8 i +7.

Exponent

Unitat Global

Indica la unitat dels valors reportats. Per exemple, unitats de longitud, massa, temperatura, etc.

Mida de l'informe global

Indica la mida dels camps de l'informe en bits.

ID de l'informe global Indica el prefix afegit a un informe concret.

Recompte d'informes globals

Indica el nombre de camps de dades per a un element.

Impuls global

Col·loca una còpia de la taula d'estat global dels elements a la pila de la CPU.

Pop global

Substitueix la taula d'estat dels elements amb l'última estructura de la pila.

Ús local

Representa un índex per designar un ús específic dins d'una pàgina d'ús. Indica l'ús suggerit pel proveïdor per a un control o grup de controls específics. Un ús proporciona informació a un desenvolupador d'aplicacions sobre el que realment mesura un control.

Ús local

Defineix l'ús inicial associat amb una matriu o un mapa de bits.

Mínim

Ús local

Defineix l'ús final associat amb una matriu o un mapa de bits.

Màxim

Designador local Determina la part del cos utilitzada per a un control. L'índex apunta a un designador a l'espai físic.

Índex

descriptor.

Designador local Defineix l'índex del designador inicial associat a una matriu o mapa de bits. Mínim

Designador local Defineix l'índex del designador final associat a una matriu o mapa de bits. Màxim

Índex de cadena local

Índex de cadena per a un descriptor de cadena. Permet associar una cadena amb un element o control concret.

Cadena local

Especifica el primer índex de cadena quan s'assigna un grup de cadenes seqüencials a controls d'una matriu.

Mínim o mapa de bits.

Local Local

Màxim de cadena
Delimitador

Especifica l'índex de l'última cadena quan s'assigna un grup de cadenes seqüencials a controls d'una matriu o mapa de bits.
Defineix el principi o el final d'un conjunt d'elements locals.

Les dades d'un control han de definir com a mínim els elements següents:
Entrada, Sortida o Característica Elements principals Ús Element local Ús Pàgina Element global Mínim lògic Element global Màxim lògic Element global Mida de l'informe Element global

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

31/174

Acabatview
Element global del recompte d'informes La taula següent mostra la representació del contingut del descriptor d'informe del ratolí des de la perspectiva d'un analitzador HID de l'amfitrió. El ratolí té tres botons (esquerra, dreta i roda). El codi presentat a l'exempleampA continuació es mostra una implementació de codi corresponent a aquesta representació del descriptor d'informe del ratolí.
Figura: Contingut del descriptor d'informe des d'un analitzador HID d'amfitrió View

(1) La funció de l'element Pàgina d'ús especifica la funció general del dispositiu. En aquest exempleampés a dir, el dispositiu HID pertany a un
control d'escriptori genèric.
(2) La col·lecció Aplicació agrupa elements principals que tenen un propòsit comú i que poden ser familiars a les aplicacions. Al diagrama, el grup està compost per tres elements principals d'entrada. Per a aquesta col·lecció, l'ús suggerit per als controls és un ratolí, tal com indica l'element Ús. (3) Es poden utilitzar col·leccions imbricades per donar més detalls sobre l'ús d'un sol control o grup de controls a les aplicacions. En aquest exempleampÉs a dir, la física de la col·lecció, imbricada a l'aplicació de col·lecció, està composta pels mateixos tres elements d'entrada que formen l'aplicació de col·lecció. La física de la col·lecció s'utilitza per a un conjunt d'elements de dades que representen punts de dades recollits en un punt geomètric. En l'exempleampPer exemple, l'ús suggerit és un punter tal com indica l'element Ús. Aquí, l'ús del punter es refereix a les coordenades de posició del ratolí i el programari del sistema traduirà les coordenades del ratolí en el moviment del cursor de la pantalla. (4) També són possibles pàgines d'ús imbricades que donen més detalls sobre un aspecte determinat dins de la funció general del dispositiu. En aquest cas, s'agrupen dos elements d'entrada que corresponen als botons del ratolí. Un element d'entrada defineix els tres botons del ratolí (dret, esquerre i roda) pel que fa al nombre de camps de dades per a l'element (element Recompte d'informes), la mida d'un camp de dades (element Mida de l'informe) i els valors possibles per a cada camp de dades (elements Ús mínim i màxim, mínim lògic i màxim). L'altre element d'entrada és una constant de 13 bits que permet alinear les dades de l'informe d'entrada en un límit de bytes. Aquest element d'entrada només s'utilitza amb finalitats de farciment. (5) Es defineix una altra pàgina d'ús imbricada que fa referència a un control d'escriptori genèric per a les coordenades de posició del ratolí. Per a aquesta pàgina d'ús, l'element d'entrada descriu els camps de dades corresponents als eixos x i y, tal com s'especifica pels dos elements d'ús.
elements.
Després d'analitzar el contingut anterior del descriptor d'informe del ratolí, l'analitzador HID de l'amfitrió pot interpretar les dades de l'informe d'entrada enviades pel dispositiu amb una transferència d'interrupció IN o en resposta a una sol·licitud GET_REPORT. Les dades de l'informe d'entrada corresponents al descriptor d'informe del ratolí es mostren a la Figura: Contingut del descriptor d'informe d'un analitzador HID de l'amfitrió. View is

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

32/174

Acabatview

es mostra a la taula següent. La mida total de les dades de l'informe és de 4 bytes. Es poden enviar diferents tipus d'informes a través del mateix punt final. Per tal de distingir els diferents tipus d'informes, s'afegeix un prefix d'ID d'informe d'1 byte a l'informe de dades. Si s'ha utilitzat un ID d'informe a l'exampde l'informe del ratolí, la mida total de les dades de l'informe seria de 5 bytes.
Taula: informe d'entrada enviat a l'amfitrió i corresponent a l'estat d'un ratolí de 3 botons

Bit Offset
0 1 2 3 16 24

Nombre de bits 1 1 1 13 8 8

Descripció Botó 1 (botó esquerre). Botó 2 (botó dret). Botó 3 (botó de roda). No s'utilitza. Posició a l'eix X. Posició a l'eix Y.

Un descriptor físic indica la part o parts del cos destinades a activar un control o controls. Una aplicació pot utilitzar aquesta informació per assignar una funcionalitat al control d'un dispositiu. Un descriptor físic és un descriptor opcional específic de la classe i la majoria de dispositius tenen poc guany per utilitzar-lo. Consulteu
Necessitats de recursos de la classe HID del dispositiu USB del nucli

Cada vegada que afegiu una instància de classe HID a una configuració USB mitjançant una crida a la funció sl_usbd_hid_add_to_configuration(), els recursos següents s'assignaran des del nucli.

Recurs
Interfícies Interfícies alternatives Punts finals Grups d'interfícies

Quantitat
1 1 1 (2 si el punt final de la interrupció OUT està habilitat) 0

Tingueu en compte que aquests números són per configuració. Quan configureu els valors de configuració SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY i SL_USBD_DESCRIPTOR_QUANTITY, no us oblideu de tenir en compte quantes configuracions s'afegiran a la classe. Pel que fa al valor de configuració SL_USBD_OPEN_ENDPOINTS_QUANTITY, com que els punts finals només s'obren quan l'amfitrió defineix una configuració, només cal tenir en compte el nombre de punts finals necessaris per a una instància de classe.
Configuració de la classe HID del dispositiu USB

Per configurar la classe HID s'utilitzen dos grups de paràmetres de configuració:
Configuracions específiques de l'aplicació de la classe HID de dispositius USB Configuracions d'instància de la classe HID de dispositius USB
Configuracions específiques de l'aplicació de la classe HID del dispositiu USB

Primer, per utilitzar el mòdul de classe HID del dispositiu USB de Silicon Labs, ajusteu les definicions de configuració de compilació HID segons les necessitats de l'aplicació. Es reagrupen dins de la capçalera sl_usbd_core_config.h. file a la secció HID. Es poden dividir en dues seccions, les configuracions de quantitat i les configuracions de tasques HID. La finalitat de les configuracions de quantitat és informar al mòdul de dispositiu USB sobre quants objectes HID USB ha d'assignar.
La taula següent descriu cada configuració definida.
Taula: definició de la configuració HID del dispositiu USB

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

33/174

Acabatview

Nom de la configuració
SL_USBD_HID_CL ASS_INSTÀNCIA_QUANTITAT
SL_USBD_HID_CONFIGURACIÓ_QUANTITAT
SL_USBD_HID_REPORT_ID_QUANTITY
SL_USBD_HID_PUSH_P OP_ITEM_QUANTITY
SL_USBD_HID_TIMER_T ASK_STACK_SIZE
SL_USBD_HID_TIMER_T ASK_PRIORITY

Descripció
Nombre d'instàncies de classe que assignareu mitjançant una crida a la funció
sl_usbd_hid_create_instance().
Nombre de configuracions. Es poden afegir instàncies de classe HID a una o més configuracions aaaa mitjançant la funció sl_usbd_hid_add_to_configuration(). Configura el nombre total d'ID d'informe que s'assignaran.
Configura el nombre total d'elements Push/Pop que s'assignaran.
La tasca del temporitzador gestiona totes les operacions HID basades en el temporitzador. Aquesta configuració permet definir la mida de la pila (en nombre de bytes). Prioritat de la tasca HID. Aquesta és una prioritat CMSIS-RTOS2.

Valor per defecte
2 1 2 0 2048
PrioritatOfertaAlta

Configuracions d'instància de classe HID de dispositiu USB Subclasse de creació d'instàncies de classe
codi_de_país_del_protocol
interval_in i interval_out p_hid_callback Descriptor d'informe de classe HID ExampAquesta secció defineix les configuracions relacionades amb les instàncies de la classe HID.
Creació d'instàncies de classe
La creació d'una instància de classe HID es fa cridant la funció aaa sl_usbd_hid_create_instance(), que genera diversos arguments de configuració que es descriuen a continuació.
subclasse
Codi de la subclasse HID. Els valors possibles són:
SL_USBD_HID_SUBCL ASS_NONE SL_USBD_HID_SUBCL ASS_BOOT
Un dispositiu HID que utilitza la subclasse d'arrencada ha d'utilitzar formats d'informe estàndard. Per obtenir més informació sobre els codis de la subclasse, consulteu la secció 4.2 de la revisió 1.11 de l'especificació HID.
protocol
Protocol utilitzat pel dispositiu HID. Els valors possibles són:
SL_USBD_HID_PROTOCOL_NONE SL_USBD_HID_PROTOCOL_KBD SL_USBD_HID_PROTOCOL_MOUSE
Si la vostra funció HID és un ratolí, el protocol s'ha de definir a SL_USBD_HID_PROTOCOL_MOUSE. Si és un teclat, s'ha de definir a SL_USBD_HID_PROTOCOL_KBD. En cas contrari, el protocol s'ha de definir a SL_USBD_HID_PROTOCOL_NONE. Per obtenir més informació sobre els codis de subclasse, consulteu la secció 4.3 de la revisió 1.11 de l'especificació HID.
codi_de_país
ID del codi de país. Els valors possibles són:
SL_USBD_HID_CODI_DE_PAÍS_NO_ADMESA

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

34/174

Acabatview
SL_USBD_HID_CODI_PAÍS_ÀRAB SL_USBD_HID_CODI_PAÍS_BELGA SL_USBD_HID_CODI_PAÍS_CANADIÀ_BILINGÜE SL_USBD_HID_CODI_PAÍS_CANADIÀ_FRANCÈS SL_USBD_HID_CODI_PAÍS_REPÚBLICA_TXECA SL_USBD_HID_CODI_PAÍS_DANÈS SL_USBD_HID_CODI_PAÍS_FINLÈS SL_USBD_HID_CODI_PAÍS_FRANCÈS SL_USBD_HID_CODI_PAÍS_ALEMANY SL_USBD_HID_CODI_PAÍS_GREC SL_USBD_HID_CODI_PAÍS_HEBREU SL_USBD_HID_CODI_PAÍS_HONGRIA SL_USBD_HID_CODI_PAÍS_INTERNACIONAL SL_USBD_HID_CODI_PAÍS_ITALIÀ SL_USBD_HID_CODI_PAÍS_JAPÓ_KATAKANA SL_USBD_HID_CODI_PAÍS_COREÀ SL_USBD_HID_CODI_PAÍS_LATÍN_AMERICÀ SL_USBD_HID_CODI_PAÍS_NEDERLANDÈS SL_USBD_HID_CODI_PAÍS_NORUEGÈS SL_USBD_HID_CODI_PAÍS_PERSA_FARSI SL_USBD_HID_CODI_PAÍS_POLÒGIC I SL_USBD_HID_CODI_PAÍS_PORTUGUÈS SL_USBD_HID_CODI_PAÍS_RÚSSIA SL_USBD_HID_CODI_PAÍS_ESLOVÀQUIA SL_USBD_HID_CODI_PAÍS_ESPANYOL SL_USBD_HID_CODI_PAÍS_SUEC SL_USBD_HID_CODI_PAÍS_SUÏS_FRANCÈS SL_USBD_HID_CODI_PAÍS_SUÏSSA_ALEMANYA SL_USBD_HID_CODI_PAÍS_SUÏSSA_RL I SL_USBD_HID_CODI_PAÍS_TAIWAN SL_USBD_HID_CODI_PAÍS_TURC_Q SL_USBD_HID_CODI_PAÍS_Regne Unit SL_USBD_HID_CODI_PAÍS_EUA SL_USBD_HID_CODI_PAÍS_YUG OSL AVIA SL_USBD_HID_CODI_PAÍS_TURC_F
El codi de país identifica per a quin país està localitzat el maquinari. La majoria del maquinari no està localitzat i, per tant, aquest valor seria SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). Tanmateix, els teclats poden utilitzar el camp per indicar l'idioma de les majúscules de les tecles.
Per obtenir més informació sobre els codis de país, consulteu la secció 6.2.1 de la revisió 1.11 de l'especificació HID.
interval_in i interval_out
interval_in i interval_out representen l'interval de sondeig del punt final d'interrupció IN i del punt final d'interrupció OUT.
Això representa l'interval de sondeig del punt final, en mil·lisegons. Definir aquest valor depèn de la freqüència amb què el dispositiu és susceptible de generar un informe nou per a l'amfitrió. Per exemple, si es genera un informe cada 16 mil·lisegons, l'interval hauria de ser de 16 o menys.
El valor ha de ser una potència de 2 (1, 2, 4, 8, 16, etc.).
Una variació d'interval_out s'ignora si ctrl_rd_en està definit com a true.
p_hid_callback
aaaa p_hid_callback és un punter a una estructura de tipus sl_usbd_hid_callbacks_t. El seu propòsit és proporcionar a la classe HID el conjunt de funcions de callback que s'han de cridar quan es produeix un esdeveniment HID.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

35/174

Acabatview

No totes les callbacks són obligatòries i es pot passar un punter nul (NULL) a la variable d'estructura callbacks quan la callback no és necessària. La taula següent descriu cada camp de configuració disponible en aquesta estructura de configuració.
Taula – Estructura de configuració de sl_usbd_hid_callbacks_t

Camps

Descripció

Signatura de funció

.activa .desactiva .obtén_descricció_informe
.get_phy_desc
.set_output_report .get_feature_report .set_feature_report

Es crida quan la instància de classe USB s'ha activat correctament. Es crida quan la instància de classe USB està desactivada.
Es crida durant la creació de la instància HID per passar el descriptor de l'informe. Per a cadascuna de les funcions HID, heu de proporcionar un descriptor d'informe. El descriptor d'informe indica a l'amfitrió com s'ha d'analitzar l'informe periòdic que enviarà el dispositiu. Escriure el vostre propi descriptor d'informe pot ser difícil, i és per això que hi ha alguns recursos per ajudar. Aquesta és l'única funció de retrollamada obligatòria. Es crida durant la creació de la instància HID per passar el descriptor físic. El descriptor físic és un descriptor que proporciona informació sobre la part o parts específiques del cos humà que activen un control o controls. Per obtenir més informació sobre els descriptors físics, consulteu la secció 6.2.3 de la revisió 1.11 de l'especificació HID. El descriptor físic és opcional i la majoria de les vegades s'ignora. El buffer que es passa aquí es pot definir com a NULL i la longitud com a 0. Es crida quan l'amfitrió defineix un informe tal com es descriu al descriptor de l'informe (quan envia un informe).
Es crida quan l'amfitrió sol·licita un informe de funcions tal com es descriu al descriptor de l'informe.
Es crida quan l'amfitrió defineix un informe de característiques tal com es descriu al descriptor de l'informe.

void app_usbd_hid_enable(uint8_t número_de_classe); void app_usbd_hid_disable(uint8_t número_de_classe); void app_usbd_hid_get_report_desc(uint8_t número_de_classe, 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

Recupera el protocol actiu actual.

void app_usbd_hid_get_protocol(uint8_t class_nbr, uint8_t *p_protocol);

.conjunt_protocol

Estableix el protocol actiu actual.

void app_usbd_hid_set_protocol(uint8_t class_nbr, uint8_t protocol);

Descriptor d'informe de classe HID Example

Classes HID de Silicon Labsampl'aplicació proporciona un exempleampexemple d'un descriptor d'informe per a un ratolí simple. L'exempleampLa imatge següent mostra un descriptor d'informe de ratolí.
Example – Descriptor d'informe de ratolí

estàtic 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. Tots els drets reservats.

36/174

Acabatview

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_VARIABLE_PRINCIPAL |

SL_USBD_HID_MAIN_ABSOLUTE,

SL_USBD_HID_GLOBAL_REPORT_COMPTE +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_VARIABLE_PRINCIPAL |

SL_USBD_HID_MAIN_RELATIVE,

SL_USBD_HID_MAIN_ENDCOLLECTION,(10)

SL_USBD_HID_MAIN_ENDCOLLECTION

(11)};

(1) La taula que representa un descriptor d'informe de ratolí s'inicialitza de manera que cada línia correspon a un element curt. Aquest últim està format per un prefix d'1 byte i unes dades d'1 byte. Vegeu vieweditat per un analitzador HID de l'amfitrió a la Figura: Informa del contingut del descriptor des d'un analitzador HID de l'amfitrió View.
(2) S'utilitza la pàgina d'ús genèric de l'escriptori.
(3) Dins de la pàgina d'ús genèric de l'escriptori, l'ús tag suggereix que el grup de controls serveix per controlar un ratolí. Una col·lecció de ratolins normalment consta de dos eixos (X i Y) i un, dos o tres botons.
(4) S'ha iniciat la recol·lecció de ratolins.
(5) Dins de la col·lecció de ratolins, un ús tag suggereix més específicament que els controls del ratolí pertanyen a la col·lecció de punters. Una col·lecció de punters és una col·lecció d'eixos que genera un valor per dirigir, indicar o apuntar les intencions de l'usuari a una aplicació.
(6) S'inicia la recopilació de punters.
(7) La pàgina d'ús dels botons defineix un element d'entrada compost per tres camps d'1 bit. Cada camp d'1 bit representa els botons 1, 2 i 3 del ratolí respectivament i pot retornar un valor de 0 o 1.
(8) L'element d'entrada per a la pàgina d'ús dels botons està omplert amb 13 bits més.
(9) S'indica una altra pàgina d'ús genèric de l'escriptori per descriure la posició del ratolí amb els eixos X i Y. L'element d'entrada està compost per dos camps de 8 bits el valor dels quals pot estar entre -127 i 127.
(10) La col·lecció de punters està tancada.
(11) La col·lecció de ratolins està tancada.
Pàgina HID d'USB.org

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

37/174

Acabatview
L'USB Implementers Forum (USB-IF) proporciona una eina anomenada "HID Descriptor Tool" juntament amb altra informació sobre el format del descriptor d'informe. Vegeu http://www.usb.org/developers/hidpage/ per obtenir més informació.
Guia de programació de dispositius USB de classe HID
Aquesta secció explica com utilitzar la classe HID. Inicialització de la classe HID del dispositiu USB Afegir una instància de classe HID del dispositiu USB al dispositiu Comunicació mitjançant la classe HID del dispositiu USB
Inicialització de la classe HID del dispositiu USB
Per afegir la funcionalitat de la classe HID al dispositiu, primer heu d'inicialitzar la classe cridant la funció sl_usbd_hid_init(). L'exampA continuació es mostra com cridar sl_usbd_hid_init() utilitzant arguments per defecte. Per obtenir més informació sobre els arguments de configuració que cal passar a sl_usbd_hid_init(), consulteu Configuracions específiques de l'aplicació de la classe HID de dispositius USB.
Example – Crida a sl_usbd_hid_init()
sl_status_t estat;
status = sl_usbd_hid_init(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}
Afegir una instància de classe HID de dispositiu USB al dispositiu
Per afegir la funcionalitat de la classe HID al dispositiu, heu de crear una instància i, a continuació, afegir-la a la configuració del dispositiu.
Creació d'una instància de classe HID
Crea una instància de classe HID cridant la funció sl_usbd_hid_create_instance(). L'exampA continuació es mostra com crear una funció de ratolí senzilla mitjançant sl_usbd_hid_create_instance() utilitzant arguments per defecte. Per obtenir més informació sobre els arguments de configuració que cal passar a sl_usbd_hid_create_instance(), consulteu Configuracions d'instància de classe HID de dispositius USB.
Example – Afegir una funció de ratolí mitjançant sl_usbd_hid_create_instance()

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

38/174

Acabatview
/* Constants globals. */ 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 };
/* Variables locals.*/ uint8_t class_nbr; sl_status_t status;
sl_usbd_hid_callbacks_t app_usbd_hid_callbacks = { NULL, NULL, app_usbd_hid_get_report_desc, NULL, NULL, NULL, NULL, NULL, NULL };
void app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (void)class_nbr;
*p_report_ptr = app_usbd_hid_mouse_report_desc; *p_report_len = sizeof(app_usbd_hid_mouse_report_desc); }
estat = 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. Tots els drets reservats.

39/174

Acabatview
/* S'ha produït un error. Cal afegir la gestió d'errors aquí. *
Afegir la instància de classe HID a la configuració del dispositiu Després de crear una instància de classe HID, podeu afegir-la a una configuració cridant la funció
sl_usbd_hid_add_to_configuration().
L'exampLa imatge següent mostra com cridar sl_usbd_hid_add_to_configuration().
Example – Crida a sl_usbd_hid_add_to_configuration()

sl_status_t estat;

sl_usbd_hid_add_to_configuration(class_nbr,

(1)

config_nbr_fs); (2)

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

(1) Número de classe a afegir a la configuració retornada per sl_usbd_hid_create_instance(). (2) Número de configuració (aquí afegint-lo a una configuració de velocitat completa).
Comunicació mitjançant el dispositiu USB de classe HID
Comunicació per instàncies de classe Comunicació síncrona Comunicació per instàncies de classe La classe HID ofereix les funcions següents per comunicar-se amb l'amfitrió.
Taula: Resum de l'API de comunicació HID

Nom de la funció
sl_usb d _hid _ read _sy nc() sl_usb d _hid _write _sy nc()

Operació Rep dades de l'amfitrió a través del punt final de la interrupció OUT. Aquesta funció és bloquejant. Envia dades a l'amfitrió a través del punt final de la interrupció IN. Aquesta funció és bloquejant.

Comunicació síncrona La comunicació síncrona significa que la transferència està bloquejant. En cridar la funció, l'aplicació es bloqueja fins que la transferència es completa amb o sense error. Es pot especificar un temps d'espera per evitar esperar indefinidament. L'exampLa imatge següent mostra una lectura i escriptura que rep dades de l'amfitrió mitjançant el punt final d'interrupció OUT i envia dades a l'amfitrió mitjançant el punt final d'interrupció IN.
Example – Lectura i escriptura HID síncrones

__ALIGNED(4) uint8_t rx_buf[2];

__ALIGNED(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

estat;

estat = sl_usbd_hid_read_sync(class_nbr,

(1)

(buid *)rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

40/174

Acabatview
status =sl_usbd_hid_read_sync(class_nbr,(1)(void *)rx_buf,(2)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* S'ha produït un error. Cal afegir la gestió d'errors aquí. *
status =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status ! SL_STATUS_OK){/* S'ha produït un error. Cal afegir la gestió d'errors aquí. *
(1) El número d'instància de classe creat a partir de sl_usbd_hid_create_instance() proporciona una referència interna perquè la classe HID encamini la transferència al punt final d'interrupció OUT o IN adequat.
(2) L'aplicació ha d'assegurar-se que el buffer proporcionat a la funció sigui prou gran per allotjar totes les dades. En cas contrari, es podrien produir problemes de sincronització. Internament, l'operació de lectura es fa amb el punt final de control o amb el punt final d'interrupció, depenent del senyalador de lectura de control definit en cridar sl_usbd_hid_create_instance().
(3) Per evitar una situació de bloqueig infinit, es pot especificar un temps d'espera expressat en mil·lisegons. Un valor de 809 fa que la tasca de l'aplicació esperi indefinidament.
(4) L'aplicació proporciona la memòria intermèdia de transmissió inicialitzada.
Tasca d'informes d'entrada periòdics de HID
Per estalviar amplada de banda, l'amfitrió té la capacitat de silenciar els informes d'un punt final d'interrupció IN limitant la freqüència d'informes. Per fer-ho, l'amfitrió ha d'enviar la sol·licitud SET_IDLE. La classe HID implementada per Silicon Labs conté una tasca interna que respecta la limitació de freqüència d'informes que podeu aplicar a un o diversos informes d'entrada. La figura Tasca d'informes d'entrada periòdics mostra el funcionament de les tasques d'informes d'entrada periòdics.
Figura – Tasca d'informes d'entrada periòdica

(1) El dispositiu rep una sol·licitud SET_IDLE. Aquesta sol·licitud especifica una durada d'inactivitat per a un ID d'informe determinat. Per obtenir més informació sobre la sol·licitud SET_IDLE, consulteu
(2) Una estructura d'ID d'informe (assignada durant la fase d'inicialització de la classe HID) s'actualitza amb la durada d'inactivitat. Un comptador de durada d'inactivitat s'inicialitza amb el valor de la durada d'inactivitat. L'estructura d'ID d'informe s'insereix al final d'una llista enllaçada que conté estructures d'ID d'informes d'entrada. El valor de la durada d'inactivitat s'expressa en unitats de 4 ms, cosa que dóna un rang de 4 a 1020 ms.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

41/174

Acabatview
Si la durada d'inactivitat és inferior a l'interval de sondeig del punt final d'interrupció IN, els informes es generen a l'interval de sondeig.
(3) Cada 4 ms, la tasca d'informes d'entrada periòdics navega per la llista d'ID d'informes d'entrada. Per a cada ID d'informe d'entrada, la tasca realitza una de les dues operacions possibles. La durada del període de la tasca coincideix amb la unitat de 4 ms utilitzada per a la durada d'inactivitat. Si l'amfitrió no ha enviat cap sol·licitud SET_IDLE, la llista d'ID d'informes d'entrada està buida i la tasca no té res per processar. La tasca només processa els ID d'informe que són diferents de 0 i amb una durada d'inactivitat superior a 0.
(4) Per a un ID d'informe d'entrada determinat, la tasca verifica si ha transcorregut el període d'inactivitat. Si el període d'inactivitat no ha transcorregut, el comptador es decrementa i no s'envia cap informe d'entrada a l'amfitrió.
(5) Si el temps d'inactivitat ha transcorregut (és a dir, si el comptador del temps d'inactivitat ha arribat a zero), s'envia un informe d'entrada a l'amfitrió cridant la funció sl_usbd_hid_write_sync() a través del punt final d'interrupció IN.
(6) Les dades de l'informe d'entrada enviades per la tasca provenen d'una memòria intermèdia de dades interna assignada per a cada informe d'entrada descrit al descriptor d'informe. Una tasca d'aplicació pot cridar la funció sl_usbd_hid_write_sync() per enviar un informe d'entrada. Després d'enviar les dades de l'informe d'entrada, sl_usbd_hid_write_sync() actualitza la memòria intermèdia interna associada a un ID d'informe d'entrada amb les dades que s'acaben d'enviar. Aleshores, la tasca d'informes d'entrada periòdics sempre envia les mateixes dades de l'informe d'entrada després de cada període d'inactivitat i fins que la tasca de l'aplicació actualitza les dades de la memòria intermèdia interna. Hi ha algun mecanisme de bloqueig per evitar la corrupció de les dades de l'ID de l'informe d'entrada en cas que es produeixi una modificació en el moment exacte de la transmissió realitzada per la tasca d'informe d'entrada periòdic.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

42/174

Acabatview
Acabatview
Dispositiu USB Classe MSC
Dispositiu USB Classe MSC Overview Necessitats de recursos de la classe MSC de dispositius USB del nucli Configuració de la classe MSC de dispositius USB Guia de programació de la classe MSC de dispositius USB Controladors d'emmagatzematge de la classe MSC de dispositius USB
Aquesta secció descriu la classe de dispositiu d'emmagatzematge massiu (MSC) compatible amb Silicon Labs USB Device. MSC és un protocol que permet la transferència d'informació entre un dispositiu USB i un host. La informació que es transfereix és qualsevol cosa que es pugui emmagatzemar electrònicament, com ara programes executables, codi font, documents, imatges, dades de configuració o altres dades de text o numèriques. El dispositiu USB apareix com un suport d'emmagatzematge extern a l'host, permetent la transferència de files mitjançant arrossegar i deixar anar.
A file el sistema defineix com el files'organitzen en el suport d'emmagatzematge. L'especificació de la classe d'emmagatzematge massiu USB no requereix cap especificació en particular file sistema per ser utilitzat en dispositius compatibles. En canvi, proporciona una interfície senzilla per llegir i escriure sectors de dades mitjançant el conjunt d'ordres transparents de la Small Computer System Interface (SCSI). Com a tal, els sistemes operatius poden tractar la unitat USB com un disc dur i poden formatar-la amb qualsevol file sistema que els agrada.
La classe de dispositius d'emmagatzematge massiu USB admet dos protocols de transport, de la manera següent:
Transport només en bloc (BOT) Transport de control/intercanvi/interrupció (CBI) (només s'utilitza per a unitats de disquet)
La classe de dispositiu d'emmagatzematge massiu implementa el conjunt d'ordres transparents SCSI utilitzant només el protocol BOT, cosa que significa que només s'utilitzaran punts finals massius per transmetre dades i informació d'estat. La implementació MSC admet diverses unitats lògiques.
La implementació de l'MSC compleix amb les especificacions següents:
Especificació de classe d'emmagatzematge massiu de bus sèrie universalview, Revisió 1.3, 5 de setembre de 2008. Emmagatzematge massiu de bus sèrie universal, transport a granel només per a classe, Revisió 1.0, 31 de setembre de 1999.
Dispositiu USB MSC aCl ss Overview
Sol·licituds de classe de punts finals de protocol Interfície de sistema informàtic petit (SCSI)
Protocol
En aquesta secció, parlarem del protocol de transport només a granel (BOT) de la classe d'emmagatzematge massiu. El protocol de transport només a granel té tres stages:
El transport d'ordres El transport de dades El transport d'estat
Les ordres d'emmagatzematge massiu són enviades per l'amfitrió a través d'una estructura anomenada Command Block Wrapper (CBW). Per a les ordres que requereixen un transport de dadestagés a dir, l'amfitrió intentarà enviar o rebre el nombre exacte de bytes del dispositiu especificat pels camps de longitud i indicador del CBW. Després del transport de dadestagés a dir, l'amfitrió intenta rebre un Command Status Wrapper (CSW) del dispositiu que detalla l'estat de la comanda, així com qualsevol residu de dades (si és que

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

43/174

Acabatview
qualsevol). Per a ordres que no inclouen un transport de dadestagés a dir, l'amfitrió intenta rebre el CSW directament després que s'enviï el CBW. El protocol es detalla a la Figura 1: Protocol MSC.
Figura – Protocol MSC

Punts finals
Pel que fa al dispositiu, d'acord amb l'especificació BOT, l'MSC està compost pels següents punts finals: Un parell de punts finals d'entrada i sortida de control anomenats punts finals per defecte. Un parell de punts finals d'entrada i sortida en bloc.
La taula següent indica els diferents usos dels punts finals.
Taula: Ús del punt final de MSC

Punt final
Entrada de control Sortida de control Entrada a granel Sortida a granel

Direcció
Dispositiu a host Host a dispositiu Dispositiu a host Host a dispositiu

Ús
Sol·licituds d'enumeració i específiques de classe MSC Sol·licituds d'enumeració i específiques de classe MSC Enviar CSW i dades Rebre CBW i dades

Sol·licituds de classe
Hi ha dues sol·licituds de control definides per al protocol MSC BOT. Aquestes sol·licituds i les seves descripcions es detallen a la taula següent.

Taula – Sol·licituds de classe d'emmagatzematge massiu

Sol·licituds de classe
Restabliment de l'emmagatzematge massiu només en bloc

Descripció
Aquesta sol·licitud s'utilitza per reiniciar el dispositiu d'emmagatzematge massiu i la seva interfície associada. Aquesta sol·licitud prepara el dispositiu per rebre el següent bloc d'ordres.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

44/174

Acabatview

Sol·licituds de classe

Descripció

Get Max Aquesta sol·licitud s'utilitza per retornar el número d'unitat lògica (LUN) més alt que admet el dispositiu. Per exempleampel, a

LUN

Un dispositiu amb LUN 0 i LUN 1 retornarà un valor d'1. Un dispositiu amb una sola unitat lògica retornarà 0 o aturarà el

sol·licitud. El valor màxim que es pot retornar és 15.

Interfície SCSI per a sistemes informàtics petits

A nivell d'interfície de programació, el dispositiu MSC implementa un dels protocols de comunicació estàndard de suports d'emmagatzematge, com ara SCSI i SFF-8020i (ATAPI). La "Interfície de programació" especifica quin protocol s'implementa i ajuda el sistema operatiu amfitrió a carregar el controlador de dispositiu adequat per comunicar-se amb el dispositiu d'emmagatzematge USB. SCSI és el protocol més comú que s'utilitza amb els dispositius d'emmagatzematge USB MSC. Oferim una implementació per a la subclasse MSC SCSI que els nostres usuaris de GSDK poden utilitzar de fàbrica.
SCSI és un conjunt d'estàndards per gestionar la comunicació entre ordinadors i dispositius perifèrics. Aquests estàndards inclouen ordres, protocols, interfícies elèctriques i interfícies òptiques. Els dispositius d'emmagatzematge que utilitzen altres interfícies de maquinari, com ara USB, utilitzen ordres SCSI per obtenir informació del dispositiu/amfitrió i controlar el funcionament del dispositiu i transferir blocs de dades al suport d'emmagatzematge.
Les ordres SCSI cobreixen una àmplia gamma de tipus i funcions de dispositius i, per tant, els dispositius necessiten un subconjunt d'aquestes ordres. En general, les ordres següents són necessàries per a la comunicació bàsica:
CONSULTA CAPACITAT DE LECTURA(10) LECTURA(10) SOL·LICITUD DETECCIÓ UNITAT DE PROVA PREPARADA ESCRIPTURA(10)
Necessitats de recursos de la classe MSC del dispositiu USB del nucli

Cada vegada que afegiu una instància de classe MSC a una configuració USB mitjançant la funció sl_usbd_msc_add_to_configuration(), els recursos següents s'assignaran des del nucli.

Recurs
Interfícies Interfícies alternatives Punts finals Grups d'interfícies

Quantitat
1 1 2 0

Tingueu en compte que aquests números són per configuració. Quan configureu els valors de configuració SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY i SL_USBD_DESCRIPTOR_QUANTITY, no us oblideu de tenir en compte quantes configuracions s'afegiran a la classe. Pel que fa al valor de configuració SL_USBD_OPEN_ENDPOINTS_QUANTITY, com que els punts finals només s'obren quan l'amfitrió defineix una configuració, només cal tenir en compte el nombre de punts finals necessaris per a una instància de classe.
Configuració de la classe MSC del dispositiu USB

Per configurar la classe MSC s'utilitzen dos grups de paràmetres de configuració:
Configuracions específiques de l'aplicació de la classe MSC del dispositiu USB Configuració de la unitat lògica de la classe MSC del dispositiu USB
Configuracions específiques de l'aplicació de la classe MSC del dispositiu USB

Configuracions de classe en temps de compilació Creació d'instàncies de classe

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

45/174

Acabatview

Configuracions de la classe en temps de compilació
La classe MSC i la subclasse SCSI de dispositius USB de Silicon Labs es poden configurar en temps de compilació mitjançant #defines que es troben a sl_usbd_core_config.h. file.
Taula: Constants de configuració genèriques

Nom de la configuració

Descripció

SL_USBD_MSC_CLASS_INST Nombre d'instàncies de classe que assignareu mitjançant una crida a la funció

QUANTITAT_ÀNCIA

sl_usbd_msc_scsi_create_instance().

SL_USBD_MSC_CONFIGURA Número de configuració a la qual es pot afegir una instància de classe mitjançant una crida a

TION_QUANTITY

funció sl_usbd_msc_scsi_add_to_configuration().

SL_USBD_MSC_LUN_QUANT Nombre d'unitats lògiques per instància de classe que afegireu mitjançant una crida a

ITY

funció sl_usbd_msc_scsi_lun_add().

SL_USBD_MSC_SCSI_64_BIT Activa o desactiva la compatibilitat amb l'adreça de bloc lògic (LBA) de 64 bits.
_LBA_EN

SL_USBD_MSC_DATA_BUFF Mida del buffer de dades per instància de classe en bytes ER_SIZE

Valor per defecte
2
1
2
0
512

Creació d'instàncies de classe
La creació d'una instància de classe SCSI MSC per a dispositius USB es fa mitjançant la crida de la funció sl_usbd_msc_scsi_create_instance(). Aquesta funció pren un argument de configuració que es descriu a continuació.
p_scsi_callbacks
p_scsi_callbacks és un punter a una estructura de configuració de tipus sl_usbd_msc_scsi_callbacks_t. A més de les funcions de retrollamada comunes de la classe de dispositius USB connect/disconnect, proporciona a la classe MSC un conjunt de funcions de retrollamada opcionals que es criden quan es produeix un esdeveniment a la unitat lògica. Es pot passar un punter nul (NULL) a aquest argument si no es necessiten retrollamades.
La taula següent descriu cada camp de configuració disponible en aquesta estructura de configuració.
Taula – Estructura de configuració de sl_usbd_msc_scsi_callbacks_t

Camps

Descripció

.habilitar

Es crida quan la instància de la classe USB s'ha activat correctament.

.disable Es crida quan la instància de la classe USB està desactivada.

.host_eject Funció que es crida quan una unitat lògica s'expulsa de l'amfitrió.

Signatura de funció
void app_usbd_msc_scsi_enable(uint8_t class_nbr);
void app_usbd_mscsi_disable(uint8_t número_de_classe); void app_usbd_mscsi_host_eject(uint8_t número_de_classe, uint8_t número_de_lu);

Configuració de la unitat lògica de la classe MSC del dispositiu USB

Afegir una unitat lògica a una instància de classe MSC es fa cridant la funció sl_usbd_msc_lun_add(). Aquesta funció pren un argument de configuració que es descriu a continuació.

p_lu_info

p_lu_info és un punter a una estructura de tipus sl_usbd_msc_scsi_lun_info_t. El seu propòsit és proporcionar la informació sobre la unitat lògica a la classe MSC.
La taula següent descriu cada camp de configuració disponible en aquesta estructura de configuració.

Taula – Estructura de configuració de sl_usbd_msc_scsi_lun_info_t

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

46/174

Acabatview

Camp

Descripció

Camp
.scsi_lun_api_p tr

Descripció
Punter a l'API del controlador multimèdia que gestionarà aquesta unitat lògica. Vegeu Controladors d'emmagatzematge de classe MSC de dispositius USB per obtenir més informació sobre els controladors d'emmagatzematge.

.ve nd o r_id _ p tr
.product_id_ptr
.nivell_de_revisió_del_producte .només_de_lectura

Punter a una cadena que conté la identificació del proveïdor de la unitat lògica. La longitud màxima de la cadena és de 8 caràcters. Punter a una cadena que conté la identificació del producte de la unitat lògica. La longitud màxima de la cadena és de 16 caràcters. Nivell de revisió del producte.
Bandera que indica si la unitat lògica s'ha de veure com a només de lectura des del punt de view de l'amfitrió (cert) o no (fals).

Guia de programació de dispositius USB de la classe MSC

En aquesta secció s'explica com utilitzar la classe MSC.
Inicialització de la classe MSC del dispositiu USB Afegir una instància de la classe SCSI MSC del dispositiu USB al dispositiu Gestió de la unitat lògica de la classe MSC del dispositiu USB
Inicialització de la classe MSC del dispositiu USB

Per afegir la funcionalitat de la classe SCSI MSC al dispositiu, primer inicialitzeu la classe base MSC i la subclasse SCSI cridant les funcions sl_usbd_msc_init() i sl_usbd_msc_scsi_init().
L'exampLa imatge següent mostra com cridar sl_usbd_msc_init() i sl_usbd_msc_scsi_init().

Example – Crida a sl_usbd_msc_init() i sl_usbd_msc_scsi_init()

sl_status_t estat;
status = sl_usbd_msc_init(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}
status = sl_usbd_msc_scsi_init(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}
Afegir una instància de classe SCSI MSC de dispositiu USB al dispositiu
Per afegir la funcionalitat de la classe SCSI MSC al dispositiu, primer creeu una instància i després afegiu-la a la configuració del dispositiu. Heu d'afegir com a mínim una unitat lògica a la instància.
Creació d'una instància de classe SCSI MSC
Crea una instància de classe SCSI MSC cridant la funció sl_usbd_msc_scsi_create_instance().
L'exampA continuació es mostra com cridar sl_usbd_msc_scsi_create_instance() utilitzant arguments per defecte. Per obtenir més informació sobre els arguments de configuració que cal passar a sl_usbd_msc_scsi_create_instance(), consulteu Configuracions específiques de l'aplicació de la classe MSC de dispositius USB.
Example – Crida a sl_usbd_msc_scsi_create_instance()

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

47/174

Acabatview

uint8_t class_nbr; sl_status_t estat;
sl_usbd_mscsi_callbacks_t app_usbd_mscsi_callbacks = { .enable = NULL, .disable = NULL, .host_eject = NULL };
estat = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
si (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */ }
Afegir la instància de classe MSC a la configuració del dispositiu
Després de crear una instància de classe MSC, podeu afegir-la a una configuració cridant la funció
sl_usbd_msc_add_to_configuration().
L'exampA continuació es mostra com cridar sl_usbd_msc_scsi_add_to_configuration() utilitzant els arguments per defecte.
Example – Crida a sl_usbd_msc_scsi_add_to_configuration()

sl_status_t estat;

estat = sl_usbd_msc_scsi_add_to_configuration(class_nbr,

(1)

config_nbr_fs);

(2)

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

(1) Número de classe a afegir a la configuració retornada per sl_usbd_msc_scsi_create_instance(). (32) Número de configuració (aquí afegint-lo a una configuració de velocitat completa).
Gestió d'unitats lògiques de classe MSC per a dispositius USB
Afegir una unitat lògica Connexió/desconnexió d'un suport d'emmagatzematge
Afegir una unitat lògica
Quan afegiu una unitat lògica a la vostra instància de classe SCSI MSC, aquesta ha d'estar vinculada a un suport d'emmagatzematge (disc RAM, targeta SD, memòria flash, etc.). La classe MSC utilitza un controlador d'emmagatzematge per comunicar-se amb els suports d'emmagatzematge. Aquest controlador s'haurà de proporcionar quan afegiu la unitat lògica.
L'exampLa següent imatge mostra com afegir una unitat lògica mitjançant sl_usbd_msc_scsi_lun_add().
Example – Afegir una unitat lògica mitjançant sl_usbd_msc_scsi_lun_add()

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

48/174

Acabatview

sl_usbd_msc_scsi_lun_t *lu_object_ptr = NULL;

sl_usbd_msc_scsi_lun_info_t lu_info;

sl_status_t

estat;

lu_info.sl_usbd_mscsi_lun_api_t = &app_usbd_scsi_storage_block_device_api;

lu_info.vendor_id_ptr

= “Silicon Labs”;

lu_info.producte_id_ptr

= "dispositiu de bloc ex"amp"le";

lu_info.producte_revision_level = 0x1000u;

lu_info.és_només_de_lectura

= fals;

estat = sl_usbd_msc_scsi_lun_add(class_nbr, &lu_info, &lu_object_ptr);
si (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */ }

Connexió/desconnexió d'un suport d'emmagatzematge
Després d'afegir la unitat lògica, cal connectar un suport d'emmagatzematge perquè estigui disponible des del costat de l'amfitrió. La classe MSC ofereix dues funcions per controlar l'associació del suport d'emmagatzematge a la unitat lògica: sl_usbd_msc_scsi_lun_attach() i sl_usbd_msc_scsi_lun_detach(). Aquestes funcions permeten emular l'eliminació d'un dispositiu d'emmagatzematge per tal de tornar a obtenir accés des de l'aplicació integrada si cal.
L'exampLa següent imatge mostra com utilitzar les funcions sl_usbd_msc_scsi_lun_attach() i sl_usbd_msc_scsi_lun_detach().
Example – Connexió/desconnexió de suports

sl_status_t estat;

status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}

(1)

estat = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); si (estat ! SL_STATUS_OK) {
/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}

(2)

estat = sl_usbd_mscsi_lun_attach(lu_object_ptr) si (estat ! SL_STATUS_OK) {
/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */
}

(3)

(1) A partir d'aquest moment, si el dispositiu MSC està connectat a un host, el suport d'emmagatzematge és accessible.
(2) Si el dispositiu MSC està connectat a un host, el suport apareixerà com a no disponible. En aquest moment, es poden realitzar operacions al suport des de l'aplicació integrada.
(3) De nou, si el dispositiu MSC està connectat a l'amfitrió, el suport d'emmagatzematge apareixerà com a connectat.
Controladors d'emmagatzematge de classe MSC per a dispositius USB
El dispositiu USB de classe MSC necessita un controlador d'emmagatzematge per comunicar-se amb un suport d'emmagatzematge. De moment, Silicon Labs no ofereix controladors.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

49/174

Acabatview
El controlador AI es defineix mitjançant typedef sl_usbd_msc_scsi_lun_api_t. La variable sl_usbd_msc_scsi_lun_api_t s'ha d'incloure a la variable sl_usbd_msc_scsi_lun_info_t, que s'utilitza quan afegiu una unitat lògica amb sl_usbd_msc_scsi_lun_add(). Vegeu la secció API SCSI MSC de dispositius USB per obtenir més detalls sobre les estructures. La implementació del controlador d'emmagatzematge pot ser tan simple com una matriu de sectors a la RAM. La mida típica del sector (és a dir, la mida del bloc) és de 512 per a dispositius d'emmagatzematge massiu i de 2048 per a CD-ROM.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

50/174

Acabatview
Acabatview
Classe de proveïdor de dispositius USB
Proveïdor de dispositius USB Class Overview Necessitats de recursos de la classe de proveïdors de dispositius USB de la configuració principal de la classe de proveïdors de dispositius USB Guia de programació de la classe de proveïdors de dispositius USB La classe Vendor permet crear dispositius específics del proveïdor que poden implementar un protocol propietari. Es basa en un parell de punts finals en bloc per transferir dades entre l'amfitrió i el dispositiu. Les transferències en bloc són convenients per transferir grans quantitats de dades no estructurades i proporcionen un intercanvi fiable de dades mitjançant un mecanisme de detecció d'errors i reintents. A més dels punts finals en bloc, la classe Vendor també pot utilitzar un parell opcional de punts finals d'interrupció. Qualsevol sistema operatiu (SO) pot funcionar amb la classe Vendor sempre que el SO tingui un controlador per gestionar la classe Vendor. Segons el SO, el controlador pot ser natiu o específic del proveïdor. Per exemple, a Microsoft Windows®, l'aplicació interactua amb el controlador WinUSB proporcionat per Microsoft per comunicar-se amb el dispositiu del proveïdor.
Proveïdor de dispositius USB Class Overview
La figura – Arquitectura general entre l'amfitrió de Windows i la classe Vendor mostra l'arquitectura general entre l'amfitrió i el dispositiu utilitzant la classe Vendor. En aquest exempleampés a dir, el sistema operatiu amfitrió és MS Windows.
Figura: Arquitectura general entre l'amfitrió de MS Windows i la classe del proveïdor

Al costat de MS Windows, l'aplicació es comunica amb el dispositiu del proveïdor interactuant amb una biblioteca USB. Les biblioteques, com ara libusb, ofereixen una API per gestionar un dispositiu i les seves canonades associades, i per comunicar-se amb el dispositiu a través de punts finals de control, bulk i interrupció.
Pel que fa al dispositiu, la classe Vendor està composta pels següents punts finals:
Un parell de punts finals d'entrada i sortida de control anomenats punts finals per defecte. Un parell de punts finals d'entrada i sortida en bloc.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

51/174

Acabatview

Un parell de punts finals d'entrada i sortida d'interrupció. Aquest parell és opcional. La taula següent indica l'ús dels diferents punts finals:
Taula: Ús dels punts finals de la classe de proveïdors

Direcció del punt final

Control IN
Control
FORA
Entrada a granel

De dispositiu a host
>Amfitrió a dispositiu
De dispositiu a host

SORTIDA a granel
Interrupció d'entrada
Interrupció
FORA

Host-to-dispositiu
De dispositiu a host
Host-to-dispositiu

Ús
Sol·licituds estàndard d'enumeració i sol·licituds específiques del proveïdor.
Sol·licituds estàndard d'enumeració i sol·licituds específiques del proveïdor.
Comunicació de dades en brut. Les dades es poden estructurar segons un protocol propietari.
Comunicació de dades en brut. Les dades es poden estructurar segons un protocol propietari.
Comunicació o notificació de dades en brut. Les dades es poden estructurar segons un protocol propietari. Comunicació o notificació de dades en brut. Les dades es poden estructurar segons un protocol propietari.

L'aplicació del dispositiu pot utilitzar punts finals d'interrupció i de transferència massiva per enviar o rebre dades a l'amfitrió o des d'aquest. Només pot utilitzar el punt final per defecte per descodificar les sol·licituds específiques del proveïdor enviades per l'amfitrió. Les sol·licituds estàndard es gestionen internament per la capa central del dispositiu USB de Silicon Labs.
Necessitats de recursos de la classe de proveïdors de dispositius USB de Core

Cada vegada que afegiu una instància de classe de proveïdor a una configuració mitjançant la funció sl_usbd_vendor_add_to_configuration(), els recursos següents s'assignaran des del nucli.

Recurs
Interfícies Interfícies alternatives Punts finals Grups d'interfícies

Quantitat
1 1 2 (4 si heu habilitat els punts finals d'interrupció) 0

Tingueu en compte que aquests números són per configuració. Quan configureu els valors de configuració SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY i SL_USBD_DESCRIPTOR_QUANTITY, no us oblideu de tenir en compte quantes configuracions s'afegiran a la classe. Pel que fa al valor de configuració SL_USBD_OPEN_ENDPOINTS_QUANTITY, com que els punts finals només s'obren quan l'amfitrió defineix una configuració, només cal tenir en compte el nombre de punts finals necessaris per a una instància de classe.
Configuració de la classe del proveïdor del dispositiu USB

Per configurar la classe Proveïdor s'utilitzen dos grups de paràmetres de configuració:
Configuracions específiques de l'aplicació de la classe de proveïdors de dispositius USB Configuracions d'instància de la classe de proveïdors de dispositius USB
Configuracions específiques de l'aplicació de la classe del proveïdor de dispositius USB
Primer, per utilitzar el mòdul de classe Vendor del dispositiu USB de Silicon Labs, ajusteu les definicions de configuració en temps de compilació de Vendor segons les necessitats de l'aplicació. Es reagrupen dins de la capçalera sl_usbd_core_config.h. file a la secció Proveïdor. La finalitat de les configuracions de quantitat és informar al mòdul de dispositiu USB sobre quants objectes Proveïdor USB assignar.
La taula següent descriu cada configuració definida.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

52/174

Acabatview

Taula: definició de la configuració del proveïdor de dispositius USB

Nom de la configuració

Descripció

Valor per defecte

SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Nombre d'instàncies de classe que assignareu mitjançant una crida a la funció 2 sl_usbd_vendor_create_instance().

SL_USBD_VENDOR_CONFIGURATION_QUANTITY Nombre de configuracions. Les instàncies de la classe de proveïdors es poden afegir a una o més configuracions mitjançant una crida a la funció sl_usbd_vendor_add_to_configuration().

Configuracions d'instància de classe de proveïdor de dispositius USB

Aquesta secció defineix les configuracions relacionades amb les instàncies de la classe Vendor.
Creació d'instància de classe intr_en interval p_vendor_callbacks
Creació d'instàncies de classe

La creació d'una instància de la classe Vendor es fa cridant la funció sl_usbd_vendor_create_instance(), que pren tres arguments de configuració que es descriuen a continuació.

intr_en
Booleà que indica si s'ha d'afegir o no un parell de punts finals d'interrupció.

Valor
vertader fals

Descripció
S'afegirà un parell de punts finals d'entrada/sortida i es posaran a disposició de l'aplicació integrada. No s'afegirà cap punt final d'interrupció. Només estarà disponible un parell de punts finals d'entrada/sortida en bloc.

interval
Si definiu intr_en a true, podeu especificar l'interval de sondeig dels punts finals d'interrupció (en mil·lisegons). Si definiu intr_en a false, podeu definir l'interval a 0, ja que la classe l'ignorarà.
p_vendor_callbacks
p_vendor_callbacks és un punter a una variable d'estructura de funcions de retorn de trucada que podeu especificar per gestionar les sol·licituds de control específiques de la classe. Si no utilitzeu cap sol·licitud específica de la classe o necessiteu activar/desactivar la notificació, podeu establir-ho a NULL.
L'exampLa imatge següent proporciona la signatura esperada del gestor de sol·licituds específic de la vostra classe.
Example – Signatura de la funció de sol·licitud específica de la classe

buit app_usbd_vendor_req_handle(uint8_t

núm._classe, (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) Número d'instància de la classe del proveïdor.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

53/174

Acabatview

(2) Punter a una sol·licitud de configuració rebuda de l'amfitrió.
Guia de programació de la classe del proveïdor de dispositius USB
Aquesta secció explica com utilitzar la classe Vendor. Inicialització de la classe USB Device Vendor Afegir una instància de la classe USB Device Vendor al dispositiu Comunicació mitjançant la classe USB Device Vendor
Inicialització de la classe de proveïdor de dispositius USB
Per afegir una funcionalitat de classe de proveïdor al vostre dispositiu, primer inicialitzeu la classe cridant la funció USBD_Vendor_Init(). L'exampLa imatge següent mostra com cridar sl_usbd_vendor_init().
Example – Crida a sl_usbd_vendor_init()

sl_status_t estat;
status = sl_usbd_vendor_init(); if (status ! SL_STATUS_OK) { /* S'ha produït un error. Cal afegir la gestió d'errors aquí. */ }
Afegir una instància de classe de proveïdor de dispositius USB al dispositiu
Per afegir la funcionalitat de la classe de proveïdor al dispositiu, primer heu de crear una instància i, a continuació, afegir-la a la configuració del dispositiu.
Creació d'una instància de classe de proveïdor Afegir la instància de classe de proveïdor a la configuració del dispositiu
Creació d'una instància de classe de proveïdor
Crea una instància de la classe Vendor cridant la funció sl_usbd_vendor_create_instance(). L'exampA continuació es mostra com cridar sl_usbd_vendor_create_instance() utilitzant arguments per defecte. Per obtenir més informació sobre els arguments de configuració que cal passar a sl_usbd_vendor_create_instance(), consulteu Configuracions d'instància de classe de proveïdor de dispositius USB.
Example – Crida a sl_usbd_vendor_create_instance()

uint8_t class_nbr; sl_status_t estat;

estat = sl_usbd_vendor_create_instance(fals,

(1)

0u,

(2)

funcions_de_retorn_de_referència_d'aplicació_usbd_vendor, (3)

&número_classe);

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

(1) No hi ha punts finals d'interrupció amb aquesta instància de classe. (2) L'interval s'ignora, ja que els punts finals d'interrupció estan desactivats.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

54/174

Acabatview

(3) Funció de crida de retorn que forma part de l'aplicació que gestiona les sol·licituds de classe específiques del proveïdor. Vegeu Comunicació mitjançant la classe de proveïdor de dispositius USB per obtenir més informació. Afegir la instància de la classe de proveïdor a la configuració del dispositiu Després de crear una instància de classe de proveïdor, podeu afegir-la a una configuració cridant la funció USBD_Vendor_ConfigAdd(). L'exampLa imatge següent mostra com cridar sl_usbd_vendor_add_to_configuration() utilitzant els arguments per defecte.
Example – Crida a sl_usbd_vendor_add_to_configuration()

sl_status_t estat;

estat = sl_usbd_vendor_add_to_configuration(class_nbr,

(1)

config_nbr_fs);

(2)

si (estat ! SL_STATUS_OK) {

/* S'ha produït un error. Cal afegir la gestió d'errors aquí. */

}

(1) Número de classe a afegir a la configuració retornada per sl_usbd_vendor_create_instance(). (2) Número de configuració (aquí afegint-lo a una configuració de velocitat completa).
Comunicació mitjançant la classe de proveïdor de dispositius USB
Comunicació síncrona general Comunicació asíncrona Sol·licitud del proveïdor General La classe Vendor ofereix les funcions següents per comunicar-se amb l'amfitrió. Per obtenir més informació sobre els paràmetres de la funció, consulteu l'API del proveïdor de dispositius USB.
Taula: Resum de l'API de comunicació amb proveïdors

Nom de la funció
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_ read_inte rrup t_sy nc() sl_usb d_ve nd o r_ read_inte rrup t_asy nc
()
sl_usb d _ven o r_write _inte rrup t_asy nc
()

Operació Rep dades de l'amfitrió a través del punt final de sortida en bloc. Aquesta funció és bloquejant. Envia dades a l'amfitrió a través del punt final d'entrada en bloc. Aquesta funció és bloquejant. Rep dades de l'amfitrió a través del punt final d'entrada en bloc. Aquesta funció no és bloquejant. Envia dades a l'amfitrió a través del punt final d'entrada en bloc. Aquesta funció no és bloquejant. Rep dades de l'amfitrió a través del punt final d'interrupció OUT. Aquesta funció és bloquejant. Envia dades a l'amfitrió a través del punt final d'interrupció IN. Aquesta funció és bloquejant. Rep dades de l'amfitrió a través del punt final d'interrupció OUT. Aquesta funció no és
bloqueig.
Envia dades a l'amfitrió a través del punt final d'interrupció IN. Aquesta funció no és bloquejant.

Les sol·licituds del proveïdor també són una altra manera de comunicar-se amb l'amfitrió. Quan es gestionen les sol·licituds del proveïdor enviades per l'amfitrió, l'aplicació pot rebre o enviar dades des de o cap a l'amfitrió mitjançant el punt final de control; haureu de proporcionar una resposta de l'aplicació passada com a paràmetre de sl_usbd_vendor_create_instance(). Comunicació síncrona

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

55/174

Acabatview

La comunicació síncrona significa que la transferència és bloquejant. Quan es crida una funció, l'aplicació es bloqueja fins que la transferència es completa amb o sense error. Es pot especificar un temps d'espera per evitar esperar per sempre. L'exampLa imatge següent mostra una lectura i escriptura que rep dades de l'amfitrió mitjançant el punt final de sortida en bloc i envia dades a l'amfitrió mitjançant el punt final d'entrada en bloc.
Example – Lectura i escriptura massiva síncrona

__ALIGNED(4) uint8_t rx_buf[2];

__ALIGNED(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

estat;

estat = sl_usbd_vendor_read_bulk_sync(class_nbr,

(1)

(buid *)&rx_buf[0],

(2)

2u,

0u,

(3)

&xfer_len);

si (estat ! SL_STATUS_OK) {

/* $$$$ Gestiona l'error. */

}

estat = sl_usbd_vendor_write_bulk_sync(número_de_classe,

(1)

(vuit *)&tx_buf[0],

(4)

2u,

0u,

(3)

fals,

(5)

&xfer_len);

si (estat ! SL_STATUS_OK) {

/* $$$$ Gestiona l'error. */

}

(1) El número d'instància de classe creat amb sl_usbd_vendor_create_instance() proporciona una referència interna a la classe Vendor per encaminar la transferència al punt final de sortida o entrada en bloc adequat.
(2) L'aplicació ha d'assegurar-se que la memòria intermèdia proporcionada a la funció sigui prou gran per allotjar totes les dades. En cas contrari, podrien sorgir problemes de sincronització.
(3) Per evitar una situació de bloqueig infinit, es pot especificar un temps d'espera expressat en mil·lisegons. Un valor de 809 fa que la tasca de l'aplicació esperi indefinidament.
(4) L'aplicació proporciona la memòria intermèdia de transmissió inicialitzada.
(5) Si aquest indicador està definit com a true i la longitud de la transferència és múltiple de la mida màxima del paquet del punt final, la pila de dispositius enviarà un paquet de longitud zero a l'amfitrió per indicar el final de la transferència.
L'ús de les funcions de comunicació de punts finals d'interrupció, sl_usbd_vendor_read_interrupt_sync() i sl_usbd_vendor_write_interrupt_sync(), és similar a les funcions de comunicació de punts finals en bloc presentades a l'Ex.ample – Lectura i escriptura massiva síncrona.
Comunicació asíncrona
La comunicació asíncrona significa que la transferència no és bloquejant. Quan es crida una funció, l'aplicació passa la informació de transferència a la pila de dispositius i no es bloqueja. Es poden fer altres processaments de l'aplicació mentre la transferència està en curs a través del bus USB. Un cop finalitzada la transferència, la pila de dispositius crida una funció de retrollamada per informar l'aplicació sobre la finalització de la transferència. L'exampLa imatge següent mostra la lectura i escriptura asíncrona.
Example – Lectura i escriptura massiva asíncrona

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

56/174

Acabatview

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

estat;

estat = sl_usbd_vendor_read_bulk_async(class_nbr,

(buid *)&rx_buf[0],

(2)

2u,

app_usbd_vendor_rx_completed,

NUL);

(4)

si (estat ! SL_STATUS_OK) {

/* $$$$ Gestiona l'error. */

}

estat = sl_usbd_vendor_write_bulk_async(class_nbr,

(vuit *)&tx_buf[0],

(5)

2u,

app_usbd_vendor_tx_completed,

NULL,

(4)

fals);

(6)

si (estat ! SL_STATUS_OK) {

/* $$$$ Gestiona l'error. */

}

}

(1) (3)
(1) (3)

static void app_usbd_vendor_rx_completed(uint8_t número_de_classe,

(3)

buit *p_buf,

uint32_t buf_len,

uint32_t xfer_len,

void *p_callback_arg,

estat sl_status_t)

{

si (estat ! SL_STATUS_OK) {

/* $$$$ Fes una mica de processament. */

} altrament {

/* $$$$ Gestiona l'error. */

}

}

static void app_usbd_vendor_tx_completed(uint8_t número_de_classe,

(3)

buit *p_buf,

uint32_t buf_len,

uint32_t xfer_len,

void *p_callback_arg,

estat sl_status_t)

{

si (estat ! SL_STATUS_OK) {

/* $$$$ Fes una mica de processament. */

} altrament {

/* $$$$ Gestiona l'error. */

}

}

(1) El número d'instància de la classe proporciona una referència interna a la classe Vendor per encaminar la transferència al punt final de sortida o entrada en bloc adequat. (2) L'aplicació ha d'assegurar-se que la memòria intermèdia proporcionada sigui prou gran per allotjar totes les dades. En cas contrari, hi pot haver problemes de sincronització. (3) L'aplicació proporciona un punter de funció de retrollamada passat com a paràmetre. Un cop finalitzada la transferència, la pila de dispositius crida aquesta funció de retrollamada perquè l'aplicació pugui finalitzar la transferència analitzant el resultat de la transferència. Per exemple, un cop finalitzada una operació de lectura, l'aplicació pot processar les dades rebudes. Un cop finalitzada l'escriptura, l'aplicació pot indicar si l'escriptura s'ha realitzat correctament i quants bytes s'han enviat.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

57/174

Acabatview
(4) També es pot passar un argument associat amb la devolució de trucada. Aleshores, en el context de la devolució de trucada, es pot recuperar informació privada. (5) L'aplicació proporciona el buffer de transmissió inicialitzat. (6) Si aquest indicador està definit com a true i la longitud de la transferència és un múltiple de la mida màxima del paquet del punt final, la pila de dispositius enviarà un paquet de longitud zero a l'amfitrió per indicar el final de la transferència. L'ús de les funcions de comunicació del punt final d'interrupció, sl_usbd_vendor_read_interrupt_async() i sl_usbd_vendor_write_interrupt_async(), és similar a les funcions de comunicació del punt final en bloc presentades a l'Ex.ampLectura i escriptura massiva asíncrona.
Sol·licitud del proveïdor
L'especificació USB 2.0 defineix tres tipus de sol·licituds: estàndard, de classe i de proveïdor. Totes les sol·licituds estàndard són gestionades directament per la capa central, mentre que les sol·licituds de classe són gestionades per la classe associada adequada. Les sol·licituds de proveïdor poden ser processades per la classe de proveïdor. Per processar les sol·licituds de proveïdor, heu de proporcionar una devolució de crida de l'aplicació com a paràmetre de sl_usbd_vendor_create_instance(). Després que el dispositiu USB rebi una sol·licitud de proveïdor, s'ha de descodificar correctament. L'exampLa imatge següent mostra la descodificació de sol·licituds del proveïdor. Algunes sol·licituds poden ser necessàries per rebre o enviar a l'amfitrió durant el procés de transferència de dades.tage d'una transferència de control. Si no hi ha dadestage és present, només heu de descodificar el paquet Setup. Aquest exampmostra els tres tipus de dadestagGestió electrònica: sense dades, dades de SORTIDA i dades d'ENTRADA.
Example – Descodificació de sol·licituds del proveïdor

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

58/174

Acabatview

#defineix APP_VENDOR_REQ_NO_DATA

0x01u

#defineix APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST 0x02u

#defineix APP_VENDOR_REQ_SEND_DATA_TO_HOST 0x03u

#defineix APP_VENDOR_REQ_DATA_BUF_SIZE

50u

estàtic uint8_t app_vendor_req_buf[APP_VENDOR_REQ_DATA_BUF_SIZE];

estàtic bool app_usbd_vendor_req (uint8_t

classe_número,

const sl_usbd_setup_req_t *p_setup_req)

(1)

{

bool vàlid;

sl_status_t estat;

uint16_t req_len;

uint32_t xfer_len;

(buid)número_de_classe;

switch(p_setup_req->bRequest) { case APP_VENDOR_REQ_NO_DATA: vàlid = true; break;

(2) (3)

cas APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:

(4)

req_len = p_setup_req->wLength;

si (req_len > APP_VENDOR_REQ_DATA_BUF_SIZE) {

// No hi ha prou espai per rebre dades.

retorn (fals);

}

// Rebre dades via Control OUT EP. // Esperar indefinidament que es completi la transferència. status = sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, &xfer_len); si (estat ! SL_STATUS_OK) { vàlid = fals; } altrament { vàlid = cert; } break;

cas APP_VENDOR_REQ_SEND_DATA_TO_HOST:

(5)

req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;

// Omple el buf amb un patró. Mem_Set((void *)&AppVendorReqBuf[0u],
'A',
req_len);

// Envia dades via Control IN EP. // Espera indefinidament que es completi la transferència. status = sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, false, &xfer_len); si (estat ! SL_STATUS_OK) { vàlid = DEF_FAIL; } else { vàlid = DEF_OK; } break;

per defecte:

(6)

// La sol·licitud no és compatible.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

59/174

Acabatview

vàlid = cert; trencament;
case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:(4) req_len = p_setup_req->wLength;if(req_len > APP_VENDOR_REQ_DATA_BUF_SIZE){// No hi ha prou espai per rebre dades.return(false);}// Rebre dades a través de Control OUT EP.// Esperar indefinidament que es completi la transferència. status =sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,&xfer_len); if(estat ! SL_STATUS_OK){ vàlid =fals;}else{ vàlid =true;}break;
case APP_VENDOR_REQ_SEND_DATA_TO_HOST:(5) req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;// Ompliu buf amb un pattern.Mem_Set((void *)&AppVendorReqBuf[0u],'A',
req_len);// Envia dades via Control IN EP.// Espera indefinidament que es completi la transferència. status =sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,false,&xfer_len); if(status ! SL_STATUS_OK){ vàlid = DEF_FAIL;}else{ vàlid = DEF_OK;}break;
per defecte: (6) // La sol·licitud no és compatible. vàlid = DEF_FAIL; break; } return (vàlid); }

(1) El nucli passarà el contingut del paquet de configuració a la vostra aplicació. L'estructura sl_usbd_setup_req_t conté els mateixos camps que els definits per l'especificació USB 2.0 (vegeu la secció "9.3 Sol·licituds de dispositiu USB" de l'especificació per obtenir més detalls):

typedef struct {

uint8_t bmRequestType; /* Característiques de la sol·licitud.

*/

uint8_t bRequest; /* Sol·licitud específica.

*/

uint16_t wValue; /* Varia segons la sol·licitud.

*/

uint16_t wIndex; /* Varia segons la sol·licitud; normalment s'utilitza com a índex.*/

uint16_t wLength; /* Longitud de transferència si les dades sóntage present.

*/

} sl_usbd_setup_req_t;

(2) Determineu la sol·licitud. Podeu utilitzar una instrucció switch si esteu utilitzant sol·licituds diferents. En aquest exempleampés a dir, hi ha tres sol·licituds diferents que corresponen als tres tipus de dadestage: APP_VENDOR_REQ_NO_DATA, APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST i APP_VENDOR_REQ_SEND_DATA_TO_HOST.
(3) Si no hi ha dadestagSi hi ha "e", només cal descodificar els altres camps. La presència d'una dada stagSi e o no, s'indica quan el camp wLength és diferent de nul o nul.
(4) Si l'amfitrió envia dades al dispositiu, heu de cridar la funció sl_usbd_core_read_control_sync(). El buffer proporcionat ha de poder contenir fins a wLength bytes. Si es produeix algun error, retorna false al nucli, cosa que bloquejarà l'estat s.tage de la transferència de control, indicant a l'amfitrió que la sol·licitud no es pot processar. Es retorna true en cas d'èxit.
(5) Si l'amfitrió rep dades del dispositiu, heu de cridar la funció sl_usbd_core_write_control_sync(). Si es produeix algun error, retorna fals al nucli, cosa que bloquejarà l'estat s.tage de la transferència de control, indicant a l'amfitrió que la sol·licitud no es pot processar. Es retorna true en cas d'èxit.
(6) En aquest ex.ampés a dir, totes les sol·licituds no reconegudes es marquen retornant fals al nucli. Això aturarà les dades o l'estat.tage de la transferència de control que indica a l'amfitrió que la sol·licitud no és compatible.
L'amfitrió envia sol·licituds de proveïdors a través d'una aplicació de proveïdor d'amfitrió. Les biblioteques USB, com ara libusb, es poden utilitzar per ajudar-vos a desenvolupar la vostra aplicació de proveïdor d'amfitrió personalitzada.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

60/174

Documentació de l'API
Documentació de l'API
Documentació de l'API
Llistat de mòduls
API de dispositiu USB API de dispositiu USB ACM API de dispositiu USB CDC API de dispositiu USB Core API de dispositiu USB HID API de dispositiu USB MSC API de dispositiu USB MSC SCSI API del proveïdor de dispositius USB

Descripció
API de dispositiu USB API de dispositiu USB ACM API de dispositiu USB CDC API de dispositiu USB Core API de dispositiu USB HID API de dispositiu USB MSC API de dispositiu USB MSC SCSI API del proveïdor de dispositius USB

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

61/174

API de dispositius USB
API de dispositius USB
API de dispositius USB
API de dispositius USB.
Mòduls
API ACM de dispositiu USB API CDC de dispositiu USB API Core de dispositiu USB API HID de dispositiu USB API MSC de dispositiu USB API MSC SCSI de dispositiu USB API del proveïdor de dispositius USB

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

62/174

API ACM de dispositius USB

API ACM de dispositius USB

API ACM de dispositius USB

API CDC ACM per a dispositius USB.
Mòduls
a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t
Funcions

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)
VARIABLES GLOBALS.
ssll__uussbbdd__ccddcc__aaccmm__ccraellabtaec_kins_stta*npc_ea(cumin_tc1a6l_lbtalicnkes_,sutaintte8__int t*eprv_saul,bucinlats1s6__nt bcra)ll_mgmt_capabilities,
Afegeix una nova instància de la subclasse d'emulació sèrie CDC ACM.
aaaa sl_usbd_cdc_ cm_ dd_to_configuration(uint8_t subcl ss_nbr, uint8_t config_nbr)
Afegiu una instància de la subclasse CDC ACM a la configuració del dispositiu USB.
aa sl_usbd_cdc_ cm_is_en bled(uint8_t subclass_nbr, bool *p_enabled)
Obtén l'estat d'habilitació de la subclasse d'emulació sèrie ACM del CDC.
aaa sl_usbd_cdc_ cm_re d(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t temps d'espera, uint32_t
*p_xfer_len) Rep dades a la subclasse d'emulació sèrie ACM de CDC.
aaaa sl_usbd_cdc_ cm_re d_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, aaaa sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_rg)
Rebre dades a la subclasse d'emulació sèrie ACM de CDC de manera asíncrona.
aa sl_usbd_cdc_ cm_write(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t temps d'espera, uint32_t
*p_xfer_len) Envia dades a la subclasse d'emulació sèrie ACM de CDC.
aaa sl_usbd_cdc_ cm_write_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, aaaa sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_rg)
Envia dades a la subclasse d'emulació sèrie ACM de CDC de manera asíncrona.
aaa sl_usbd_cdc_ cm_get_line_control_st te(uint8_t subcl ss_nbr, uint8_t *p_line_ctrl)
Retorna l'estat de les línies de control.
aaa sl_usbd_cdc_ cm_get_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Obtén l'estat actual de la codificació de línia.
aaa sl_usbd_cdc_ cm_set_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Estableix una nova codificació de línia.
aaa sl_usbd_cdc_ cm_set_line_st te_event(uint8_t subcl ss_nbr, uint8_t esdeveniments)
Defineix un o més esdeveniments d'estat de línia.
aaaa sl_usbd_cdc_ cm_cle r_line_st te_event(uint8_t subcl ss_nbr, uint8_t esdeveniments)
Esborra un esdeveniment o esdeveniments d'estat de línia.

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

63/174

API ACM de dispositius USB
Macros
#defineix SL_USBD_CDC_ACM_NBR_NONE 255u
MÒDUL.
#defineix SL_USBD_CDC_ACM_PARITY_NONE 0u
DEFINEIX LA CONFIGURACIÓ DEL PORT.
#defineix SL_USBD_CDC_ACM_PARITY_ODD 1u #defineix SL_USBD_CDC_ACM_PARITY_EVEN 2u #defineix SL_USBD_CDC_ACM_PARITY_MARK 3u #defineix SL_USBD_CDC_ACM_PARITY_SPACE 4u #defineix SL_USBD_CDC_ACM_STOP_BIT_1 0u #defineix SL_USBD_CDC_ACM_STOP_BIT_1_5 1u #defineix SL_USBD_CDC_ACM_STOP_BIT_2 2u #defineix SL_USBD_CDC_ACM_CTRL_BREAK 0 01u
ESDEVENIMENTS DE LÍNIA DEFINEIXEN BANDERES.
#defineix SL_USBD_CDC_ACM_CTRL_RTS 0 02u #defineix SL_USBD_CDC_ACM_CTRL_DTR 0 04u #defineix SL_USBD_CDC_ACM_STATE_DCD 0 01u #defineix SL_USBD_CDC_ACM_STATE_DSR 0 02u #defineix SL_USBD_CDC_ACM_STATE_BREAK 0 04u #defineix SL_USBD_CDC_ACM_STATE_RING 0 08u #defineix SL_USBD_CDC_ACM_STATE_FRAMING 0 10u #defineix SL_USBD_CDC_ACM_STATE_PARITY 0 20u #defineix SL_USBD_CDC_ACM_STATE_OVERUN 0 40u #defineix SL_USBD_CDC_ACM_CALL_MGMT_DEV 0 01u
CAPACITATS DE GESTIÓ DE TRUCADES.
#defineix SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI 0 02u #defineix SL_USBD_CDC_ACM_CALL_MGMT_DATA_OVER_DCI 0 02u | 0 01u)
Documentació de funcions
sl_usbd_cdc_acm_init
sl_status_t sl_usbd_cdc_acm_init (buit)
VARIABLES GLOBALS. Paràmetres
Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

64/174

API ACM de dispositius USB

Tipus
buit

Direcció N/A

Nom de l'argument

MACROS CONSTANTS GLOBALS PROTOTIPS DE FUNCIONS FUNCIONS CDC ACM

Inicialitza la subclasse d'emulació sèrie ACM de CDC.
Devolucions

Retorna SL_STATUS_OK en cas d'èxit o un altre codi SL_STATUS en cas d'error.

Descripció

sl_usbd_cdc_acm_create_instance

sl_status_t sl_usbd_cdc_acm_create_instance (uint16_t interval_d'estat_de_línia, uint16_t capacitats_de_gestió_de_criades, sl_usbd_cdc_acm_callbacks_t * p_acm_callbacks, uint8_t * p_subclass_nbr)

Afegeix una nova instància de la subclasse d'emulació sèrie CDC ACM.
Paràmetres

Tipus
uint16_t
uint16_t

Nom de l'argument de direcció

Descripció

N/A

interval_d'estat_de_línia Interval de notificació de l'estat de la línia en mil·lisegons (el valor ha de

sigui una potència de 2).

N/A

Mapa de bits de les capacitats de gestió de trucades de call_mgmt_capabilities. Operat amb l'operador OR de

següents banderes:

SL_USBD_CDC_ACM_CALL_MGMT_DEV El dispositiu gestiona la gestió de trucades per si mateix. SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI El dispositiu pot enviar/rebre informació de gestió de trucades a través d'una interfície de classe de dades.

sl_usbd_cdc_acm_callbacks_t N/A
*

uint8_t *

N/A

p_acm_callbacks p_subclass_nbr

Punters opcionals a funcions de retrollamada que s'invocaran en diversos esdeveniments.
Paràmetre a la variable que rebrà el número d'instància de la subclasse d'emulació sèrie CDC ACM.

Devolucions

Retorna SL_STATUS_OK en cas d'èxit o un altre codi SL_STATUS en cas d'error.

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)

Afegiu una instància de la subclasse CDC ACM a la configuració del dispositiu USB.
Paràmetres

Tipus
uint8_t uint8_t

Direcció N/AN/A

Nom de l'argument
número_de_subclasse número_de_configuració

Descripció Número d'instància de la subclasse d'emulació sèrie CDC ACM. Índex de configuració per afegir-hi una nova interfície de classe de prova.

Devolucions

Copyright © 2025 Silicon Laboratories. Tots els drets reservats.

65/174

API ACM de dispositius USB
Retorna SL_STATUS_OK en cas d'èxit o un altre codi SL_STATUS en cas d'error.

sl_usbd_cdc_acm_is_habilitat

sl_status_t sl_usbd_cdc_acm_is_enabled (uint8_t subclass_nbr, bool * p_enabled)

Obtén l'estat d'habilitació de la subclasse d'emulació sèrie ACM del CDC.
Paràmetres

Tipus

Direcció

Nom de l'argument

Descripció

uint8_t N/A

subclass_nbr Número d'instància de la subclasse d'emulació sèrie CDC ACM.

booleà * N/A

p_habilitat

Booleà a una variable que rebrà l'estat d'habilitació. La variable està definida com a true, l'emulació sèrie CDC ACM està habilitada. El va

Documents/Recursos

Pila de dispositius USB de SILICON LABS [pdfManual d'instruccions
Pila de dispositius USB, pila de dispositius, pila

Referències

Deixa un comentari

La teva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats *