SILICON LABS USB-enhedsstak Instruktionsmanual

USB-enhedsstak

Specifikationer

  • USB-version: 1.5.1
  • Udgivelsesdato: 21. juli 2025
  • Simplicity SDK-version: 2025.6.1

Produkt overview

USB-enhedsstakken fra Silicon Labs leverer alsidig og
brugervenlig USB-tilslutning til IoT-projekter, hvilket letter
kommunikation mellem netværks-coprocessorer og værter.

Funktioner

  • Effektiv USB-enhedsstak
  • Ideel til IoT-projekter
  • Understøttelse af kommunikation mellem netværks-coprocessorer og
    værter

Produktbrugsvejledning

USB-enhedskonfiguration

Konfigurer USB-enhedens indstillinger i henhold til dit projekt
krav ved at se afsnittet USB-enhedskonfiguration
i dokumentationen.

Programmeringsvejledning til USB-enheder

Følg USB-enhedsprogrammeringsvejledningen for at forstå, hvordan du
programmere og interagere med USB-enheden til forskellige formål
applikationer.

USB-enhedsklasser

Afsnittet USB-enhedsklasser giver en oversigt overview af forskellige
klasser som CDC ACM, HID, MSC SCSI og Vendor Class. Vælg den
passende klasse baseret på din enheds funktionalitet.

Fejlfinding af USB-enheder

Hvis du støder på problemer med USB-enheden, skal du se
Fejlfindingsafsnit for USB-enheder med løsninger og fejlfinding
tips.

Microsoft Windows OS USB-vært

Hvis du bruger USB-enheden med et Microsoft Windows OS USB
Vært, sørg for at følge retningslinjerne i
dokumentation for problemfri integration.

FAQ

Q: Hvad er nogle almindelige exampfærre enheder jeg kan bygge ved hjælp af
denne USB-stak?

A: USB-stakken giver dig mulighed for at bygge enheder som f.eks.
USB-til-seriel adaptere, mus eller tastaturer, flytbar lagring
enheder og brugerdefinerede enheder.

Q: Er der specifikke softwarekrav for at bruge dette
USB-enhedsstak?

A: Kompatibel software inkluderer Simplicity SDK, Simplicity
Studio, Simplicity Commander, GCC (GNU Compiler Collection),
IAR indlejret arbejdsbænk til ARM og IAR EWARM.

Universal Serial Bus USB

Universal Serial Bus USB

USB-overgangview Overview
Udgivelsesnoter USB
Specifikationer og funktioner overview
USB-enhedskonfiguration overståetview
USB-enhedsprogrammeringsvejledning overview
USB-enhedsklasser overview CDC ACM-klasse overståetview HID-klasse overview MSC SCSI-klasse overview Leverandørklasse overview
USB API API-dokumentation USB-enheds-API USB-enheds ACM API a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t USB-enheds CDC API a sl_usbd_cdc_subcl ss_driver_t USB-enhedskerne-API
sl_usbd_device_config_t sl_usbd_setup_req_t
en sl_usbd_cl ss_driver_t USB-enhed HID API
sl_usbd_hid_callbacks_t USB-enhed MSC API
en sl_usbd_msc_subcl ss_driver_t USB-enhed MSC SCSI API
sl_usbd_msc_scsi_callbacks_t

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

1/174

Universal Serial Bus USB
en sl_usbd_msc_scsi_lun_ pi
sl_usbd_msc_scsi_lun_info sl_usbd_msc_scsi_lun
USB-enhedsleverandør-API sl_usbd_vendor_callbacks_t
API-dokumentation Fejlfinding af USB-enheder
Overview Microsoft Windows OS USB-vært
Overview

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

2/174

Overview
Overview
USB-enhed
USB er en af ​​de mest succesfulde kommunikationsgrænseflader i computersystemernes historie og er de facto-standarden for tilslutning af computerudstyr. Silicon Labs USB Device Stack er et USB-enhedsmodul, der er specielt designet til indlejrede systemer. Det er bygget fra bunden med Silicon Labs' kvalitet, skalerbarhed og pålidelighed og har gennemgået en streng valideringsproces for at overholde USB 2.0-specifikationen. Denne dokumentation beskriver, hvordan man initialiserer, starter og bruger Silicon Labs USB Device Stack. Den forklarer de forskellige konfigurationsværdier og deres anvendelser. Den indeholder også en oversigt over...view af teknologien, typer af konfigurationsmuligheder, implementeringsprocedurer og f.eks.amptypisk brug for hver tilgængelig klasse.
For at du hurtigt kan forstå USB-koncepterne, indeholder dokumentationen mange eksemplerampUSB-kort med grundlæggende funktioner. Disse f.eks.amples vil give dig et framework, der giver dig mulighed for hurtigt at bygge enheder. Disse f.eks.amples inkluderer:
USB-til-seriel adapter (kommunikationsenhedsklasse) Mus eller tastatur (Human Interface Device Class) Flytbar lagerenhed (Mass Storage Class) Brugerdefineret enhed (Vendor Class)
Det følgende er slutview af dokumentationsafsnittene:
Specifikationer og funktioner Konfiguration af USB-enhed Programmeringsvejledning til USB-enhed Klasser af USB-enheder
CDC ACM-klasse HID-klasse MSC SCSI-klasse Leverandørklasse Fejlfinding af USB-enhed Microsoft Windows OS USB-vært

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

3/174

USB
USB

USB-version 1.5.1 21. juli 2025 – Udgivelsesnoter
Simplicity SDK version 2025.6.1
Silicon Labs' effektive USB-enhedsstak tilbyder alsidig og brugervenlig USB-tilslutning, der er ideel til IoT-projekter, herunder kommunikation mellem netværksprocessorer og værter. Klik her for tidligere udgivelser.
Udgivelsesoversigt
Nøglefunktioner | API-ændringer | Fejlrettelser | Chipaktivering
Nøglefunktioner
Kun underliggende platformændringer.
API ændringer
Ingen.
Fejlrettelser
Ingen.
Chipaktivering
Ingen.
Nøglefunktioner
Nye funktioner | Forbedringer | Fjernede funktioner | Forældede funktioner
Nye funktioner
Ingen.
Forbedringer
Kun underliggende platformændringer.
Fjernede funktioner
Ingen.
Forældede funktioner
Ingen.
API ændringer
Nye API'er | Ændrede API'er | Fjernede API'er | Forældede API'er
Nye API'er

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

4/174

USB
Ingen.
Ændrede API'er
Ingen.
Fjernede API'er
Ingen.
Forældede API'er
Ingen.
Fejlrettelser
Ingen.
Chipaktivering
Ingen.
Anvendelse ExampÆndringer
Ny examples | Modificeret Eksamples | Fjernet Eksamples | Forældet Examples
Ny examples
Ingen.
Ændret Examples
Ingen.
Fjernet eksamples
Ingen.
Forældet Eksamples
Ingen.
Virkning af ændringer i udgivelse
Konsekvenserklæringer | Migrationsvejledning
Konsekvenserklæringer
Ingen.
Migrationsvejledning
Ingen.
Kendte problemer og begrænsninger
Ingen.
Brug af denne udgivelse

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

5/174

USB

Hvad indeholder udgivelsen? | Kompatibel software | Installation og brug | Hjælp og feedback

Hvad er der i udgivelsen?

USB-enhedsstakapplikation Eks.amples
Kompatibel software

Software
Simplicity SDK, Simplicity Studio, Simplicity Commander (GCC), GNU Compiler Collection (GNU Compiler Collection), IAR Embedded Workbench til ARM, IAR EWARM

Kompatibel version eller variant
2025.6.0 5.11.0 1.18.2 (leveret med Simplicity Studio) 12.2.1 (leveret med Simplicity Studio) 9.40.1 (leveret med Simplicity Studio)

Installation og brug

For at kickstarte din udvikling, se vores:
Programmeringsvejledning til USB-enheder. API-dokumentation.
For information om integration af sikker boks, se Sikker boks.
Til review Sikkerheds- og softwarerådgivningsmeddelelser og administrer dine meddelelsespræferencer:
Gå til https://community.silabs.com/. Log ind med dine kontooplysninger. Klik på din profile ikonet i øverste højre hjørne af siden.
õ Vælg Meddelelser i rullemenuen. ö I afsnittet Meddelelser skal du gå til fanen Mine produktmeddelelser for atview historisk sikkerheds- og softwarerådgivning
meddelelser
÷ For at administrere dine præferencer skal du bruge fanen Administrer notifikationer til at tilpasse, hvilke produktopdateringer og meddelelser du ønsker
modtage.
For anbefalede konfigurationsindstillinger, se her.
For at lære mere om softwaren i denne udgivelse, kan du dykke ned i vores online dokumentation.
Hjælp og feedback

Kontakt Silicon Labs Support. For at bruge vores Ask AI-værktøj til at få svar, se søgefeltet øverst på denne side.

Bemærk: Ask AI er eksperimentel.

Få hjælp fra vores udviklerfællesskab.
SDK-udgivelses- og vedligeholdelsespolitik
Se vores politik for SDK-udgivelse og vedligeholdelse.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

6/174

Overview
Overview
Specifikationer
Overholder “Universal Serial Bus specification revision 2.0” Implementerer “Interface Association Descriptor Engineering Change Notice (ECN)” Overførselstyper
Styring af masseafbrydelser USB-klasser Kommunikationsenhedsklasse (CDC) Abstrakt kontrolmodel (ACM) Human Interface Device (HID) Masselagringsklasse (MSC) Leverandørspecifik klasseramme
Funktioner
Skalerbar til kun at inkludere nødvendige funktioner for at minimere hukommelsesfodaftryk Understøtter fuld hastighed (12 Mbit/s) Understøtter kompositenheder (multifunktionsenheder) Understøtter multikonfigurationsenheder Understøtter USB-strømbesparende funktioner (enhed suspenderes og genoptages) Fuldstændig integration af Mass Storage Class i Micrium OS File Systemmodul udviklet med CMSIS-RTOS2 abstraktionslag, så det kan fungere med forskellige operativsystemer. Silicon Labs GSDK leveres med FreeRTOS- og Micrium OS-porte.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

7/174

Overview
Overview

USB-enhedskonfiguration

Dette afsnit omhandler, hvordan man konfigurerer en Silicon Labs USB-enhed. Der er tre grupper af konfigurationsparametre, som følger:
USB-enhedskernekonfiguration Konfiguration af USB-enhedsoplysninger Konfiguration af USB-enhedshardware
USB-enhedskernekonfiguration
Silicon Labs USB-enhed kan konfigureres ved kompilering via et sæt #defines, der er placeret i sl_usbd_core_config.h. fileUSB-enhed bruger #defines, når det er muligt, fordi de tillader skalering af kode- og datastørrelser ved kompileringstid baseret på hvilke funktioner der er aktiveret. Dette gør det muligt at justere Silicon Labs USB-enhedens read-only memory (ROM) og random-access memory (RAM) fodaftryk baseret på din applikations krav.
Anbefalet: Start konfigurationsprocessen med standardværdierne (fremhævet med fed skrift).
Afsnittene nedenfor er organiseret baseret på rækkefølgen i skabelonkonfigurationen file, sl_usbd_core_config.h.
Konfiguration af kernekonfigurationsklasser
Kernekonfiguration
Tabel – Konfigurationskonstanter for USB-enhedskerne

Konstant beskrivelse

Standardværdi

SL_USBD_TA SK_STACK_ STØRRELSE

Konfigurerer stakstørrelsen i bytes af USBD-kerneopgaven

4096

SL_USBD_TA SK_PRIORIT Y

Konfigurerer prioriteten for USBD-kerneopgaven. Dette er en CMSIS-RTOS2-prioritet.

osPrioritetHøj

SL_USBD_A UTO_START _USB_ENHED E

Hvis aktiveret, startes USB-enheden automatisk, når kernen startes, og den pågældende USBD-kerneopgave er planlagt for første gang. Hvis deaktiveret, skal din applikation kalde sl_usbd_core_start_device(), når den er klar til at blive registreret af USB-værten.

SL_USBD_C Det samlede antal konfigurationer, der vil blive tilføjet via sl_usbd_add_configuration()

1

ONFIGURATI-funktionen.

ON_QUANTI

TY

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

8/174

Overview

Konstant
SL_USBD _INTERF ACE_QU ANTITY
SL_USBD _ALT_INT ERFACE_ QUANTI
TY
SL_USBD _INTERF ACE_GR
OUP_QU
ANTITET
SL_USBD _BESKRIVELSE
PTOR_Q
UANTITY
SL_USBD _STRING _QUANTI
TY
SL_USBD _OPEN_E NDPOIN TS_QUA NTITY

Beskrivelse Det samlede antal USB-grænseflader, der skal tilføjes til alle dine konfigurationer. Dette afhænger i høj grad af den/de anvendte klasse(r). For mere information om, hvor mange grænseflader en klasseinstans kræver, henvises til afsnittet "Ressourcebehov fra kernen" for din/dine klasse(r).
Det samlede antal alternative USB-grænseflader, der skal tilføjes til alle dine konfigurationer. Dette afhænger i høj grad af den/de anvendte klasse(r). Denne værdi skal altid være lig med eller større end SL_USBD_INTERFACE_QUANTITY. For mere information om, hvor mange alternative grænseflader en klasseinstans kræver, henvises til afsnittet "Ressourcebehov fra kernen" for din/dine klasse(r).
Det samlede antal USB-grænsefladegrupper, der vil blive tilføjet til alle dine konfigurationer. Dette afhænger i høj grad af den/de anvendte klasse(r). For mere information om, hvor mange grænsefladegrupper der kræver en klasseinstans, se afsnittet "Ressourcebehov fra kernen" for din/dine klasse(r).
Det samlede antal slutpunktsbeskrivelser, der vil blive tilføjet til alle dine konfigurationer. Dette afhænger i høj grad af den/de anvendte klasse(r). For mere information om, hvor mange slutpunktsbeskrivelser en klasseinstans kræver, se "Antal slutpunkter" i afsnittet "Ressourcebehov fra kernen" for din/dine klasse(r). Bemærk, at kontrolslutpunkterne ikke behøver at blive taget i betragtning her. Det samlede antal USB-strenge. Hvis antallet indstilles til nul, deaktiveres funktionen. Deaktivering af dette vil medføre, at enheden ikke gemmer nogen USB-beskrivelsesstrenge, der sendes fra applikationen. Det betyder, at værten ikke vil være i stand til at hente beskrivelsesstrengene (f.eks. producent- og produktnavn). Det samlede antal åbne slutpunkter pr. konfiguration. En enhed kræver mindst to åbne slutpunkter til kontroloverførsler, men du skal også tilføje slutpunkterne for den/de anvendte klasse(r). For mere information om, hvor mange åbne slutpunkter en klasseinstans kræver, se "Antal slutpunkter" i afsnittet "Ressourcebehov fra kernen" for din/dine klasse(r).

Standardværdi
10 10
2
20 30 20

Klassekonfiguration
Klasser har specifikke kompileringskonfigurationer. Se USB-enhedsklasser for yderligere oplysninger.
Konfiguration af USB-enhedsoplysninger

Konfigurationen sl_usbd_device_config.h file omgrupperer kompileringstidspunktet #define-s for at angive grundlæggende oplysninger om din enhed, såsom leverandør-/produkt-ID, enhedsstrenge osv. Tabellen nedenfor beskriver hver informationskonfigurationsdefinering, der er tilgængelig i denne konfiguration file.

Tabel – USB-enhedsinformationskonfiguration definerer

Konstant
SL_USBD_DEVIC E_VENDOR_ID
SL_USBD_ENHED E_PRODUKT_ID

Beskrivelse Dit leverandøridentifikationsnummer, som leveret af USB Implementers Forum. Du kan finde flere oplysninger om, hvordan du kan få et leverandør-ID, på http://www.usb.org/developers/vendor/. Dit produktidentifikationsnummer.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

9/174

Overview

Konstant

Beskrivelse

SL_USBD_DEVICE_RELEASE Udgivelsesnummer på din enhed. _NUMBER

SL_USBD_DEVICE_MANUFA Streng, der beskriver producenten af ​​din enhed. Denne konfiguration ignoreres, når

CTURER_STRING

Konfigurationen SL_USBD_STRING_QUANTITY er indstillet til 0.

SL_USBD_DEVICE_PRODUC Streng, der beskriver dit produkt. Denne konfiguration ignoreres, når konfigurationen

T_STRING

SL_USBD_STRING_QUANTITY er sat til 0.

SL_USBD_DEVICE_SERIAL_N Streng, der indeholder serienummeret på din enhed. Denne konfiguration ignoreres, når

UMBER_STRING

Konfigurationen SL_USBD_STRING_QUANTITY er indstillet til 0.

SL_USBD_DEVICE_LANGUA Identifikationsnummer for sproget i din enheds strenge. Mulige værdier er:
GE_ID

– SL_USBD_LANG_ID_ARABIC_SAUDI_ARABIA

– SL_USBD_LANG_ID_KINESISK_TAIWAN

– SL_USBD_LANG_ID_ENGLISH_US

– SL_USBD_LANG_ID_ENGLISH_UK

– SL_USBD_LANG_ID_FRANSK

– SL_USBD_LANG_ID_TYSK

– SL_USBD_LANG_ID_GRÆSK

– SL_USBD_LANG_ID_ITALISK

– SL_USBD_LANG_ID_PORTUGISISK

– SL_USBD_LANG_ID_SANSKRIT

Denne konfiguration ignoreres, når konfigurationen SL_USBD_STRING_QUANTITY er indstillet til 0.

USB-enhedshardwarekonfiguration

Afhængigt af den Silicon Labs-enhed, du bruger, vil du muligvis have GPIO-pin og -port til at konfigurere til USB VBUS Sense-signal. Konfigurationsdefinitionerne findes i sl_usbd_hardware_config.h-headeren. file.

Konstant
SL_USBD_DRIVER_VBUS_SENSE_PORT SL_USBD_DRIVER_VBUS_SENSE_PIN-kode

