USB Core er et Linux -kerneundersystem designet til at understøtte USB -enheder og USB-buscontrollere. Formålet med dets oprettelse er at abstrahere fra hardwareimplementeringen af USB-standarden (eller hardwareafhængige funktioner) ved at definere et sæt datastrukturer, makroer og funktioner.
USB-understøttelse blev tilføjet til Linux-kernen kort efter 2.2-kernegrenen og kort før 2.3-linjen blev startet. Udviklinger fra 2.3-linjen blev jævnligt overført til 2.2-linjen, hvorved der blev tilføjet nye funktioner, såsom hot plug-support, nye drivere og arbejdsoptimering. 2.5-kernelinjen arvede alle disse forbedringer, og de tilføjede understøttelse af arbejde med USB 2.0 og som et resultat højere ydeevne, mere stabil drift mellem enheder, forenkling af applikationsgrænsefladen (det blev sværere at lave fejl i koden) , samt vedligeholde intern dokumentation.
Siden evnen til at køre Linux over tid er dukket op på mange medieenheder, er USB-understøttelse i Linux under udviklingen blevet opdelt i to dele. På den ene side kan Linux køres fra USB-enheder tilsluttet enheden (for eksempel flashdrev), på den anden side kan Linux også køre på hovedcomputeren, som USB-enheder er tilsluttet. De anvendte USB-drivere er meget forskellige, så for at skelne mellem dem blev det passende navn for enhedsdriverne introduceret . gadgetdrivere [1] .
I kernen får værts-OS-driverne adgang til USB Core API'erne. Der er to typer USB Core offentlige API'er, der er målrettet mod to forskellige niveauer af USB-driveren: drivere til generelle formål, der er tilgængelige via driverrammer såsom blok-, karakter- eller netværksenheder, og drivere, der er en del af kernen og er involveret i styring af USB-bussen. Sådanne kernedrivere inkluderer en hub-driver, der styrer et træ af USB-enheder, samt flere forskellige typer værtscontroller-drivere ( eng. host controller driver , forkortelse HCD), som styrer individuelle busser.
Metoden til at bestemme den bedste måde for drivere at arbejde med en USB-enhed er ret kompliceret:
De eneste værts-OS-drivere, der faktisk får adgang til enheden (læse/skrive-registre, afbrydelseshåndtering osv.) er værtscontroller-driverne. I teorien understøtter alle værtscontroller-drivere lignende funktionalitet ved brug af en enkelt applikationsgrænseflade. I praksis begyndte dette først at blive understøttet i kerneversion 2.5, men der er forskelle i fejlhåndtering [2] .
Standard Application Programming Interfaces (API'er), der følger med USB Core [3] er anført nedenfor .
Navn | Funktioner |
---|---|
usb_init_urb | Initialiserer URB'er til senere brug af USB-driveren |
usb_alloc_urb | Opretter en ny URB til senere brug af USB-driveren |
usb_free_urb | Frigiver den hukommelse, der er optaget af URB'en, når alle brugere er færdige med at bruge den. |
usb_get_urb | Øger URB-referenceantallet |
usb_submit_urb | Sender en asynkron overførselsanmodning til en slutenhed |
usb_unlink_urb | Afbryder/annullerer overførselsanmodningen til slutenheden |
usb_kill_urb | Annullerer overførselsanmodningen og venter på, at den er fuldført |
usb_control_msg | Opretter en URB-kontrolmeddelelse, sender den ud og venter på udførelse |
usb_bulk_msg | Opretter en generisk URB-meddelelse, sender den ud og venter på udførelse |
usb_sg_init | Initialiserer en generel I/O eller afbrydelsesanmodning baseret på en distribueret liste |
usb_sg_wait | Udfører split/join-forespørgsel synkront |
usb_sg_cancel | Stopper split/flet I/O initieret af usb_sg_wait |
usb_get_descriptor | Sender en generisk anmodning om get descriptor (GET_DESCRIPTOR) |
usb_streng | Returnerer en strengdeskriptor i ISO 8859-1-format |
usb_get_status | Sender et GET_STATUS-opkald |
usb_clear_halt | Meddeler enheden om at nulstille den afventende tilstand for slutenheden |
usb_set_interface | Gør en alternativ forudindstilling aktiv |
usb_reset_configuration | Software genstart af enheden |
usb_register_dev | Registrerer en USB-enhed og beder om et mindre nummer |
usb_deregister_dev | Afregistrerer USB-enhedens dynamiske undernummer |
usb_match_id | Finder det første matchende usb_device_id for en enhed eller grænseflade |
usb_register_driver | Registrerer USB-driveren |
usb_afregistrer | Afregistrerer USB-driveren |
usb_ifnum_to_if | Henter grænsefladeobjektet for det givne grænsefladenummer |
usb_altnum_to_altsetting | Henter den alternative indstillingsstruktur for det givne grænsefladenummer |
usb_driver_claim_interface | Binder en driver til en grænseflade |
usb_driver_release_interface | Frigør driveren fra grænsefladen |
usb_find_interface | Finder usb_interface-markøren til driveren og enheden |
usb_get_dev | Øger referencetallet for USB-enhedsstrukturen |
usb_put_dev | Frigiver den brugte struktur af USB-enheden |
usb_get_intf | Øger referencetallet for USB-interfacestrukturen |
usb_put_intf | Frigiver den brugte USB-interfacestruktur |
usb_lock_device_for_reset | Pålægger korrekt en lås på enheden til efterfølgende genstart |
usb_find_enhed | Finder den nødvendige USB-enhed i systemet |
usb_get_current_frame_number | Returnerer nummeret på den aktuelle busramme |
usb_buffer_alloc | Tildeler en DMA-kompatibel buffer til at placere URB_NO_xxx_DMA_MAP |
usb_buffer_free | Frigiver hukommelse tildelt med usb_buffer_alloc |
usb_buffer_map | Opretter DMA-bindinger til URB |
usb_buffer_dmasync | Synkroniserer browsing af DMA-buffere og CPU |
usb_buffer_unmap | Bryder DMA-bindinger til URB |
usb_buffer_map_sg | Opretter distribuerede DMA-bindinger til slutpunkter |
usb_buffer_dmasync_sg | Synkroniserer visning af distribuerede DMA-buffere og CPU'en |
usb_buffer_unmap_sg | Bryder distribuerede DMA-bindinger |
usb_hub_tt_clear_buffer | Nulstiller kontrol/bulk-tilstand i højhastighedshub |
usb_root_hub_lost_power | Kaldes af HCD, når rodhubben mister Vbus-strøm. |
usb_reset_device | Genstarter USB-porten for at geninitialisere enheden |
Der er to hoved I/O-modeller i USB API. Den enkleste model er asynkron: chauffører sender anmodningen som en URB, og derefter fuldfører URB-tilbagekaldet i næste trin operationen. Alle typer USB-overførsler understøtter denne model, dog er der specielle modeller til kontrol-URB'er (som altid har deres egne indstillinger og statusser, men ikke altid har mulighed for datatrin ) og isokrone URB'er (som tillader overførsel af store pakker og inkluderer rapportering om hver dårlig pakke.) Sådanne modeller er bygget op omkring understøttelse af en synkron API, hvor driveren kalder en rutine, der allokerer en eller flere URB'er i hukommelsen, sender dem og venter på, at de er færdige. Der er også synkrone wrappers til enkeltbufferkontrol og bulkoverførsler (som er ubelejligt til brug i nogle scenarier for nedlukning af drivere), samt til streaming baseret på distribuerede lister (streaming eller afbrudt).
USB-drivere kræver buffere, der kan bruges til direkte hukommelsesadgang (DMA), selvom de ikke behøver at lave deres egen DMA-binding. Der er API'er, der kan bruges ved tildeling af DMA-buffere, fordi de kan forhindre forkerte buffere i at blive brugt på nogle systemer. I nogle tilfælde kan drivere bruge 64-bit DMA-tilstand til at overvinde andre typer bufferbegrænsninger [3] .