USB-kerne

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.

Udviklingshistorie

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] .

Sådan virker det

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] .

Liste over standardapplikationsgrænseflader

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

USB API-modeller

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] .

Noter

  1. Introduktion til USB på Linux Arkiveret 18. maj 2009.  (Engelsk)
  2. USB Host-Side API-model arkiveret 19. maj 2009.  (Engelsk)
  3. 1 2 USB Core API'er Arkiveret 1. maj 2010.  (Engelsk)

Links