Beskrivelse
GPIO-port til USB VBUS Sense-signalet på dit kort. GPIO-ben til USB VBUS Sense-signalet på dit kort.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

10/174

Overview
Overview
Programmeringsvejledning til USB-enheder
Dette afsnit forklarer, hvordan man bruger USB-enhedsmodulet.
Førstegangsopsætning af USB-enhedsmodul
Dette afsnit beskriver de grundlæggende trin, der kræves for at initialisere USB-enhedsmodulet og for at tilføje, forberede og starte en enhed. Initialisering af USB-enhedsmodulet Initialisering af USB-enhedskernen Initialisering af aCl ss(er) Tilføjelse af din USB-enhed Opbygning af din USB-enhed Tilføjelse af konfiguration(er) Tilføjelse af USB-funktion(er) Start af din USB-enhed
Event Hook-funktioner
Initialisering af USB-enhedsmodulet
Initialisering af USB-enhedskernen
a US a Start med at initialisere B-enhedsmodulkernen ved at udføre funktionen sl_usbd_core_init(). Eksemplet nedenfor viser, hvordan man udfører sl_usbd_core_init().
Example – Kalder sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}
Initialisering af klasse(r)
Når USB-enhedsmodulets kerne er blevet initialiseret, skal du initialisere hver klasse, du har til hensigt at bruge. Se afsnittet "Programmeringsvejledning" i dine acl-ss'er for yderligere oplysninger.
Opbygning af din USB-enhed
Tilføjelse af konfiguration(er)
Når du har initialiseret din enhed, kan du begynde at tilføje USB-funktioner til den, startende med en ny konfiguration. En enhed skal have mindst én konfiguration. For at tilføje en eller flere konfigurationer skal du kalde funktionen sl_usbd_core_dd_configuration(). Denne funktion skal kaldes for hver konfiguration, du vil tilføje. Eks.ampNedenfor vises, hvordan man tilføjer en fuld hastighed.
Example – Tilføjelse af konfiguration(er) til din enhed

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

11/174

Overview

sl_status_t status; uint8_t config_nbr_fs;

/* Tilføjer en fuldhastighedskonfiguration til enheden. */

status = sl_usbd_core_add_configuration(0,

/* Ingen særlige attributter til konfigurationen. */

100u,

/* Maks. strømforbrug: 100mA.

*/

SL_USBD_ENHED_HASTIGHED_FULL,

/* Konfiguration med fuld hastighed.

*/

"Konfiguration Tilføj Eks.amp"Fuldhastighedskonfiguration",

&config_nbr_fs);

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

Tilføjelse af USB-funktion(er)
Når du har tilføjet mindst én konfiguration til din enhed, kan du tilføje grænseflader og slutpunkter til din enhed. Hver USB-klasse har sine egne behov med hensyn til grænseflade- og slutpunktstype, antal og andre parametre. Silicon Labs USB-enhed tilføjer grænseflader og slutpunkter i de klasser, den tilbyder.
Fra din applikation kan du instantiere en USB-klasse og føje den til en konfiguration. Du kan finde flere oplysninger om konceptet med USB-enhedsklasseinstanser i USB-enhedsklasser. Bemærk, at du kan instantiere og føje mange forskellige klasseinstanser til en konfiguration for at oprette en multifunktionsenhed (kompositenhed).
EksampLe nedenfor viser, hvordan man opretter en klasseinstans og tilføjer den til en konfiguration.
Example – Tilføjelse af en klasseinstans til din enhed

sl_status_t status; uint8_t klasse_nr;
/* Opret en instans af den klasse, du vil bruge.*/ /* Bemærk, at denne funktion kan have flere argumenter afhængigt af klassen. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */ }
/* Tilføj klasseinstansen til Full-Speed-konfigurationen. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Klassenummer returneret af sl_usbd_ _opret_instans. */
config_nbr_fs); /* Konfigurationsnummer returneret af sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */ }
Start af din USB-enhed
Som standard startes enheden automatisk af USB-enhedens kerneopgave, når enhedens initialisering er fuldført, og kernen er startet. For at kontrollere, hvornår enheden startes og bliver synlig for USB-værten, skal du bruge konfigurationen defineret SL_USBD_AUTO_START_USB_DEVICE til at deaktivere den automatiske startfunktion. Når den er deaktiveret, kan du, efter at du har bygget/forberedt din enhed, starte den og gøre den synlig for USB-værten ved at kalde funktionen sl_usbd_core_start_device().
EksampFølgende tabel viser, hvordan du starter din enhed ved hjælp af funktionen sl_usbd_core_start_device().
Example – Start af din enhed

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

12/174

Overview

sl_status_t status;
status = sl_usbd_core_start_device(); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */ }

Event Hook-funktioner
USB-enhedskernemodulet tilbyder to svage hook-funktioner, som du kan omdefinere i din applikation. Deres formål er at give besked, når bus- og konfigurationshændelser opstår.
Tabel – USB Event Hook-funktioner

Tilfælde

Beskrivelse

Bus

Kaldes når USB-bushændelse opstår

Konfiguration kaldes, når USB-konfigurationshændelsen opstår

Funktionssignatur
void sl_usbd_on_bus_event(sl_usbd_bus_event_t event); void sl_usbd_on_config_event(sl_usbd_config_event_t event, uint8_t config_nbr);

Example – Event Hook-funktioner

void sl_usbd_on_bus_event(sl_usbd_bus_event_t event) { switch (event) { case SL_USBD_EVENT_BUS_CONNECT: Slå denne kode til en anden enhed. Denne kode er i øjeblikket SL_USBD_EVENT_BUS_CONNECT ...
// kaldes når USB-kablet sættes i en host controller break;
case SL_USBD_EVENT_BUS_DISCONNECT: // kaldes når USB-kablet fjernes fra en værtcontroller bryder;
case SL_USBD_EVENT_BUS_RESET: // kaldes når værten sender en nulstillingskommando break;
case SL_USBD_EVENT_BUS_SUSPEND: // kaldes når værten sender suspend-kommandoen break;
case SL_USBD_EVENT_BUS_RESUME: // kaldes når værten sender wake up-kommandoen break;
standard: pause; } }
void sl_usbd_on_config_event(sl_usbd_config_event_t event, uint8_t config_nbr) { switch (event) { case SL_USBD_EVENT_CONFIG_SET: Slet ikke konfigurationskommandoer. Funktionen er konfigurationskommandoer, men den kan oversættes til en anden funktion.
// kaldes når værten indstiller en konfigurationspause;
case SL_USBD_EVENT_CONFIG_UNSET: // kaldes når en konfiguration er deaktiveret break;
standard: pause; } }

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

13/174

Overview

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

14/174

Overview
Overview

USB-enhedsklasser

USB-klasserne, der er tilgængelige i Silicon Labs USB Device, deler nogle fælles karakteristika. Dette afsnit forklarer disse karakteristika og deres interaktion med kernelaget.
For mere information om en specifik klasse, se følgende:
CDC ACM-klasse HID-klasse MSC SCSI-klasse Leverandørklasse
Om klasseinstanser
De USB-klasser, der er tilgængelige i USB Device, implementerer konceptet med klasseinstanser. En klasseinstans repræsenterer én funktion i en enhed. Funktionen kan beskrives af én grænseflade eller af en gruppe af grænseflader og tilhører en specifik klasse.
Hver USB-klasseimplementering har nogle fælles konfigurationer og funktioner, baseret på konceptet klasseinstans. De fælles konfigurationer og funktioner er præsenteret i tabellen nedenfor. I kolonnetitlen 'Konstanter eller Funktion' kan pladsholderen XXXX erstattes af klassens navn: CDC, HID, MSC, CDC_ACM eller VENDOR (leverandør for funktionsnavne).
Tabel – Konstanter og funktioner relateret til konceptet med flere klasseinstanser

Konstant eller funktion
SL_USBD_XXXX_CL ASS_INS TANCE_QUANTITY
SL_USBD_XXXX_KONFIGURATION_QUANTITY
sl_usb d _XXXX_opret _instant ()
sl_usbd_XXXX_add_to_conf Iguration()

Beskrivelse
Konfigurerer det maksimale antal klasseinstanser.
Konfigurerer det maksimale antal konfigurationer. Under klasseinitialiseringen vil en oprettet klasseinstans blive tilføjet til en eller flere konfigurationer. Opretter en ny klasseinstans.
Tilføjer en eksisterende klasseinstans til den angivne enhedskonfiguration.

Med hensyn til kodeimplementering vil klassen deklarere en lokal global variabel, der indeholder en klassekontrolstruktur. Denne klassekontrolstruktur er knyttet til én klasseinstans og vil indeholde specifikke oplysninger til at administrere klasseinstansen.
De følgende figurer viser flere case-scenarier. Hver figur indeholder et kodeeksempelampder svarer til case-scenariet.
Figur – Flere klasseinstanser – FS-enhed (1 konfiguration med 1 grænseflade) repræsenterer en typisk USB-enhed. Enheden er Full-Speed ​​(FS) og indeholder en enkelt konfiguration. Enhedens funktion beskrives af én grænseflade, der består af et par slutpunkter til datakommunikation. Én klasseinstans oprettes og giver dig mulighed for at administrere hele grænsefladen med dens tilhørende slutpunkt.
Figur – Flere klasseinstanser – FS-enhed 1-konfiguration med 1 grænseflade)

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

15/174

Overview

Koden svarende til figur – Flere klasseinstanser – FS-enhed (1 konfiguration med 1 grænseflade) er vist i eksempletample nedenfor.
Example – Flere klasseinstanser – FS-enhed 1-konfiguration med 1 grænseflade)

sl_status_t status; uint8_t klasse_0;

void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Håndterer klasseaktiveringshændelse. */ }

void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Håndterer klassedeaktiveringshændelse. */ }

sl_usbd_XXXX_callbacks_t class_callbacks = {

(1)

.aktiver = app_usbd_XXXX_aktiver,

.deaktiver = app_usbd_XXXX_deaktiver

};

status = sl_usbd_XXXX_init();

(2)

hvis (status ! SL_STATUS_OK) {

/* $$$$ Håndter fejlen. */

}

status = sl_usbd_XXXX_create_instance(&class_callbacks,

(3)

&klasse_0);

hvis (status ! SL_STATUS_OK) {

/* $$$$ Håndter fejlen. */

}

status = sl_usbd_XXXX_add_to_configuration(klasse_0, konfiguration_0);

(4)

hvis (status ! SL_STATUS_OK) {

/* $$$$ Håndter fejlen. */

}

(1) Hver klasse tilbyder et sæt callback-funktioner til enhedsforbindelses-/afbrydelseshændelser og til klassespecifikke hændelser. Callback-strukturobjektet sendes som argument, når klasseinstansen oprettes med sl_usbd_XXXX_create_instance()
fungere.
(1) Initialiser klassen. Alle interne variabler, strukturer og klasseporte vil blive initialiseret. Bemærk, at Init()-funktionen i nogle klasser kan acceptere andre argumenter.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

16/174

Overview
(2) Opret klasseinstansen, som er class_0. Funktionen sl_usbd_XXXX_create_instance() allokerer en klassekontrolstruktur tilknyttet class_0. Afhængigt af klassen kan sl_usbd_XXXX_create_instance() have yderligere parametre udover klassenummeret, der repræsenterer klassespecifikke oplysninger gemt i klassekontrolstrukturen. aaa (3) Tilføj klasseinstansen, class_0, til det angivne konfigurationsnummer, config_0. sl_usbd_XXXX_add_to_configuration() vil oprette grænseflade 0 og dens tilhørende IN- og OUT-slutpunkter. Som et resultat omfatter klasseinstansen grænseflade 0 og dens slutpunkter. Enhver kommunikation, der udføres på grænseflade 0, vil bruge klasseinstansnummeret, class_0. Figur – Flere klasseinstanser – FS-enhed (2 konfigurationer og flere grænseflader) repræsenterer et mere komplekst eksempel.ampf.eks. En fuldhastighedsenhed består af to konfigurationer. Enheden har to funktioner, der tilhører samme klasse, men hver funktion beskrives af to grænseflader og har et par tovejsende endepunkter. I dette eksempelampI modsætning til Figur – Flere klasseinstanser – FS-enhed (1 konfiguration med 1 grænseflade) og Figur – Flere klasseinstanser – FS-enhed (2 konfigurationer og flere grænseflader), hvor klasseinstansen var tilknyttet en enkelt grænseflade, oprettes der to klasseinstanser.
Figur – Flere klasseinstanser – FS-enhed 2-konfigurationer og flere grænseflader)

Koden svarende til figur – Flere klasseinstanser – FS-enhed (2 konfigurationer og flere grænseflader) er vist i eksempletampnedenfor. Fejlhåndteringen er udeladt for klarhedens skyld.
Example – Flere klasseinstanser – FS-enhed 2-konfigurationer og flere grænseflader)

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

17/174

Overview

sl_status_t status; uint8_t klasse_0; uint8_t klasse_1;
status = sl_usbd_XXXX_init();
status = sl_usbd_XXXX_create_instance(&klasse_0); status = sl_usbd_XXXX_create_instance(&klasse_1);
status = sl_usbd_XXXX_add_to_configuration(klasse_0, cfg_0); status = sl_usbd_XXXX_add_to_configuration(klasse_1, cfg_0);
status = sl_usbd_XXXX_add_to_configuration(klasse_0, cfg_1); status = sl_usbd_XXXX_add_to_configuration(klasse_1, cfg_1);

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

(1) Initialiser klassen. Alle interne variabler, strukturer og klasseporte vil blive initialiseret.
(2) Opret klasseinstansen, class_0. Funktionen sl_usbd_XXXX_create_instance() allokerer en klassekontrolstruktur tilknyttet class_0.
(3) Opret klasseinstansen, class_1. Funktionen sl_usbd_XXXX_create_instance() allokerer en anden klassekontrolstruktur tilknyttet class_1.
(4) Tilføj klasseinstansen, class_0, til konfigurationen, cfg_0. sl_usbd_XXXX_add_to_configuration() vil oprette grænseflade 0, grænseflade 1, alternative grænseflader og de tilhørende IN- og OUT-slutpunkter. Klasseinstansnummeret, class_0, vil blive brugt til al datakommunikation på grænseflade 0 eller grænseflade 1.
(5) Tilføj klasseinstansen, class_1, til konfigurationen, cfg_0. sl_usbd_XXXX_add_to_configuration() vil oprette grænseflade 2, grænseflade 3 og deres tilhørende IN- og OUT-slutpunkter. Klasseinstansnummeret, class_1, vil blive brugt til al datakommunikation på grænseflade 2 eller grænseflade 3.
(6) Tilføj de samme klasseinstanser, class_0 og class_1, til den anden konfiguration, cfg_1.
Hver klasse definerer en struktur af typen sl_usbd_XXXX_callbacks_t. Dens formål er at give hver klasse et sæt callback-funktioner, der skal kaldes, når en begivenhed indtræffer. Der findes to callback-funktioner i hver klasse. De er præsenteret i tabellen nedenfor.
Tabel – Almindelige klassetilbagekaldsfunktioner

Felter Beskrivelse .enable Kaldes, når USB-klasseinstansen er aktiveret. .disable Kaldes, når USB-klasseinstansen er deaktiveret.

Funktionssignatur void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

18/174

Overview
Overview
USB-enhed CDC ACM-klasse
USB-enhed CDC-baseklasse overview USB-enhed CDC ACM-klasse Ressourcebehov fra kerne USB-enhed CDC ACM-underklasse Overview USB-enhed CDC ACM-klassekonfiguration USB-enhed CDC ACM-klasseprogrammeringsvejledning
Dette afsnit beskriver Communications Device Class (CDC)-klassen og den tilhørende CDC-underklasse, der understøttes af Silicon Labs' USB Device-stak. Silicon Labs USB-Device understøtter i øjeblikket Abstract Control Model (ACM)-underklassen, som almindeligvis bruges til seriel emulering.
CDC omfatter forskellige telekommunikations- og netværksenheder. Telekommunikationsenheder omfatter analoge modemer, analoge og digitale telefoner, ISDN-terminaladaptere osv. For eksempelampNetværksenheder indeholder ADSL- og kabelmodemer, Ethernet-adaptere og hubs. CDC definerer et rammeværk til at indkapsle eksisterende kommunikationstjenestestandarder, såsom V.250 (til modemer over telefonnetværk) og Ethernet (til lokale netværksenheder), ved hjælp af et USB-link. En kommunikationsenhed er ansvarlig for enhedsstyring, opkaldsstyring efter behov og datatransmission.
CDC definerer syv hovedgrupper af enheder. Hver gruppe tilhører en kommunikationsmodel, som kan omfatte flere underklasser. Hver gruppe af enheder har sit eget specifikationsdokument udover CDC-basisklassen. De syv grupper er:
Offentligt telefonnet (PSTN), enheder, herunder talebåndsmodemer, telefoner og serielle emuleringsenheder. ISDN-enheder (Integrated Services Digital Network), herunder terminaladaptere og telefoner. Ethernet Control Model (ECM)-enheder, herunder enheder, der understøtter IEEE 802-familien (f.eks. kabel- og ADSL-modemer, WiFi-adaptere). Asynkrone overførselstilstande (ATM)-enheder, herunder ADSL-modemer og andre enheder, der er tilsluttet ATM-netværk (arbejdsstationer, routere, LAN-switche). Trådløse mobile kommunikationsenheder (WMC), herunder multifunktionelle kommunikationshåndsæt, der bruges til at administrere tale- og datakommunikation. Ethernet Emulation Model (EEM)-enheder, der udveksler Ethernet-indrammede data. Network Control Model (NCM)-enheder, herunder højhastighedsnetværksenheder (High Speed ​​Packet Access-modemer, linjeterminaludstyr)
CDC'en og den tilhørende underklasseimplementering overholder følgende specifikationer:
Universal Serial Bus, Klassedefinitioner for Kommunikationsenheder, Revision 1.2, 3. november 2010. Universal Serial Bus, Kommunikation, Underklasse for PSTN-enheder, Revision 1.2, 9. februar 2007.
USB-enhed CDC-baseklasse overview
En CDC-enhed består af følgende grænseflader for at implementere kommunikationsfunktioner:
Kommunikationsklassegrænsefladen (CCI) er ansvarlig for enhedsstyring og eventuelt opkaldsstyring.
Enhedsstyring muliggør generel konfiguration og kontrol af enheden og notifikation om hændelser til værten. Opkaldsstyringen muliggør etablering og afslutning af opkald. Opkaldsstyring kan multiplekses via en DCI. En CCI er obligatorisk for alle CDC-enheder. Den identificerer CDC-funktionen ved at specificere den kommunikationsmodel, der understøttes af CDC-enheden. Grænsefladen(erne) efter CCI'en kan være enhver defineret USB-klassegrænseflade, f.eks. lyd eller en leverandørspecifik grænseflade. Den leverandørspecifikke grænseflade er specifikt repræsenteret af en DCI.
Data Class Interface (DCI) er ansvarlig for datatransmission. Data, der sendes og/eller modtages, følger ikke en specifik
format. Data kan være rådata fra en kommunikationslinje, data, der følger et proprietært format osv. Alle DCI'er, der følger CCI'en, kan ses som underordnede grænseflader.
En CDC-enhed skal have mindst én CCI og nul eller flere DCI'er. Én CCI og enhver underordnet DCI leverer tilsammen en funktion til værten. Denne funktion kaldes også en funktion. I en sammensat CDC-enhed kan du have flere

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

