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