Az USB Core egy Linux kernel alrendszer , amelyet USB - eszközök és USB-busz-vezérlők támogatására terveztek . Létrehozásának célja, hogy adatstruktúrák, makrók és függvények halmazának meghatározásával elvonatkoztasson az USB szabvány hardveres megvalósításától (vagy hardverfüggő funkcióktól).
Az USB-támogatás a Linux kernelhez nem sokkal a 2.2-es kernelág után és röviddel a 2.3-as sor elindítása előtt került hozzáadásra. A 2.3-as vonal fejlesztései rendszeresen átkerültek a 2.2-es vonalra, ezáltal új funkciókkal egészültek ki, mint például a hot plug támogatás, új illesztőprogramok és munkaoptimalizálás. A 2.5-ös kernelvonal örökölte ezeket a fejlesztéseket, és hozzáadták az USB 2.0-val való munkavégzés támogatását, és ennek eredményeként nagyobb teljesítményt, stabilabb működést az eszközök között, egyszerűsített alkalmazási felületet (nehezebbé vált a kódban való hibázás) , valamint a belső dokumentáció vezetése.
Mivel a Linux idővel történő futtatásának lehetősége számos médiaeszközön megjelent, fejlődése során a Linux USB-támogatása két részre oszlott. Egyrészt a Linux futtatható az eszközhöz csatlakoztatott USB-eszközökről (például flash meghajtókról), másrészt a Linux azon a fő számítógépen is futhat, amelyre USB-eszközök csatlakoznak. A használt USB-illesztőprogramok nagyon eltérőek, ezért a megkülönböztetés érdekében bevezették az eszközillesztőknek megfelelő elnevezést . gadgetdrivers [1] .
A kernelen belül a gazdagép operációs rendszer illesztőprogramjai hozzáférnek az USB Core API-khoz. Az USB Core nyilvános API-k két típusa létezik, amelyek az USB-illesztőprogram két különböző szintjét célozzák meg: általános célú illesztőprogramok , amelyek olyan illesztőprogram- keretrendszereken keresztül érhetők el , mint például blokk-, karakter- vagy hálózati eszközök, valamint olyan illesztőprogramok, amelyek a kernel részét képezik, és részt vesznek a az USB-busz kezelése. Az ilyen kernel-illesztőprogramok közé tartozik az USB-eszközök fáját kezelő hub-illesztőprogram, valamint számos különböző típusú gazdavezérlő-illesztőprogram ( eng. host controller driver , röv. HCD), amely az egyes buszokat vezérli.
Az illesztőprogramok USB-eszközzel való munkavégzésének legjobb módjának meghatározására szolgáló módszer meglehetősen összetett:
Az egyetlen gazdagép operációs rendszer illesztőprogramja, amely ténylegesen hozzáfér az eszközhöz (olvasási/írási regiszterek, megszakításkezelés stb.), a gazdavezérlő illesztőprogramjai. Elméletileg az összes gazdagépvezérlő-illesztőprogram hasonló funkciókat támogat egyetlen alkalmazási felület használatával. A gyakorlatban ezt csak a 2.5-ös kernelverzióban kezdték el támogatni, de vannak eltérések a hibakezelésben [2] .
Az USB Core-hoz [3] tartozó szabványos alkalmazásprogramozási interfészek (API-k) az alábbiakban találhatók .
Név | Funkciók |
---|---|
usb_init_urb | Inicializálja az URB-ket az USB-illesztőprogram későbbi használatához |
usb_alloc_urb | Új URB-t hoz létre az USB-illesztőprogram későbbi használatra |
usb_free_urb | Felszabadítja az URB által elfoglalt memóriát, amikor minden felhasználó befejezte a használatát. |
usb_get_urb | Növeli az URB referenciaszámát |
usb_submit_urb | Aszinkron átviteli kérelmet küld egy végkészüléknek |
usb_unlink_urb | Megszakítja/törli az átviteli kérést a végkészülékhez |
usb_kill_urb | Törli az átviteli kérelmet, és megvárja annak befejezését |
usb_control_msg | Létrehoz egy URB vezérlőüzenetet, elküldi, és várja a végrehajtást |
usb_bulk_msg | Létrehoz egy általános URB-üzenetet, elküldi, és várja a végrehajtást |
usb_sg_init | Inicializál egy általános I/O vagy megszakítási kérelmet egy elosztott lista alapján |
usb_sg_wait | Szinkronban hajtja végre a felosztási/csatlakozási lekérdezést |
usb_sg_cancel | Leállítja az usb_sg_wait által kezdeményezett felosztást/egyesítést |
usb_get_descriptor | Általános leíró kérést küld (GET_DESCRIPTOR) |
usb_string | Egy karakterlánc-leírót ad vissza ISO 8859-1 formátumban |
usb_get_status | GET_STATUS hívást küld |
usb_clear_halt | Értesíti az eszközt, hogy állítsa vissza a végeszköz függő állapotát |
usb_set_interface | Aktívvá tesz egy alternatív beállítást |
usb_reset_configuration | A készülék szoftveres újraindítása |
usb_register_dev | Regisztrál egy USB-eszközt, és kisebb számot kér |
usb_deregister_dev | Törli az USB-eszköz dinamikus mellékszámának regisztrációját |
usb_match_id | Megkeresi az első egyező usb_device_id értéket egy eszközhöz vagy interfészhez |
usb_register_driver | Regisztrálja az USB illesztőprogramot |
usb_deregister | Törli az USB-illesztőprogram regisztrációját |
usb_ifnum_to_if | Lekéri az adott interfészszámhoz tartozó interfész objektumot |
usb_altnum_to_altsetting | Lekéri az adott interfészszámhoz tartozó alternatív beállítási struktúrát |
usb_driver_claim_interface | Illesztőprogramot köt egy interfészhez |
usb_driver_release_interface | Leválasztja az illesztőprogramot az interfészről |
usb_find_interface | Megkeresi az usb_interface mutatót az illesztőprogramhoz és az eszközhöz |
usb_get_dev | Növeli az USB-eszköz szerkezetének referenciaszámát |
usb_put_dev | Felszabadítja az USB-eszköz használt szerkezetét |
usb_get_intf | Növeli az USB interfész szerkezet referenciaszámát |
usb_put_intf | Felszabadítja a használt USB interfész struktúrát |
usb_lock_device_for_reset | Helyesen zárolja az eszközt a későbbi újraindításhoz |
usb_find_device | Megkeresi a szükséges USB-eszközt a rendszerben |
usb_get_current_frame_number | Az aktuális buszkeret számát adja vissza |
usb_buffer_alloc | Lefoglal egy DMA-kompatibilis puffert az URB_NO_xxx_DMA_MAP elhelyezéséhez |
usb_buffer_free | Felszabadítja az usb_buffer_alloc által lefoglalt memóriát |
usb_buffer_map | DMA-összerendeléseket hoz létre az URB-hez |
usb_buffer_dmasync | Szinkronizálja a DMA pufferek és a CPU böngészését |
usb_buffer_unmap | Megszakítja a DMA-kötéseket az URB-hez |
usb_buffer_map_sg | Elosztott DMA-összerendeléseket hoz létre a végpontokhoz |
usb_buffer_dmasync_sg | Szinkronizálja az elosztott DMA pufferek és a CPU megtekintését |
usb_buffer_unmap_sg | Megszakítja az elosztott DMA-kötéseket |
usb_hub_tt_clear_buffer | Visszaállítja a vezérlés/tömeges módot a nagy sebességű hub-ban |
usb_root_hub_lost_power | HCD hívja, ha a gyökérhub elveszti a Vbus tápellátását. |
usb_reset_device | Újraindítja az USB-portot az eszköz újrainicializálásához |
Az USB API-ban két fő I/O modell található. A legegyszerűbb modell aszinkron: az illesztőprogramok URB-ként küldik el a kérést, majd a következő lépésben az URB visszahívás befejezi a műveletet. Minden típusú USB átvitel támogatja ezt a modellt, azonban léteznek speciális modellek a vezérlő URB-ekhez (melyeknek mindig megvannak a saját beállításai és állapotai, de nem mindig van lehetőségük adatfázisra ) és izokron URB-k (amelyek nagy csomagok átvitelét teszik lehetővé Az ilyen modellek egy szinkron API támogatására épülnek, amelyben az illesztőprogram meghív egy rutint, amely egy vagy több URB-t foglal le a memóriában, elküldi azokat, és megvárja, hogy befejeződjenek. egypufferes vezérléshez és tömeges átvitelekhez (amelyek kényelmetlenek egyes illesztőprogram-leállítási forgatókönyvekben), valamint az elosztott listákon alapuló adatfolyamhoz (adatfolyam vagy megszakított).
Az USB-illesztőprogramok puffereket igényelnek, amelyek közvetlen memóriaeléréshez (DMA) használhatók, bár nem kell saját DMA-összerendelést végezniük. Vannak olyan API-k, amelyek használhatók DMA-pufferek kiosztása során, mert megakadályozhatják, hogy egyes rendszereken helytelen puffereket használjanak. Egyes esetekben az illesztőprogramok 64 bites DMA módot használhatnak más típusú pufferkorlátozások leküzdésére [3] .