19/174

Overview
funktioner. Derfor ville enheden bestå af flere sæt CCI og DCI('er) som vist i figur – CDC-kompositenhed.
Figur – CDC-kompositenhed

En CDC-enhed vil sandsynligvis bruge følgende kombination af slutpunkter:
Et par kontrol-IN- og OUT-slutpunkter kaldet standardslutpunktet. Et valgfrit bulk- eller afbrydelses-IN-slutpunkt. Et par bulk- eller isokrone IN- og OUT-slutpunkter. Bemærk, at Silicon Labs USB-enhedsstak i øjeblikket ikke understøtter isokrone slutpunkter.
Tabellen nedenfor viser brugen af ​​de forskellige endepunkter og via hvilken grænseflade i CDC'en de bruges.
Tabel – CDC-slutpunktsbrug

Slutpunkt
Styr IN
Styr OUT
Afbrydelse eller bulk IN Bulk eller isokron IN Bulk eller isokron
UD

Retning
Enhed-til-vært
Vært-til-enhed
Enhed-til-vært
Enhed-til-vært
Vært-til-enhed

Brug af grænseflade

CCI

Standardanmodninger om optælling, klassespecifikke anmodninger, enheds

administration og eventuelt opkaldsadministration.

CCI

Standardanmodninger om optælling, klassespecifikke anmodninger, enheds

administration og eventuelt opkaldsadministration.

CCI

Hændelsesmeddelelser, såsom ringdetektion, status for seriel linje, netværksstatus.

DCI

Rå eller formateret datakommunikation.

DCI

Rå eller formateret datakommunikation.

De fleste kommunikationsenheder bruger et afbrydelsesslutpunkt til at underrette værten om hændelser. Isokrone slutpunkter bør ikke bruges til dataoverførsel, når en proprietær protokol er afhængig af datatransmission i tilfælde af USB-protokolfejl. Isokron kommunikation kan i sagens natur miste data, da den ikke har nogen gentagelsesmekanismer.
De syv hovedmodeller for kommunikation omfatter adskillige underklasser. En underklasse beskriver, hvordan enheden skal bruge CCI til at håndtere enhedsstyring og opkaldsstyring. Tabellen nedenfor viser alle mulige underklasser og den kommunikationsmodel, de tilhører.
Tabel – CDC-underklasser

Underklasse
Direkte linjekontrolmodel Abstrakt kontrolmodel

Kommunikationsmodel
PSTN
PSTN

Exampantal enheder, der bruger denne underklasse
Modemenheder, der styres direkte af USB-værten
Serielle emuleringsenheder , modemenheder styret via et serielt kommandosæt

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

20/174

Overview

Underklasse

Kommunikationsmodel

Exampantal enheder, der bruger denne underklasse

Telefonstyringsmodel

PSTN

Multikanalskontrol ISDN-model

CAPI-kontrolmodel ISDN

Ethernet-netværk ECM-kontrolmodel

Netværk af hæveautomater

ATM

Kontrolmodel

Trådløs håndsætstyringsmodel

WMC

Enhedsstyring WMC

Mobil direkte linjemodel

WMC

OBEX

WMC

Ethernet-emulering EEM-model

Netværkskontrolmodel

NCM

Taletelefoniudstyr
Basistakstterminaladaptere, primærtakstterminaladaptere, telefoner
Basistakstterminaladaptere, primære takstterminaladaptere, telefoner DOC-SIS-kabelmodemer, ADSL-modemer, der understøtter PPPoE-emulering, Wi-Fi-adaptere (IEEE 802.11-familien), IEEE 802.3-adaptere ADSL-modemer
Mobilt terminaludstyr, der opretter forbindelse til trådløse enheder
Mobilt terminaludstyr, der opretter forbindelse til trådløse enheder Mobilt terminaludstyr, der opretter forbindelse til trådløse enheder
Mobilt terminaludstyr, der opretter forbindelse til trådløse enheder Enheder, der bruger Ethernet-rammer som det næste transportlag. Ikke beregnet til routing- og internetforbindelsesenheder IEEE 802.3-adaptere, der bærer højhastighedsdatabåndbredde på netværket

USB-enhed CDC ACM-klasse ressourcebehov fra Core

Hver gang du tilføjer en CDC ACM-klasseinstans til en USB-konfiguration via et kald til funktionen sl_usbd_cdc_acm_add_to_configuration(), vil følgende ressourcer blive allokeret fra kernen.

Ressource
Grænseflader Alternative grænseflader Slutpunkter Grænsefladegrupper

Mængde
2 2 3 1

Bemærk, at disse tal er pr. konfiguration. Når du konfigurerer dine konfigurationsværdier SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, skal du ikke glemme at tage højde for, hvor mange konfigurationer klassen vil blive tilføjet. For konfigurationsværdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, da slutpunkter kun åbnes, når en konfiguration er angivet af værten, skal du blot tage højde for antallet af nødvendige slutpunkter for en klasseinstans.
USB-enhed CDC ACM-underklasse Overview

CDC-basisklassen består af et kommunikationsklasseinterface (CCI) og et dataklasseinterface (DCI), som diskuteres detaljeret i USB-enheds-CDC-basisklasse overview Dette afsnit omhandler en CCI af typen ACM. Den består af et standardslutpunkt for administrationselementet og et afbrydelsesslutpunkt for notifikationselementet. Et par bulk-slutpunkter bruges til at overføre uspecificerede data over DCI'en.
ACM-underklassen bruges af to typer kommunikationsenheder:
Enheder, der understøtter AT-kommandoer (f.eks. talebåndsmodemer). Serielle emuleringsenheder, som også kaldes virtuelle COM-portenheder.
Der er adskillige underklassespecifikke anmodninger til ACM-underklassen. De giver dig mulighed for at styre og konfigurere enheden. Den komplette liste og beskrivelse af alle ACM-anmodninger kan findes i specifikationen.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

21/174

Overview Underklasse for PSTN-enheder, revision 1.2, 9. februar 2007=, afsnit 6.2.2.
Fra denne liste understøtter Silicon Labs9 ACM-underklassen følgende:
Tabel – ACM-anmodninger understøttet af Silicon Labs

Beskrivelse af anmodning om underklasse

SætKommFunktionHentKommFunktionRydKommFunktion

Værten sender denne anmodning for at kontrollere indstillingerne for en given kommunikationsfunktion. Bruges ikke til seriel emulering.
Værten sender denne anmodning for at hente de aktuelle indstillinger for en given kommunikationsfunktion. Bruges ikke til seriel emulering.
Værten sender denne anmodning for at rydde indstillingerne for en given kommunikationsfunktion. Bruges ikke til seriel emulering.

SætLineCoding

Værten sender denne anmodning for at konfigurere ACM-enhedens indstillinger: baudhastighed, antal stopbits, paritetstype og antal databits. For en seriel emulering sendes denne anmodning automatisk af en seriel terminal, hver gang du konfigurerer de serielle indstillinger for en åben virtuel COM-port.

GetLineCoding

Værten sender denne anmodning for at hente de aktuelle ACM-indstillinger (baudhastighed, stopbits, paritet, databits). Ved seriel emulering sender serielle terminaler automatisk denne anmodning under åbning af den virtuelle COM-port.

SetControlLineState Værten sender denne anmodning for at styre bærebølgen for halvduplex-modemer og angive, om Data Terminal Equipment (DTE) er klar eller ej. I tilfældet med seriel emulering er DTE'en en seriel terminal. Ved seriel emulering tillader visse serielle terminaler dig at sende denne anmodning med de indstillede kontroller.

SætBreak

Værten sender denne anmodning for at generere et RS-232-stilbrud. For en seriel emulering tillader visse serielle terminaler dig at sende denne anmodning.

Silicon Labs9 ACM-underklassen bruger interrupt IN-slutpunktet til at underrette værten om den aktuelle serielle linjetilstand. Den serielle
linjetilstand er et bitmap, der informerer værten om:

Data kasseret på grund af overløb Paritetsfejl Framingfejl Tilstand for ringsignaldetektion Tilstand for bruddetektionsmekanisme Tilstand for transmissionsbærer Tilstand for modtagerbærerdetektion

Implementeringen af ​​Silicon Labs9 ACM-underklassen overholder følgende specifikation:
Universal Serial Bus, kommunikation, underklasse til PSTN-enheder, revision 1.2, 9. februar 2007.
USB-enhed CDC ACM-klassekonfiguration

Dette afsnit omhandler, hvordan man konfigurerer CDC ACM-klassen (kommunikationsenhedsklasse, abstrakt kontrolmodel). Der er to grupper af konfigurationsparametre:
USB-enhed CDC ACM-klasse Applikationsspecifikke konfigurationer USB-enhed CDC ACM-klasseinstanskonfigurationer
USB-enhed CDC ACM-klasse Applikationsspecifikke konfigurationer

CDC-basisklasse ACM-underklasse
CDC-basisklasse

For at bruge Silicon Labs USB-enheds CDC-klassemodulet skal du først justere CDC-kompileringstidskonfigurationen #define-s i henhold til dine applikationsbehov. De er omgrupperet i sl_usbd_core_config.h-headeren. file under CDC-sektionen. Deres formål er at informere USB-enhedsmodulet om, hvor mange USB CDC-objekter der skal allokeres.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

22/174

Overview

Tabellen nedenfor beskriver hvert konfigurationsfelt, der er tilgængeligt i denne konfigurationsstruktur.
Tabel – USB-enheds CDC-konfiguration definerer

Konfigurationsnavn
SL_USBD_CDC_CL AS S_INSTANCE_QUANTITY
SL_USBD_CDC_CONF IGURATION_QUANTI
TY
SL_USBD_CDC_DATA_INTERFACE_QUANTI
TY

Beskrivelse
Antal klasseinstanser, du vil allokere via et kald til funktionen
sl_usbd_cdc_acm_create_instance().
Antal konfigurationer. ACM-klasseinstanser kan tilføjes til en eller flere aaaa-konfigurationer via sl_usbd_cdc_acm_add_to_configuration().
Samlet antal datagrænseflader (DCI) for alle CDC-funktioner. Hver CDC ACM-funktion, der er tilføjet til funktionen sl_usbd_cdc_acm_create_instance(), vil tilføje datagrænsefladen.

Standardværdi
2
1
2

ACM-underklasse
ACM-underklassen har én kompileringskonfiguration, der er vist i tabellen nedenfor.
Tabel – Definer USB-enhed CDC ACM-konfiguration

Konfigurationsnavn
SL_USBD_CDC_ACM_SUBCL ASS_I STANDARDANVÆRK

Beskrivelse
Konfigurerer antallet af underklasseinstanser, du vil allokere via et kald til
funktion sl_usbd_cdc_acm_create_instance().

Standardværdi
2

Konfigurationer af USB-enheds-CDC ACM-klasseinstans

Dette afsnit definerer konfigurationerne relateret til CDC ACM serielle klasseinstanser. Oprettelse af klasseinstans, linjetilstand, interval, opkaldsstyringsfunktioner, p_acm_callbacks
Oprettelse af klasseinstans

For at oprette en CDC ACM seriel klasseinstans skal du kalde funktionen T a sl_usbd_cdc_acm_create_instance(). Denne funktion kræver tre konfigurationsargumenter, som beskrevet her.

linjetilstandsinterval
Dette er intervallet (i millisekunder), som din CDC ACM serielle klasseinstans vil rapportere linjetilstandsmeddelelserne til T aa-værten. Denne værdi skal være en potens af to (1, 2, 4, 8, 16 osv.).

call_mgmt_capabilities
Bitmap for opkaldsstyringsfunktioner. Mulige værdier for bitmap'en er som følger:

Værdi (bit)
SL_USBD_ACM_SERIAL_CALL_MGMT_DEV
SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI _DCI

Beskrivelse
Enheden håndterer selv opkaldsstyring. Enheden kan sende/modtage oplysninger om opkaldsstyring via en Data Class-grænseflade.

p_acm_callbacks

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

23/174

Overview

aa M aa p_acm_callbacks er en pointer til en struktur af typen sl_usbd_cdc_acm_callbacks_t. Dens formål er at give CDC AC Cl ss et sæt af callback-funktioner, der skal kaldes, når en CDC ACM-hændelse opstår. Ikke alle callbacks er obligatoriske, og en null-pointer (NULL) kan sendes i callbacks-strukturvariablen, når callback-funktionen ikke er nødvendig. Tabellen nedenfor beskriver hvert konfigurationsfelt, der er tilgængeligt i denne konfigurationsstruktur.
Tabel – sl_usbd_cdc_acm _callbacks_t Konfigurationsstruktur

Felter

Beskrivelse

.aktiver

Kaldes når USB-klasseinstansen er aktiveret

med succes.

.deaktiver

Kaldes, når USB-klasseinstansen er deaktiveret.

.line_control_changed Kaldes, når en ændring af linjekontrol modtages.

line_coding_changed Kaldes, når en ændring af linjekodning modtages.

Funktionssignatur
void app_usbd_cdc_acm_enable(uint8_t subclass_nbr);
void app_usbd_cdc_acm_disable(uint8_t subclass_nbr);
void app_usbd_cdc_acm_line_control_changed(uint8_t subklasse_nbr, uint8_t event, uint8_t event_chngd); bool app_usbd_cdc_acm_line_coding_changed(uint8_t subklasse_nbr, subklasse_nbr, sl_usbd_cdc_acm_line_coding_t Hvad som helst beholder sin egen kode, f.eks.: "app_usbd_cdc_acm_line_coding_t" og "uint8_t" som en del af koden, er "uint8_t" og "uint8_t" som en del af koden.
*p_line_coding

Se afsnittet Registrering af tilbagekald til hændelsesnotifikationer for tilbagekaldsfunktioner, f.eks.ample.
USB-enhed CDC ACM-klasseprogrammeringsvejledning

Dette afsnit forklarer, hvordan man bruger CDC Abstract Control Model-klassen. Initialisering af USB-enhedens CDC ACM-klasse Tilføjelse af en USB-enheds-CDC ACM-klasseinstans til din enhed Kommunikation ved hjælp af CDC ACM-klassen
Initialisering af USB-enhedens CDC ACM-klasse

For at tilføje CDC ACM-klassefunktionalitet til din enhed skal du først initialisere CDC-basisklassen og ACM-underklassen ved at udføre funktionerne sl_usbd_cdc_init() og sl_usbd_cdc_acm_init(). Eksemplet nedenfor viser, hvordan man udfører sl_usbd_cdc_init() og sl_usbd_cdc_acm_init() ved hjælp af standardargumenter.

Example – Initialisering af CDC ACM-klasse

sl_status_t status;
status = sl_usbd_cdc_init(); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}
status = sl_usbd_cdc_acm_init(); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}
Tilføjelse af en USB-enheds CDC ACM-klasseinstans til din enhed
For at tilføje CDC ACM-klassefunktionalitet til din enhed skal du oprette en instans og derefter føje den til din enheds konfiguration(er).
Oprettelse af en CDC ACM-klasseinstans

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

24/174

Overview
Tilføjelse af CDC ACM-klasseinstansen til din enheds konfiguration(er) Registrering af tilbagekald til hændelsesnotifikationer
Oprettelse af en CDC ACM-klasseinstans
aa M aaa Opret en CDC AC-klasseinstance ved at bruge funktionen sl_usbd_cdc_acm_create_instance(). Eksemplet nedenfor viser, hvordan man opretter en CDC AC-klasseinstance via sl_usbd_cdc_acm_create_instance().
Example – Oprettelse af en CDC ACM-funktion via sl_usbd_cdc_acm_create_instance()

uint8_t underklasse_nbr; sl_status_t status;
status = sl_usbd_cdc_acm_create_instance(64u, SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI_DCI | SL_USBD_ACM_SERIAL_CALL_MGMT_DEV, NULL, &underklassenummer);
hvis (status ! SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}
Tilføjelse af CDC ACM-klasseinstansen til din enheds konfiguration(er)
Når du har oprettet en CDC ACM-klasseinstans, kan du tilføje den til en konfiguration ved at kalde funktionen
sl_usbd_cdc_acm_add_to_configuration().
Eksemplet nedenfor viser, hvordan man bruger sl_usbd_cdc_acm_add_to_configuration().
Example – Kald til USBD ACM sl_usbd_cdc_acm_add_to_configuration()

sl_status_t status;

status = sl_usbd_cdc_acm_add_to_configuration(underklassenummer,

(1)

config_nbr_fs);

(2)

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

