USB mag

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

Fejlesztési előzmények

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

Hogyan működik

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

A szabványos alkalmazási interfészek listája

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

USB API modellek

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

Jegyzetek

  1. Bevezetés az USB-hez Linuxon Archiválva : 2009. május 18.  (Angol)
  2. USB Host-Side API-modell archiválva : 2009. május 19.  (Angol)
  3. 1 2 USB Core API archiválva : 2010. május 1.  (Angol)

Linkek