USB-kärna

USB Core är ett Linux  -kärnundersystem designat för att stödja USB- enheter och USB-busskontroller. Syftet med dess skapelse är att abstrahera från hårdvaruimplementeringen av USB-standarden (eller hårdvaruberoende funktioner) genom att definiera en uppsättning datastrukturer, makron och funktioner.

Utvecklingshistorik

USB-stöd lades till i Linux-kärnan strax efter 2.2-kärngrenen och strax innan 2.3-linjen startades. Utvecklingar från 2.3-linjen överfördes regelbundet till 2.2-linjen och lade därigenom till nya funktioner, såsom hot plug-stöd, nya drivrutiner och arbetsoptimering. 2.5-kärnlinjen ärvde alla dessa förbättringar, och de lade till stöd för att arbeta med USB 2.0 och som ett resultat högre prestanda, mer stabil drift mellan enheter, förenkling av applikationsgränssnittet (det blev svårare att göra fel i koden) , samt underhålla intern dokumentation.

Eftersom möjligheten att köra Linux över tid har dykt upp på många mediaenheter, har USB-stödet i Linux under dess utveckling delats upp i två delar. Å ena sidan kan Linux köras från USB-enheter anslutna till enheten (till exempel flash-enheter), å andra sidan kan Linux även köras på huvuddatorn som USB-enheter är anslutna till. USB-drivrutinerna som används är mycket olika, så för att skilja mellan dem introducerades det lämpliga namnet för enhetsdrivrutinerna .  pryldrivare [1] .

Hur det fungerar

Inom kärnan har värdoperativsystemets drivrutiner åtkomst till USB Core API:erna. Det finns två typer av USB Core publika API:er som är inriktade på två olika nivåer av USB-drivrutinen: drivrutiner för allmänna ändamål som är tillgängliga via drivrutinsramverk som block, tecken eller nätverksenheter, och drivrutiner som är en del av kärnan och är involverade i hantera USB-bussen. Sådana kärndrivrutiner inkluderar en navdrivrutin som hanterar ett träd av USB-enheter, såväl som flera olika typer av värdstyrenhetsdrivrutiner ( eng.  host controller driver , förkortning HCD ), som styr individuella bussar.

Metoden för att bestämma det bästa sättet för drivrutiner att arbeta med en USB-enhet är ganska komplex:

De enda drivrutiner för värdoperativsystem som faktiskt har åtkomst till enheten (läs/skrivregister, avbrottshantering, etc.) är värdstyrenhetens drivrutiner. I teorin stöder alla värdstyrenhetsdrivrutiner liknande funktionalitet genom att använda ett enda applikationsgränssnitt. I praktiken började detta stödjas först i kärnversion 2.5, men det finns skillnader i felhantering [2] .

Lista över standardapplikationsgränssnitt

De vanliga API:erna (Application Programming Interfaces) som ingår i USB Core [3] listas nedan .