aaa (1) Cl ss-nummer, der skal føjes til konfigurationen returneret af sl_usbd_cdc_acm_create_instance(). (2) Konfigurationsnummer (her tilføjes det til en Full-Speed-konfiguration).
Registrering af tilbagekald til begivenhedsnotifikationer
CDC ACM Serial-klassen kan underrette din applikation om eventuelle ændringer i linjekontrol eller kodning via notifikations-tilbagekaldsfunktioner. En struktur af en tilbagekaldsfunktion kan sendes som argument under oprettelsen af ​​ACM-instansen. Bemærk, at disse tilbagekald er valgfrie. F.eks.ample – CDC ACM Tilbagekaldsregistrering illustrerer brugen af ​​tilbagekaldsregistreringsfunktionerne. F.eks.ample – CDC ACM Callbacks Implementering viser en exampimplementeringsprincippet for callback-funktionerne.
Example – CDC ACM Tilbagekaldsregistrering

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

25/174

Overview

uint8_t underklasse_nbr; sl_status_t status;
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, }; Bemærk: Engelsk: Please be aware that the text is object sense. The use of content and the two translations may be use the use of functions. The use of content is objectionable ...
status = 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);
hvis (status ! SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */ }
Example – Implementering af CDC ACM-tilbagekald

bool app_usbd_cdc_acm_line_coding_changed (uint8_t

underklasse_nbr,

sl_usbd_cdc_acm_line_coding_t *p_line_coding)

{

uint32_t baudrate_new;

uint8_t paritet_ny;

uint8_t stop_bits_new;

uint8_t data_bits_new;

/* TODO Anvend ny linjekodning.*/ baudrate_new = p_line_coding->BaudRate; parity_new = p_line_coding->Paritet; stop_bits_new = p_line_coding->StopBits; data_bits_new = p_line_coding->DataBits;

retur (sandt);

(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; Hvad er konfigurationskommandoer for netværksudstyr?

/* TODO Anvend ny linjekontrol. */ 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) ? sandt : falsk;
}

(1) Det er vigtigt at returnere false til denne funktion, hvis linjekodningen mislykkedes. Ellers returneres true.
Kommunikation ved hjælp af CDC ACM-klassen
Seriel status
Linjekodning Linjekontrol

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

26/174

Overview

Linjetilstand Underklasse Instans Kommunikation
Seriel status
Linjekodning
USB-værten styrer linjekodningen (baudhastighed, paritet osv.) for CDC ACM-enheden. Når det er nødvendigt, er applikationen ansvarlig for at indstille linjekodningen. Der er to funktioner til at hente og indstille den aktuelle linjekodning, som beskrevet i tabellen nedenfor.
Tabel – CDC ACM-linjekodningsfunktioner

Fungere
sl_usbd_cdc_acm_g e t_line _kodning ()
sl_usbd_cdc_acm_s e t_line _kodning ()

Beskrivelse
Din applikation kan hente de aktuelle linjekodningsindstillinger enten fra værten med SetLineCoding-anmodninger eller med funktionen sl_usbd_cdc_acm_set_line_coding().
Din applikation kan indstille linjekodningen. Værten kan hente indstillingerne med GetLineCoding-anmodningen.

Linje kontrol
USB-værten styrer linjestyringen (RTS- og DTR-ben, pausesignal osv.) på CDC ACM-enheden. Når det er nødvendigt, er din applikation ansvarlig for at anvende linjestyringen. Der findes en funktion til at hente og indstille de aktuelle linjestyringer, som beskrevet i tabellen nedenfor.
Tabel – CDC ACM-linjestyringsfunktioner

Fungere
sl_usb d _cd c_acm_ge t_line _kontrol_tilstand ()

Din applikation kan hente den aktuelle kontrollinjetilstand, som værten har angivet, med SetControlLineState-anmodningen.

Linjetilstand
USB-værten henter linjetilstanden med jævne mellemrum. Dit program skal opdatere linjetilstanden, hver gang den ændres. Når det er nødvendigt, er dit program ansvarligt for at indstille linjetilstanden. Der findes to funktioner til at hente og indstille de aktuelle linjekontroller, som beskrevet i tabellen nedenfor.
Tabel – CDC ACM-linjetilstandsfunktioner

Fungere
sl_usb d _cd c_acm_se t _line _state _e ve nt()
sl_usbd_cdc_acm_cle ar_line _state _e ve nt()

Din applikation kan indstille enhver linjetilstandshændelse(r). Når linjetilstanden indstilles, sendes en afbrydelses-IN-overførsel til værten for at informere om en ændring i den serielle linjetilstand.
Applikationen kan rydde to hændelser i linjetilstanden: transmissionsbærer og modtagerbærerdetektion. Alle andre hændelser ryddes automatisk af ACM's serielle emuleringsunderklasse.

Underklasseinstanskommunikation

Silicon Labs' ACM-underklasse tilbyder følgende funktioner til at kommunikere med værten. For flere detaljer om functions9-parametrene, se referencen CDC ACM Subclass Functions.

Funktionsnavn
sl_usb d _cd c_acm_ læse () sl_usb d _cd c_acm_skrive ()

Operation
Modtager data fra værten via et bulk OUT-slutpunkt. Denne funktion blokerer. Sender data til værten via et bulk IN-slutpunkt. Denne funktion blokerer.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

27/174

Overview

Tabel – CDC ACM Communication API Resumé aaaaa sl_usbd_cdc_acm_read() og sl_usbd_cdc_acm_write() leverer synkron kommunikation, hvilket betyder, at overførslen blokerer. Med andre ord blokerer applikationen, når funktionen kaldes, indtil overførslen er fuldført med eller uden en fejl. En timeout kan angives for at undgå evig ventetid. Eks.ampbilledet nedenfor viser et læse- og skriveeksempelampder modtager data fra værten ved hjælp af bulk OUT-slutpunktet og sender data til værten ved hjælp af bulk IN-slutpunktet.
Liste – Seriel læsning og skrivning Eks.ample

__ALIGNED(4) uint8_t rx_buf[2];

__ALIGNED(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

status;

status = sl_usbd_cdc_acm_read(underklassenummer,

(1)

rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

status = sl_usbd_cdc_acm_write(underklassenummer,

(1)

tx_buf,

(4)

2u,

0u,

(3)

&xfer_len);

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

(1) Klasseforekomstnummeret oprettet med sl_usbd_cdc_acm_create_instance() giver en intern reference til AC-underklassen for at rute overførslen til det korrekte bulk OUT- eller IN-slutpunkt. (2) Din applikation skal sikre, at den buffer, der leveres til funktionen, er stor nok til at rumme alle dataene. Ellers kan der opstå synkroniseringsproblemer. (3) For at undgå en uendelig blokeringssituation skal du angive en timeout udtrykt i millisekunder. En værdi på 809 får applikationsopgaven til at vente for evigt. (4) Applikationen leverer den initialiserede transmissionsbuffer.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

28/174

Overview
Overview

USB-enhed HID-klasse

USB-enhed HID-klasse overview USB-enhed HID-klasse Ressourcebehov fra kerne USB-enhed HID-klassekonfiguration USB-enhed HID-klasse Programmeringsvejledning HID Periodiske inputrapporter Opgave
Dette afsnit beskriver HID-klassen (Human Interface Device), der understøttes af Silicon Labs USB-enhed.
HID-klassen omfatter enheder, der bruges af mennesker til at styre computeroperationer, såsom tastaturer, mus, pegeredskaber og spilleenheder.
HID-klassen kan også bruges i en sammensat enhed, der indeholder kontroller såsom drejeknapper, kontakter, knapper og skydere. For eksempelampLyd-, lyd- og lydstyrkekontroller i et audioheadset styres af headsettets HID-funktion. HID-klassen kan udveksle data til ethvert formål ved kun at bruge kontrol- og afbrydelsesoverførsler.
HID-klassen er en af ​​de ældste og mest anvendte USB-klasser. Alle større værtsoperativsystemer leverer en indbygget driver til at styre HID-enheder, hvilket er grunden til, at en række leverandørspecifikke enheder fungerer med HID-klassen. Denne klasse inkluderer også forskellige typer outputelementer såsom LED'er, lyd, taktil feedback osv.
HID-implementeringen overholder følgende specifikationer:
Enhedsklassedefinition for Human Interface Devices (HID), 27/6/01, version 1.11. Brugstabeller for Universal Serial Bus HID, 28/10/2004, version 1.12.
USB-enhed HID-klasse overview
Overview
En HID-enhed består af følgende slutpunkter:
Et par kontrol IN- og OUT-slutpunkter kaldet standardslutpunktet Et afbrydelses-IN-slutpunkt Et valgfrit afbrydelses-OUT-slutpunkt
Tabellen nedenfor beskriver brugen af ​​de forskellige endepunkter:
Tabel – Brug af HID-klasseslutpunkter

Brug af endepunktsretning

Styr IN
Kontrollere
UD
Afbryd IN
Afbryde
UD

Enhed-til-vært
Vært-til-enhed
Enhed-til-vært
Vært-til-enhed

Standardanmodninger om optælling, klassespecifikke anmodninger og datakommunikation (input, funktionsrapporter sendt til værten med GET_REPORT-anmodning). Standardanmodninger om optælling, klassespecifikke anmodninger og datakommunikation (output, funktionsrapporter modtaget fra værten med SET_REPORT-anmodning). Datakommunikation (input og funktionsrapporter).
Datakommunikation (output- og funktionsrapporter).

Rapport

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

29/174

Overview

En vært og en HID-enhed udveksler data ved hjælp af rapporter. En rapport indeholder formaterede data, der giver information om kontroller og andre fysiske enheder på HID-enheden. En kontrol kan manipuleres af brugeren og styrer et aspekt af enheden. For eksempelampf.eks. kan en kontrol være en knap på en mus eller et tastatur, en kontakt osv. Andre enheder informerer brugeren om tilstanden af ​​bestemte enhedens funktioner. For eksempelampLED'er på et tastatur informerer brugeren om, at caps lock er aktiveret, det numeriske tastatur er aktivt osv.
Formatet og brugen af ​​rapportdata forstås af værten ved at analysere indholdet af en rapportbeskrivelse. Analyse af indholdet udføres af en parser. Rapportbeskrivelsen beskriver data leveret af hver kontrol i en enhed. Den er sammensat af elementer, som er informationsstykker om enheden og består af et 1-byte præfiks og en variabel længde.
data. For yderligere oplysninger om elementformatet, se
1.11=, afsnit 5.6 og 6.2.2.
Der er tre hovedtyper af varer:
Hovedelementet definerer eller grupperer bestemte typer datafelter.
Globalt element beskriver datakarakteristika for et kontrolelement.
Et lokalt element beskriver datakarakteristika for et kontrolelement.
Hver elementtype er defineret af forskellige funktioner. En elementfunktion kan også kaldes en tagEn elementfunktion kan ses som et underelement, der tilhører en af ​​de tre primære elementtyper. Tabellen nedenfor giver en kort oversigtview af elementets funktioner i hver elementtype. For en komplet beskrivelse af elementerne i hver kategori, se
Tabel – Beskrivelse af elementets funktion for hver elementtype

Element Element Type Funktion

Beskrivelse

Hovedindgang

Beskriver information om data leveret af en eller flere fysiske kontroller.

Hovedoutput Beskriver data sendt til enheden.

Hovedtræk

Beskriver enhedskonfigurationsoplysninger, der sendes til eller modtages fra enheden, som påvirker enhedens eller en af ​​dens komponenters overordnede funktionsmåde.

Elementer relateret til hovedsamlingsgruppen (input, output eller funktion).

Hovedafslutning Lukker en samling. Samling

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

30/174

Overview

Element Element Type Funktion

Beskrivelse

Global brugsside

Identificerer en funktion, der er tilgængelig i enheden.

Global Logisk Definerer den nedre grænse for de rapporterede værdier i logiske enheder. Minimum

Global Logisk Definerer den øvre grænse for de rapporterede værdier i logiske enheder. Maksimum

Global fysisk Definerer den nedre grænse for de rapporterede værdier i fysiske enheder, det vil sige det logiske minimum udtrykt i fysiske enheder.

Global fysisk Definerer den øvre grænse for de rapporterede værdier i fysiske enheder, det vil sige det logiske maksimum udtrykt i fysiske enheder.

Global enhed

Angiver enhedseksponenten i 10-tal. Eksponenten går fra -8 til +7.

Eksponent

Global enhed

Angiver enheden for de rapporterede værdier. For eksempel længde, masse, temperaturenheder osv.

Global rapportstørrelse

Angiver størrelsen på rapportfelterne i bits.

Globalt rapport-ID Angiver det præfiks, der er tilføjet til en bestemt rapport.

Globalt antal rapporter

Angiver antallet af datafelter for et element.

Globalt skub

Placerer en kopi af den globale elementtilstandstabel på CPU-stakken.

Global pop

Erstatter elementtilstandstabellen med den sidste struktur fra stakken.

Lokal brug

Repræsenterer et indeks, der angiver en specifik anvendelse på en anvendelsesside. Det angiver leverandørens foreslåede anvendelse af en specifik kontrol eller gruppe af kontroller. En anvendelse leverer oplysninger til en applikationsudvikler om, hvad en kontrol faktisk måler.

Lokal brug

Definerer den startbrug, der er knyttet til et array eller en bitmap.

Minimum

Lokal brug

Definerer den afsluttende brug, der er knyttet til et array eller en bitmap.

Maksimum

Lokal designator Bestemmer den kropsdel, der bruges til en kontrol. Indeks peger på en designator i den fysiske

Indeks

deskriptor.

Lokal designator Definerer indekset for den startdesignator, der er knyttet til et array eller en bitmap. Minimum

Lokal designator Definerer indekset for den afsluttende designator, der er knyttet til et array eller en bitmap. Maksimum

Lokalt strengindeks

Strengindeks for en strengbeskrivelse. Det tillader, at en streng knyttes til et bestemt element eller kontrolelement.

Lokal streng

Angiver det første strengindeks, når en gruppe af sekventielle strenge tildeles kontrolelementer i et array

Minimum eller bitmap.

Lokale Lokale

Strengmaksimum
Afgrænsning

Angiver det sidste strengindeks, når en gruppe af sekventielle strenge tildeles kontrolelementer i et array eller en bitmap.
Definerer begyndelsen eller slutningen af ​​et sæt lokale elementer.

En control9s-data skal mindst definere følgende elementer:
Input, Output eller funktion Hovedelementer Brug Lokalt element Brugsside Globalt element Logisk minimum Globalt element Logisk maksimum Globalt element Rapportstørrelse Globalt element

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

31/174

Overview
Rapportantal Globalt element Tabellen nedenfor viser repræsentationen af ​​​​en muserapportbeskrivelsesindhold fra et værts-HID-parserperspektiv. Musen har tre knapper (venstre, højre og hjul). Koden præsenteret i eksempletampNedenfor er en kodeimplementering svarende til denne muserapportbeskrivelserepræsentation.
Figur – Rapportbeskrivelsesindhold fra en værts-HID-parser View

(1) Funktionen Brugssideelement angiver enhedens generelle funktion. I dette eksempelampHID-enheden tilhører en
generisk skrivebordskontrol.
(2) Samlingen Applikation grupperer hovedelementer, der har et fælles formål og kan være velkendte for applikationer. I diagrammet består gruppen af ​​tre inputhovedelementer. For denne samling er den foreslåede brug af kontrolelementerne en mus, som angivet af brugselementet. (3) Indlejrede samlinger kan bruges til at give flere detaljer om brugen af ​​et enkelt kontrolelement eller en gruppe af kontrolelementer til applikationer. I dette eksempelampDen fysiske samling, der er indlejret i samlingsapplikationen, er sammensat af de samme tre inputelementer, der danner samlingsapplikationen. Den fysiske samling bruges til et sæt dataelementer, der repræsenterer datapunkter indsamlet på ét geometrisk punkt. I eksempeletampf.eks. er den foreslåede brug en pointer, som angivet af Brugselementet. Her refererer pointerbrugen til musepositionskoordinaterne, og systemsoftwaren vil oversætte musekoordinaterne, når skærmmarkøren bevæger sig. (4) Indlejrede brugssider er også mulige og giver flere detaljer om et bestemt aspekt inden for enhedens generelle funktion. I dette tilfælde er to inputelementer grupperet og svarer til musens knapper. Et inputelement definerer de tre knapper på musen (højre, venstre og hjul) med hensyn til antal datafelter for elementet (Rapportantal-element), størrelsen på et datafelt (Rapportstørrelse-element) og mulige værdier for hvert datafelt (Minimum og Maksimum brug, Logisk Minimum og Maksimum-elementer). Det andet inputelement er en 13-bit konstant, der tillader inputrapportdataene at blive justeret på en bytegrænse. Dette inputelement bruges kun til udfyldningsformål. (5) En anden indlejret brugsside, der refererer til en generisk skrivebordskontrol, er defineret for musepositionskoordinaterne. For denne brugsside beskriver inputelementet de datafelter, der svarer til x- og y-aksen, som specificeret af de to Brugselementer.
genstande.
Efter at have analyseret indholdet af den foregående muserapportbeskrivelse, kan host9s HID-parser fortolke de inputrapportdata, der sendes af enheden med en afbrydelse af IN-overførslen eller som svar på en GET_REPORT-anmodning. De inputrapportdata, der svarer til muserapportbeskrivelsen, er vist i figur – Rapportbeskrivelsesindhold fra en Host HID-parser. View is

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

32/174

Overview

vist i tabellen nedenfor. Den samlede størrelse af rapportdataene er 4 bytes. Forskellige typer rapporter kan sendes over det samme slutpunkt. For at skelne mellem de forskellige typer rapporter tilføjes et 1-byte rapport-ID-præfiks til datarapporten. Hvis et rapport-ID blev brugt i den eks.ampi muserapporten ville den samlede størrelse af rapportdataene være 5 bytes.
Tabel – Inputrapport sendt til vært og svarende til tilstanden af ​​en mus med 3 knapper

Bit offset
0 1 2 3 16 24

Bit antal 1 1 1 13 8 8

Beskrivelse Knap 1 (venstre knap). Knap 2 (højre knap). Knap 3 (hjulknap). Ikke i brug. Position på akse X. Position på akse Y.

En fysisk deskriptor angiver den eller de dele af kroppen, der er beregnet til at aktivere en eller flere kontrolelementer. En applikation kan bruge disse oplysninger til at tildele en funktionalitet til en enheds kontrolelement. En fysisk deskriptor er en valgfri klassespecifik deskriptor, og de fleste enheder har kun ringe fordel ved at bruge den. Se
USB-enhed HID-klasse ressourcebehov fra Core

Hver gang du tilføjer en HID-klasseinstans til en USB-konfiguration via et kald til funktionen sl_usbd_hid_add_to_configuration(), vil følgende ressourcer blive allokeret fra kernen.

Ressource
Grænseflader Alternative grænseflader Slutpunkter Grænsefladegrupper

Mængde
1 1 1 (2 hvis interrupt OUT-slutpunktet er aktiveret) 0

Bemærk, at disse tal er pr. konfiguration. Når du konfigurerer dine konfigurationsværdier SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, skal du ikke glemme at tage højde for, hvor mange konfigurationer klassen vil blive tilføjet. For konfigurationsværdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, da slutpunkter kun åbnes, når en konfiguration er angivet af værten, skal du blot tage højde for antallet af nødvendige slutpunkter for en klasseinstans.
USB-enheds HID-klassekonfiguration

To grupper af konfigurationsparametre bruges til at konfigurere HID-klassen:
USB-enheds HID-klasse Applikationsspecifikke konfigurationer USB-enheds HID-klasseinstanskonfigurationer
USB-enhed HID-klasse Applikationsspecifikke konfigurationer

For at bruge Silicon Labs USB-enheds HID-klassemodulet skal du først justere HID-kompileringstidskonfigurationsdefinitionerne i henhold til dine applikationsbehov. De er omgrupperet i sl_usbd_core_config.h-headeren. file under HID-sektionen. De kan opdeles i to sektioner, mængdekonfigurationer og HID-opgavekonfigurationer. Formålet med mængdekonfigurationerne er at informere USB-enhedsmodulet om, hvor mange USB HID-objekter der skal allokeres.
Tabellen nedenfor beskriver hver konfigurationsdefinition.
Tabel – Definerer USB-enheds HID-konfiguration

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

33/174

Overview

Konfigurationsnavn
SL_USBD_HID_CL ASS_I STANDARDANVÆRK
SL_USBD_HID_CONFIG URATION_QUANTITY
SL_USBD_HID_RAPPORT_ 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

Beskrivelse
Antal klasseinstanser, du vil allokere via et kald til funktionen
sl_usbd_hid_create_instance().
Antal konfigurationer. HID-klasseinstanser kan tilføjes til en eller flere aaaa-konfigurationer via funktionen sl_usbd_hid_add_to_configuration(). Konfigurerer det samlede antal rapport-ID'er, der skal allokeres.
Konfigurerer det samlede antal Push/Pop-elementer, der skal allokeres.
Timeropgaven håndterer alle timerbaserede HID-operationer. Denne konfiguration giver dig mulighed for at indstille stakstørrelsen (i antal bytes). Prioritet for HID-opgave. Dette er en CMSIS-RTOS2-prioritet.

Standardværdi
2 1 2 0 2048
osPrioritetHøj

USB-enhed HID-klasse Instanskonfigurationer Klasse Instansoprettelse underklasse
protokol landekode
interval_in og interval_out p_hid_callback HID-klasse Rapportbeskrivelse Eks.ampDette afsnit definerer konfigurationerne relateret til HID-klasseinstanserne.
Oprettelse af klasseinstans
Oprettelse af en HID-klasseinstans gøres ved at kalde funktionen aaa sl_usbd_hid_create_instance(), som udfører flere konfigurationsargumenter, der er beskrevet nedenfor.
underklasse
Kode for HID-underklassen. Mulige værdier er:
SL_USBD_HID_SUBCL ASS_NONE SL_USBD_HID_SUBCL ASS_BOOT
En HID-enhed, der bruger boot-underklassen, skal bruge standardrapportformater. For yderligere information om underklassekoderne, se afsnit 4.2 i HID-specifikationsrevision 1.11.
protokol
Protokol brugt af HID-enheden. Mulige værdier er:
SL_USBD_HID_PROTOCOL_NONE SL_USBD_HID_PROTOCOL_KBD SL_USBD_HID_PROTOCOL_MOUSE
Hvis din HID-funktion er en mus, skal protokollen indstilles til SL_USBD_HID_PROTOCOL_MOUSE. Hvis det er et tastatur, skal den indstilles til SL_USBD_HID_PROTOCOL_KBD. Ellers skal protokollen indstilles til SL_USBD_HID_PROTOCOL_NONE. For mere information om underklassekoderne, se afsnit 4.3 i HID-specifikationsrevision 1.11.
landekode
ID for landekoden. Mulige værdier er:
SL_USBD_HID_LANDSKODE_IKKE_UNDERSTØTTET

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

34/174

Overview
SL_USBD_HID_COUNTRY_CODE_ARABIC SL_USBD_HID_COUNTRY_CODE_BELGIAN SL_USBD_HID_COUNTRY_CODE_CANADIAN_BISLINGUAL SL_USBD_HID_COUNTRY_CODE_CANADIAN_FRENCH SL_USBD_HID_COUNTRY_CODE_CZECH_REPUBLIC SL_USBD_HID_COUNTRY_CODE_DANISH SL_USBD_HID_COUNTRY_CODE_FINNISH SL_USBD_HID_COUNTRY_CODE_FRENCH SL_USBD_HID_COUNTRY_CODE_GERMAN SL_USBD_HID_COUNTRY_CODE_GREEK SL_USBD_HID_COUNTRY_CODE_HEBREW SL_USBD_HID_COUNTRY_CODE_UNGARN SL_USBD_HID_COUNTRY_CODE_INTERNATIONAL SL_USBD_HID_COUNTRY_CODE_ITALIAN SL_USBD_HID_COUNTRY_CODE_JAPAN_KATAKANA SL_USBD_HID_COUNTRY_CODE_KOREAN SL_USBD_HID_COUNTRY_CODE_L ATIN_AMERICAN SL_USBD_HID_COUNTRY_CODE_NETHERL ANDS_DUTCH SL_USBD_HID_COUNTRY_CODE_NORWEGIAN SL_USBD_HID_COUNTRY_CODE_PERSIAN_FARSI SL_USBD_HID_COUNTRY_CODE_POL AND SL_USBD_HID_COUNTRY_CODE_PORTUGUESE SL_USBD_HID_COUNTRY_CODE_RUSSIA SL_USBD_HID_COUNTRY_CODE_SLOVAKIA SL_USBD_HID_COUNTRY_CODE_SPANISH SL_USBD_HID_COUNTRY_CODE_SVEDISH SL_USBD_HID_COUNTRY_CODE_SCHWEIZERSK_FRANSK SL_USBD_HID_COUNTRY_CODE_WISS_GERMAN SL_USBD_HID_COUNTRY_CODE_SWITZERL OG SL_USBD_HID_COUNTRY_CODE_TAIWAN SL_USBD_HID_COUNTRY_CODE_TURKISH_Q SL_USBD_HID_COUNTRY_CODE_UK SL_USBD_HID_COUNTRY_CODE_US SL_USBD_HID_COUNTRY_CODE_YUG OSL AVIA SL_USBD_HID_COUNTRY_CODE_TURKISH_F
Landekoden identificerer, hvilket land hardwaren er lokaliseret til. Det meste hardware er ikke lokaliseret, og derfor ville denne værdi være SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). Tastaturer kan dog bruge feltet til at angive sproget på tasterne.
For yderligere information om landekoderne, se afsnit 6.2.1 i HID-specifikationsrevision 1.11.
interval_in og interval_out
interval_in og interval_out repræsenterer pollingintervallet for IN-afbrydelsesendepunktet og OUT-afbrydelsesendepunktet.
Dette repræsenterer pollingintervallet for slutpunktet i millisekunder. Indstillingen af ​​denne værdi afhænger af, hvor ofte din enhed er modtagelig for at generere en ny rapport til værten. Hvis der f.eks. genereres en rapport hvert 16. millisekund, skal intervallet være 16 eller mindre.
Værdien skal være en potens af 2 (1, 2, 4, 8, 16 osv.).
En interval_out-værdi ignoreres, hvis ctrl_rd_en er indstillet til sand.
p_hid_callback
aaaa p_hid_callback er en pointer til en struktur af typen sl_usbd_hid_callbacks_t. Dens formål er at give HID Cl ss et sæt af callback-funktioner, der skal kaldes, når en HID-hændelse indtræffer.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

35/174

Overview

Ikke alle callbacks er obligatoriske, og en null-pointer (NULL) kan sendes i callbacks-strukturvariablen, når callback'et ikke er nødvendigt. Tabellen nedenfor beskriver hvert konfigurationsfelt, der er tilgængeligt i denne konfigurationsstruktur.
Tabel – sl_usbd_hid_callbacks_t Konfigurationsstruktur

Felter

Beskrivelse

Funktionssignatur

.aktiver .deaktiver .get_report_desc
.get_phy_desc
.set_output_report .get_feature_report .set_feature_report

Kaldes, når USB-klasseinstansen er aktiveret. Kaldes, når USB-klasseinstansen er deaktiveret.
Kaldes under oprettelsen af ​​HID-instansen for at overføre din rapportbeskrivelse. For hver af dine HID-funktioner skal du angive en rapportbeskrivelse. Rapportbeskrivelsen angiver over for værten, hvordan den periodiske rapport, der sendes af enheden, skal parses. Det kan være udfordrende at skrive din egen rapportbeskrivelse, og derfor er der nogle ressourcer, der kan hjælpe. Dette er den eneste obligatoriske tilbagekaldsfunktion. Kaldes under oprettelsen af ​​HID-instansen for at overføre din fysiske deskriptor. Den fysiske deskriptor er en deskriptor, der giver information om den eller de specifikke dele af den menneskelige krop, der aktiverer en eller flere kontrolelementer. For mere information om fysiske deskriptorer, se afsnit 6.2.3 i HID-specifikationsrevision 1.11. Den fysiske deskriptor er valgfri og ignoreres for det meste. Bufferen, der sendes her, kan indstilles til NULL, og længden kan indstilles til 0. Kaldes, når værten angiver en rapport som beskrevet i din rapportbeskrivelse (når den sender en rapport).
Kaldes, når værten anmoder om en funktionsrapport som beskrevet i din rapportbeskrivelse.
Kaldes, når værten indstiller en funktionsrapport som beskrevet i din rapportbeskrivelse.

void app_usbd_hid_enable(uint8_t class_nbr); void app_usbd_hid_disable(uint8_t class_nbr); void app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_get_phy_desc(uint8_t class_nbr, const uint8_t *p_report_ptr, uint16_tp_report_len);
void app_usbd_hid_set_output_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len); void app_usbd_hid_get_feature_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len); void app_usbd_hid_set_feature_report(uint8_t class_nbr, uint8_t report_id, uint8_t *p_report_buf, uint16_t report_len);

