USB-enhetsstabel
Spesifikasjoner
- USB-versjon: 1.5.1
- Utgivelsesdato: 21. juli 2025
- Simplicity SDK-versjon: 2025.6.1
Produkt overview
USB-enhetsstakken fra Silicon Labs gir allsidig og
brukervennlig USB-tilkobling for IoT-prosjekter, noe som forenkler
kommunikasjon mellom nettverkskoprosessorer og verter.
Funksjoner
- Effektiv USB-enhetsstabel
- Ideell for IoT-prosjekter
- Støtte for kommunikasjon mellom nettverks-medprosessorer og
verter
Produktbruksinstruksjoner
Konfigurasjon av USB-enhet
Konfigurer USB-enhetsinnstillingene i henhold til prosjektet ditt
kravene ved å se i avsnittet om USB-enhetskonfigurasjon
i dokumentasjonen.
Programmeringsveiledning for USB-enheter
Følg programmeringsveiledningen for USB-enheter for å forstå hvordan du
programmere og samhandle med USB-enheten for forskjellige formål
applikasjoner.
USB-enhetsklasser
Seksjonen USB-enhetsklasser gir en oversikt overview av forskjellige
klasser som CDC ACM, HID, MSC SCSI og leverandørklasse. Velg
passende klasse basert på enhetens funksjonalitet.
Feilsøking av USB-enheter
Hvis du støter på problemer med USB-enheten, kan du se
Feilsøkingsseksjon for USB-enheter for løsninger og feilsøking
tips.
Microsoft Windows OS USB-vert
Hvis du bruker USB-enheten med et Microsoft Windows OS USB
Vert, sørg for å følge retningslinjene i
dokumentasjon for sømløs integrasjon.
FAQ
Spørsmål: Hva er noen vanlige eksampfærre enheter jeg kan bygge med
denne USB-stakken?
A: USB-stakken lar deg bygge enheter som
USB-til-seriell-adaptere, mus eller tastaturer, flyttbar lagring
enheter og tilpassede enheter.
Spørsmål: Finnes det noen spesifikke programvarekrav for å bruke dette
USB-enhetsstabel?
A: Kompatibel programvare inkluderer Simplicity SDK, Simplicity
Studio, Simplicity Commander, GCC (GNU Compiler Collection),
IAR innebygd arbeidsbenk for ARM og IAR EWARM.
Universal Serial Bus USB
Universal Serial Bus USB
USB-overgangview Overview
Utgivelsesnotater USB
Spesifikasjoner og funksjoner overview
USB-enhetskonfigurasjon overview
Programmeringsveiledning for USB-enheter overview
USB-enhetsklasser overview CDC ACM-klassen er overview HID-klasse overview MSC SCSI-klasse overview Leverandørklasse overview
USB API API-dokumentasjon USB-enhet API USB-enhet ACM API a sl_usbd_cdc_ cm_line_coding_t sl_usbd_cdc_acm_callbacks_t USB-enhet CDC API a sl_usbd_cdc_subcl ss_driver_t USB-enhetskjerne API
sl_usbd_device_config_t sl_usbd_setup_req_t
en sl_usbd_cl ss_driver_t USB-enhet HID API
sl_usbd_hid_callbacks_t USB-enhet MSC API
en sl_usbd_msc_subcl ss_driver_t USB-enhet MSC SCSI API
sl_usbd_msc_scsi_callbacks_t
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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-enhetsleverandør-API sl_usbd_vendor_callbacks_t
API-dokumentasjon Feilsøking av USB-enheter
Overview Microsoft Windows OS USB-vert
Overview
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
2/174
Overview
Overview
USB-enhet
USB er et av de mest vellykkede kommunikasjonsgrensesnittene i datasystemenes historie og er de facto-standarden for tilkobling av datamaskinens periferiutstyr. Silicon Labs USB Device Stack er en USB-enhetsmodul som er spesielt utviklet for innebygde systemer. Bygget fra grunnen av med Silicon Labs' kvalitet, skalerbarhet og pålitelighet, har den gjennomgått en streng valideringsprosess for å overholde USB 2.0-spesifikasjonen. Denne dokumentasjonen beskriver hvordan du initialiserer, starter og bruker Silicon Labs USB Device Stack. Den forklarer de ulike konfigurasjonsverdiene og bruken av dem. Den inneholder også en oversikt over...view av teknologien, typer konfigurasjonsmuligheter, implementeringsprosedyrer og f.eks.ampmindre typisk bruk for alle tilgjengelige klasser.
For å hjelpe deg med å forstå USB-konseptene raskt, inneholder dokumentasjonen mange eksemplerampUSB-kort med grunnleggende funksjoner. Disse eksempleneamples vil gi deg et rammeverk som lar deg bygge enheter raskt. Disse eks.amples inkluderer:
USB-til-seriell-adapter (kommunikasjonsenhetsklasse) Mus eller tastatur (Human Interface Device-klasse) Flyttbar lagringsenhet (masselagringsklasse) Tilpasset enhet (leverandørklasse)
Følgende er overview av dokumentasjonsdelene:
Spesifikasjoner og funksjoner Konfigurasjon av USB-enhet Programmeringsveiledning for USB-enhet Klasser av USB-enhet
CDC ACM-klasse HID-klasse MSC SCSI-klasse Leverandørklasse Feilsøking av USB-enhet Microsoft Windows OS USB-vert
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
3/174
USB
USB
USB-versjon 1.5.1 21. juli 2025 – Utgivelsesmerknader
Simplicity SDK-versjon 2025.6.1
Silicon Labs' effektive USB-enhetsstabel tilbyr allsidig og brukervennlig USB-tilkobling som er ideell for IoT-prosjekter, inkludert kommunikasjon mellom nettverkskoprosessorer og verter. Klikk her for tidligere utgivelser.
Slipp sammendrag
Viktige funksjoner | API-endringer | Feilrettinger | Chipaktivering
Nøkkelfunksjoner
Kun underliggende plattformendringer.
API-endringer
Ingen.
Feilrettinger
Ingen.
Chipaktivering
Ingen.
Nøkkelfunksjoner
Nye funksjoner | Forbedringer | Fjernede funksjoner | Utdaterte funksjoner
Nye funksjoner
Ingen.
Forbedringer
Kun underliggende plattformendringer.
Fjernede funksjoner
Ingen.
Utfasede funksjoner
Ingen.
API-endringer
Nye API-er | Endrede API-er | Fjernede API-er | Utdaterte API-er
Nye APIer
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
4/174
USB
Ingen.
Modifiserte API-er
Ingen.
Fjernede API-er
Ingen.
Utdaterte API-er
Ingen.
Feilrettinger
Ingen.
Chipaktivering
Ingen.
Søknad EksampEndringene
Ny eksamples | Modifisert Eksamples | Fjernet Eksamples | Utdatert Examples
Ny eksamples
Ingen.
Modifisert eksamples
Ingen.
Fjernet eksamples
Ingen.
Utdatert eks.amples
Ingen.
Virkningen av endringer i utgivelsen
Konsekvensuttalelser | Migreringsveiledning
Konsekvensuttalelser
Ingen.
migrasjonsguide
Ingen.
Kjente problemer og begrensninger
Ingen.
Bruker denne utgivelsen
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
5/174
USB
Hva er i utgivelsen? | Kompatibel programvare | Installasjon og bruk | Hjelp og tilbakemeldinger
Hva er i utgivelsen?
USB-enhetsstabelapplikasjon Eks.amples
Kompatibel programvare
Programvare
Simplicity SDK Simplicity Studio Simplicity Commander GCC (GNU Compiler Collection) IAR Embedded Workbench for ARM IAR EWARM
Kompatibel versjon eller variant
2025.6.0 5.11.0 1.18.2 (følger med Simplicity Studio) 12.2.1 (følger med Simplicity Studio) 9.40.1 (følger med Simplicity Studio)
Installasjon og bruk
For å kickstarte utviklingen din, se vår:
Programmeringsveiledning for USB-enheter. API-dokumentasjon.
Hvis du vil ha informasjon om integrering av sikkert hvelv, kan du se Sikkert hvelv.
Til review Varsler om sikkerhet og programvarerådgivning og administrer varslingsinnstillingene dine:
ò Gå til https://community.silabs.com/. ò Logg inn med kontoinformasjonen din. ò Klikk på profile ikonet øverst til høyre på siden.
õ Velg Varsler fra rullegardinmenyen. ö I Varsler-delen går du til fanen Mine produktvarsler for åview historisk sikkerhets- og programvarerådgivning
varsler
÷ For å administrere preferansene dine, bruk fanen Administrer varsler for å tilpasse hvilke produktoppdateringer og råd du
motta.
For anbefalte konfigurasjonsinnstillinger, se her.
For å lære mer om programvaren i denne utgivelsen, kan du dykke ned i vår online dokumentasjon.
Hjelp og tilbakemeldinger
Kontakt Silicon Labs kundestøtte. For å bruke verktøyet vårt «Spør AI» for å få svar, se søkefeltet øverst på denne siden.
Merk: Ask AI er eksperimentelt.
Få hjelp fra utviklerfellesskapet vårt.
Retningslinjer for utgivelse og vedlikehold av SDK
Se våre retningslinjer for SDK-utgivelse og vedlikehold.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
6/174
Overview
Overview
Spesifikasjoner
Samsvarer med «Universal Serial Bus specification revision 2.0» Implementerer «Interface Association Descriptor Engineering Change Notice (ECN)» Overføringstyper
Kontroll Bulk Interrupt USB-klasser Kommunikasjonsenhetsklasse (CDC) Abstrakt kontrollmodell (ACM) Menneskelig grensesnittsenhet (HID) Masselagringsklasse (MSC) Leverandørspesifikt klasserammeverk
Funksjoner
Skalerbar for kun å inkludere nødvendige funksjoner for å minimere minneavtrykk Støtter fullhastighets (12 Mbit/s) Støtter komposittenheter (multifunksjonsenheter) Støtter enheter med flere konfigurasjoner Støtter USB-strømsparingsfunksjoner (enhetssuspendering og gjenopptak) Fullstendig integrering av Mass Storage Class i Micrium OS File Systemmodul utviklet med CMSIS-RTOS2 abstraksjonslag slik at den kan fungere med forskjellige operativsystemer. Silicon Labs GSDK leveres med FreeRTOS- og Micrium OS-porter.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
7/174
Overview
Overview
Konfigurasjon av USB-enhet
Denne delen omhandler hvordan du konfigurerer Silicon Labs USB-enhet. Det finnes tre grupper med konfigurasjonsparametere, som følger:
Kjernekonfigurasjon av USB-enhet Konfigurasjon av USB-enhetsinformasjon Konfigurasjon av USB-enhetsmaskinvare
USB-enhetskjernekonfigurasjon
Silicon Labs USB-enhet kan konfigureres ved kompilering via et sett med #defines som ligger i sl_usbd_core_config.h. fileUSB-enheten bruker #defines når det er mulig fordi de tillater at kode- og datastørrelser skaleres ved kompilering basert på hvilke funksjoner som er aktivert. Dette gjør at skrivebeskyttet minne (ROM) og RAM (random-access memory) til Silicon Labs USB-enheten kan justeres basert på applikasjonens krav.
Anbefalt: Start konfigurasjonsprosessen med standardverdiene (uthevet med fet skrift).
Seksjonene nedenfor er organisert basert på rekkefølgen i malkonfigurasjonen file, sl_usbd_core_config.h.
Kjernekonfigurasjonsklasser Konfigurasjon
Kjernekonfigurasjon
Tabell – Konstanter for USB-enhetskjernekonfigurasjon
Konstantbeskrivelse
Standardverdi
SL_USBD_TA SK_STACK_ STØRRELSE
Konfigurerer stakkstørrelsen i byte av USBD-kjerneoppgaven
4096
SL_USBD_TA SK_PRIORIT Y
Konfigurerer prioriteten til USBD-kjerneoppgaven. Dette er en CMSIS-RTOS2-prioritet.
osPrioritetHøy
SL_USBD_A UTO_START _USB_ENHET E
Hvis aktivert, startes USB-enheten automatisk når kjernen startes og den ene USBD-kjerneoppgaven er planlagt for første gang. Hvis deaktivert, må applikasjonen kalle sl_usbd_core_start_device() når den er klar til å bli oppdaget av USB-verten.
SL_USBD_C Det totale antallet konfigurasjoner som vil bli lagt til via sl_usbd_add_configuration()
1
ONFIGURATI-funksjonen.
PÅ_KVANTITET
TY
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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 totale antallet USB-grensesnitt som skal legges til for alle konfigurasjonene dine. Dette avhenger i stor grad av klassen(e) som brukes. Hvis du vil ha mer informasjon om hvor mange grensesnitt en klasseinstans krever, kan du se avsnittet «Ressursbehov fra kjernen» for klassen(e) din(e).
Det totale antallet alternative USB-grensesnitt som skal legges til for alle konfigurasjonene dine. Dette avhenger i stor grad av klassen(e) som brukes. Denne verdien må alltid være lik eller større enn SL_USBD_INTERFACE_QUANTITY. For mer informasjon om hvor mange alternative grensesnitt en klasseinstans krever, se avsnittet «Ressursbehov fra kjernen» for klassen(e) din(e).
Det totale antallet USB-grensesnittgrupper som legges til for alle konfigurasjonene dine. Dette avhenger i stor grad av klassen(e) som brukes. Hvis du vil ha mer informasjon om hvor mange grensesnittgrupper som krever en klasseinstans, kan du se avsnittet «Ressursbehov fra kjernen» for klassen(e) din(e).
Det totale antallet endepunktsbeskrivelser som legges til for alle konfigurasjonene dine. Dette avhenger i stor grad av klassen(e) som brukes. Hvis du vil ha mer informasjon om hvor mange endepunktsbeskrivelser en klasseinstans krever, kan du se «Antall endepunkter» i delen «Ressursbehov fra kjernen» for klassen(e) din(e). Merk at kontrollendepunktene ikke trenger å vurderes her. Det totale antallet USB-strenger. Hvis du setter antallet til null, deaktiveres funksjonen. Hvis du deaktiverer dette, lagrer ikke enheten noen USB-beskrivelsesstrenger som sendes fra applikasjonen. Dette betyr at verten ikke kan hente beskrivelsesstrengene (for eksempel produsent og produktnavn). Det totale antallet åpnede endepunkter per konfigurasjon. En enhet krever minst to åpnede endepunkter for kontrolloverføringer, men du må også legge til endepunktene for klassen(e) som brukes. Hvis du vil ha mer informasjon om hvor mange åpnede endepunkter en klasseinstans krever, kan du se «Antall endepunkter» i delen «Ressursbehov fra kjernen» for klassen(e) din(e).
Standardverdi
10 10
2
20 30 20
Klassekonfigurasjon
Klasser har spesifikke konfigurasjoner under kompilering. Se USB-enhetsklasser for mer informasjon.
Konfigurasjon av USB-enhetsinformasjon
sl_usbd_device_config.h-konfigurasjonen file omgrupperer kompileringstidspunktet #define-s for å angi grunnleggende informasjon om enheten din, for eksempel leverandør-/produkt-ID, enhetsstrenger osv. Tabellen nedenfor beskriver hver informasjonskonfigurasjonsdefinisjon som er tilgjengelig i denne konfigurasjonen. file.
Tabell – Definerer konfigurasjon av USB-enhetsinformasjon
Konstant
SL_USBD_DEVIC E_VENDOR_ID
SL_USBD_DEVIC E_PRODUCT_ID
Beskrivelse Ditt leverandøridentifikasjonsnummer slik det er levert av USB Implementers Forum. Hvis du vil ha mer informasjon om hvordan du kan få en leverandør-ID, kan du se http://www.usb.org/developers/vendor/. Ditt produktidentifikasjonsnummer.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
9/174
Overview
Konstant
Beskrivelse
SL_USBD_DEVICE_RELEASE Utgivelsesnummeret til enheten din. _NUMBER
SL_USBD_DEVICE_MANUFA Streng som beskriver produsenten av enheten din. Denne konfigurasjonen ignoreres når
CTURER_STRING
konfigurasjonen SL_USBD_STRING_QUANTITY er satt til 0.
SL_USBD_DEVICE_PRODUC Streng som beskriver produktet ditt. Denne konfigurasjonen ignoreres når konfigurasjonen
T_STRING
SL_USBD_STRING_QUANTITY er satt til 0.
SL_USBD_DEVICE_SERIAL_N Streng som inneholder serienummeret til enheten din. Denne konfigurasjonen ignoreres når
UMBER_STRING
konfigurasjonen SL_USBD_STRING_QUANTITY er satt til 0.
SL_USBD_DEVICE_LANGUA Identifikasjonsnummeret til språket i enhetens strenger. Mulige verdier er:
GE_ID
– SL_USBD_LANG_ID_ARABIC_SAUDI_ARABIA
– SL_USBD_LANG_ID_CHINESE_TAIWAN
– SL_USBD_LANG_ID_ENGELSK_US
– SL_USBD_LANG_ID_ENGELSK_UK
– SL_USBD_LANG_ID_FRANSK
– SL_USBD_LANG_ID_TYSK
– SL_USBD_LANG_ID_GREEK
– SL_USBD_LANG_ID_ITALIAN
– SL_USBD_LANG_ID_PORTUGISISK
– SL_USBD_LANG_ID_SANSKRIT
Denne konfigurasjonen ignoreres når konfigurasjonen SL_USBD_STRING_QUANTITY er satt til 0.
Konfigurasjon av USB-enhetsmaskinvare
Avhengig av Silicon Labs-enheten du bruker, vil du muligens ha GPIO-pinnen og -porten for å konfigurere for USB VBUS Sense-signal. Konfigurasjonsdefinisjonene finnes i sl_usbd_hardware_config.h-headeren. file.
Konstant
SL_USBD_DRIVER_VBUS_SENSE_PORT SL_USBD_DRIVER_VBUS_SENSE_PIN
Beskrivelse
GPIO-port for USB VBUS Sense-signalet på kortet ditt. GPIO-pin for USB VBUS Sense-signalet på kortet ditt.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
10/174
Overview
Overview
Programmeringsveiledning for USB-enheter
Denne delen forklarer hvordan du bruker USB-enhetsmodulen.
Førstegangsoppsett av USB-enhetsmodul
Denne delen beskriver de grunnleggende trinnene som kreves for å initialisere USB-enhetsmodulen og for å legge til, klargjøre og starte en enhet. Initialisere USB-enhetsmodulen Initialisere USB-enhetskjernen Initialisere aCl ss(ene) Legge til USB-enheten Bygge USB-enheten Legge til konfigurasjon(er) Legge til USB-funksjon(er) Starte USB-enheten
Hendelseskrokfunksjoner
Initialisering av USB-enhetsmodulen
Initialisere USB-enhetskjernen
a US a Begynn med å initialisere B-enhetsmodulkjernen ved å fylle ut funksjonen sl_usbd_core_init(). Eksemplet nedenfor viser hvordan du fyller ut sl_usbd_core_init().
Example – Kaller sl_usbd_core_init()
sl_status_t status; status = sl_usbd_core_init(); if (status ! SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
Initialisere klassen(e)
Etter at USB-enhetsmodulkjernen er initialisert, må du initialisere hver klasse du har tenkt å bruke. Se avsnittet «Programmeringsveiledning» i tilgangskontrollisten(e) for mer informasjon.
Bygge USB-enheten din
Legge til konfigurasjon(er)
Etter at du har initialisert enheten, kan du begynne å legge til USB-funksjonene på den, og starte med en ny konfigurasjon. En enhet må ha minst én konfigurasjon. For å legge til en eller flere konfigurasjoner, kall funksjonen sl_usbd_core_dd_configuration(). Denne funksjonen må kalles for hver konfigurasjon du vil legge til. Eks.ampLeksjonen nedenfor viser hvordan du legger til en fullhastighetsmodus.
Example – Legge til konfigurasjon(er) på enheten din
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
11/174
Overview
sl_status_t status; uint8_t config_nbr_fs;
/* Legger til en fullhastighetskonfigurasjon på enheten. */
status = sl_usbd_core_add_configuration(0,
/* Ingen spesielle attributter til konfigurasjonen. */
100u,
/* Maks. strømforbruk: 100mA.
*/
SL_USBD_ENHET_HASTIGHET_FULL,
/* Fullhastighetskonfigurasjon.
*/
"Konfigurer Legg til f.eks."amp«Fullhastighetskonfigurasjon»
&config_nbr_fs);
hvis (status ! SL_STATUS_OK) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
Legge til USB-funksjon(er)
Etter at du har lagt til minst én konfigurasjon på enheten din, kan du legge til grensesnittene og endepunktene på enheten. Hver USB-klasse har sine egne behov når det gjelder grensesnitt- og endepunktstype, antall og andre parametere. Silicon Labs USB-enhet legger til grensesnitt og endepunkter i klassene den tilbyr.
Fra applikasjonen din kan du instansiere en USB-klasse og legge den til i en konfigurasjon. Hvis du vil ha mer informasjon om konseptet med USB-enhetsklasseforekomster, kan du se USB-enhetsklasser. Merk at du kan instansiere og legge til mange forskjellige klasseforekomster i en konfigurasjon for å opprette en flerfunksjonsenhet (komposittenhet).
EksampLevel nedenfor viser hvordan du oppretter en klasseinstans og legger den til i en konfigurasjon.
Example – Legge til en klasseinstans på enheten din
sl_status_t status; uint8_t klasse_nbr;
/* Opprett en instans av klassen du vil bruke.*/ /* Merk at denne funksjonen kan ha flere argumenter, avhengig av klassen. */ status = sl_usbd_ _create_instance(&class_nbr); if (status ! SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */ }
/* Legg til klasseinstansen i Full-Speed-konfigurasjonen. */ status = sl_usbd_ _add_to_configuration(class_nbr, /* Klassenummer returnert av sl_usbd_ _opprett_instans. */
config_nbr_fs); /* Konfigurasjonsnummer returnert av sl_usbd_core_add_configuration(). */ if (status ! SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */ }
Starte USB-enheten
Som standard startes enheten automatisk av USB-enhetens kjerneoppgave etter at enhetsinitialiseringen er fullført og kjernen startet. For å kontrollere når enheten startes og blir synlig for USB-verten, bruk konfigurasjonen SL_USBD_AUTO_START_USB_DEVICE for å deaktivere automatisk startfunksjon. Når den er deaktivert, kan du starte enheten etter at du har bygget/forberedt den og gjøre den synlig for USB-verten ved å kalle funksjonen sl_usbd_core_start_device().
EksampLevel nedenfor viser hvordan du starter enheten din ved hjelp av sl_usbd_core_start_device()-funksjonen.
Example – Starte enheten
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
12/174
Overview
sl_status_t status;
status = sl_usbd_core_start_device(); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */ }
Hendelseskrokfunksjoner
USB-enhetskjernemodulen tilbyr to svake hook-funksjoner som du kan omdefinere i applikasjonen din. Hensikten deres er å varsle når buss- og konfigurasjonshendelser oppstår.
Tabell – USB-hendelseskrokfunksjoner
Hendelse
Beskrivelse
Buss
Kalles når USB-busshendelse oppstår
Konfigurasjon kalles når USB-konfigurasjonshendelsen oppstår
Funksjonssignatur
void sl_usbd_on_bus_event(sl_usbd_bus_event_t hendelse); void sl_usbd_on_config_event(sl_usbd_config_event_t hendelse, uint8_t config_nbr);
Example – Event Hook-funksjoner
void sl_usbd_on_bus_event(sl_usbd_bus_event_t hendelse) { switch (hendelse) { case SL_USBD_EVENT_BUS_CONNECT: Slå denne koden uten at den er konfigurert for å koble til en annen tilkobling.
// kalles når USB-kabelen settes inn i en vertskontroller break;
case SL_USBD_EVENT_BUS_DISCONNECT: // kalles når USB-kabelen fjernes fra en vertskontroller break;
case SL_USBD_EVENT_BUS_RESET: // kalles når verten sender reset-kommandoen break;
case SL_USBD_EVENT_BUS_SUSPEND: // kalles når verten sender suspend-kommandoen break;
case SL_USBD_EVENT_BUS_RESUME: // kalles når verten sender en wake up-kommando break;
standard: pause; } }
void sl_usbd_on_config_event(sl_usbd_config_event_t hendelse, uint8_t konfigurasjonsnr) { switch (hendelse) { case SL_USBD_EVENT_CONFIG_SET: Slett *
// kalles når verten setter et konfigurasjonsbrudd;
case SL_USBD_EVENT_CONFIG_UNSET: // kalles når en konfigurasjon er deaktivert break;
standard: pause; } }
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
13/174
Overview
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
14/174
Overview
Overview
USB-enhetsklasser
USB-klassene som er tilgjengelige i Silicon Labs USB Device har noen fellestrekk. Denne delen forklarer disse egenskapene og deres interaksjon med kjernelaget.
For mer informasjon om en bestemt klasse, se følgende:
CDC ACM-klasse HID-klasse MSC SCSI-klasse Leverandørklasse
Om klasseforekomster
USB-klassene som er tilgjengelige i USB Device implementerer konseptet med klasseinstanser. En klasseinstans representerer én funksjon i en enhet. Funksjonen kan beskrives av ett grensesnitt eller av en gruppe grensesnitt og tilhører en bestemt klasse.
Hver USB-klasseimplementering har noen felles konfigurasjoner og funksjoner, basert på konseptet med klasseinstans. De vanlige konfigurasjonene og funksjonene presenteres i tabellen nedenfor. I kolonnetittelen «Konstanter eller funksjon» kan plassholderen XXXX erstattes med navnet på klassen: CDC, HID, MSC, CDC_ACM eller VENDOR (leverandør for funksjonsnavn).
Tabell – Konstanter og funksjoner relatert til konseptet med flere klasseinstanser
Konstant eller funksjon
SL_USBD_XXXX_CL ASS_INS TANCE_QUANTITY
SL_USBD_XXXX_CONFIGURATION_QUANTITY
sl_usb d _XXXX_opprett _instant ()
sl_usbd_XXXX_add_to_conf-informasjon()
Beskrivelse
Konfigurerer maksimalt antall klasseforekomster.
Konfigurerer maksimalt antall konfigurasjoner. Under klasseinitialiseringen vil en opprettet klasseinstans bli lagt til i én eller flere konfigurasjoner. Oppretter en ny klasseinstans.
Legger til en eksisterende klasseinstans i den angitte enhetskonfigurasjonen.
Når det gjelder kodeimplementering, vil klassen deklarere en lokal global variabel som inneholder en klassekontrollstruktur. Denne klassekontrollstrukturen er knyttet til én klasseinstans og vil inneholde spesifikk informasjon for å administrere klasseinstansen.
Figurene nedenfor viser flere tilfeller. Hver figur inneholder et kodeeksempelampsom tilsvarer tilfellet.
Figur – Flere klasseinstanser – FS-enhet (1 konfigurasjon med 1 grensesnitt) representerer en typisk USB-enhet. Enheten er fullhastighets (FS) og inneholder én konfigurasjon. Enhetens funksjon beskrives av ett grensesnitt som består av et par endepunkter for datakommunikasjon. Én klasseinstans opprettes og lar deg administrere hele grensesnittet med det tilhørende endepunktet.
Figur – Flere klasseinstanser – FS-enhet 1-konfigurasjon med 1 grensesnitt)
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
15/174
Overview
Koden som tilsvarer figur – Flere klasseforekomster – FS-enhet (1 konfigurasjon med 1 grensesnitt) vises i eksemplet.ample nedenfor.
Example – Flere klasseinstanser – FS-enhet 1-konfigurasjon med 1 grensesnitt)
sl_status_t status; uint8_t klasse_0;
void app_usbd_XXXX_enable(uint8_t class_nbr) { /* Håndtere klasseaktiveringshendelse. */ }
void app_usbd_XXXX_disable(uint8_t class_nbr) { /* Håndtere hendelsen for deaktivering av klasse. */ }
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 feilen. */
}
status = sl_usbd_XXXX_create_instance(&class_callbacks,
(3)
&klasse_0);
hvis (status ! SL_STATUS_OK) {
/* $$$$ Håndter feilen. */
}
status = sl_usbd_XXXX_add_to_configuration(klasse_0, konfigurasjon_0);
(4)
hvis (status ! SL_STATUS_OK) {
/* $$$$ Håndter feilen. */
}
(1) Hver klasse tilbyr et sett med tilbakekallingsfunksjoner for hendelser med enhetstilkobling/frakobling og for klassespesifikke hendelser. Tilbakekallsstrukturobjektet sendes som argument når klasseinstansen opprettes med sl_usbd_XXXX_create_instance()
funksjon.
(1) Initialiser klassen. Alle interne variabler, strukturer og klasseporter vil bli initialisert. Merk at Init()-funksjonen i noen klasser kan ta andre argumenter.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
16/174
Overview
(2) Opprett klasseinstansen, som er class_0. Funksjonen sl_usbd_XXXX_create_instance() tildeler en klassekontrollstruktur tilknyttet class_0. Avhengig av klassen kan sl_usbd_XXXX_create_instance() ha flere parametere i tillegg til klassenummeret som representerer klassespesifikk informasjon lagret i klassekontrollstrukturen. aaa (3) Legg til klasseinstansen, class_0, til det angitte konfigurasjonsnummeret, config_0. sl_usbd_XXXX_add_to_configuration() vil opprette grensesnitt 0 og dets tilhørende IN- og OUT-endepunkter. Som et resultat omfatter klasseinstansen grensesnitt 0 og dets endepunkter. All kommunikasjon som gjøres på grensesnitt 0 vil bruke klasseinstansnummeret, class_0. Figur – Flere klasseinstanser – FS-enhet (2 konfigurasjoner og flere grensesnitt) representerer et mer komplekst eksempel.ampf.eks. En fullhastighetsenhet består av to konfigurasjoner. Enheten har to funksjoner som tilhører samme klasse, men hver funksjon beskrives av to grensesnitt og har et par toveis endepunkter. I dette eksempletampdvs. to klasseinstanser opprettes. Hver klasseinstans er tilknyttet en gruppe grensesnitt, i motsetning til Figur – Flere klasseinstanser – FS-enhet (1 konfigurasjon med 1 grensesnitt) og Figur – Flere klasseinstanser – FS-enhet (2 konfigurasjoner og flere grensesnitt) der klasseinstansen var tilknyttet et enkelt grensesnitt.
Figur – Flere klasseforekomster – FS-enhet 2-konfigurasjoner og flere grensesnitt)
Koden som tilsvarer figur – Flere klasseforekomster – FS-enhet (2 konfigurasjoner og flere grensesnitt) vises i eksempletampnedenfor. Feilhåndteringen er utelatt for tydelighetens skyld.
Example – Flere klasseinstanser – FS-enhet 2-konfigurasjoner og flere grensesnitt)
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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 klasseporter vil bli initialisert.
(2) Opprett klasseinstansen, class_0. Funksjonen sl_usbd_XXXX_create_instance() tildeler en klassekontrollstruktur tilknyttet class_0.
(3) Opprett klasseinstansen, class_1. Funksjonen sl_usbd_XXXX_create_instance() tildeler en annen klassekontrollstruktur tilknyttet class_1.
(4) Legg til klasseinstansen, class_0, i konfigurasjonen, cfg_0. sl_usbd_XXXX_add_to_configuration() vil opprette grensesnitt 0, grensesnitt 1, alternative grensesnitt og de tilhørende IN- og OUT-endepunktene. Klasseinstansnummeret, class_0, vil bli brukt til all datakommunikasjon på grensesnitt 0 eller grensesnitt 1.
(5) Legg til klasseinstansen, class_1, i konfigurasjonen, cfg_0. sl_usbd_XXXX_add_to_configuration() vil opprette grensesnitt 2, grensesnitt 3 og deres tilhørende IN- og OUT-endepunkter. Klasseinstansnummeret, class_1, vil bli brukt til all datakommunikasjon på grensesnitt 2 eller grensesnitt 3.
(6) Legg til de samme klasseforekomstene, class_0 og class_1, i den andre konfigurasjonen, cfg_1.
Hver klasse definerer en struktur av typen sl_usbd_XXXX_callbacks_t. Hensikten er å gi hver klasse et sett med tilbakekallingsfunksjoner som skal kalles når en hendelse inntreffer. Det finnes to tilbakekallingsfunksjoner i hver klasse. De presenteres i tabellen nedenfor.
Tabell – Vanlige tilbakekallingsfunksjoner i klassen
Felt Beskrivelse .enable Kalles når USB-klasseinstansen er aktivert. .disable Kalles når USB-klasseinstansen er deaktivert.
Funksjonssignatur void app_usbd_XXXX_enable(uint8_t class_nbr); void app_usbd_XXXX_disable(uint8_t class_nbr);
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
18/174
Overview
Overview
USB-enhet CDC ACM-klasse
USB-enhet CDC-baseklasse overview USB-enhet CDC ACM-klasse Ressursbehov fra kjerne USB-enhet CDC ACM-underklasse overview Konfigurasjon av USB-enhet CDC ACM-klasse Programmeringsveiledning for USB-enhet CDC ACM-klasse
Denne delen beskriver CDC-klassen (Communications Device Class) og den tilhørende CDC-underklassen som støttes av Silicon Labs' USB-enhetsstabel. Silicon Labs USB-enhet støtter for tiden ACM-underklassen (Abstract Control Model), som ofte brukes til seriell emulering.
CDC omfatter diverse telekommunikasjons- og nettverksenheter. Telekommunikasjonsenheter omfatter analoge modemer, analoge og digitale telefoner, ISDN-terminaladaptere osv. For eksempelampNettverksenheter inneholder ADSL- og kabelmodemer, Ethernet-adaptere og huber. CDC definerer et rammeverk for å innkapsle eksisterende standarder for kommunikasjonstjenester, som V.250 (for modemer over telefonnettverk) og Ethernet (for lokale nettverksenheter), ved hjelp av en USB-kobling. En kommunikasjonsenhet er ansvarlig for enhetsadministrasjon, samtalehåndtering ved behov og dataoverføring.
CDC definerer sju hovedgrupper av enheter. Hver gruppe tilhører en kommunikasjonsmodell, som kan inneholde flere underklasser. Hver gruppe av enheter har sitt eget spesifikasjonsdokument i tillegg til CDC-basisklassen. De sju gruppene er:
Offentlig telefonnett (PSTN), enheter inkludert talebåndmodemer, telefoner og serielle emuleringsenheter. Integrated Services Digital Network (ISDN)-enheter, inkludert terminaladaptere og telefoner. Ethernet Control Model (ECM)-enheter, inkludert enheter som støtter IEEE 802-familien (f.eks. kabel- og ADSL-modemer, WiFi-adaptere). Asynkron overføringsmodus (ATM)-enheter, inkludert ADSL-modemer og andre enheter koblet til ATM-nettverk (arbeidsstasjoner, rutere, LAN-svitsjer). Trådløse mobile kommunikasjonsenheter (WMC), inkludert flerfunksjonskommunikasjonsenheter som brukes til å administrere tale- og datakommunikasjon. Ethernet Emulation Model (EEM)-enheter som utveksler Ethernet-rammede data. Network Control Model (NCM)-enheter, inkludert høyhastighetsnettverksenheter (høyhastighets pakketilgangsmodemer, linjeterminalutstyr)
CDC-en og den tilhørende underklasseimplementeringen overholder følgende spesifikasjoner:
Universal Serial Bus, klassedefinisjoner for kommunikasjonsenheter, revisjon 1.2, 3. november 2010. Universal Serial Bus, kommunikasjon, underklasse for PSTN-enheter, revisjon 1.2, 9. februar 2007.
USB-enhet CDC-baseklasse overview
En CDC-enhet består av følgende grensesnitt for å implementere kommunikasjonsfunksjonalitet:
Kommunikasjonsklassegrensesnittet (CCI) er ansvarlig for enhetsadministrasjon og eventuelt samtaleadministrasjon.
Enhetsadministrasjon muliggjør generell konfigurasjon og kontroll av enheten og varsling av hendelser til verten. Samtaleadministrasjonen muliggjør etablering og avslutning av samtaler. Samtaleadministrasjon kan multiplekses gjennom en DCI. En CCI er obligatorisk for alle CDC-enheter. Den identifiserer CDC-funksjonen ved å spesifisere kommunikasjonsmodellen som støttes av CDC-enheten. Grensesnittet(ene) som følger etter CCI-en kan være et hvilket som helst definert USB-klassegrensesnitt, for eksempel lyd eller et leverandørspesifikt grensesnitt. Det leverandørspesifikke grensesnittet er spesifikt representert av en DCI.
Data Class Interface (DCI) er ansvarlig for dataoverføring. Data som sendes og/eller mottas følger ikke en spesifikk
format. Data kan være rådata fra en kommunikasjonslinje, data som følger et proprietært format, osv. Alle DCI-ene som følger CCI-en kan sees på som underordnede grensesnitt.
En CDC-enhet må ha minst én CCI og null eller flere DCI-er. Én CCI og en hvilken som helst underordnet DCI gir sammen en funksjon til verten. Denne muligheten kalles også en funksjon. I en sammensatt CDC-enhet kan du ha flere
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
19/174
Overview
funksjoner. Derfor ville enheten være satt sammen av flere sett med CCI og DCI(er) som vist i figur – CDC-komposittenhet.
Figur – CDC-komposittenhet
En CDC-enhet vil sannsynligvis bruke følgende kombinasjon av endepunkter:
Et par kontroll-INN- og UT-endepunkter kalt standardendepunkt. Et valgfritt bulk- eller avbrudds-INN-endepunkt. Et par bulk- eller isokrone IN- og UT-endepunkter. Merk at Silicon Labs USB-enhetsstabel for øyeblikket ikke støtter isokrone endepunkter.
Tabellen nedenfor viser bruken av de ulike endepunktene og hvilket grensesnitt i CDC-en de brukes av.
Tabell – Bruk av CDC-endepunkt
Endepunkt
Kontroller IN
Kontroller UT
Avbryt eller bulk IN Bulk eller isokron IN Bulk eller isokron
UTE
Retning
Enhet-til-vert
Vert-til-enhet
Enhet-til-vert
Enhet-til-vert
Vert-til-enhet
Bruk av grensesnitt
CCI
Standardforespørsler om opplisting, klassespesifikke forespørsler, enhet
administrasjon, og eventuelt samtaleadministrasjon.
CCI
Standardforespørsler om opplisting, klassespesifikke forespørsler, enhet
administrasjon, og eventuelt samtaleadministrasjon.
CCI
Hendelsesvarsling, for eksempel ringdeteksjon, status for serielinje, nettverksstatus.
DCI
Rå eller formatert datakommunikasjon.
DCI
Rå eller formatert datakommunikasjon.
De fleste kommunikasjonsenheter bruker et avbruddsendepunkt for å varsle verten om hendelser. Isokrone endepunkter bør ikke brukes til dataoverføring når en proprietær protokoll er avhengig av dataoverføring på nytt i tilfelle USB-protokollfeil. Isokron kommunikasjon kan iboende miste data siden den ikke har noen mekanismer for å prøve på nytt.
De syv hovedmodellene for kommunikasjon omfatter flere underklasser. En underklasse beskriver hvordan enheten skal bruke CCI til å håndtere enhetsadministrasjon og samtaleadministrasjon. Tabellen nedenfor viser alle mulige underklasser og kommunikasjonsmodellen de tilhører.
Tabell – CDC-underklasser
Underklasse
Direkte linjekontrollmodell Abstrakt kontrollmodell
Kommunikasjonsmodell
PSTN
PSTN
Exampantall enheter som bruker denne underklassen
Modemenheter direkte kontrollert av USB-verten
Serielle emuleringsenheter , modemenheter styrt gjennom et serielt kommandosett
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
20/174
Overview
Underklasse
Kommunikasjonsmodell
Exampantall enheter som bruker denne underklassen
Telefonkontrollmodell
PSTN
Flerkanalskontroll ISDN-modell
CAPI-kontrollmodell ISDN
Ethernet-nettverk ECM-kontrollmodell
Minibanknettverk
minibank
Kontrollmodell
Modell for trådløs håndkontroll
WMC
Enhetsadministrasjon WMC
Mobil direktelinjemodell
WMC
OBEX
WMC
Ethernet-emulering EEM-modell
Nettverkskontrollmodell
NCM
Taletelefonienheter
Terminaladaptere for basistakst, terminaladaptere for primærtakst, telefoner
Basistakstterminaladaptere, primærtakstterminaladaptere, telefoner DOC-SIS-kabelmodemer, ADSL-modemer som støtter PPPoE-emulering, Wi-Fi-adaptere (IEEE 802.11-familien), IEEE 802.3-adaptere ADSL-modemer
Mobilt terminalutstyr som kobler seg til trådløse enheter
Mobilt terminalutstyr som kobler til trådløse enheter Mobilt terminalutstyr som kobler til trådløse enheter
Mobilt terminalutstyr som kobler til trådløse enheter Enheter som bruker Ethernet-rammer som neste transportlag. Ikke beregnet for ruting og Internett-tilkoblingsenheter IEEE 802.3-adaptere som bærer høyhastighets databåndbredde på nettverket
USB-enhet CDC ACM-klasse ressursbehov fra kjernen
Hver gang du legger til en CDC ACM-klasseinstans i en USB-konfigurasjon via et kall til funksjonen sl_usbd_cdc_acm_add_to_configuration(), vil følgende ressurser bli allokert fra kjernen.
Ressurs
Grensesnitt Alternative grensesnitt Endepunkter Grensesnittgrupper
Mengde
2 2 3 1
Merk at disse tallene er per konfigurasjon. Når du konfigurerer konfigurasjonsverdiene SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, må du ikke glemme å ta hensyn til hvor mange konfigurasjoner klassen skal legges til. For konfigurasjonsverdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, siden endepunkter bare åpnes når en konfigurasjon er angitt av verten, trenger du bare å ta hensyn til antall nødvendige endepunkter for en klasseinstans.
USB-enhet CDC ACM-underklasse Overview
CDC-basisklassen består av et kommunikasjonsklassegrensesnitt (CCI) og et dataklassegrensesnitt (DCI), som diskuteres i detalj i USB-enhets-CDC-basisklasse overview Denne delen omhandler en CCI av typen ACM. Den består av et standard endepunkt for administrasjonselementet og et avbruddsendepunkt for varslingselementet. Et par masseendepunkter brukes til å overføre uspesifiserte data over DCI-en.
ACM-underklassen brukes av to typer kommunikasjonsenheter:
Enheter som støtter AT-kommandoer (for eksempel talebåndmodemer). Serielle emuleringsenheter som også kalles virtuelle COM-portenheter.
Det finnes flere underklassespesifikke forespørsler for ACM-underklassen. De lar deg kontrollere og konfigurere enheten. Den komplette listen og beskrivelsen av alle ACM-forespørsler finner du i spesifikasjonen.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
21/174
Overview Underklasse for PSTN-enheter, revisjon 1.2, 9. februar 2007=, avsnitt 6.2.2.
Fra denne listen støtter Silicon Labs9 ACM-underklassen følgende:
Tabell – ACM-forespørsler støttet av Silicon Labs
Beskrivelse av forespørsel om underklasse
AngiKommfunksjonHentKommfunksjonRyddKommfunksjon
Verten sender denne forespørselen for å kontrollere innstillingene for en gitt kommunikasjonsfunksjon. Brukes ikke til seriell emulering.
Verten sender denne forespørselen for å hente gjeldende innstillinger for en gitt kommunikasjonsfunksjon. Brukes ikke til seriell emulering.
Verten sender denne forespørselen for å slette innstillingene for en gitt kommunikasjonsfunksjon. Brukes ikke til seriell emulering.
SettLinjekoding
Verten sender denne forespørselen for å konfigurere ACM-enhetsinnstillingene: baudhastighet, antall stoppbiter, paritetstype og antall databiter. For en seriell emulering sendes denne forespørselen automatisk av en seriell terminal hver gang du konfigurerer serieinnstillingene for en åpen virtuell COM-port.
GetLineCoding
Verten sender denne forespørselen for å hente gjeldende ACM-innstillinger (baudhastighet, stoppbiter, paritet, databiter). For seriell emulering sender serielle terminaler denne forespørselen automatisk under åpning av den virtuelle COM-porten.
SetControlLineState Verten sender denne forespørselen for å kontrollere bærebølgen for halvdupleksmodemer og indikere om Data Terminal Equipment (DTE) er klar eller ikke. I tilfelle seriell emulering er DTE en seriell terminal. For seriell emulering tillater visse serielle terminaler deg å sende denne forespørselen med kontrollene angitt.
SettBreak
Verten sender denne forespørselen for å generere et RS-232-stilbrudd. For seriell emulering tillater visse serielle terminaler deg å sende denne forespørselen.
Silicon Labs9 ACM-underklasse bruker avbrudds-IN-endepunktet til å varsle verten om gjeldende serielinjetilstand. Serien
linjestatus er et bitmap som informerer verten om:
Data forkastet på grunn av overrun Paritetsfeil Innrammingsfeil Tilstand for ringsignaldeteksjon Tilstand for brudddeteksjonsmekanisme Tilstand for sendebærer Tilstand for mottakerbærerdeteksjon
Implementeringen av Silicon Labs9 ACM-underklassen er i samsvar med følgende spesifikasjon:
Universal Serial Bus, kommunikasjon, underklasse for PSTN-enheter, revisjon 1.2, 9. februar 2007.
USB-enhet CDC ACM-klassekonfigurasjon
Denne delen omhandler hvordan du konfigurerer CDC ACM-klassen (kommunikasjonsenhetsklasse, abstrakt kontrollmodell). Det finnes to grupper med konfigurasjonsparametere:
USB-enhet CDC ACM-klasse Applikasjonsspesifikke konfigurasjoner USB-enhet CDC ACM-klasseforekomstkonfigurasjoner
USB-enhet CDC ACM-klasse Applikasjonsspesifikke konfigurasjoner
CDC-basisklasse ACM-underklasse
CDC-basisklasse
For å bruke Silicon Labs USB-enhets CDC-klassemodul må du først justere CDC-kompileringstidskonfigurasjonen #define-s i henhold til applikasjonens behov. De er omgruppert i sl_usbd_core_config.h-headeren. file under CDC-delen. Hensikten deres er å informere USB-enhetsmodulen om hvor mange USB CDC-objekter som skal tildeles.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
22/174
Overview
Tabellen nedenfor beskriver hvert konfigurasjonsfelt som er tilgjengelig i denne konfigurasjonsstrukturen.
Tabell – USB-enhets CDC-konfigurasjon definerer
Konfigurasjonsnavn
SL_USBD_CDC_CL AS S_INSTANCE_QUANTITY
SL_USBD_CDC_CONFIGURATION_QUANTI
TY
SL_USBD_CDC_DATA_GRENSESNITT_KVANTUM
TY
Beskrivelse
Antall klasseforekomster du vil tildele via et kall til funksjonen
sl_usbd_cdc_acm_create_instance().
Antall konfigurasjoner. ACM-klasseforekomster kan legges til én eller flere aaaa-konfigurasjoner via sl_usbd_cdc_acm_add_to_configuration().
Totalt antall datagrensesnitt (DCI) for alle CDC-funksjonene. Hver CDC ACM-funksjon som er lagt til i funksjonen sl_usbd_cdc_acm_create_instance(), vil legge til dette grensesnittet.
Standardverdi
2
1
2
ACM-underklasse
ACM-underklassen har én kompileringstidskonfigurasjon som vist i tabellen nedenfor.
Tabell – Definer konfigurasjon av USB-enhet CDC ACM
Konfigurasjonsnavn
SL_USBD_CDC_ACM_SUBCL ASS_I STANDARDANTALL
Beskrivelse
Konfigurerer antall underklasseforekomster du vil tildele via et kall til
funksjonen sl_usbd_cdc_acm_create_instance().
Standardverdi
2
Konfigurasjoner av USB-enhets CDC ACM-klasseforekomster
Denne delen definerer konfigurasjonene knyttet til CDC ACM-serielle klasseforekomster. Klasseforekomstoppretting linjetilstand intervall kall administrasjonsmuligheter p_acm_callbacks
Oppretting av klasseinstans
For å opprette en CDC ACM seriell klasseinstans, kall funksjonen T a sl_usbd_cdc_acm_create_instance(). Denne funksjonen krever tre konfigurasjonsargumenter, som beskrevet her.
linjetilstandsintervall
Dette er intervallet (i millisekunder) som din CDC ACM serielle klasseinstans vil rapportere linjetilstandsvarsler til T aa-verten. Denne verdien må være en potens av to (1, 2, 4, 8, 16 osv.).
call_mgmt_capabilities
Bitmap for samtalebehandlingsfunksjoner. Mulige verdier for bitmapet er som følger:
Verdi (bit)
SL_USBD_ACM_SERIAL_CALL_MGMT_DEV
SL_USBD_ACM_SERIAL_CALL_MGMT_DATA_CCI _DCI
Beskrivelse
Enheten håndterer samtalehåndtering selv. Enheten kan sende/motta samtalehåndteringsinformasjon over et dataklassegrensesnitt.
p_acm_tilbakekallinger
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
23/174
Overview
aa M aa p_acm_callbacks er en peker til en struktur av typen sl_usbd_cdc_acm_callbacks_t. Hensikten er å gi CDC AC Cl ss et sett med tilbakeringingsfunksjoner som skal kalles når en CDC ACM-hendelse oppstår. Ikke alle tilbakeringinger er obligatoriske, og en nullpeker (NULL) kan sendes i tilbakeringingsstrukturvariabelen når tilbakeringingen ikke er nødvendig. Tabellen nedenfor beskriver hvert konfigurasjonsfelt som er tilgjengelig i denne konfigurasjonsstrukturen.
Tabell – sl_usbd_cdc_acm _callbacks_t Konfigurasjonsstruktur
Felter
Beskrivelse
.aktiver
Kalles når USB-klasseforekomsten er aktivert
vellykket.
.deaktiver
Kalles når USB-klasseinstansen er deaktivert.
.line_control_changed Kalles når en endring i linjekontrollen mottas.
line_coding_changed Kalles når en endring i linjekoding mottas.
Funksjonssignatur
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 hendelse, uint8_t hendelse_chngd); bool app_usbd_cdc_acm_line_coding_changed(uint8_t subklasse_nbr, subklasse_nbr, sl_usbd_cdc_acm_line_coding_t Hent: Titel : Bekreft vilkår og betingelser ved å bruke koden *Oppdater vilkår og betingelser ved å bruke koden*.
*p_linjekoding
Se avsnittet Registrere tilbakeringinger av hendelsesvarsler for tilbakeringingsfunksjoner, f.eks.ample.
USB-enhet CDC ACM-klasseprogrammeringsveiledning
Denne delen forklarer hvordan du bruker CDC Abstract Control Model-klassen. Initialisere USB-enhetens CDC ACM-klasse Legge til en USB-enhets CDC ACM-klasseinstans på enheten din Kommunisere ved hjelp av CDC ACM-klassen
Initialisere USB-enhetens CDC ACM-klasse
For å legge til CDC ACM-klassefunksjonalitet på enheten din, må du først initialisere CDC-basisklassen og ACM-underklassen ved å fylle funksjonene sl_usbd_cdc_init() og sl_usbd_cdc_acm_init(). Eksemplet nedenfor viser hvordan du kjører sl_usbd_cdc_init() og sl_usbd_cdc_acm_init() ved hjelp av standardargumenter.
Example – Initialisering av CDC ACM-klasse
sl_status_t status;
status = sl_usbd_cdc_init(); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
status = sl_usbd_cdc_acm_init(); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
Legge til en USB-enhets CDC ACM-klasseinstans på enheten din
For å legge til CDC ACM-klassefunksjonalitet på enheten din, må du opprette en instans og deretter legge den til i enhetens konfigurasjon(er).
Opprette en CDC ACM-klasseinstans
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
24/174
Overview
Legge til CDC ACM-klasseinstansen i enhetens konfigurasjon(er) Registrere tilbakekallinger for hendelsesvarsler
Opprette en CDC ACM-klasseinstans
aa M aaa Opprett en CDC AC-klasseinstance ved å kalle funksjonen sl_usbd_cdc_acm_create_instance(). T aaa M aaa Eksemplet nedenfor viser hvordan du oppretter en CDC AC-klasseinstance via sl_usbd_cdc_acm_create_instance().
Example – Opprette en CDC ACM-funksjon 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) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
Legge til CDC ACM-klasseinstansen i enhetens konfigurasjon(er)
Etter at du har opprettet en CDC ACM-klasseinstans, kan du legge den til i en konfigurasjon ved å kalle funksjonen
sl_usbd_cdc_acm_add_to_configuration().
Eksemplet nedenfor viser hvordan du bruker sl_usbd_cdc_acm_add_to_configuration().
Example – Kall 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) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
aaa (1) Kl. ss-nummer som skal legges til konfigurasjonen returnert av sl_usbd_cdc_acm_create_instance(). (2) Konfigurasjonsnummer (her legges det til i en Full-Speed-konfigurasjon).
Registrere tilbakeringinger av hendelsesvarsler
CDC ACM Serial-klassen kan varsle applikasjonen din om eventuelle endringer i linjekontroll eller koding via tilbakekallingsfunksjoner for varsling. En struktur for tilbakekallingsfunksjoner kan sendes som argument under opprettelsen av ACM-instansen. Merk at disse tilbakekallingene er valgfrie. F.eks.ample – CDC ACM Tilbakekallingsregistrering illustrerer bruken av tilbakekallingsregistreringsfunksjonene. Eks.ample – Implementering av CDC ACM-tilbakekallinger viser en eks.ampimplementeringsnivået av tilbakeringingsfunksjonene.
Example – Registrering av tilbakeringinger for CDC ACM
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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, }; Betegnelse: På engelsk: Applikasjonen bruker vilkårlig tilkobling og rettigheter forbeholdt.
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) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */ }
Example – Implementering av CDC ACM-tilbakekallinger
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 stopp_bits_ny;
uint8_t data_bits_new;
/* GJØREMÅL Bruk ny linjekoding.*/ 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;
returner (sant);
(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; Hensiktselement: Titelsetning: Kommentarer er ikke tilgjengelige for dette formålet. Det er imidlertid ingen oversettelse tilgjengelig for dette formålet.
/* GJØREMÅTE Bruk ny linjekontroll. */ 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_changed & 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) ? sann : usann;
}
(1) Det er viktig å returnere `false` til denne funksjonen hvis linjekodingen mislyktes. Ellers returneres `true`.
Kommunikasjon ved hjelp av CDC ACM-klassen
Seriell status
Linjekoding Linjekontroll
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
26/174
Overview
Kommunikasjon av linjetilstand, underklasseforekomst
Seriell status
Linjekoding
USB-verten styrer linjekodingen (baudrate, paritet osv.) til CDC ACM-enheten. Når det er nødvendig, er applikasjonen ansvarlig for å stille inn linjekodingen. Det finnes to funksjoner for å hente og stille inn gjeldende linjekoding, som beskrevet i tabellen nedenfor.
Tabell – CDC ACM-linjekodingsfunksjoner
Funksjon
sl_usbd_cdc_acm_g e t_line_koding ()
sl_usbd_cdc_acm_s e t_line_koding ()
Beskrivelse
Applikasjonen din kan hente de gjeldende linjekodingsinnstillingene enten fra verten med SetLineCoding-forespørsler eller med funksjonen sl_usbd_cdc_acm_set_line_coding().
Applikasjonen din kan angi linjekodingen. Verten kan hente innstillingene med GetLineCoding-forespørselen.
Linjekontroll
USB-verten styrer linjekontrollen (RTS- og DTR-pinner, bruddsignal osv.) til CDC ACM-enheten. Når det er nødvendig, er applikasjonen din ansvarlig for å bruke linjekontrollene. Det finnes en funksjon for å hente og angi gjeldende linjekontroller, som beskrevet i tabellen nedenfor.
Tabell – CDC ACM-linjekontrollfunksjoner
Funksjon
sl_usb d _cd c_acm_ge t_line _kontroll_tilstand ()
Applikasjonen din kan hente gjeldende kontrolllinjetilstand angitt av verten med SetControlLineState-forespørselen.
Linjetilstand
USB-verten henter linjestatusen med jevne mellomrom. Applikasjonen din må oppdatere linjestatusen hver gang den endres. Om nødvendig er applikasjonen din ansvarlig for å angi linjestatusen. To funksjoner er tilgjengelige for å hente og angi gjeldende linjekontroller, som beskrevet i tabellen nedenfor.
Tabell – CDC ACM-linjetilstandsfunksjoner
Funksjon
sl_usb d _cd c_acm_se t _line _state _e ve nt()
sl_usbd_cdc_acm_cle ar_line _state _e ve nt()
Applikasjonen din kan angi en hvilken som helst hendelse(r) i linjetilstanden. Når linjetilstanden angis, sendes en avbruddsoverføring (IN) til verten for å informere om en endring i den serielle linjetilstanden.
Applikasjonen kan fjerne to hendelser i linjetilstanden: deteksjon av senderbærer og mottakerbærer. Alle de andre hendelsene fjernes automatisk av underklassen for seriell emulering av ACM.
Kommunikasjon av underklasseinstanser
Silicon Labs' ACM-underklasse tilbyr følgende funksjoner for å kommunisere med verten. For mer informasjon om functions9-parameterne, se referansen til CDC ACM-underklassefunksjoner.
Funksjonsnavn
sl_usb d _cd c_acm_ les () sl_usb d _cd c_acm_write ()
Operasjon
Mottar data fra verten via et bulk OUT-endepunkt. Denne funksjonen blokkerer. Sender data til verten via et bulk IN-endepunkt. Denne funksjonen blokkerer.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
27/174
Overview
Tabell – Sammendrag av CDC ACM-kommunikasjons-API aaaaa sl_usbd_cdc_acm_read() og sl_usbd_cdc_acm_write() gir synkron kommunikasjon, som betyr at overføringen blokkerer. Med andre ord, når funksjonen kalles, blokkeres applikasjonen til overføringen er fullført med eller uten en feil. En tidsavbrudd kan spesifiseres for å unngå å vente evig. Eks.ampLekken nedenfor viser et lese- og skriveeksempelampsom mottar data fra verten ved hjelp av bulk OUT-endepunktet og sender data til verten ved hjelp av bulk IN-endepunktet.
Oppføring – Seriell lese- og skriveeksemplarample
__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) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
status = sl_usbd_cdc_acm_write(underklassenummer,
(1)
tx_buf,
(4)
2u,
0u,
(3)
&xfer_len);
hvis (status ! SL_STATUS_OK) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
(1) Klasseforekomstnummeret som ble opprettet med sl_usbd_cdc_acm_create_instance() gir en intern referanse til AC-underklassen for å rute overføringen til riktig bulk-UT- eller IN-endepunkt. (2) Applikasjonen din må sørge for at bufferen som er gitt til funksjonen er stor nok til å romme alle dataene. Ellers kan det oppstå synkroniseringsproblemer. (3) For å unngå en uendelig blokkeringssituasjon, angi en tidsavbrudd uttrykt i millisekunder. En verdi på 809 får applikasjonsoppgaven til å vente i evigheter. (4) Applikasjonen gir den initialiserte overføringsbufferen.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
28/174
Overview
Overview
USB-enhet HID-klasse
USB-enhet HID-klasse overview USB-enhet HID-klasse Ressursbehov fra kjernen USB-enhet HID-klassekonfigurasjon USB-enhet HID-klasse Programmeringsveiledning HID Periodiske inndatarapporter Oppgave
Denne delen beskriver HID-klassen (Human Interface Device) som støttes av Silicon Labs USB-enhet.
HID-klassen omfatter enheter som brukes av mennesker til å kontrollere datamaskinoperasjoner, for eksempel tastaturer, mus, pekeenheter og spillenheter.
HID-klassen kan også brukes i en sammensatt enhet som inneholder kontroller som knotter, brytere, knapper og glidebrytere. For eksempelampLyd-, lyd- og volumkontroller i et lydhodesett styres av HID-funksjonen til hodesettet. HID-klassen kan utveksle data for ethvert formål ved kun å bruke kontroll- og avbruddsoverføringer.
HID-klassen er en av de eldste og mest brukte USB-klassene. Alle de store vertsoperativsystemene tilbyr en innebygd driver for å administrere HID-enheter, og det er derfor en rekke leverandørspesifikke enheter fungerer med HID-klassen. Denne klassen inkluderer også ulike typer utgangselementer som LED-er, lyd, taktil tilbakemelding osv.
HID-implementeringen overholder følgende spesifikasjoner:
Enhetsklassedefinisjon for menneskelige grensesnittenheter (HID), 27.06.01, versjon 1.11. Brukstabeller for Universal Serial Bus HID, 28.10.2004, versjon 1.12.
USB-enhet HID-klasse overview
Overview
En HID-enhet består av følgende endepunkter:
Et par kontroll-INN- og UT-endepunkter kalt standardendepunktet. Et avbrudds-INN-endepunkt. Et valgfritt avbrudds-UT-endepunkt.
Tabellen nedenfor beskriver bruken av de ulike endepunktene:
Tabell – Bruk av HID-klassen endepunkter
Bruk av endepunktretning
Kontroller IN
Kontroll
UTE
Avbryt INN
Avbryte
UTE
Enhet-til-vert
Vert-til-enhet
Enhet-til-vert
Vert-til-enhet
Standardforespørsler om opplisting, klassespesifikke forespørsler og datakommunikasjon (input, funksjonsrapporter sendt til verten med GET_REPORT-forespørsel). Standardforespørsler om opplisting, klassespesifikke forespørsler og datakommunikasjon (output, funksjonsrapporter mottatt fra verten med SET_REPORT-forespørsel). Datakommunikasjon (input og funksjonsrapporter).
Datakommunikasjon (utdata- og funksjonsrapporter).
Rapportere
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
29/174
Overview
En vert og en HID-enhet utveksler data ved hjelp av rapporter. En rapport inneholder formaterte data som gir informasjon om kontroller og andre fysiske enheter i HID-enheten. En kontroll kan manipuleres av brukeren og betjener et aspekt av enheten. For eksempelampf.eks. kan en kontroll være en knapp på en mus eller et tastatur, en bryter osv. Andre enheter informerer brukeren om statusen til bestemte enhetsfunksjoner. For eksempelampLED-lamper på et tastatur varsler brukeren om Caps Lock er aktivert, det numeriske tastaturet er aktivt osv.
Formatet og bruken av rapportdata forstås av verten ved å analysere innholdet i en rapportbeskrivelse. Analyse av innholdet gjøres av en parser. Rapportbeskrivelsen beskriver data levert av hver kontroll i en enhet. Den er satt sammen av elementer som er informasjonsbiter om enheten og består av et 1-byte prefiks og en variabel lengde.
data. For mer informasjon om elementformatet, se
1.11=, avsnitt 5.6 og 6.2.2.
Det finnes tre hovedtyper av varer:
Hovedelementet definerer eller grupperer bestemte typer datafelt.
Globalt element beskriver dataegenskapene til en kontroll.
Et lokalt element beskriver dataegenskapene til en kontroll.
Hver elementtype er definert av forskjellige funksjoner. En elementfunksjon kan også kalles en tagEn elementfunksjon kan sees på som et underelement som tilhører en av de tre hovedelementtypene. Tabellen nedenfor gir en kort oversiktview av elementfunksjonene i hver elementtype. For en fullstendig beskrivelse av elementene i hver kategori, se
Tabell – Beskrivelse av elementets funksjon for hver elementtype
Element Elementtype Funksjon
Beskrivelse
Hovedinngang
Beskriver informasjon om dataene som leveres av én eller flere fysiske kontroller.
Hovedutgang Beskriver data som sendes til enheten.
Hovedfunksjon
Beskriver informasjon om enhetskonfigurasjon som sendes til eller mottas fra enheten, som påvirker den generelle oppførselen til enheten eller en av dens komponenter.
Relaterte elementer i hovedsamlingsgruppen (input, output eller function).
Hoved Slutt på Lukker en samling. Samling
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
30/174
Overview
Element Elementtype Funksjon
Beskrivelse
Global bruksside
Identifiserer en funksjon som er tilgjengelig i enheten.
Global Logisk Definerer den nedre grensen for de rapporterte verdiene i logiske enheter. Minimum
Global Logisk Definerer den øvre grensen for de rapporterte verdiene i logiske enheter. Maksimum
Global fysisk Definerer den nedre grensen for de rapporterte verdiene i fysiske enheter, det vil si det logiske minimumsminimumet uttrykt i fysiske enheter.
Global fysisk Definerer den øvre grensen for de rapporterte verdiene i fysiske enheter, det vil si det logiske maksimumsmaksimumet uttrykt i fysiske enheter.
Global enhet
Angir enhetseksponenten i grunntall 10. Eksponenten går fra -8 til +7.
Eksponent
Global enhet
Angir enheten for de rapporterte verdiene. For eksempel lengde, masse, temperaturenheter osv.
Global rapportstørrelse
Angir størrelsen på rapportfeltene i biter.
Global rapport-ID Angir prefikset som er lagt til i en bestemt rapport.
Globalt antall rapporter
Angir antall datafelt for et element.
Globalt press
Plasserer en kopi av den globale elementtilstandstabellen på CPU-stakken.
Global pop
Erstatter elementstatustabellen med den siste strukturen fra stakken.
Lokal bruk
Representerer en indeks for å angi en spesifikk bruk innenfor en bruksside. Den indikerer leverandørens foreslåtte bruk for en spesifikk kontroll eller gruppe kontroller. En bruk gir informasjon til en applikasjonsutvikler om hva en kontroll faktisk måler.
Lokal bruk
Definerer startbruken knyttet til en array eller bitmap.
Minimum
Lokal bruk
Definerer den avsluttende bruken som er knyttet til en array eller bitmap.
Maksimum
Lokal betegnelse Bestemmer kroppsdelen som brukes for en kontroll. Indeksen peker til en betegnelse i den fysiske
Indeks
deskriptor.
Lokal betegnelse Definerer indeksen til startbetegnelsen som er knyttet til en matrise eller et punktgrafikkbilde. Minimum
Lokal betegnelse Definerer indeksen til den avsluttende betegnelsen som er knyttet til en matrise eller et punktgrafikkbilde. Maksimum
Lokal strengindeks
Strengindeks for en strengbeskrivelse. Den tillater at en streng kan knyttes til et bestemt element eller en kontroll.
Lokal streng
Angir den første strengindeksen når en gruppe sekvensielle strenger tilordnes til kontroller i en matrise.
Minimum eller bitmap.
Lokalt Lokalt
Strengmaksimum
Avgrensning
Angir den siste strengindeksen når en gruppe sekvensielle strenger tilordnes til kontroller i en matrise eller et punktgrafikk.
Definerer begynnelsen eller slutten av et sett med lokale elementer.
En control9s-data må definere minst følgende elementer:
Inndata, utdata eller funksjon Hovedelementer Bruk Lokalt element Bruksside Globalt element Logisk minimum Globalt element Logisk maksimum Globalt element Rapportstørrelse Globalt element
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
31/174
Overview
Rapportantall Globalt element Tabellen nedenfor viser representasjonen av innholdet i en muserapportbeskrivelse fra et verts-HID-parserperspektiv. Musen har tre knapper (venstre, høyre og hjul). Koden som presenteres i eksempletampLe nedenfor er en kodeimplementering som tilsvarer denne muserapportbeskrivelsesrepresentasjonen.
Figur – Rapportbeskrivelsesinnhold fra en Host HID-parser View
(1) Funksjonen Brukssideelement spesifiserer enhetens generelle funksjon. I dette eksempeletample, HID-enheten tilhører en
generisk skrivebordskontroll.
(2) Samlingen Applikasjonen grupperer hovedelementer som har et felles formål og kan være kjente for applikasjoner. I diagrammet består gruppen av tre hovedelementer for input. For denne samlingen er den foreslåtte bruken av kontrollene en mus, som angitt av brukselementet. (3) Nestede samlinger kan brukes til å gi mer informasjon om bruken av en enkelt kontroll eller gruppe kontroller til applikasjoner. I dette eksempeletample, den fysiske samlingen, nestet i samlingsapplikasjonen, er satt sammen av de samme tre inndataelementene som danner samlingsapplikasjonen. Den fysiske samlingen brukes for et sett med dataelementer som representerer datapunkter samlet inn på ett geometrisk punkt. I eksempeletampf.eks. er den foreslåtte bruken en peker som angitt av Bruk-elementet. Her refererer pekerbruken til museposisjonskoordinatene, og systemprogramvaren vil oversette musekoordinatene når skjermmarkøren beveger seg. (4) Nestede brukssider er også mulige og gir mer informasjon om et bestemt aspekt innenfor enhetens generelle funksjon. I dette tilfellet er to inngangselementer gruppert og korresponderer med museknappene. Ett inngangselement definerer de tre museknappene (høyre, venstre og hjul) når det gjelder antall datafelt for elementet (Rapportantall-element), størrelsen på et datafelt (Rapportstørrelse-element) og mulige verdier for hvert datafelt (Minimum og Maksimum bruk, Logisk minimum og Maksimum-elementer). Det andre inngangselementet er en 13-bits konstant som gjør at inndatarapportdataene kan justeres på en bytegrense. Dette inngangselementet brukes kun til utfylling. (5) En annen nestet bruksside som refererer til en generisk skrivebordskontroll er definert for museposisjonskoordinatene. For denne brukssiden beskriver inngangselementet datafeltene som korresponderer med x- og y-aksen som spesifisert av de to brukselementene.
gjenstander.
Etter å ha analysert innholdet i den forrige rapportbeskrivelsen fra musen, kan host9s HID-parser tolke inputrapportdataene som sendes av enheten med en avbrudds-IN-overføring eller som svar på en GET_REPORT-forespørsel. Inputrapportdataene som tilsvarer muserapportbeskrivelsen vist i figur – Rapportbeskrivelsesinnhold fra en Host HID-parser. View is
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
32/174
Overview
vist i tabellen nedenfor. Den totale størrelsen på rapportdataene er 4 byte. Ulike typer rapporter kan sendes over samme endepunkt. For å skille mellom de ulike rapporttypene legges et 1-byte rapport-ID-prefiks til datarapporten. Hvis en rapport-ID ble brukt i eks.ample av muserapporten, ville den totale størrelsen på rapportdataene være 5 byte.
Tabell – Inndatarapport sendt til vert og korresponderer med tilstanden til en mus med tre knapper
Bit Offset
0 1 2 3 16 24
Bitantall 1 1 1 13 8 8
Beskrivelse Knapp 1 (venstre knapp). Knapp 2 (høyre knapp). Knapp 3 (hjulknapp). Ikke i bruk. Posisjon på akse X. Posisjon på akse Y.
En fysisk deskriptor angir den delen eller delene av kroppen som er ment å aktivere en eller flere kontroller. En applikasjon kan bruke denne informasjonen til å tilordne en funksjonalitet til kontrollen til en enhet. En fysisk deskriptor er en valgfri klassespesifikk deskriptor, og de fleste enheter har liten gevinst ved å bruke den. Se
Ressursbehov for USB-enhet HID-klasse fra kjernen
Hver gang du legger til en HID-klasseinstans i en USB-konfigurasjon via et kall til funksjonen sl_usbd_hid_add_to_configuration(), vil følgende ressurser bli allokert fra kjernen.
Ressurs
Grensesnitt Alternative grensesnitt Endepunkter Grensesnittgrupper
Mengde
1 1 1 (2 hvis avbrudds-UT-endepunktet er aktivert) 0
Merk at disse tallene er per konfigurasjon. Når du konfigurerer konfigurasjonsverdiene SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, må du ikke glemme å ta hensyn til hvor mange konfigurasjoner klassen skal legges til. For konfigurasjonsverdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, siden endepunkter bare åpnes når en konfigurasjon er angitt av verten, trenger du bare å ta hensyn til antall nødvendige endepunkter for en klasseinstans.
Konfigurasjon av USB-enhets HID-klasse
To grupper med konfigurasjonsparametere brukes til å konfigurere HID-klassen:
USB-enhet HID-klasse Applikasjonsspesifikke konfigurasjoner USB-enhet HID-klasseforekomstkonfigurasjoner
USB-enhet HID-klasse Applikasjonsspesifikke konfigurasjoner
For å bruke Silicon Labs USB-enhets HID-klassemodul, juster først HID-kompileringstidskonfigurasjonsdefinisjonene i henhold til applikasjonens behov. De er omgruppert i sl_usbd_core_config.h-headeren. file under HID-delen. De kan deles inn i to seksjoner, mengdekonfigurasjoner og HID-oppgavekonfigurasjoner. Formålet med mengdekonfigurasjonene er å informere USB-enhetsmodulen om hvor mange USB HID-objekter som skal tildeles.
Tabellen nedenfor beskriver hver konfigurasjonsdefinisjon.
Tabell – Definerer HID-konfigurasjon for USB-enhet
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
33/174
Overview
Konfigurasjonsnavn
SL_USBD_HID_CL ASS_I STANDARDANTALL
SL_USBD_HID_CONFIG URATION_QUANTITY
SL_USBD_HID_RAPPORT_ ID_ANTALL
SL_USBD_HID_PUSH_P OP_ITEM_QUANTITY
SL_USBD_HID_TIMER_T ASK_STACK_SIZE
SL_USBD_HID_TIMER_T SPØRRE_PRIORITET
Beskrivelse
Antall klasseforekomster du vil tildele via et kall til funksjonen
sl_usbd_hid_create_instance().
Antall konfigurasjoner. HID-klasseforekomster kan legges til én eller flere aaaa-konfigurasjoner via funksjonen sl_usbd_hid_add_to_configuration(). Konfigurerer det totale antallet rapport-ID-er som skal tildeles.
Konfigurerer det totale antallet Push/Pop-elementer som skal tildeles.
Timeroppgaven håndterer alle timerbaserte HID-operasjoner. Denne konfigurasjonen lar deg angi stakkstørrelsen (i antall byte). Prioritet for HID-oppgaven. Dette er en CMSIS-RTOS2-prioritet.
Standardverdi
2 1 2 0 2048
osPrioritetHøy
USB-enhet HID-klasse Instanskonfigurasjoner Klasse Instansoppretting underklasse
protokoll landskode
interval_in og interval_out p_hid_callback HID-klasse Rapportbeskrivelse Eks.ampDenne delen definerer konfigurasjonene knyttet til HID-klasseforekomstene.
Oppretting av klasseinstans
Du oppretter en HID-klasseinstans ved å kalle funksjonen aaa sl_usbd_hid_create_instance(), som krever flere konfigurasjonsargumenter som er beskrevet nedenfor.
underklasse
Kode for HID-underklassen. Mulige verdier er:
SL_USBD_HID_SUBCL ASS_NONE SL_USBD_HID_SUBCL ASS_BOOT
En HID-enhet som bruker oppstartsunderklassen må bruke standard rapportformater. For mer informasjon om underklassekodene, se avsnitt 4.2 i HID-spesifikasjonsrevisjon 1.11.
protokoll
Protokollen som brukes av HID-enheten. Mulige verdier er:
SL_USBD_HID_PROTOCOL_NONE SL_USBD_HID_PROTOCOL_KBD SL_USBD_HID_PROTOCOL_MOUSE
Hvis HID-funksjonen din er en mus, bør protokollen settes til SL_USBD_HID_PROTOCOL_MOUSE. Hvis det er et tastatur, bør den settes til SL_USBD_HID_PROTOCOL_KBD. Ellers bør protokollen settes til SL_USBD_HID_PROTOCOL_NONE. For mer informasjon om underklassekodene, se avsnitt 4.3 i HID-spesifikasjonsrevisjon 1.11.
landskode
ID for landskoden. Mulige verdier er:
SL_USBD_HID_LANDSKODE_IKKE_STØTTET
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
34/174
Overview
SL_USBD_HID_LANDSKODE_ARABISK SL_USBD_HID_LANDSKODE_BELGISK SL_USBD_HID_LANDSKODE_KANADISK_TOSPRÅKLIG SL_USBD_HID_LANDSKODE_KANADISK_FRANSK SL_USBD_HID_LANDSKODE_TSJEKKIA SL_USBD_HID_LANDSKODE_DANSK SL_USBD_HID_LANDSKODE_FINNISH SL_USBD_HID_LANDSKODE_FRANSK SL_USBD_HID_LANDSKODE_TYSK SL_USBD_HID_LANDSKODE_GREEK SL_USBD_HID_LANDSKODE_HEBRØSK SL_USBD_HID_LANDSKODE_UNGARN SL_USBD_HID_LANDSKODE_INTERNATIONAL SL_USBD_HID_LANDSKODE_ITALIANSK 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_SWISS_FRENCH 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
Landskoden identifiserer hvilket land maskinvaren er lokalisert for. Mesteparten av maskinvaren er ikke lokalisert, og derfor vil denne koden være SL_USBD_HID_COUNTRY_CODE_NOT_SUPPORTED (0). Tastaturer kan imidlertid bruke feltet til å angi språket til tastehodene.
For mer informasjon om landskodene, se avsnitt 6.2.1 i HID-spesifikasjonsrevisjon 1.11.
intervall_inn og intervall_ut
interval_in og interval_out representerer pollingintervallet for IN-avbruddsendepunktet og OUT-avbruddsendepunktet.
Dette representerer avspørringsintervallet for endepunktet, i millisekunder. Hvor ofte denne verdien stilles inn, avhenger av hvor ofte enheten din er mottakelig for å generere en ny rapport for verten. Hvis for eksempel en rapport genereres hvert 16. millisekund, bør intervallet være 16 eller mindre.
Verdien må være en potens av 2 (1, 2, 4, 8, 16 osv.).
En interval_out-verdi ignoreres hvis ctrl_rd_en er satt til sann.
p_hid_tilbakekalling
aaaa p_hid_callback er en peker til en struktur av typen sl_usbd_hid_callbacks_t. Hensikten er å gi HID Cl ss et sett med tilbakekallingsfunksjoner som skal kalles når en HID-hendelse inntreffer.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
35/174
Overview
Ikke alle tilbakeringinger er obligatoriske, og en nullpeker (NULL) kan sendes i tilbakeringingsstrukturvariabelen når tilbakeringingen ikke er nødvendig. Tabellen nedenfor beskriver hvert konfigurasjonsfelt som er tilgjengelig i denne konfigurasjonsstrukturen.
Tabell – sl_usbd_hid_callbacks_t Konfigurasjonsstruktur
Felter
Beskrivelse
Funksjonssignatur
.aktiver .deaktiver .get_report_desc
.get_phy_desc
.set_output_report .get_feature_report .set_feature_report
Kalles når USB-klasseinstansen er aktivert. Kalles når USB-klasseinstansen er deaktivert.
Kalles under opprettelsen av HID-instansen for å sende rapportbeskrivelsen din. For hver av HID-funksjonene dine må du oppgi en rapportbeskrivelse. Rapportbeskrivelsen indikerer for verten hvordan den periodiske rapporten som sendes av enheten, skal analyseres. Det kan være utfordrende å skrive din egen rapportbeskrivelse, og det er derfor det finnes noen ressurser som kan hjelpe. Dette er den eneste obligatoriske tilbakekallingsfunksjonen. Kalles under opprettelsen av HID-instansen for å sende den fysiske beskrivelsen din. Den fysiske beskrivelsen er en beskrivelse som gir informasjon om den spesifikke delen eller delene av menneskekroppen som aktiverer en eller flere kontroller. Hvis du vil ha mer informasjon om fysiske beskrivelser, kan du se avsnitt 6.2.3 i HID-spesifikasjonsrevisjon 1.11. Den fysiske beskrivelsen er valgfri og ignoreres mesteparten av tiden. Bufferen som sendes her, kan settes til NULL og lengden settes til 0. Kalles når verten angir en rapport som beskrevet i rapportbeskrivelsen din (når den sender en rapport).
Kalles når verten ber om en funksjonsrapport som beskrevet i rapportbeskrivelsen din.
Kalles når verten angir en funksjonsrapport som beskrevet i rapportbeskrivelsen din.
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 gjeldende aktive protokoll.
void app_usbd_hid_get_protocol(uint8_t klassenummer, uint8_t *p_protocol);
.set_protocol
Angir gjeldende aktive protokoll.
void app_usbd_hid_set_protocol(uint8_t class_nbr, uint8_t protocol);
HID-klasserapportbeskrivelse Eks.ample
Silicon Labs' HID-klasseampapplikasjonen gir en eks.ampav en rapportbeskrivelse for en enkel mus. EksempletampLegefeltet nedenfor viser en rapportbeskrivelse for mus.
Example – Musrapportbeskrivelse
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 rettigheter forbeholdt.
36/174
Overview
SL_USBD_HID_HOVEDSAMLING +1, SL_USBD_HID_SAMLING_PROGRAM,(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_HOVED_VARIABLE |
SL_USBD_HID_MAIN_ABSOLUTE,
SL_USBD_HID_GLOBAL_RAPPORT_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_HOVED_VARIABLE |
SL_USBD_HID_MAIN_RELATIVE,
SL_USBD_HID_MAIN_ENDCOLLECTION,(10)
SL_USBD_HID_MAIN_ENDCOLLECTION
(11)};
(1) Tabellen som representerer en muserapportbeskrivelse initialiseres på en slik måte at hver linje tilsvarer et kort element. Sistnevnte er dannet av et 1-byte prefiks og 1-byte data. Se viewed av en verts-HID-parser i figur – Rapportbeskrivelsesinnhold fra en verts-HID-parser View.
(2) Siden Generisk skrivebordsbruk brukes.
(3) Innenfor den generelle skrivebordsbrukssiden, bruken tag antyder at kontrollgruppen er for å styre en mus. En musesamling består vanligvis av to akser (X og Y) og én, to eller tre knapper.
(4) Musesamlingen er startet.
(5) Innenfor musesamlingen, en bruk tag antyder mer spesifikt at musekontrollene tilhører pekersamlingen. En pekersamling er en samling av akser som genererer en verdi for å dirigere, indikere eller peke brukerens intensjoner mot et program.
(6) Pekersamlingen startes.
(7) Siden for bruk av knapper definerer et inputelement som består av tre 1-bits felt. Hvert 1-bits felt representerer henholdsvis museknappen 1, 2 og 3 og kan returnere en verdi på 0 eller 1.
(8) Inndataelementet for brukssiden for knapper er utfylt med 13 andre biter.
(9) En annen generisk skrivebordsbruksside er angitt for å beskrive museposisjonen med aksene X og Y. Input-elementet består av to 8-bits felt med en verdi mellom -127 og 127.
(10) Pekersamlingen er lukket.
(11) Musesamlingen er stengt.
USB.org HID-side
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
37/174
Overview
USB Implementers Forum (USB-IF) tilbyr et verktøy kalt «HID Descriptor Tool» sammen med annen informasjon om rapportbeskrivelsesformatet. Se http://www.usb.org/developers/hidpage/ for mer informasjon.
Programmeringsveiledning for USB-enhet HID-klasse
Denne delen forklarer hvordan du bruker HID-klassen. Initialisere USB-enhetens HID-klasse Legge til en USB-enhets HID-klasseinstans på enheten din Kommunisere ved hjelp av USB-enhetens HID-klasse
Initialisere USB-enhetens HID-klasse
For å legge til HID-klassefunksjonalitet på enheten din, må du først initialisere klassen ved å kalle funksjonen sl_usbd_hid_init(). EksempletampLevel nedenfor viser hvordan du kaller sl_usbd_hid_init() ved hjelp av standardargumenter. Hvis du vil ha mer informasjon om konfigurasjonsargumentene som skal sendes til sl_usbd_hid_init(), kan du se Applikasjonsspesifikke konfigurasjoner for USB-enhets-HID-klasse.
Example – Kaller sl_usbd_hid_init()
sl_status_t status;
status = sl_usbd_hid_init(); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
Legge til en HID-klasseforekomst av en USB-enhet på enheten din
For å legge til HID-klassefunksjonalitet på enheten din, må du opprette en instans og deretter legge den til i enhetens konfigurasjon(er).
Opprette en HID-klasseinstans
Opprett en HID-klasseinstans ved å kalle funksjonen sl_usbd_hid_create_instance(). EksempletampLeksjonen nedenfor viser hvordan du oppretter en enkel musefunksjon via sl_usbd_hid_create_instance() ved hjelp av standardargumenter. Hvis du vil ha mer informasjon om konfigurasjonsargumentene som skal sendes til sl_usbd_hid_create_instance(), kan du se Konfigurasjoner av USB-enhets-HID-klasseinstanser.
Example – Legge til en musefunksjon via sl_usbd_hid_create_instance()
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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 }; Hensikt: } Tillegg: } Please provide the text and the two translations. The use of the functions in a partition or use the functions.
void app_usbd_hid_get_report_desc(uint8_t class_nbr, const uint8_t **p_report_ptr, uint16_t *p_report_len)
{ (void)klassenummer;
*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 rettigheter forbeholdt.
39/174
Overview
/* Det oppsto en feil. Feilhåndtering bør legges til her. */}
Legge til HID-klasseforekomsten i enhetens konfigurasjon(er) Etter at du har opprettet en HID-klasseforekomst, kan du legge den til i en konfigurasjon ved å kalle funksjonen
sl_usbd_hid_add_to_configuration().
EksampLevel nedenfor viser hvordan du kaller sl_usbd_hid_add_to_configuration().
Example – Kaller 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) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
(1) Klassenummer som skal legges til konfigurasjonen returnert av sl_usbd_hid_create_instance(). (2) Konfigurasjonsnummer (her legges det til i en Full-Speed-konfigurasjon).
Kommunikasjon ved hjelp av USB-enhetens HID-klasse
Klasseforekomstkommunikasjon Synkron kommunikasjon Klasseforekomstkommunikasjon HID-klassen tilbyr følgende funksjoner for å kommunisere med verten.
Tabell – Sammendrag av HID-kommunikasjons-API
Funksjonsnavn
sl_usb d _hid _read ad _sy nc() sl_usb d _hid _write _sy nc()
Operasjon Mottar data fra verten via avbrudds-UT-endepunktet. Denne funksjonen blokkerer. Sender data til verten via avbrudds-IN-endepunktet. Denne funksjonen blokkerer.
Synkron kommunikasjon Synkron kommunikasjon betyr at overføringen blokkeres. Ved funksjonskall blokkeres applikasjonen inntil overføringen er fullført med eller uten feil. En tidsavbrudd kan spesifiseres for å unngå evig venting. Eks.ampFiguren nedenfor viser en lese- og skriveprosess som mottar data fra verten ved hjelp av avbrudds-UT-endepunktet og sender data til verten ved hjelp av avbrudds-INN-endepunktet.
Example – Synkron HID-lesing og -skriving
__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(klassenummer,
(1)
(void *)rx_buf,
(2)
2u,
0u,
(3)
&xfer_len);
hvis (status ! SL_STATUS_OK) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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){/* Det oppsto en feil. Feilhåndtering bør legges til her. */}
status =sl_usbd_hid_write_sync(class_nbr,(1)(void *)tx_buf,(4)2u,0u,(3)&xfer_len);if(status !SL_STATUS_OK){/* Det oppsto en feil. Feilhåndtering bør legges til her. */}
(1) Klasseforekomstnummeret som ble opprettet fra sl_usbd_hid_create_instance() gir en intern referanse for HID-klassen for å rute overføringen til riktig avbrudds-UT- eller IN-endepunkt.
(2) Applikasjonen må sørge for at bufferen som er gitt til funksjonen er stor nok til å romme alle dataene. Ellers kan det oppstå synkroniseringsproblemer. Internt utføres leseoperasjonen enten med kontrollendepunktet eller med avbruddsendepunktet, avhengig av kontrollleseflagget som er satt når sl_usbd_hid_create_instance() kalles.
(3) For å unngå en uendelig blokkeringssituasjon kan en tidsavbruddsverdi uttrykt i millisekunder spesifiseres. En verdi på 809 får applikasjonsoppgaven til å vente i evigheter.
(4) Applikasjonen sørger for den initialiserte sendebufferen.
HID Periodiske inndatarapporter Oppgave
For å spare båndbredde har verten muligheten til å dempe rapporter fra et avbrudds-IN-endepunkt ved å begrense rapporteringsfrekvensen. For å gjøre dette må verten sende SET_IDLE-forespørselen. HID-klassen implementert av Silicon Labs inneholder en intern oppgave som respekterer rapporteringsfrekvensbegrensningen som du kan bruke på én eller flere inngangsrapporter. Figur Periodiske inngangsrapporter-oppgaver viser hvordan de periodiske inngangsrapportoppgavene fungerer.
Figur – Periodiske inndatarapporter
(1) Enheten mottar en SET_IDLE-forespørsel. Denne forespørselen angir en inaktiv varighet for en gitt rapport-ID. Hvis du vil ha mer informasjon om SET_IDLE-forespørselen, kan du se
(2) En rapport-ID-struktur (tildelt under initialiseringsfasen for HID-klassen) oppdateres med inaktivitetsvarigheten. En inaktivitetsvarighetsteller initialiseres med verdien for inaktivitetsvarigheten. Rapport-ID-strukturen settes inn på slutten av en lenket liste som inneholder ID-strukturer for inndatarapporter. Inaktivitetsvarighetsverdien uttrykkes i en enhet på 4 ms, som gir et område fra 4 til 1020 ms.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
41/174
Overview
Hvis inaktivitetsvarigheten er kortere enn pollingintervallet for avbrudds-IN-endepunktet, genereres rapportene ved pollingintervallet.
(3) Hver 4. ms blar den periodiske inndatarapportoppgaven gjennom listen over inndatarapport-IDer. For hver inndatarapport-ID utfører oppgaven én av to mulige operasjoner. Varigheten av oppgaveperioden samsvarer med 4 ms-enheten som brukes for inaktivitetsvarigheten. Hvis ingen SET_IDLE-forespørsler er sendt av verten, er listen over inndatarapport-IDer tom, og oppgaven har ingenting å behandle. Oppgaven behandler bare rapport-IDer som er forskjellige fra 0 og med en inaktivitetsvarighet som er større enn 0.
(4) For en gitt inputrapport-ID verifiserer oppgaven om inaktivitetstiden har utløpt. Hvis inaktivitetstiden ikke har utløpt, reduseres telleren, og ingen inputrapport sendes til verten.
(5) Hvis inaktivitetsvarigheten har utløpt (det vil si at inaktivitetsvarighetstelleren har nådd null), sendes en inputrapport til verten ved å kalle sl_usbd_hid_write_sync()-funksjonen via avbrudds-IN-endepunktet.
(6) Inndatarapportdataene som sendes av oppgaven kommer fra en intern databuffer som er allokert for hver inndatarapport beskrevet i rapportbeskrivelsen. En applikasjonsoppgave kan kalle sl_usbd_hid_write_sync()-funksjonen for å sende en inndatarapport. Etter at inndatarapportdataene er sendt, oppdaterer sl_usbd_hid_write_sync() den interne bufferen som er knyttet til en inndatarapport-ID med dataene som nettopp er sendt. Deretter sender den periodiske inndatarapportoppgaven alltid de samme inndatarapportdataene etter hver inaktivitetsperiode som er gått og inntil applikasjonsoppgaven oppdaterer dataene i den interne bufferen. Det finnes en låsemekanisme for å unngå at inndatarapport-ID-dataene blir ødelagt i tilfelle en endring skjer på nøyaktig samme tidspunkt som overføringen gjøres av den periodiske inndatarapportoppgaven.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
42/174
Overview
Overview
USB-enhet MSC-klasse
USB-enhet MSC-klasse overview USB-enhet MSC-klasse Ressursbehov fra kjernen Konfigurasjon av USB-enhet MSC-klasse Programmeringsveiledning for USB-enhet MSC-klasse Lagringsdrivere
Denne delen beskriver masselagringsenhetsklassen (MSC) som støttes av Silicon Labs USB-enhet. MSC er en protokoll som muliggjør overføring av informasjon mellom en USB-enhet og en vert. Informasjonen som overføres er alt som kan lagres elektronisk, for eksempel kjørbare programmer, kildekode, dokumenter, bilder, konfigurasjonsdata eller andre tekst- eller numeriske data. USB-enheten vises som et eksternt lagringsmedium for verten, noe som muliggjør overføring av files via dra og slipp.
A file systemet definerer hvordan fileer organisert i lagringsmediet. Spesifikasjonen for USB-masselagringsklassen krever ingen spesielle file system som skal brukes på kompatible enheter. I stedet gir det et enkelt grensesnitt for å lese og skrive datasektorer ved hjelp av det transparente kommandosettet Small Computer System Interface (SCSI). Som sådan kan operativsystemer behandle USB-stasjonen som en harddisk, og kan formatere den med hvilken som helst file systemet de liker.
USB-masselagringsenhetsklassen støtter to transportprotokoller, som følger:
Bulk-Only Transport (BOT) Control/Bulk/Interrupt (CBI) Transport (brukes kun for diskettstasjoner)
Masselagringsenhetsklassen implementerer det transparente SCSI-kommandosettet kun ved hjelp av BOT-protokollen, noe som betyr at bare massesluttpunkter vil bli brukt til å overføre data og statusinformasjon. MSC-implementeringen støtter flere logiske enheter.
MSC-implementeringen er i samsvar med følgende spesifikasjoner:
Spesifikasjon for universell seriell bussmasselagringsklasse overview, Revisjon 1.3 5. september 2008. Universal Serial Bus Mass Storage Class Bulk-Only Transport, revisjon 1.0 31. september 1999.
USB-enhet MSC aCl ss Overview
Protokollendepunkter Klasseforespørsler Small Computer System Interface (SCSI)
Protokoll
I denne delen skal vi diskutere Bulk-Only Transport (BOT)-protokollen i masselagringsklassen. Bulk-Only Transport-protokollen har tre stages:
Kommandotransporten Datatransporten Statustransporten
Masselagringskommandoer sendes av verten gjennom en struktur kalt Command Block Wrapper (CBW). For kommandoer som krever en datatransportstruktur...tage.g., verten vil forsøke å sende eller motta det nøyaktige antallet byte fra enheten som spesifisert av lengde- og flaggfeltene til CBW. Etter at datatransporten er fullførttage. verten prøver å motta en kommandostatusomslag (CSW) fra enheten som beskriver statusen til kommandoen samt eventuelle datarester (hvis
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
43/174
Overview
(any). For kommandoer som ikke inkluderer en datatransport-stage.g., verten forsøker å motta CSW-en direkte etter at CBW er sendt. Protokollen er beskrevet i figur – MSC-protokoll.
Figur – MSC-protokoll
endepunkter
På enhetssiden, i samsvar med BOT-spesifikasjonen, består MSC av følgende endepunkter: Et par kontroll-IN- og OUT-endepunkter kalt standardendepunkt. Et par bulk-IN- og OUT-endepunkter.
Tabellen nedenfor viser de ulike bruksområdene for endepunktene.
Tabell – Bruk av MSC-endepunkt
Endepunkt
Kontroll INN Kontroll UT Bulk INN Bulk UT
Retning
Enhet til vert Vert til enhet Enhet til vert Vert til enhet
Bruk
Opplisting og MSC-klassespesifikke forespørsler Opplisting og MSC-klassespesifikke forespørsler Send CSW og data Motta CBW og data
Forespørsler om klasser
Det er to definerte kontrollforespørsler for MSC BOT-protokollen. Disse forespørslene og beskrivelsene av dem er detaljert beskrevet i tabellen nedenfor.
Tabell – Forespørsler om masselagringsklasse
Forespørsler om klasser
Tilbakestilling av kun masselagring
Beskrivelse
Denne forespørselen brukes til å tilbakestille masselagringsenheten og dens tilhørende grensesnitt. Denne forespørselen klargjør enheten til å motta neste kommandoblokk.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
44/174
Overview
Forespørsler om klasser
Beskrivelse
Get Max Denne forespørselen brukes til å returnere det høyeste logiske enhetsnummeret (LUN) som støttes av enheten. For eksempelample, a
LUN
En enhet med LUN 0 og LUN 1 vil returnere verdien 1. En enhet med én logisk enhet vil returnere 0 eller stoppe
forespørsel. Maksimumsverdien som kan returneres er 15.
Lite datasystemgrensesnitt SCSI
På programmeringsgrensesnittnivå implementerer MSC-enheten en av standardprotokollene for lagringsmediekommunikasjon, som SCSI og SFF-8020i (ATAPI). «Programmeringsgrensesnittet» spesifiserer hvilken protokoll som er implementert, og hjelper vertsoperativsystemet med å laste inn den passende enhetsdriveren for kommunikasjon med USB-lagringsenheten. SCSI er den vanligste protokollen som brukes med USB MSC-lagringsenheter. Vi tilbyr en implementering for MSC SCSI-underklassen som våre GSDK-brukere kan bruke rett ut av esken.
SCSI er et sett med standarder for håndtering av kommunikasjon mellom datamaskiner og eksterne enheter. Disse standardene inkluderer kommandoer, protokoller, elektriske grensesnitt og optiske grensesnitt. Lagringsenheter som bruker andre maskinvaregrensesnitt, for eksempel USB, bruker SCSI-kommandoer for å innhente enhets-/vertsinformasjon og kontrollere enhetens drift og overføre datablokker i lagringsmediet.
SCSI-kommandoer dekker et bredt spekter av enhetstyper og funksjoner, og derfor trenger enheter et delsett av disse kommandoene. Generelt er følgende kommandoer nødvendige for grunnleggende kommunikasjon:
FORESPØRSEL LESEKAPASITET(10) LESING(10) FORESPØRSEL SENSERING TEST ENHET KLAR SKRIVING(10)
USB-enhet MSC-klasse ressursbehov fra kjernen
Hver gang du legger til en MSC-klasseinstans i en USB-konfigurasjon via funksjonen sl_usbd_msc_add_to_configuration(), vil følgende ressurser bli allokert fra kjernen.
Ressurs
Grensesnitt Alternative grensesnitt Endepunkter Grensesnittgrupper
Mengde
1 1 2 0
Merk at disse tallene er per konfigurasjon. Når du konfigurerer konfigurasjonsverdiene SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, må du ikke glemme å ta hensyn til hvor mange konfigurasjoner klassen skal legges til. For konfigurasjonsverdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, siden endepunkter bare åpnes når en konfigurasjon er angitt av verten, trenger du bare å ta hensyn til antall nødvendige endepunkter for en klasseinstans.
USB-enhet MSC-klassekonfigurasjon
To grupper med konfigurasjonsparametere brukes til å konfigurere MSC-klassen:
USB-enhet MSC-klasse Applikasjonsspesifikke konfigurasjoner USB-enhet MSC-klasse Konfigurasjon av logisk enhet
USB-enhet MSC-klasse Applikasjonsspesifikke konfigurasjoner
Klassekompileringstidskonfigurasjoner Oppretting av klasseinstanser
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
45/174
Overview
Konfigurasjoner for klassekompileringstid
MSC-klassen og SCSI-underklassen til Silicon Labs USB-enheten kan konfigureres ved kompilering via #defines som ligger i sl_usbd_core_config.h. file.
Tabell – Generiske konfigurasjonskonstanter
Konfigurasjonsnavn
Beskrivelse
SL_USBD_MSC_CLASS_INST Antall klasseforekomster du vil tildele via et kall til funksjonen
ANCE_QUANTITY
sl_usbd_msc_scsi_create_instance().
SL_USBD_MSC_CONFIGURA Nummer på konfigurasjonen som en klasseinstans kan legges til via et kall til
TION_QUANTITY
funksjonen sl_usbd_msc_scsi_add_to_configuration().
SL_USBD_MSC_LUN_QUANT Antall logiske enheter per klasseinstans som du vil legge til via et kall til
ITY
funksjonen sl_usbd_msc_scsi_lun_add().
SL_USBD_MSC_SCSI_64_BIT Aktiverer eller deaktiverer støtte for logisk blokkadresse (LBA) på 64 bits.
_LBA_EN
SL_USBD_MSC_DATA_BUFF Størrelse på databuffer per klasseforekomst i byte ER_SIZE
Standardverdi
2
1
2
0
512
Oppretting av klasseinstans
Du oppretter en MSC SCSI-klasseinstans for USB-enheter ved å kalle funksjonen sl_usbd_msc_scsi_create_instance(). Denne funksjonen tar ett konfigurasjonsargument som er beskrevet nedenfor.
p_scsi_tilbakekallinger
p_scsi_callbacks er en peker til en konfigurasjonsstruktur av typen sl_usbd_msc_scsi_callbacks_t. I tillegg til den vanlige usb-enhetsklassen tilbakekallinger connect/disconnect, gir den MSC-klassen et sett med valgfrie tilbakekallingsfunksjoner som kalles når en hendelse inntreffer på den logiske enheten. En nullpeker (NULL) kan sendes til dette argumentet hvis ingen tilbakekallinger er nødvendig.
Tabellen nedenfor beskriver hvert konfigurasjonsfelt som er tilgjengelig i denne konfigurasjonsstrukturen.
Tabell – sl_usbd_msc_scsi_callbacks_t Konfigurasjonsstruktur
Felter
Beskrivelse
.aktiver
Kalles når USB-klasseinstansen er aktivert.
.disable Kalles når USB-klasseinstansen er deaktivert.
.host_eject Funksjon som kalles når en logisk enhet kastes ut fra verten.
Funksjonssignatur
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);
Konfigurasjon av logisk enhet for USB-enhet MSC-klasse
Å legge til en logisk enhet til en MSC-klasseinstans gjøres ved å kalle funksjonen sl_usbd_msc_lun_add(). Denne funksjonen tar ett konfigurasjonsargument som er beskrevet nedenfor.
p_lu_info
p_lu_info er en peker til en struktur av typen sl_usbd_msc_scsi_lun_info_t. Hensikten er å gi informasjon om den logiske enheten til MSC-klassen.
Tabellen nedenfor beskriver hvert konfigurasjonsfelt som er tilgjengelig i denne konfigurasjonsstrukturen.
Tabell – sl_usbd_msc_scsi_lun_info_t Konfigurasjonsstruktur
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
46/174
Overview
Felt
Beskrivelse
Felt
.scsi_lun_api_p tr
Beskrivelse
Peker til mediedriver-API-et som skal håndtere denne logiske enheten. Se USB-enhets MSC-klasselagringsdrivere for mer informasjon om lagringsdrivere.
.ve nd o r_id _ p tr
.produkt_id_ptr
.p r o d ukt_ revisjon_nivå .er_ les_kun
Peker til en streng som inneholder leverandør-ID-en til den logiske enheten. Maksimal lengde på strengen er 8 tegn. Peker til en streng som inneholder produkt-ID-en til den logiske enheten. Maksimal lengde på strengen er 16 tegn. Produktrevisjonsnivå.
Flagg som angir om den logiske enheten skal sees som skrivebeskyttet fra punktet view av verten (sant) eller ikke (usant).
USB-enhet MSC-klasseprogrammeringsveiledning
Denne delen forklarer hvordan du bruker MSC-klassen.
Initialisere USB-enhetsklassen MSC Legge til en USB-enhetsklasse MSC SCSI-forekomst på enheten din Håndtering av logiske enheter for USB-enhetsklassen MSC
Initialisere USB-enhetens MSC-klasse
For å legge til MSC SCSI-klassefunksjonalitet på enheten din, initialiser først MSC-basisklassen og SCSI-underklassen ved å kalle funksjonene sl_usbd_msc_init() og sl_usbd_msc_scsi_init().
EksampLevel nedenfor viser hvordan du kaller sl_usbd_msc_init() og sl_usbd_msc_scsi_init().
Example – Kaller sl_usbd_msc_init() og sl_usbd_msc_scsi_init()
sl_status_t status;
status = sl_usbd_msc_init(); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
status = sl_usbd_msc_scsi_init(); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
Legge til en USB-enhets MSC SCSI-klasseinstans på enheten din
For å legge til MSC SCSI-klassefunksjonalitet på enheten din, må du først opprette en instans og deretter legge den til i enhetens konfigurasjon(er). Du må legge til minst én logisk enhet i instansen din.
Opprette en MSC SCSI-klasseinstans
Opprett en MSC SCSI-klasseinstans ved å kalle funksjonen sl_usbd_msc_scsi_create_instance().
EksampLeksjonen nedenfor viser hvordan du kaller sl_usbd_msc_scsi_create_instance() ved hjelp av standardargumenter. Hvis du vil ha mer informasjon om konfigurasjonsargumentene som skal sendes til sl_usbd_msc_scsi_create_instance(), kan du se Applikasjonsspesifikke konfigurasjoner for USB-enhet MSC-klasse.
Example – Kaller sl_usbd_ msc_scsi_create_instance()
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
47/174
Overview
uint8_t klasse_nbr; sl_status_t status;
sl_usbd_msc_scsi_callbacks_t app_usbd_msc_scsi_callbacks = { .enable = NULL, .disable = NULL, .host_eject = NULL }; Hvis du bruker denne funksjonen, kan du bruke denne funksjonen til å fjerne alle funksjonene.
status = sl_usbd_msc_scsi_create_instance(&app_usbd_msc_scsi_callbacks,0 &class_nbr);
hvis (status ! SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */ }
Legge til MSC-klasseinstansen i enhetens konfigurasjon(er)
Etter at du har opprettet en MSC-klasseinstans, kan du legge den til i en konfigurasjon ved å kalle funksjonen
sl_usbd_msc_add_to_configuration().
EksampLevel nedenfor viser hvordan du kaller sl_usbd_msc_scsi_add_to_configuration() ved hjelp av standardargumenter.
Example – Kaller 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) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
(1) Klassenummer som skal legges til konfigurasjonen returnert av sl_usbd_msc_scsi_create_instance(). (32) Konfigurasjonsnummer (her legges det til i en fullhastighetskonfigurasjon).
USB-enhet MSC-klasse logisk enhetshåndtering
Legge til en logisk enhet Koble til/fra et lagringsmedium
Legge til en logisk enhet
Når du legger til en logisk enhet i MSC SCSI-klasseinstansen din, må den være bundet til et lagringsmedium (RAMDisk, SD-kort, flashminne osv.). MSC-klassen bruker en lagringsdriver for å kommunisere med lagringsmedier. Denne driveren må leveres når du legger til den logiske enheten.
EksampLevel nedenfor viser hvordan du legger til en logisk enhet via sl_usbd_msc_scsi_lun_add().
Example – Legge til en logisk enhet via sl_usbd_msc_scsi_lun_add()
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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
= "blokkeringsenhet f.eks.ample”;
lu_info.produktrevisjonsnivå = 0x1000u;
lu_info.er_skrivebeskyttet
= usann;
status = sl_usbd_msc_scsi_lun_add(klassenummer, &lu_info, &lu_object_ptr);
hvis (status ! SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */ }
Feste/frakoble et lagringsmedium
Etter at den logiske enheten er lagt til, må et lagringsmedium kobles til for å være tilgjengelig fra vertssiden. MSC-klassen tilbyr to funksjoner for å kontrollere lagringsmediets tilknytning til den logiske enheten: sl_usbd_msc_scsi_lun_attach() og sl_usbd_msc_scsi_lun_detach(). Disse funksjonene lar deg emulere fjerningen av en lagringsenhet for å få tilgang igjen fra den innebygde applikasjonen om nødvendig.
EksampLevel nedenfor viser hvordan du bruker funksjonene sl_usbd_msc_scsi_lun_attach() og sl_usbd_msc_scsi_lun_detach().
Example – Feste/løsne medier
sl_status_t status;
status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
…
(1)
status = sl_usbd_msc_scsi_lun_detach(lu_object_ptr); hvis (status !SL_STATUS_OK) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
…
(2)
status = sl_usbd_msc_scsi_lun_attach(lu_object_ptr) hvis (status !SL_STATUS_OK) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
…
(3)
(1) Fra dette øyeblikket, hvis MSC-enheten er koblet til en vert, er lagringsmediet tilgjengelig.
(2) Hvis MSC-enheten er koblet til en vert, vil mediet nå vises som utilgjengelig. I dette øyeblikket kan operasjoner utføres på mediet fra den innebygde applikasjonen.
(3) Igjen, hvis MSC-enheten er koblet til verten, vil lagringsmediet vises som tilkoblet.
USB-enhet MSC-klasse lagringsdrivere
USB-enheten MSC-klassen trenger en lagringsdriver for å kommunisere med et lagringsmedium. For øyeblikket tilbyr ikke Silicon Labs drivere.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
49/174
Overview
TPY aa Driveren AI er definert av typedef sl_usbd_msc_scsi_lun_api_t. Vår sl_usbd_msc_scsi_lun_api_t-fil må inkluderes for å aaaaaaaa din sl_usbd_msc_scsi_lun_info_t-fil, bruk argumentet når du legger til logikkenheten med sl_usbd_msc_scsi_lun_add(). Se avsnittet USB-enhet MSC SCSI API for mer informasjon om strukturene. Implementeringen av lagringsdriveren kan være så enkel som en matrise med sektorer i RAM. Typisk sektorstørrelse (dvs. blokkstørrelse) er 512 for masselagringsenheter og 2048 for CD-ROM-er.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
50/174
Overview
Overview
USB-enhetsleverandørklasse
USB-enhetsleverandørens klasse overview Ressursbehov for USB-enhetsleverandørklasse fra kjernen Konfigurasjon av USB-enhetsleverandørklasse Programmeringsveiledning for USB-enhetsleverandørklasse Vendor-klassen lar deg bygge leverandørspesifikke enheter som kan implementere en proprietær protokoll. Den er avhengig av et par masse-endepunkter for å overføre data mellom verten og enheten. Masseoverføringer er praktiske for å overføre store mengder ustrukturerte data og gir en pålitelig utveksling av data ved å bruke en mekanisme for feildeteksjon og nytt forsøk. I tillegg til masse-endepunkter kan Vendor-klassen også bruke et valgfritt par avbruddsendepunkter. Ethvert operativsystem (OS) kan fungere med Vendor-klassen, forutsatt at operativsystemet har en driver for å håndtere Vendor-klassen. Avhengig av operativsystemet kan driveren være innebygd eller leverandørspesifikk. For eksempel, under Microsoft Windows®, samhandler applikasjonen din med WinUSB-driveren levert av Microsoft for å kommunisere med leverandørenheten.
USB-enhetsleverandørens klasse overview
Figur – Generell arkitektur mellom Windows-vert og leverandørklasse viser den generelle arkitekturen mellom verten og enheten ved bruk av leverandørklassen. I dette eksempletampe.g., vertsoperativsystemet er MS Windows.
Figur – Generell arkitektur mellom MS Windows-vert og leverandørklasse
På MS Windows-siden kommuniserer applikasjonen med leverandørens enhet ved å samhandle med et USB-bibliotek. Biblioteker, som libusb, tilbyr et API for å administrere en enhet og tilhørende rør, og for å kommunisere med enheten gjennom kontroll-, bulk- og avbruddsendepunkter.
På enhetssiden består leverandørklassen av følgende endepunkter:
Et par kontroll-INN- og UT-endepunkter kalt standardendepunktet. Et par bulk-INN- og UT-endepunkter.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
51/174
Overview
Et par avbrytende IN- og OUT-endepunkter. Dette paret er valgfritt. Tabellen nedenfor viser bruken av de forskjellige endepunktene:
Tabell – Bruk av leverandørklasse-endepunkter
Endepunktretning
Kontroller IN
Kontroll
UTE
Masseinnsending
Enhet-til-vert
>Vert-til-enhet
Enhet-til-vert
Masse UT
Avbryt INN
Avbryte
UTE
Vert-til-enhet
Enhet-til-vert
Vert-til-enhet
Bruk
Standardforespørsler om opplisting og leverandørspesifikke forespørsler.
Standardforespørsler om opplisting og leverandørspesifikke forespørsler.
Rådatakommunikasjon. Data kan struktureres i henhold til en proprietær protokoll.
Rådatakommunikasjon. Data kan struktureres i henhold til en proprietær protokoll.
Rådatakommunikasjon eller varsling. Data kan struktureres i henhold til en proprietær protokoll. Rådatakommunikasjon eller varsling. Data kan struktureres i henhold til en proprietær protokoll.
Enhetsapplikasjonen kan bruke masse- og avbruddsendepunkter for å sende eller motta data til eller fra verten. Den kan bare bruke standardendepunktet til å dekode leverandørspesifikke forespørsler sendt av verten. Standardforespørslene administreres internt av kjernelaget i Silicon Labs USB-enhet.
Ressursbehov for USB-enhetsleverandørklasse fra Core
Hver gang du legger til en leverandørklasseinstans i en konfigurasjon via funksjonen sl_usbd_vendor_add_to_configuration(), vil følgende ressurser bli allokert fra kjernen.
Ressurs
Grensesnitt Alternative grensesnitt Endepunkter Grensesnittgrupper
Mengde
1 1 2 (4 hvis du aktiverte avbruddsendepunkter) 0
Merk at disse tallene er per konfigurasjon. Når du konfigurerer konfigurasjonsverdiene SL_USBD_INTERFACE_QUANTITY, SL_USBD_ALT_INTERFACE_QUANTITY, SL_USBD_INTERFACE_GROUP_QUANTITY og SL_USBD_DESCRIPTOR_QUANTITY, må du ikke glemme å ta hensyn til hvor mange konfigurasjoner klassen skal legges til. For konfigurasjonsverdien SL_USBD_OPEN_ENDPOINTS_QUANTITY, siden endepunkter bare åpnes når en konfigurasjon er angitt av verten, trenger du bare å ta hensyn til antall nødvendige endepunkter for en klasseinstans.
Konfigurasjon av USB-enhetsleverandørklasse
To grupper med konfigurasjonsparametere brukes til å konfigurere leverandørklassen:
USB-enhetsleverandørklasse Applikasjonsspesifikke konfigurasjoner Konfigurasjoner av USB-enhetsleverandørklasseforekomster
USB-enhetsleverandørklasse Applikasjonsspesifikke konfigurasjoner
For å bruke Silicon Labs USB-enhetsleverandørklassemodul, juster først leverandørens kompileringstidskonfigurasjonsdefinisjoner i henhold til applikasjonens behov. De er omgruppert i sl_usbd_core_config.h-headeren. file under Leverandør-delen. Formålet med mengdekonfigurasjonene er å informere USB-enhetsmodulen om hvor mange USB-leverandørobjekter som skal tildeles.
Tabellen nedenfor beskriver hver konfigurasjonsdefinisjon.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
52/174
Overview
Tabell – Definerer konfigurasjon fra leverandør av USB-enheter
Konfigurasjonsnavn
Beskrivelse
Standardverdi
SL_USBD_VENDOR_CLASS_INSTANCE_QUANTITY Antall klasseinstanser du vil tildele via et kall til funksjonen sl_usbd_vendor_create_instance().
SL_USBD_VENDOR_CONFIGURATION_QUANTITY Antall konfigurasjoner. Leverandørklasseforekomster kan legges til én eller flere konfigurasjoner via et kall til funksjonen sl_usbd_vendor_add_to_configuration().
Konfigurasjoner av USB-enhetsleverandørklasseforekomster
Denne delen definerer konfigurasjonene knyttet til Vendor-klasseforekomstene.
Klasseforekomstoppretting intr_en intervall p_vendor_callbacks
Oppretting av klasseinstans
Du oppretter en Vendor-klasseinstans ved å kalle funksjonen sl_usbd_vendor_create_instance(), som tar tre konfigurasjonsargumenter som er beskrevet nedenfor.
intr_en
Boolsk verdi som indikerer om et par avbruddsendepunkter skal legges til eller ikke.
Verdi
sant usant
Beskrivelse
Et par IN/OUT-endepunkter vil bli lagt til og gjort tilgjengelige for den innebygde applikasjonen. Ingen avbruddsendepunkter vil bli lagt til. Bare et par Bulk IN/OUT-endepunkter vil være tilgjengelige.
intervall
Hvis du setter intr_en til true, kan du spesifisere avspørringsintervallet for avbruddsendepunktene (i millisekunder). Hvis du setter intr_en til false, kan du sette interval til 0, da det vil bli ignorert av klassen.
p_vendor_tilbakekallinger
p_vendor_callbacks er en peker til en strukturvariabel for tilbakekallingsfunksjoner som du kan spesifisere for å håndtere klassespesifikke kontrollforespørsler. Hvis du ikke bruker noen klassespesifikke forespørsler eller trenger å aktivere/deaktivere varsling, kan du sette denne til NULL.
EksampFilen nedenfor viser den forventede signaturen til din klassespesifikke forespørselsbehandler.
Example – Signatur av klassespesifikk forespørselsfunksjon
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ørklasseforekomstnummer.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
53/174
Overview
(2) Peker til en mottatt oppsettforespørsel fra verten.
Programmeringsveiledning for USB-enhetsleverandørklasse
Denne delen forklarer hvordan du bruker Vendor-klassen. Initialisere USB-enhetsleverandørklassen Legge til en USB-enhetsleverandørklasseinstans på enheten din Kommunisere ved hjelp av USB-enhetsleverandørklassen
Initialiserer USB-enhetsleverandørklassen
For å legge til en leverandørklassefunksjonalitet på enheten din, initialiser først klassen ved å kalle funksjonen USBD_Vendor_Init(). Eks.ampLevel nedenfor viser hvordan du kaller sl_usbd_vendor_init().
Example – Kaller sl_usbd_vendor_init()
sl_status_t status;
status = sl_usbd_vendor_init(); if (status !SL_STATUS_OK) { /* Det oppsto en feil. Feilhåndtering bør legges til her. */ }
Legge til en USB-enhetsleverandørklasseinstans på enheten din
For å legge til leverandørklassefunksjonalitet på enheten din, må du først opprette en instans og deretter legge den til i enhetens konfigurasjon(er).
Opprette en leverandørklasseinstans Legge til leverandørklasseinstansen i enhetens konfigurasjon(er)
Opprette en leverandørklasseinstans
Opprett en Vendor-klasseinstans ved å kalle funksjonen sl_usbd_vendor_create_instance(). EksempletampLeksjonen nedenfor viser hvordan du kaller sl_usbd_vendor_create_instance() ved hjelp av standardargumenter. Hvis du vil ha mer informasjon om konfigurasjonsargumentene som skal sendes til sl_usbd_vendor_create_instance(), kan du se Konfigurasjoner av USB-enhetsleverandørklasseinstanser.
Example – Kaller sl_usbd_vendor_create_instance()
uint8_t klasse_nbr; 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) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
(1) Ingen avbruddsendepunkter med denne klasseinstansen. (2) Intervall ignoreres siden avbruddsendepunkter er deaktivert.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
54/174
Overview
(3) Tilbakekallsfunksjon som er en del av applikasjonen din som håndterer leverandørspesifikke klasseforespørsler. Se Kommunikasjon ved hjelp av USB-enhetsleverandørklassen for mer informasjon. Legge til leverandørklasseforekomsten i enhetens konfigurasjon(er) Etter at du har opprettet en leverandørklasseforekomst, kan du legge den til i en konfigurasjon ved å kalle funksjonen USBD_Vendor_ConfigAdd(). Eks.ampLevel nedenfor viser hvordan du kaller sl_usbd_vendor_add_to_configuration() ved hjelp av standardargumenter.
Example – Kaller 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) {
/* Det oppsto en feil. Feilhåndtering bør legges til her. */
}
(1) Klassenummer som skal legges til konfigurasjonen returnert av sl_usbd_vendor_create_instance(). (2) Konfigurasjonsnummer (her legges det til i en fullhastighetskonfigurasjon).
Kommunikasjon ved hjelp av USB-enhetsleverandørklassen
Generell synkron kommunikasjon Asynkron kommunikasjon Leverandørforespørsel Generelt Leverandør-klassen tilbyr følgende funksjoner for å kommunisere med verten. Hvis du vil ha mer informasjon om parameterne til funksjonen, kan du se USB-enhetsleverandør-API.
Tabell – Sammendrag av leverandørkommunikasjons-API
Funksjonsnavn
sl_usb d _v e nd o r_ re ad _b ulk_sy nc() sl_usb d _v e nd o r_write _b ulk_sy nc() sl_usb d _v e nd o r_ re ad _b ulk_asy nc() sl_usb d _v e nd o r_write _b ulk_asy nc() sl_usb d _v e nd o r_ re ad _inte rrup t_sy nc() sl_usb d _v e nd o r_write _inte rrup t_sy nc() sl_usb d _v e nd o r_ re ad _inte rrup t_asy nc
()
sl_usb d _v e nd o r_write _inte rrup t_asy nc
()
Operation Receives data from host through bulk OUT endpoint. This function is blocking. Sends data to host through bulk IN endpoint. This function is blocking. Receives data from host through bulk OUT endpoint. This function is non-blocking. Sends data to host through bulk IN endpoint. This function is non-blocking. Receives data from host through interrupt OUT endpoint. This function is blocking. Sends data to host through interrupt IN endpoint. This function is blocking. Receives data from host through interrupt OUT endpoint. This function is non-
blokkering.
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 rettigheter forbeholdt.
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 feilen. */
}
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 feilen. */
}
(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) Applikasjonen sørger for den initialiserte sendebufferen.
(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 kommunikasjon
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 rettigheter forbeholdt.
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 feilen. */
}
status = sl_usbd_vendor_write_bulk_async(class_nbr,
(void *)&tx_buf[0],
(5)
2u,
app_usbd_vendor_tx_completed,
NULL,
(4)
false);
(6)
hvis (status ! SL_STATUS_OK) {
/* $$$$ Håndter feilen. */
}
}
(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. */
} annet {
/* $$$$ Håndter feilen. */
}
}
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. */
} annet {
/* $$$$ Håndter feilen. */
}
}
(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 rettigheter forbeholdt.
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 rettigheter forbeholdt.
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;
misligholde:
(6)
// Request is not supported.
Copyright © 2025 Silicon Laboratories. Alle rettigheter forbeholdt.
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 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 rettigheter forbeholdt.
60/174
API-dokumentasjon
API-dokumentasjon
API-dokumentasjon
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 rettigheter forbeholdt.
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 rettigheter forbeholdt.
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
Funksjoner
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 rettigheter forbeholdt.
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 rettigheter forbeholdt.
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.
Parametere
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.
Parametere
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 rettigheter forbeholdt.
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.
Parametere
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 / Ressurser
![]() |
SILICON LABS USB Device Stack [pdf] Bruksanvisning USB Device Stack, Device Stack, Stack |