namn Funktioner
usb_init_urb Initierar URB:er för senare användning av USB-drivrutinen
usb_alloc_urb Skapar en ny URB för senare användning av USB-drivrutinen
usb_free_urb Frigör minnet som upptas av URB:n när alla användare har slutat använda det.
usb_get_urb Ökar URB-referensantalet
usb_submit_urb Skickar en asynkron överföringsbegäran till en slutenhet
usb_unlink_urb Avbryter/avbryter överföringsbegäran till slutenheten
usb_kill_urb Avbryter överföringsbegäran och väntar på att den ska slutföras
usb_control_msg Skapar ett URB-kontrollmeddelande, skickar ut det och väntar på exekvering
usb_bulk_msg Skapar ett generiskt URB-meddelande, skickar ut det och väntar på exekvering
usb_sg_init Initierar en allmän I/O- eller avbrottsbegäran baserat på en distribuerad lista
usb_sg_wait Exekverar split/join-fråga synkront
usb_sg_cancel Stoppar split/merge I/O initierad av usb_sg_wait
usb_get_descriptor Skickar en generisk begäran om get descriptor (GET_DESCRIPTOR)
usb_string Returnerar en strängbeskrivning i formatet ISO 8859-1
usb_get_status Skickar ett GET_STATUS-samtal
usb_clear_halt Meddelar enheten att återställa väntande tillstånd för slutenheten
usb_set_interface Gör en alternativ förinställning aktiv
usb_reset_configuration Programvara omstart av enheten
usb_register_dev Registrerar en USB-enhet och ber om ett mindre nummer
usb_deregister_dev Avregistrerar USB-enhetens dynamiska undernummer
usb_match_id Hittar det första matchande usb_device_id för en enhet eller gränssnitt
usb_register_drivrutin Registrerar USB-drivrutinen
usb_avregistrera Avregistrerar USB-drivrutinen
usb_ifnum_to_if Hämtar gränssnittsobjektet för det givna gränssnittsnumret
usb_altnum_to_altsetting Hämtar den alternativa inställningsstrukturen för det givna gränssnittsnumret
usb_driver_claim_interface Binder en drivrutin till ett gränssnitt
usb_driver_release_interface Kopplar bort drivrutinen från gränssnittet
usb_find_interface Hittar usb_interface-pekaren för drivrutinen och enheten
usb_get_dev Ökar referenstalet för USB-enhetsstrukturen
usb_put_dev Frigör USB-enhetens använda struktur
usb_get_intf Ökar referenstalet för USB-gränssnittsstrukturen
usb_put_intf Frigör den använda USB-gränssnittsstrukturen
usb_lock_device_for_reset Låser enheten korrekt för efterföljande omstart
usb_find_device Hittar den nödvändiga USB-enheten i systemet
usb_get_current_frame_number Returnerar numret på den aktuella bussramen
usb_buffer_alloc Tilldelar en DMA-kompatibel buffert för att placera URB_NO_xxx_DMA_MAP
usb_buffer_free Frigör minne tilldelat med usb_buffer_alloc
usb_bufferkarta Skapar DMA-bindningar till URB
usb_buffer_dmasync Synkroniserar bläddring av DMA-buffertar och CPU
usb_buffer_unmap Bryter DMA-bindningar till URB
usb_buffer_map_sg Skapar distribuerade DMA-bindningar till slutpunkter
usb_buffer_dmasync_sg Synkroniserar visning av distribuerade DMA-buffertar och CPU
usb_buffer_unmap_sg Bryter distribuerade DMA-bindningar
usb_hub_tt_clear_buffer Återställer kontroll/bulkläge i höghastighetsnav
usb_root_hub_lost_power Anropas av HCD när rothubben tappar Vbus-ström.
usb_reset_device Startar om USB-porten för att återinitiera enheten

USB API-modeller

Det finns två huvudsakliga I/O-modeller i USB API. Den enklaste modellen är asynkron: förare skickar begäran som en URB, och sedan slutför URB-återuppringningen i nästa steg operationen. Alla typer av USB-överföringar stöder denna modell, dock finns det speciella modeller för styr-URB:er (som alltid har sina egna inställningar och status, men inte alltid har möjlighet till datasteg ) och  isokrona URB:er (som tillåter överföring av stora paket och inkluderar rapportering om varje dåligt paket.) Sådana modeller är byggda kring att stödja ett synkront API, där föraren anropar en rutin som allokerar en eller flera URB:er i minnet, skickar dem och väntar på att de ska slutföras. Det finns också synkrona omslag. för kontroll av en buffert och bulköverföringar (vilket är obekvämt att använda i vissa scenarier för avstängning av drivrutiner), såväl som för streaming baserat på distribuerade listor (strömmande eller avbrutna).

USB-drivrutiner kräver buffertar som kan användas för direkt minnesåtkomst (DMA), även om de inte behöver göra sin egen DMA-bindning. Det finns API:er som kan användas vid allokering av DMA-buffertar eftersom de kan förhindra att felaktiga buffertar används på vissa system. I vissa fall kan drivrutiner använda 64-bitars DMA-läge för att övervinna andra typer av buffertbegränsningar [3] .

Anteckningar

  1. Introduktion till USB på Linux Arkiverad 18 maj 2009.  (Engelsk)
  2. USB Host-Side API-modell arkiverad 19 maj 2009.  (Engelsk)
  3. 1 2 USB Core APIs Arkiverade 1 maj 2010.  (Engelsk)

Länkar