.get_protocol

Henter den aktuelle aktive protokol.

void app_usbd_hid_get_protocol(uint8_t class_nbr, uint8_t *p_protocol);

.set_protocol

Indstiller den aktuelle aktive protokol.

void app_usbd_hid_set_protocol(uint8_t class_nbr, uint8_t protocol);

HID-klasserapportbeskrivelse Eks.ample

Silicon Labs' HID-klasseampapplikationen giver en exampfil af en rapportbeskrivelse for en simpel mus. Eks.ampFilen nedenfor viser en rapportbeskrivelse for en mus.
Example – Muserapportbeskrivelse

statisk 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. Alle rettigheder forbeholdes.

36/174

Overview

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_HOVEDSAMLING +1, SL_USBD_HID_SAMLING_FYSISK,(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_RAPPORT_COUNT +1,0 03,

SL_USBD_HID_GLOBAL_RAPPORT_SIZE +1,0 01,

SL_USBD_HID_MAIN_INPUT +1, SL_USBD_HID_MAIN_DATA |

SL_USBD_HID_MAIN_VARIABLE |

SL_USBD_HID_MAIN_ABSOLUTE,

SL_USBD_HID_GLOBAL_REPORT_COUNT +1,0 01,(8)

SL_USBD_HID_GLOBAL_RAPPORT_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_RAPPORT_SIZE +1,0 08,

SL_USBD_HID_GLOBAL_RAPPORT_COUNT +1,0 02,

SL_USBD_HID_MAIN_INPUT +1, SL_USBD_HID_MAIN_DATA |

SL_USBD_HID_MAIN_VARIABLE |

SL_USBD_HID_MAIN_RELATIVE,

SL_USBD_HID_MAIN_ENDCOLLECTION,(10)

SL_USBD_HID_MAIN_ENDCOLLECTION

(11)};

(1) Tabellen, der repræsenterer en muserapportbeskrivelse, initialiseres på en sådan måde, at hver linje svarer til et kort element. Sidstnævnte er dannet af et 1-byte præfiks og 1-byte data. Se viewed af en vært-HID-parser i figur – Rapportbeskrivelsesindhold fra en vært-HID-parser View.
(2) Siden Generisk skrivebordsbrug bruges.
(3) Inden for siden Generisk desktopbrug, brugen tag antyder, at gruppen af ​​kontrolelementer er til at styre en mus. En musesamling består typisk af to akser (X og Y) og en, to eller tre knapper.
(4) Museindsamlingen er startet.
(5) Inden for musesamlingen, en anvendelse tag antyder mere specifikt, at musekontrollerne tilhører pointersamlingen. En pointersamling er en samling af akser, der genererer en værdi for at dirigere, indikere eller pege brugerens intentioner mod et program.
(6) Pointersamlingen startes.
(7) Siden Brug af knapper definerer et inputelement bestående af tre 1-bit felter. Hvert 1-bit felt repræsenterer henholdsvis musens knap 1, 2 og 3 og kan returnere en værdi på 0 eller 1.
(8) Inputelementet for siden Knapbrug er udfyldt med 13 andre bits.
(9) En anden generisk skrivebordsbrugsside er angivet til beskrivelse af musens position med akserne X og Y. Inputelementet består af to 8-bit felter, hvis værdi kan være mellem -127 og 127.
(10) Pointersamlingen er lukket.
(11) Musesamlingen er lukket.
USB.org HID-side

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

37/174

Overview
USB Implementers Forum (USB-IF) tilbyder et værktøj kaldet "HID Descriptor Tool" sammen med andre oplysninger om rapportbeskrivelsesformatet. Se http://www.usb.org/developers/hidpage/ for yderligere oplysninger.
USB-enhed HID-klasseprogrammeringsvejledning
Dette afsnit forklarer, hvordan du bruger HID-klassen. Initialisering af USB-enhedens HID-klasse Tilføjelse af en USB-enheds HID-klasseinstans til din enhed Kommunikation ved hjælp af USB-enhedens HID-klasse
Initialisering af USB-enhedens HID-klasse
For at tilføje HID-klassefunktionalitet til din enhed skal du først initialisere klassen ved at kalde funktionen sl_usbd_hid_init(). EksempletampFiguren nedenfor viser, hvordan man kalder sl_usbd_hid_init() ved hjælp af standardargumenter. For mere information om de konfigurationsargumenter, der skal sendes til sl_usbd_hid_init(), se USB Device HID Class Applikationsspecifikke konfigurationer.
Example – Kalder sl_usbd_hid_init()
sl_status_t status;
status = sl_usbd_hid_init(); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}
Tilføjelse af en USB-enheds HID-klasseinstans til din enhed
For at tilføje HID-klassefunktionalitet til din enhed skal du oprette en instans og derefter tilføje den til din enheds konfiguration(er).
Oprettelse af en HID-klasseinstans
Opret en HID-klasseinstans ved at kalde funktionen sl_usbd_hid_create_instance().ampNedenstående tekst viser, hvordan man opretter en simpel musefunktion via sl_usbd_hid_create_instance() ved hjælp af standardargumenter. For mere information om de konfigurationsargumenter, der skal sendes til sl_usbd_hid_create_instance(), se Konfigurationer af USB-enheds-HID-klasseinstanser.
Example – Tilføjelse af en musefunktion via sl_usbd_hid_create_instance()

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

38/174

Overview
/* Globale konstanter. */ statisk konstant 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 };
/* Lokale variabler.*/ 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 }; Bemærk: *Udfyldningstekst mangler i feltet "Læs mere" og "Tilføj en given tekst."
void app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (void)klasse_nbr;
*p_report_ptr = app_usbd_hid_mouse_report_desc; *p_report_len = sizeof(app_usbd_hid_mouse_report_desc); }
status = 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. Alle rettigheder forbeholdes.

39/174

Overview
/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */}
Tilføjelse af HID-klasseinstansen til din enheds konfiguration(er) Når du har oprettet en HID-klasseinstans, kan du tilføje den til en konfiguration ved at kalde funktionen
sl_usbd_hid_add_to_configuration().
EksampFilen nedenfor viser, hvordan man kalder sl_usbd_hid_add_to_configuration().
Example – Kalder sl_usbd_hid_add_to_configuration()

sl_status_t status;

sl_usbd_hid_add_to_configuration(klassenummer,

(1)

config_nbr_fs); (2)

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

(1) Klassenummer, der skal føjes til den konfiguration, der returneres af sl_usbd_hid_create_instance(). (2) Konfigurationsnummer (her tilføjes det til en Full-Speed-konfiguration).
Kommunikation ved hjælp af USB-enhedens HID-klasse
Klasseinstanskommunikation Synkron kommunikation Klasseinstanskommunikation HID-klassen tilbyder følgende funktioner til at kommunikere med værten.
Tabel – Oversigt over HID-kommunikations-API

Funktionsnavn
sl_usb d _hid _read ad _sy nc() sl_usb d _hid _write _sy nc()

Handling Modtager data fra værten via interrupt OUT-slutpunktet. Denne funktion blokerer. Sender data til værten via interrupt IN-slutpunktet. Denne funktion blokerer.

Synkron kommunikation Synkron kommunikation betyder, at overførslen blokerer. Ved funktionskald blokerer applikationerne, indtil overførslen er fuldført med eller uden en fejl. En timeout kan angives for at undgå evig ventetid. Eks.ampFiguren nedenfor viser en læse- og skrivefunktion, der modtager data fra værten ved hjælp af interrupt OUT-slutpunktet og sender data til værten ved hjælp af interrupt IN-slutpunktet.
Example – Synkron HID-læsning og -skrivning

__ALIGNED(4) uint8_t rx_buf[2];

__ALIGNED(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

status;

status = sl_usbd_hid_read_sync(class_nbr,

(1)

(void *)rx_buf,

(2)

2u,

0u,

(3)

&xfer_len);

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

40/174

Overview
status =sl_usbd_hid_read_sync(class_nbr,(1)(void *)rx_buf,(2)2u,0u,(3)&xfer_len);if(status !SL_STATUS_OK){/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */}
status =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status !SL_STATUS_OK){/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */}
(1) Klasseinstansnummeret oprettet fra sl_usbd_hid_create_instance() giver en intern reference til HID-klassen for at rute overførslen til det korrekte interrupt OUT- eller IN-slutpunkt.
(2) Applikationen skal sikre, at den buffer, der stilles til rådighed for funktionen, er stor nok til at rumme alle dataene. Ellers kan der opstå synkroniseringsproblemer. Internt udføres læseoperationen enten med kontrolslutpunktet eller med afbrydelsesslutpunktet, afhængigt af det kontrollæseflag, der er indstillet ved kald af sl_usbd_hid_create_instance().
(3) For at undgå en uendelig blokeringssituation kan der angives en timeout udtrykt i millisekunder. En værdi på 809 får applikationsopgaven til at vente i en evighed.
(4) Applikationen leverer den initialiserede transmissionsbuffer.
HID Periodiske inputrapporter Opgave
For at spare båndbredde har værten mulighed for at afbryde rapporter fra et interrupt IN-slutpunkt ved at begrænse rapporteringsfrekvensen. For at gøre dette skal værten sende SET_IDLE-anmodningen. HID-klassen implementeret af Silicon Labs indeholder en intern opgave, der respekterer den rapporteringsfrekvensbegrænsning, som du kan anvende på en eller flere inputrapporter. Figur Periodic Input Reports Task viser, hvordan de periodiske inputrapportopgaver fungerer.
Figur – Periodiske inputrapporter

(1) Enheden modtager en SET_IDLE-anmodning. Denne anmodning angiver en inaktiv varighed for et givet rapport-ID. For flere oplysninger om SET_IDLE-anmodningen, se
(2) En rapport-ID-struktur (tildelt under HID-klassens initialiseringsfase) opdateres med inaktivitetsvarigheden. En inaktivitetsvarighedstæller initialiseres med inaktivitetsvarighedsværdien. Rapport-ID-strukturen indsættes i slutningen af ​​en linket liste, der indeholder inputrapport-ID-strukturer. Inaktivitetsvarighedsværdien udtrykkes i en enhed på 4 ms, hvilket giver et interval på 4 til 1020 ms.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

41/174

Overview
Hvis inaktivitetsvarigheden er kortere end pollingintervallet for afbrydelses-IN-slutpunktet, genereres rapporterne ved pollingintervallet.
(3) Hver 4 ms gennemser den periodiske inputrapportopgave listen over inputrapport-ID'er. For hvert inputrapport-ID udfører opgaven en af ​​to mulige operationer. Varigheden af ​​opgaveperioden matcher den 4 ms-enhed, der bruges til inaktivitetsvarigheden. Hvis værten ikke har sendt SET_IDLE-anmodninger, er listen over inputrapport-ID'er tom, og opgaven har intet at behandle. Opgaven behandler kun rapport-ID'er, der er forskellige fra 0 og med en inaktivitetsvarighed, der er større end 0.
(4) For et givet inputrapport-ID verificerer opgaven, om inaktivitetsperioden er udløbet. Hvis inaktivitetsperioden ikke er udløbet, dekrementeres tælleren, og der sendes ingen inputrapport til værten.
(5) Hvis inaktivitetsvarigheden er udløbet (dvs. at tælleren for inaktivitetsvarighed har nået nul), sendes en inputrapport til værten ved at kalde funktionen sl_usbd_hid_write_sync() via interrupt IN-slutpunktet.
(6) De inputrapportdata, der sendes af opgaven, kommer fra en intern databuffer, der er allokeret til hver inputrapport, der er beskrevet i rapportbeskrivelsen. En applikationsopgave kan kalde funktionen sl_usbd_hid_write_sync() for at sende en inputrapport. Efter at have sendt inputrapportdataene opdaterer sl_usbd_hid_write_sync() den interne buffer, der er knyttet til et inputrapport-ID, med de netop sendte data. Derefter sender den periodiske inputrapportopgave altid de samme inputrapportdata efter hver forløbet inaktivitetsperiode, og indtil applikationsopgaven opdaterer dataene i den interne buffer. Der er en låsemekanisme for at undgå beskadigelse af inputrapport-ID-dataene i tilfælde af en ændring, der sker på det nøjagtige tidspunkt for transmissionen udført af den periodiske inputrapportopgave.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

42/174

Overview
Overview
USB-enhed MSC-klasse
USB-enhed MSC-klasse overview USB-enhed MSC-klasse Ressourcebehov fra Core USB-enhed MSC-klassekonfiguration USB-enhed MSC-klasse Programmeringsvejledning USB-enhed MSC-klasse Lagringsdrivere
Dette afsnit beskriver masselagringsenhedsklassen (MSC), der understøttes af Silicon Labs USB-enhed. MSC er en protokol, der muliggør overførsel af information mellem en USB-enhed og en vært. De oplysninger, der overføres, er alt, der kan lagres elektronisk, såsom eksekverbare programmer, kildekode, dokumenter, billeder, konfigurationsdata eller andre tekst- eller numeriske data. USB-enheden vises som et eksternt lagringsmedium for værten, hvilket muliggør overførsel af files via træk og slip.
A file systemet definerer, hvordan fileer organiseret i lagringsmediet. Specifikationen for USB-masselagringsklassen kræver ingen specifikke file system, der skal bruges på kompatible enheder. I stedet giver det en simpel grænseflade til at læse og skrive datasektorer ved hjælp af det transparente SCSI-kommandosæt (Small Computer System Interface). Som sådan kan operativsystemer behandle USB-drevet som en harddisk og formatere det med enhver file system de kan lide.
USB-masselagringsenhedsklassen understøtter to transportprotokoller, som følger:
Bulk-Only Transport (BOT) Control/Bulk/Interrupt (CBI) Transport (bruges kun til diskettedrev)
Masselagringsenhedsklassen implementerer det transparente SCSI-kommandosæt udelukkende ved hjælp af BOT-protokollen, hvilket betyder, at kun bulk-slutpunkter vil blive brugt til at overføre data og statusoplysninger. MSC-implementeringen understøtter flere logiske enheder.
MSC-implementeringen overholder følgende specifikationer:
Universal Serial Bus Mass Storage Class Specifikation Overview, Revision 1.3 5. september 2008. Universal Serial Bus Mass Storage Class Bulk-Only Transport, Revision 1.0 31. september 1999.
USB-enhed MSC aCl ss Overview
Protokol-slutpunkter Klasseanmodninger Small Computer System Interface (SCSI)
Protokol
I dette afsnit vil vi diskutere Bulk-Only Transport (BOT)-protokollen for masselagringsklassen. Bulk-Only Transport-protokollen har tre stages:
Kommandotransporten Datatransporten Statustransporten
Masselagringskommandoer sendes af værten via en struktur kaldet Command Block Wrapper (CBW). For kommandoer, der kræver en datatransports...tage.g. vil værten forsøge at sende eller modtage det nøjagtige antal bytes fra enheden som angivet af længde- og flagfelterne i CBW'en. Efter datatransportentage. værten forsøger at modtage en Command Status Wrapper (CSW) fra enheden, der beskriver kommandoens status samt eventuelle dataresterende data (hvis

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

43/174

Overview
(any). For kommandoer, der ikke inkluderer en datatransport stage.g., værten forsøger at modtage CSW'en direkte efter at CBW'en er sendt. Protokollen er beskrevet i figur – MSC-protokol.
Figur – MSC-protokol

Endpoints
På enhedssiden består MSC'en i overensstemmelse med BOT-specifikationen af ​​følgende slutpunkter: Et par kontrol-IN- og OUT-slutpunkter kaldet standardslutpunkter. Et par bulk-IN- og OUT-slutpunkter.
Tabellen nedenfor viser de forskellige anvendelser af endepunkterne.
Tabel – MSC-slutpunktsbrug

Slutpunkt
Styring IND Styring UD Bulk IND Bulk UD

Retning
Enhed til vært Vært til enhed Enhed til vært Vært til enhed

Brug
Optælling og MSC-klassespecifikke anmodninger Optælling og MSC-klassespecifikke anmodninger Send CSW og data Modtag CBW og data

Klasseanmodninger
Der er to definerede kontrolanmodninger til MSC BOT-protokollen. Disse anmodninger og deres beskrivelser er detaljeret beskrevet i tabellen nedenfor.

Tabel – Anmodninger om masselagringsklasse

Klasseanmodninger
Nulstilling af kun masselagring

Beskrivelse
Denne anmodning bruges til at nulstille masselagerenheden og dens tilhørende grænseflade. Denne anmodning forbereder enheden til at modtage den næste kommandoblok.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

44/174

Overview

Klasseanmodninger

Beskrivelse

Get Max Denne anmodning bruges til at returnere det højeste logiske enhedsnummer (LUN), der understøttes af enheden. For eksempelampLea

LUN

En enhed med LUN 0 og LUN 1 returnerer værdien 1. En enhed med en enkelt logisk enhed returnerer 0 eller stopper

anmodning. Den maksimale værdi, der kan returneres, er 15.

Lille computersystemgrænseflade SCSI

På programmeringsgrænsefladeniveau implementerer MSC-enheden en af ​​standardprotokollerne for lagringsmediekommunikation, såsom SCSI og SFF-8020i (ATAPI). "Programmeringsgrænsefladen" specificerer, hvilken protokol der er implementeret, og hjælper værtsoperativsystemet med at indlæse den passende enhedsdriver til kommunikation med USB-lagerenheden. SCSI er den mest almindelige protokol, der bruges med USB MSC-lagerenheder. Vi tilbyder en implementering til MSC SCSI-underklassen, som vores GSDK-brugere kan bruge direkte fra starten.
SCSI er et sæt standarder til håndtering af kommunikation mellem computere og eksterne enheder. Disse standarder omfatter kommandoer, protokoller, elektriske grænseflader og optiske grænseflader. Lagerenheder, der bruger andre hardwaregrænseflader, såsom USB, bruger SCSI-kommandoer til at indhente enheds-/værtsoplysninger og styre enhedens drift og overføre datablokke på lagermediet.
SCSI-kommandoer dækker en bred vifte af enhedstyper og funktioner, og derfor har enheder brug for en delmængde af disse kommandoer. Generelt er følgende kommandoer nødvendige for grundlæggende kommunikation:
FORESPØRGSEL LÆSEKAPACITET (10) LÆS (10) ANMODNING SENSERING TEST ENHED KLAR SKRIV (10)
USB-enhed MSC-klasse ressourcebehov fra Core

Hver gang du tilføjer en MSC-klasseinstans til en USB-konfiguration via funktionen sl_usbd_msc_add_to_configuration(), vil følgende ressourcer blive allokeret fra kernen.

Ressource
Grænseflader Alternative grænseflader Slutpunkter Grænsefladegrupper

Mængde
1 1 2 0

Bemærk, at disse tal er pr. konfiguration. Når du konfigurerer dine konfigurationsværdier SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, skal du ikke glemme at tage højde for, hvor mange konfigurationer klassen vil blive tilføjet. For konfigurationsværdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, da slutpunkter kun åbnes, når en konfiguration er angivet af værten, skal du blot tage højde for antallet af nødvendige slutpunkter for en klasseinstans.
USB-enhed MSC-klassekonfiguration

To grupper af konfigurationsparametre bruges til at konfigurere MSC-klassen:
USB-enhed MSC-klasse Applikationsspecifikke konfigurationer USB-enhed MSC-klasse Logisk enhedskonfiguration
USB-enhed MSC-klasse Applikationsspecifikke konfigurationer

Konfigurationer under kompilering af klasse Oprettelse af klasseinstanser

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

45/174

Overview

Klassekompileringstidskonfigurationer
Silicon Labs USB-enheds MSC-klasse og SCSI-underklasse kan konfigureres ved kompilering via #defines, der findes i sl_usbd_core_config.h. file.
Tabel – Generiske konfigurationskonstanter

Konfigurationsnavn

Beskrivelse

SL_USBD_MSC_CLASS_INST Antal klasseinstanser, du vil allokere via et kald til funktionen

ANCE_QUANTITY

sl_usbd_msc_scsi_create_instance().

SL_USBD_MSC_CONFIGURA Nummer på den konfiguration, som en klasseinstans kan tilføjes til via et kald til

TION_QUANTITY

funktionen sl_usbd_msc_scsi_add_to_configuration().

SL_USBD_MSC_LUN_QUANT Antal logiske enheder pr. klasseinstans, som du vil tilføje via et kald til

ITY

funktionen sl_usbd_msc_scsi_lun_add().

SL_USBD_MSC_SCSI_64_BIT Aktiverer eller deaktiverer understøttelse af Logical Block Address (LBA) på 64 bit.
_LBA_EN

SL_USBD_MSC_DATA_BUFF Størrelse af databuffer pr. klasseinstans i bytes ER_SIZE

Standardværdi
2
1
2
0
512

Oprettelse af klasseinstans
Oprettelse af en USB-enheds MSC SCSI-klasseinstans gøres ved at kalde funktionen sl_usbd_msc_scsi_create_instance(). Denne funktion tager ét konfigurationsargument, der er beskrevet nedenfor.
p_scsi_callbacks
p_scsi_callbacks er en pointer til en konfigurationsstruktur af typen sl_usbd_msc_scsi_callbacks_t. Ud over de almindelige usb-enhedsklasser callbacks connect/disconnect, giver den MSC-klassen et sæt valgfrie callback-funktioner, der kaldes, når en hændelse opstår på den logiske enhed. En null-pointer (NULL) kan sendes til dette argument, hvis der ikke er behov for callbacks.
Tabellen nedenfor beskriver hvert konfigurationsfelt, der er tilgængeligt i denne konfigurationsstruktur.
Tabel – sl_usbd_msc_scsi_callbacks_t Konfigurationsstruktur

Felter

Beskrivelse

.aktiver

Kaldes, når USB-klasseinstansen er aktiveret.

.disable Kaldes, når USB-klasseinstansen er deaktiveret.

.host_eject Funktion kaldes, når en logisk enhed skubbes ud fra værten.

Funktionssignatur
void app_usbd_msc_scsi_enable(uint8_t class_nbr);
void app_usbd_msc_scsi_disable(uint8_t class_nbr); void app_usbd_msc_scsi_host_eject(uint8_t class_nbr, uint8_t lu_nbr);

USB-enhed MSC-klasse Logisk enhedskonfiguration

Tilføjelse af en logisk enhed til en MSC-klasseinstans gøres ved at kalde funktionen sl_usbd_msc_lun_add(). Denne funktion tager ét konfigurationsargument, der er beskrevet nedenfor.

p_lu_info

p_lu_info er en pointer til en struktur af typen sl_usbd_msc_scsi_lun_info_t. Dens formål er at give information om den logiske enhed til MSC-klassen.
Tabellen nedenfor beskriver hvert konfigurationsfelt, der er tilgængeligt i denne konfigurationsstruktur.

Tabel – sl_usbd_msc_scsi_lun_info_t Konfigurationsstruktur

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

46/174

Overview

Felt

Beskrivelse

Felt
.scsi_lun_api_p tr

Beskrivelse
Pointer til den mediedriver-API, der håndterer denne logiske enhed. Se USB-enhed MSC-klassen Lagerdrivere for at få flere oplysninger om lagerdrivere.

.ve nd o r_id _ p tr
.produkt_id_ptr
.p ro d uct_ re v isi on_level .is_ read _only

Pointer til en streng, der indeholder leverandør-ID'et for den logiske enhed. Strengens maksimale længde er 8 tegn. Pointer til en streng, der indeholder produkt-ID'et for den logiske enhed. Strengens maksimale længde er 16 tegn. Produktrevisionsniveau.
Flag, der angiver, om den logiske enhed skal ses som skrivebeskyttet fra et punkt view af værten (sandt) eller ej (falsk).

USB-enhed MSC-klasseprogrammeringsvejledning

Dette afsnit forklarer, hvordan man bruger MSC-klassen.
Initialisering af USB-enheds MSC-klassen Tilføjelse af en USB-enheds MSC SCSI-klasseinstans til din enhed Håndtering af logiske enheder i USB-enheds MSC-klassen
Initialisering af USB-enhedens MSC-klasse

For at tilføje MSC SCSI-klassefunktionalitet til din enhed skal du først initialisere MSC-basisklassen og SCSI-underklassen ved at kalde funktionen sl_usbd_msc_init() og sl_usbd_msc_scsi_init().
EksampFiguren nedenfor viser, hvordan man kalder sl_usbd_msc_init() og sl_usbd_msc_scsi_init().

Example – Kalder sl_usbd_msc_init() og sl_usbd_msc_scsi_init()

sl_status_t status;
status = sl_usbd_msc_init(); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}
status = sl_usbd_msc_scsi_init(); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}
Tilføjelse af en USB-enheds MSC SCSI-klasseinstans til din enhed
For at tilføje MSC SCSI-klassefunktionalitet til din enhed skal du først oprette en instans og derefter føje den til din enheds konfiguration(er). Du skal føje mindst én logisk enhed til din instans.
Oprettelse af en MSC SCSI-klasseinstans
Opret en MSC SCSI-klasseinstans ved at kalde funktionen sl_usbd_msc_scsi_create_instance().
EksampNedenstående tekst viser, hvordan man kalder sl_usbd_msc_scsi_create_instance() ved hjælp af standardargumenter. For mere information om de konfigurationsargumenter, der skal sendes til sl_usbd_msc_scsi_create_instance(), se USB-enheds MSC-klasseapplikationsspecifikke konfigurationer.
Example – Kalder sl_usbd_ msc_scsi_create_instance()

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

47/174

Overview

uint8_t klasse_nr; sl_status_t status;
sl_usbd_msc_scsi_callbacks_t app_usbd_msc_scsi_callbacks = { .enable = NULL, .disable = NULL, .host_eject = NULL }; Bemærk: Da dette er konfigurationskommandoer, oversættes de fleste termer ikke direkte. Funktionelle ord som "enable" og "null" er ikke direkte.
status = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
hvis (status ! SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */ }
Tilføjelse af MSC-klasseinstansen til din enheds konfiguration(er)
Når du har oprettet en MSC-klasseinstans, kan du tilføje den til en konfiguration ved at kalde funktionen
sl_usbd_msc_add_to_configuration().
EksampFølgende tekst viser, hvordan man kalder sl_usbd_msc_scsi_add_to_configuration() ved hjælp af standardargumenter.
Example – Kalder sl_usbd_ msc_scsi_add_to_configuration()

sl_status_t status;

status = sl_usbd_msc_scsi_add_to_configuration(klassenummer,

(1)

config_nbr_fs);

(2)

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

(1) Klassenummer, der skal føjes til den konfiguration, der returneres af sl_usbd_msc_scsi_create_instance(). (32) Konfigurationsnummer (her tilføjes det til en Full-Speed-konfiguration).
USB-enhed MSC-klasse Logisk enhedshåndtering
Tilføjelse af en logisk enhed Tilslutning/frakobling af et lagringsmedium
Tilføjelse af en logisk enhed
Når du tilføjer en logisk enhed til din MSC SCSI-klasseinstans, skal den være bundet til et lagringsmedie (RAMDisk, SD-kort, flashhukommelse osv.). MSC-klassen bruger en lagringsdriver til at kommunikere med lagringsmedier. Denne driver skal leveres, når den logiske enhed tilføjes.
EksampFilen nedenfor viser, hvordan man tilføjer en logisk enhed via sl_usbd_msc_scsi_lun_add().
Example – Tilføjelse af en logisk enhed via sl_usbd_msc_scsi_lun_add()

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

48/174

Overview

sl_usbd_msc_scsi_lun_t *lu_object_ptr = NULL;

sl_usbd_msc_scsi_lun_info_t lu_info;

sl_status_t

status;

lu_info.sl_usbd_msc_scsi_lun_api_t = &app_usbd_scsi_storage_block_device_api;

lu_info.vendor_id_ptr

= “Silicon Labs”;

lu_info.product_id_ptr

= "blok enhed f.eks.ample”;

lu_info.produkt_revisionsniveau = 0x1000u;

lu_info.er_skrivebeskyttet

= falsk;

status = sl_usbd_msc_scsi_lun_add(klassenummer, &lu_info, &lu_object_ptr);
hvis (status ! SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */ }

Tilslutning/afmontering af et lagringsmedium
Når den logiske enhed er blevet tilføjet, skal et lagermedie tilsluttes for at være tilgængeligt fra værtssiden. MSC-klassen tilbyder to funktioner til at styre lagermediets tilknytning til den logiske enhed: sl_usbd_msc_scsi_lun_attach() og sl_usbd_msc_scsi_lun_detach(). Disse funktioner giver dig mulighed for at emulere fjernelsen af ​​en lagerenhed for at få adgang igen fra den integrerede applikation, hvis det er nødvendigt.
EksampFiguren nedenfor viser, hvordan man bruger funktionerne sl_usbd_msc_scsi_lun_attach() og sl_usbd_msc_scsi_lun_detach().
Example – Medietilslutning/-afmontering

sl_status_t status;

status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}

(1)

status = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); hvis (status !SL_STATUS_OK) {
/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}

(2)

status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr) hvis (status !SL_STATUS_OK) {
/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */
}

(3)

(1) Fra dette øjeblik, hvis MSC-enheden er tilsluttet en vært, er lagringsmediet tilgængeligt.
(2) Hvis MSC-enheden er tilsluttet en vært, vil mediet nu vises som utilgængeligt. På nuværende tidspunkt kan handlinger udføres på mediet fra den integrerede applikation.
(3) Igen, hvis MSC-enheden er tilsluttet værten, vil lagringsmediet vises som tilsluttet.
USB-enhed MSC-klasselagerdrivere
USB-enheden MSC-klassen skal bruge en lagerdriver for at kommunikere med et lagermedie. Silicon Labs tilbyder i øjeblikket ikke drivere.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

49/174

Overview
TPY aa Driveren AI er defineret af typedef sl_usbd_msc_scsi_lun_api_t. Vores sl_usbd_msc_scsi_lun_api_t-fil skal inkluderes for at aaaaaaaa din sl_usbd_msc_scsi_lun_info_t-fil. Brug argumentet, når du tilføjer en logisk enhed med sl_usbd_msc_scsi_lun_add(). Se afsnittet USB-enhed MSC SCSI API for flere detaljer om strukturerne. Implementeringen af ​​lagringsdriveren kan være så simpel som et array af sektorer i RAM. Typisk sektorstørrelse (dvs. blokstørrelse) er 512 for masselagringsenheder og 2048 for cd-rom'er.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

50/174

Overview
Overview
USB-enhedsleverandørklasse
USB-enhedsleverandørklasse overview Ressourcebehov for USB-enhedsleverandørklasse fra Core Konfiguration af USB-enhedsleverandørklasse Programmeringsvejledning til USB-enhedsleverandørklasse Vendor-klassen giver dig mulighed for at bygge leverandørspecifikke enheder, der kan implementere en proprietær protokol. Den er afhængig af et par bulk-slutpunkter til at overføre data mellem værten og enheden. Bulkoverførsler er praktiske til at overføre store mængder ustrukturerede data og giver en pålidelig dataudveksling ved hjælp af en fejldetektions- og gentagelsesmekanisme. Ud over bulk-slutpunkter kan Vendor-klassen også bruge et valgfrit par afbrydelsesslutpunkter. Ethvert operativsystem (OS) kan fungere med Vendor-klassen, forudsat at operativsystemet har en driver til at håndtere Vendor-klassen. Afhængigt af operativsystemet kan driveren være native eller leverandørspecifik. For eksempel interagerer din applikation under Microsoft Windows® med WinUSB-driveren leveret af Microsoft for at kommunikere med leverandørenheden.
USB-enhedsleverandørklasse overview
Figur – Generel arkitektur mellem Windows-vært og leverandørklasse viser den generelle arkitektur mellem værten og enheden ved hjælp af leverandørklassen. I dette eksempelampdvs. værtsoperativsystemet er MS Windows.
Figur – Generel arkitektur mellem MS Windows-vært og leverandørklasse

På MS Windows-siden kommunikerer applikationen med leverandørens enhed ved at interagere med et USB-bibliotek. Biblioteker, som libusb, tilbyder en API til at administrere en enhed og dens tilhørende pipes, og til at kommunikere med enheden via kontrol-, bulk- og afbrydelsesendepunkter.
På enhedssiden består Vendor-klassen af ​​følgende slutpunkter:
Et par kontrol-IN- og OUT-slutpunkter kaldet standardslutpunktet. Et par bulk-IN- og OUT-slutpunkter.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

51/174

Overview

Et par afbrydelses-IN- og OUT-endepunkter. Dette par er valgfrit. Tabellen nedenfor viser brugen af ​​de forskellige endepunkter:
Tabel – Brug af leverandørklasse-slutpunkter

Endepunktsretning

Styr IN
Kontrollere
UD
Masseind

Enhed-til-vært
>Vært-til-enhed
Enhed-til-vært

Masse UD
Afbryd IN
Afbryde
UD

Vært-til-enhed
Enhed-til-vært
Vært-til-enhed

Brug
Standardanmodninger om optælling og leverandørspecifikke anmodninger.
Standardanmodninger om optælling og leverandørspecifikke anmodninger.
Rådatakommunikation. Data kan struktureres i henhold til en proprietær protokol.
Rådatakommunikation. Data kan struktureres i henhold til en proprietær protokol.
Rådatakommunikation eller -notifikation. Data kan struktureres i henhold til en proprietær protokol. Rådatakommunikation eller -notifikation. Data kan struktureres i henhold til en proprietær protokol.

Enhedsapplikationen kan bruge bulk- og interrupt-slutpunkter til at sende eller modtage data til eller fra værten. Den kan kun bruge standardslutpunktet til at afkode leverandørspecifikke anmodninger sendt af værten. Standardanmodningerne administreres internt af kernelaget i Silicon Labs USB-enheden.
USB-enhedsleverandørklasseressourcebehov fra Core

Hver gang du tilføjer en leverandørklasseinstans til en konfiguration via funktionen sl_usbd_vendor_add_to_configuration(), vil følgende ressourcer blive allokeret fra kernen.

Ressource
Grænseflader Alternative grænseflader Slutpunkter Grænsefladegrupper

Mængde
1 1 2 (4 hvis du aktiverede afbrydelsesendepunkter) 0

Bemærk, at disse tal er pr. konfiguration. Når du konfigurerer dine konfigurationsværdier SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, skal du ikke glemme at tage højde for, hvor mange konfigurationer klassen vil blive tilføjet. For konfigurationsværdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, da slutpunkter kun åbnes, når en konfiguration er angivet af værten, skal du blot tage højde for antallet af nødvendige slutpunkter for en klasseinstans.
Konfiguration af USB-enhedsleverandørklasse

To grupper af konfigurationsparametre bruges til at konfigurere Vendor-klassen:
USB-enhedsleverandørklasse Applikationsspecifikke konfigurationer Konfigurationer af USB-enhedsleverandørklasseinstanser
USB-enhedsleverandørklasse Applikationsspecifikke konfigurationer
For at bruge Silicon Labs USB-enhedsleverandørklassemodulet skal du først justere leverandørens kompileringstidskonfiguration i henhold til dine applikationsbehov. De er omgrupperet i sl_usbd_core_config.h-headeren. file under Leverandør-sektionen. Formålet med mængdekonfigurationerne er at informere USB-enhedsmodulet om, hvor mange USB-leverandørobjekter der skal allokeres.
Tabellen nedenfor beskriver hver konfigurationsdefinition.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

52/174

Overview

Tabel – Definerer konfiguration for USB-enhedsleverandør

Konfigurationsnavn

Beskrivelse

Standardværdi

SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Antal klasseinstanser, du vil allokere via et kald til funktionen sl_usbd_vendor_create_instance().

SL_USBD_VENDOR_CONFIGURATION_QUANTITY Antal konfigurationer. Leverandørklasseinstanser kan føjes til en eller flere konfigurationer via et kald til funktionen sl_usbd_vendor_add_to_configuration().

Konfigurationer af USB-enhedsleverandørklasseinstanser

Dette afsnit definerer de konfigurationer, der er relateret til Vendor-klasseinstanserne.
Oprettelse af klasseinstans intr_en interval p_vendor_callbacks
Oprettelse af klasseinstans

Oprettelse af en Vendor-klasseinstans gøres ved at kalde funktionen sl_usbd_vendor_create_instance(), som tager tre konfigurationsargumenter, der er beskrevet nedenfor.

intr_en
Boolean, der angiver, om et par afbrydelsesendepunkter skal tilføjes eller ej.

Værdi
sandt falsk

Beskrivelse
Et par IN/OUT-slutpunkter vil blive tilføjet og gjort tilgængelige for den integrerede applikation. Der vil ikke blive tilføjet noget afbrydelsesslutpunkt. Kun et par Bulk IN/OUT-slutpunkter vil være tilgængelige.

interval
Hvis du sætter intr_en til true, kan du angive pollingintervallet for afbrydelsesslutpunkterne (i millisekunder). Hvis du sætter intr_en til false, kan du sætte interval til 0, da det vil blive ignoreret af klassen.
p_vendor_callbacks
p_vendor_callbacks er en pointer til en callback-funktionsstrukturvariabel, som du kan angive til at håndtere klassespecifikke kontrolanmodninger. Hvis du ikke bruger nogen klassespecifikke anmodninger eller har brug for at aktivere/deaktivere notifikationer, kan du indstille denne til NULL.
EksampFilen nedenfor viser den forventede signatur fra din klassespecifikke anmodningsbehandler.
Example – Signatur af klassespecifik anmodningsfunktion

void app_usbd_vendor_req_handle(uint8_t)

klassenummer, (1)

konstant 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) Leverandørklasseinstansnummer.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

53/174

Overview

(2) Pointer til en modtaget opsætningsanmodning fra værten.
USB-enhedsleverandørklasseprogrammeringsvejledning
Dette afsnit forklarer, hvordan du bruger Vendor-klassen. Initialisering af USB-enhedsleverandørklassen Tilføjelse af en USB-enhedsleverandørklasseinstans til din enhed Kommunikation ved hjælp af USB-enhedsleverandørklassen
Initialisering af USB-enhedsleverandørklassen
For at tilføje en leverandørklassefunktionalitet til din enhed skal du først initialisere klassen ved at kalde funktionen USBD_Vendor_Init().ampNedenstående viser, hvordan man kalder sl_usbd_vendor_init().
Example – Kalder sl_usbd_vendor_init()

sl_status_t status;
status = sl_usbd_vendor_init(); if (status !SL_STATUS_OK) { /* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */ }
Tilføjelse af en USB-enhedsleverandørklasseinstans til din enhed
For at tilføje leverandørklassefunktionalitet til din enhed skal du først oprette en instans og derefter føje den til din enheds konfiguration(er).
Oprettelse af en leverandørklasseinstans Tilføjelse af leverandørklasseinstansen til din enheds konfiguration(er)
Oprettelse af en leverandørklasseinstans
Opret en Vendor-klasseinstans ved at kalde funktionen sl_usbd_vendor_create_instance().ampFiguren nedenfor viser, hvordan man kalder sl_usbd_vendor_create_instance() ved hjælp af standardargumenter. For mere information om de konfigurationsargumenter, der skal sendes til sl_usbd_vendor_create_instance(), se Konfigurationer af USB-enhedsleverandørklasseinstanser.
Example – Kalder sl_usbd_vendor_create_instance()

uint8_t klasse_nr; sl_status_t status;

status = sl_usbd_vendor_create_instance(false,

(1)

0u,

(2)

app_usbd_vendor_callback_functions, (3)

&klassenummer);

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

(1) Ingen Interrupt-slutpunkter med denne klasseinstans. (2) Interval ignoreres, da Interrupt-slutpunkter er deaktiveret.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

54/174

Overview

(3) Tilbagekaldsfunktion, der er en del af din applikation, der håndterer leverandørspecifikke klasseanmodninger. Se Kommunikation ved hjælp af USB-enhedsleverandørklassen for at få flere oplysninger. Tilføjelse af leverandørklasseinstansen til din enheds konfiguration(er) Når du har oprettet en leverandørklasseinstans, kan du føje den til en konfiguration ved at kalde funktionen USBD_Vendor_ConfigAdd(). Eks.ampFilen nedenfor viser, hvordan man kalder sl_usbd_vendor_add_to_configuration() ved hjælp af standardargumenter.
Example – Kalder sl_usbd_vendor_add_to_configuration()

sl_status_t status;

status = sl_usbd_vendor_add_to_configuration(klassenummer,

(1)

config_nbr_fs);

(2)

hvis (status ! SL_STATUS_OK) {

/* Der opstod en fejl. Fejlhåndtering bør tilføjes her. */

}

(1) Klassenummer, der skal føjes til den konfiguration, der returneres af sl_usbd_vendor_create_instance(). (2) Konfigurationsnummer (her tilføjes det til en Full-Speed-konfiguration).
Kommunikation ved hjælp af USB-enhedsleverandørklassen
Generel Synkron kommunikation Asynkron kommunikation Leverandøranmodning Generelt Leverandør-klassen tilbyder følgende funktioner til at kommunikere med værten. For flere detaljer om funktionens parametre, se USB-enhedsleverandør-API.
Tabel – Oversigt over leverandørkommunikations-API

Funktionsnavn
sl_usb d _v e nd o r_ read ad _b ulk_sy nc() sl_usb d _v e nd o r_ write _b ulk_sy nc() sl_usb d _v e nd o r_ read ad _b ulk_asy nc() sl_usb d _v e nd o r_ read ad _inter rrup t_sy nc() sl_usb d _v e nd o r_ read ad _inter rrup t_sy nc() sl_usb d _v e nd o r_ read ad _inter rrup t_asy nc
()
sl_usb d _v e nd o r_write _inte rrup t_asy nc
()

Operation Receives data from host through bulk OUT endpoint. This function is blocking. Sends data to host through bulk IN endpoint. This function is blocking. Receives data from host through bulk OUT endpoint. This function is non-blocking. Sends data to host through bulk IN endpoint. This function is non-blocking. Receives data from host through interrupt OUT endpoint. This function is blocking. Sends data to host through interrupt IN endpoint. This function is blocking. Receives data from host through interrupt OUT endpoint. This function is non-
blokering.
Sends data to host through interrupt IN endpoint. This function is non-blocking.

The vendor requests are also another way to communicate with the host. When managing vendor requests sent by the host, the application can receive or send data from or to the host using the control endpoint; you will need to provide an application callback passed as a parameter of sl_usbd_vendor_create_instance() . Synchronous Communication

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

55/174

Overview

Synchronous communication means that the transfer is blocking. When a function is called, the application blocks until the transfer completes with or without an error. A timeout can be specified to avoid waiting forever. The example below shows a read and write that receives data from the host using the bulk OUT endpoint and sends data to the host using the bulk IN endpoint.
Example – Synchronous Bulk Read and Write

__ALIGNED(4) uint8_t rx_buf[2];

__ALIGNED(4) uint8_t tx_buf[2];

uint32_t

xfer_len;

sl_status_t

status;

status = sl_usbd_vendor_read_bulk_sync(class_nbr,

(1)

(void *)&rx_buf[0],

(2)

2u,

0u,

(3)

&xfer_len);

hvis (status ! SL_STATUS_OK) {

/* $$$$ Håndter fejlen. */

}

status = sl_usbd_vendor_write_bulk_sync( class_nbr,

(1)

(void *)&tx_buf[0],

(4)

2u,

0u,

(3)

false,

(5)

&xfer_len);

hvis (status ! SL_STATUS_OK) {

/* $$$$ Håndter fejlen. */

}

(1) The class instance number created with sl_usbd_vendor_create_instance() provides an internal reference to the Vendor class to route the transfer to the proper bulk OUT or IN endpoint.
(2) The application must ensure that the buffer provided to the function is large enough to accommodate all the data. Otherwise, synchronization issues might happen.
(3) In order to avoid an infinite blocking situation, a timeout expressed in milliseconds can be specified. A value of 809 makes the application task wait forever.
(4) Applikationen leverer den initialiserede transmissionsbuffer.
(5) If this flag is set to true , and the transfer length is multiple of the endpoint maximum packet size, the device stack will send a zero-length packet to the host to signal the end of the transfer.
The use of interrupt endpoint communication functions, sl_usbd_vendor_read_interrupt_sync() and sl_usbd_vendor_write_interrupt_sync() , is similar to bulk endpoint communication functions presented in Example – Synchronous Bulk Read and Write.
Asynkron kommunikation
Asynchronous communication means that the transfer is non-blocking. When a function is called, the application passes the transfer information to the device stack and does not block. Other application processing can be done while the transfer is in progress over the USB bus. Once the transfer has completed, a callback function is called by the device stack to inform the application about the transfer completion. The example below shows asynchronous read and write.
Example – Asynchronous Bulk Read and Write

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

56/174

Overview

void app_usbd_vendor_comm (uint8_t class_nbr)

{

__ALIGNED(4) uint8_t rx_buf[2];

__ALIGNED(4) uint8_t tx_buf[2];

sl_status_t

status;

status = sl_usbd_vendor_read_bulk_async(class_nbr,

(void *)&rx_buf[0],

(2)

2u,

app_usbd_vendor_rx_completed,

NULL);

(4)

hvis (status ! SL_STATUS_OK) {

/* $$$$ Håndter fejlen. */

}

status = sl_usbd_vendor_write_bulk_async(class_nbr,

(void *)&tx_buf[0],

(5)

2u,

app_usbd_vendor_tx_completed,

NUL,

(4)

false);

(6)

hvis (status ! SL_STATUS_OK) {

/* $$$$ Håndter fejlen. */

}

}

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

static void app_usbd_vendor_rx_completed(uint8_t class_nbr,

(3)

void *p_buf,

uint32_t buf_len,

uint32_t xfer_len,

void *p_callback_arg,

sl_status_t status)

{

hvis (status ! SL_STATUS_OK) {

/* $$$$ Do some processing. */

} andet {

/* $$$$ Håndter fejlen. */

}

}

static void app_usbd_vendor_tx_completed(uint8_t class_nbr,

(3)

void *p_buf,

uint32_t buf_len,

uint32_t xfer_len,

void *p_callback_arg,

sl_status_t status)

{

hvis (status ! SL_STATUS_OK) {

/* $$$$ Do some processing. */

} andet {

/* $$$$ Håndter fejlen. */

}

}

(1) The class instance number provides an internal reference to the Vendor class to route the transfer to the proper bulk OUT or IN endpoint. (2) The application must ensure that the buffer provided is large enough to accommodate all the data. Otherwise, there may be synchronization issues. (3) The application provides a callback function pointer passed as a parameter. Upon completion of the transfer, the device stack calls this callback function so that the application can finalize the transfer by analyzing the transfer result. For instance, on completion of a read operation, the application might perform processing on the received data. Upon write completion, the application can indicate if the write was successful and how many bytes were sent.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

57/174

Overview
(4) An argument associated with the callback can be also passed. Then in the callback context, some private information can be retrieved. (5) The application provides the initialized transmit buffer. (6) If this flag is set to true , and the transfer length is a multiple of the endpoint maximum packet size, the device stack will send a zero-length packet to the host to signal the end of transfer. The use of interrupt endpoint communication functions, sl_usbd_vendor_read_interrupt_async() and sl_usbd_vendor_write_interrupt_async() , is similar to the bulk endpoint communication functions presented in Example Asynchronous Bulk Read and Write.
Vendor Request
The USB 2.0 specification defines three types of requests: standard, class, and vendor. All standard requests are handled directly by the core layer, while class requests are managed by the proper associated class. Vendor requests can be processed by the vendor class. To process vendor requests, you must provide an application callback as a parameter of sl_usbd_vendor_create_instance() . After a vendor request is received by the USB device, it must be decoded properly. The example below shows vendor request decoding. Certain requests may be required to receive from or send to the host during the data stage of a control transfer. If no data stage is present, you only have to decode the Setup packet. This example shows the three types of data stage management: no data, data OUT and data IN.
Example – Vendor Request Decoding

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

58/174

Overview

#define APP_VENDOR_REQ_NO_DATA

0x01u

#define APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST 0x02u

#define APP_VENDOR_REQ_SEND_DATA_TO_HOST 0x03u

#define APP_VENDOR_REQ_DATA_BUF_SIZE

50u

static uint8_t app_vendor_req_buf[APP_VENDOR_REQ_DATA_BUF_SIZE];

static bool app_usbd_vendor_req (uint8_t

class_nbr,

const sl_usbd_setup_req_t *p_setup_req)

(1)

{

bool valid;

sl_status_t status;

uint16_t req_len;

uint32_t xfer_len;

(void)class_nbr;

switch(p_setup_req->bRequest) { case APP_VENDOR_REQ_NO_DATA: valid = true; break;

(2) (3)

case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:

(4)

req_len = p_setup_req->wLength;

if (req_len > APP_VENDOR_REQ_DATA_BUF_SIZE) {

// Not enough room to receive data.

return (false);

}

// Receive data via Control OUT EP. // Wait transfer completion forever. status = sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, &xfer_len); if (status ! SL_STATUS_OK) { valid = false; } else { valid = true; } break;

case APP_VENDOR_REQ_SEND_DATA_TO_HOST:

(5)

req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;

// Fill buf with a pattern. Mem_Set((void *)&AppVendorReqBuf[0u],
'EN',
req_len);

// Send data via Control IN EP. // Wait transfer completion forever. status = sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len, 0u, false, &xfer_len); if (status ! SL_STATUS_OK) { valid = DEF_FAIL; } else { valid = DEF_OK; } break;

misligholdelse:

(6)

// Request is not supported.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

59/174

Overview

valid =true;break;
case APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST:(4) req_len = p_setup_req->wLength;if(req_len > APP_VENDOR_REQ_DATA_BUF_SIZE){// Not enough room to receive data.return(false);}// Receive data via Control OUT EP.// Wait transfer completion forever. status =sl_usbd_core_read_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,&xfer_len);if(status ! SL_STATUS_OK){ valid =false;}else{ valid =true;}break;
case APP_VENDOR_REQ_SEND_DATA_TO_HOST:(5) req_len = APP_VENDOR_REQ_DATA_BUF_SIZE;// Fill buf with a pattern.Mem_Set((void *)&AppVendorReqBuf[0u],’A’,
req_len);// Send data via Control IN EP.// Wait transfer completion forever. status =sl_usbd_core_write_control_sync((void *)&app_vendor_req_buf[0u],
req_len,0u,false,&xfer_len);if(status ! SL_STATUS_OK){ valid = DEF_FAIL;}else{ valid = DEF_OK;}break;
default:(6)// Request is not supported. valid = DEF_FAIL;break;}return(valid);}

(1) The core will pass the Setup packet content to your application. The structure sl_usbd_setup_req_t contains the same fields as defined by the USB 2.0 specification (refer to section “9.3 USB Device Requests” of the specification for more details):

typedef struct {

uint8_t bmRequestType; /* Characteristics of request.

*/

uint8_t bRequest; /* Specific request.

*/

uint16_t wValue; /* Varies according to request.

*/

uint16_t wIndex; /* Varies according to request; typically used as index.*/

uint16_t wLength; /* Transfer length if data stage til stede.

*/

} sl_usbd_setup_req_t;

(2) Determine the request. You may use a switch statement if you are using different requests. In this example, there are three different requests corresponding to the three types of the data stage: APP_VENDOR_REQ_NO_DATA, APP_VENDOR_REQ_RECEIVE_DATA_FROM_HOST, and APP_VENDOR_REQ_SEND_DATA_TO_HOST.
(3) If no data stage is present, you only need to decode the other fields. The presence of a data stage or not is indicated by the field wLength being non-null or null.
(4) If the host sends data to the device, you must call the function sl_usbd_core_read_control_sync() . The buffer provided should be able to contain up to wLength bytes. If any error occurs, return false to the core that will stall the status stage of the control transfer, indicating to the host that the request cannot be processed. true is returned in case of success.
(5) If the host receives data from the device, you must call the function sl_usbd_core_write_control_sync() . If any error occurs, return false to the core that will stall the status stage of the control transfer, indicating to the host that the request cannot be processed. true is returned in case of success.
(6) In this example, all requests not recognized are marked by returning false to the core. This one will stall the data or status stage of the control transfer indicating to the host that the request is not supported.
The host sends vendor requests through a host vendor application. USb libraries, such as libusb, can be used to help you develop your custom host vendor application.

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

60/174

API dokumentation
API dokumentation
API dokumentation
Liste over moduler
USB Device API USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API

Beskrivelse
USB Device API USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

61/174

USB Device API
USB Device API
USB Device API
USB Device API.
Moduler
USB Device ACM API USB Device CDC API USB Device Core API USB Device HID API USB Device MSC API USB Device MSC SCSI API USB Device Vendor API

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

62/174

USB Device ACM API

USB Device ACM API

USB Device ACM API

USB Device CDC ACM API.
Moduler
a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t
Funktioner

sl_status_t sl_status_t
sl_status_t sl_status_t sl_status_t
sl_status_t
sl_status_t
sl_status_t
sl_status_t sl_status_t sl_status_t sl_status_t sl_status_t

a sl_usbd_cdc_ cm_init(void)
GLOBAL VARIABLES.
ssll__uussbbdd__ccddcc__aaccmm__ccraellabtaec_kins_stta*npc_ea(cumin_tc1a6l_lbtalicnkes_,sutaintte8__int t*eprv_saul,bucinlats1s6__nt bcra)ll_mgmt_capabilities,
Add a new instance of the CDC ACM serial emulation subclass.
a a a a sl_usbd_cdc_ cm_ dd_to_configur tion(uint8_t subcl ss_nbr, uint8_t config_nbr)
Add a CDC ACM subclass class instance into USB device configuration.
a a sl_usbd_cdc_ cm_is_en bled(uint8_t subclass_nbr, bool *p_enabled)
Get the CDC ACM serial emulation subclass enable state.
a a a sl_usbd_cdc_ cm_re d(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t timeout, uint32_t
*p_xfer_len) Receive data on the CDC ACM serial emulation subclass.
a a a a sl_usbd_cdc_ cm_re d_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, a a a a sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_ rg)
Receive data on the CDC ACM serial emulation subclass asynchronously.
a a sl_usbd_cdc_ cm_write(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, uint16_t timeout, uint32_t
*p_xfer_len) Send data on the CDC ACM serial emulation subclass.
a a a sl_usbd_cdc_ cm_write_ sync(uint8_t subcl ss_nbr, uint8_t *p_buf, uint32_t buf_len, a a a a sl_usbd_cdc_ sync_function_t sync_fnct, void *p_ sync_ rg)
Send data on the CDC ACM serial emulation subclass asynchronously.
a a a sl_usbd_cdc_ cm_get_line_control_st te(uint8_t subcl ss_nbr, uint8_t *p_line_ctrl)
Return the state of control lines.
a a a sl_usbd_cdc_ cm_get_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Get the current state of the line coding.
a a a sl_usbd_cdc_ cm_set_line_coding(uint8_t subcl ss_nbr, sl_usbd_cdc_ cm_line_coding_t *p_line_coding)
Set a new line coding.
a a a sl_usbd_cdc_ cm_set_line_st te_event(uint8_t subcl ss_nbr, uint8_t events)
Set a line state event(s).
a a a a sl_usbd_cdc_ cm_cle r_line_st te_event(uint8_t subcl ss_nbr, uint8_t events)
Clear a line state event(s).

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

63/174

USB Device ACM API
Makroer
#define SL_USBD_CDC_ACM_NBR_NONE 255u
MODUL.
#define SL_USBD_CDC_ACM_PARITY_NONE 0u
PORT SETTINGS DEFINES.
#define SL_USBD_CDC_ACM_PARITY_ODD 1u #define SL_USBD_CDC_ACM_PARITY_EVEN 2u #define SL_USBD_CDC_ACM_PARITY_MARK 3u #define SL_USBD_CDC_ACM_PARITY_SPACE 4u #define SL_USBD_CDC_ACM_STOP_BIT_1 0u #define SL_USBD_CDC_ACM_STOP_BIT_1_5 1u #define SL_USBD_CDC_ACM_STOP_BIT_2 2u #define SL_USBD_CDC_ACM_CTRL_BREAK 0 01u
LINE EVENTS FLAGS DEFINES.
#define SL_USBD_CDC_ACM_CTRL_RTS 0 02u #define SL_USBD_CDC_ACM_CTRL_DTR 0 04u #define SL_USBD_CDC_ACM_STATE_DCD 0 01u #define SL_USBD_CDC_ACM_STATE_DSR 0 02u #define SL_USBD_CDC_ACM_STATE_BREAK 0 04u #define SL_USBD_CDC_ACM_STATE_RING 0 08u #define SL_USBD_CDC_ACM_STATE_FRAMING 0 10u #define SL_USBD_CDC_ACM_STATE_PARITY 0 20u #define SL_USBD_CDC_ACM_STATE_OVERUN 0 40u #define SL_USBD_CDC_ACM_CALL_MGMT_DEV 0 01u
CALL MANAGEMENT CAPABILITIES.
#define SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI 0 02u #define SL_USBD_CDC_ACM_CALL_MGMT_DATA_OVER_DCI 0 02u | 0 01u)
Function Documentation
sl_usbd_cdc_acm_init
sl_status_t sl_usbd_cdc_acm_init (void )
GLOBAL VARIABLES. Parameters
Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

64/174

USB Device ACM API

Type
ugyldig

Direction N/A

Argument Name

MACROS GLOBAL CONSTANTS FUNCTION PROTOTYPES CDC ACM FUNCTIONS

Initialize the CDC ACM serial emulation subclass.
Returnerer

Returns SL_STATUS_OK on success or another SL_STATUS code on failure.

Beskrivelse

sl_usbd_cdc_acm_create_instance

sl_status_t sl_usbd_cdc_acm_create_instance (uint16_t line_state_interval, uint16_t call_mgmt_capabilities, sl_usbd_cdc_acm_callbacks_t * p_acm_callbacks, uint8_t * p_subclass_nbr)

Add a new instance of the CDC ACM serial emulation subclass.
Parametre

Type
uint16_t
uint16_t

Direction Argument Name

Beskrivelse

N/A

line_state_interval Line state notification interval in milliseconds (value must

be a power of 2).

N/A

call_mgmt_capabilities Call Management Capabilities bitmap. OR’ed of the

following flags:

SL_USBD_CDC_ACM_CALL_MGMT_DEV Device handles call management itself. SL_USBD_CDC_ACM_CALL_MGMT_DATA_CCI_DCI Device can send/receive call management information over a Data Class interface.

sl_usbd_cdc_acm_callbacks_t N/A
*

uint8_t *

N/A

p_acm_callbacks p_subclass_nbr

Optional pointers to callback functions to be called on various events.
Param to variable that will receive CDC ACM serial emulation subclass instance number.

Returnerer

Return SL_STATUS_OK on success or another SL_STATUS code on failure.

sl_usbd_cdc_acm_add_to_configuration

sl_status_t sl_usbd_cdc_acm_add_to_configuration (uint8_t subclass_nbr, uint8_t config_nbr)

Add a CDC ACM subclass class instance into USB device configuration.
Parametre

Type
uint8_t uint8_t

Direction N/A N/A

Argument Name
subclass_nbr config_nbr

Description CDC ACM serial emulation subclass instance number. Configuration index to add new test class interface to.

Returnerer

Copyright © 2025 Silicon Laboratories. Alle rettigheder forbeholdes.

65/174

USB Device ACM API
Returns SL_STATUS_OK on success or another SL_STATUS code on failure.

sl_usbd_cdc_acm_is_enabled

sl_status_t sl_usbd_cdc_acm_is_enabled (uint8_t subclass_nbr, bool * p_enabled)

Get the CDC ACM serial emulation subclass enable state.
Parametre

Type

Retning

Argument Name

Beskrivelse

uint8_t N/A

subclass_nbr CDC ACM serial emulation subclass instance number.

bool * N/A

p_enabled

Boolean to a variable that will receive enable status. The variable is set to true, CDC ACM serial emulation is enabled. The va

Dokumenter/ressourcer

SILICON LABS USB Device Stack [pdf] Brugsanvisning
USB Device Stack, Device Stack, Stack

Referencer

Efterlad en kommentar

Din e-mailadresse vil ikke blive offentliggjort. Påkrævede felter er markeret *