Má tu někdo zkušenosti s využitím PCI Endpoint Frameworkem v kernelu?

Zdravím, chci se zeptat,
Vytvářím zařízení a potřebuju aby se chovalo jako USB kamera - UVC class, ale fyzicky je připojený přes PCIe

Vím, že v Linuxu je PCI Endpoint Framework, kterej mi udělá první krok
K tomu chci připojit virtuální xHCI (jako se používá při virtualizaci)
UVC class část softwaru mám

Chci se zeptat, má někdo s něčím podobným zkušenosti, případně je někde nějaký ukázkový využití, případně i přímo tenhle případ, kdy se má zařízení chovat jako xHCI?

Vím, že běžně se tohle většinou řeší buď s RTOS nebo úplně bez (nebo už je to taky přežitek a je Linux správná cesta?), ale tohle poběží na multicore i.XM8 s velkou pamětí a spoustou pomocnejch jednotek na zpracování obrazu, tady to OS značně ulehčuje.


RDa

  • *****
  • 2 783
    • Zobrazit profil
    • E-mail
A to ma byt ciste virtualni implementace, nebo to bezi na skutecnem hw (jakem), ktery ma PCIe endpoint?

EDIT: to i.XM8 jsi asi chtel rict iMX8 - a pak se tedy divim, ze to chcete bastlit skrze PCIe, kdyz ten SOC ma rovnou dva USB3 porty ktere muzou fungovat jako device, takze by sis usetril jednu vrstvu, ktera bude v zamyslenem nasazeni velky performance hit.

PCIe endpoint device neznamena ze si tam muzes udelat jakykoliv realny zarizeni (na to jste meli pouzit FPGA), ale ze to podporuje typicky nejake DMA a tim to konci (napr. TI DSP toho hodne vyuzivaj).
« Poslední změna: 03. 02. 2021, 13:23:56 od RDa »

Jo iMX8 tomělo být

Tady jde spíš o možnost, když neni USB3 na protistraně, tak je tohle jako zajímavá alternativa
A z pohledu dat, je to "jenom změna pár hlaviček" a DMA jepřešoupne místo do USB fifo do PCIe fifo

Ten výslednej performance hit mě taky docela zajímá

Použitý algoritmy by vycházely na hrozně velký FPGA, samotný FPGA do kterýho by se vešel USB stack s DMA a paměťovym řadičem je dražší neže tenhle SOC

RDa

  • *****
  • 2 783
    • Zobrazit profil
    • E-mail
A z pohledu dat, je to "jenom změna pár hlaviček" a DMA jepřešoupne místo do USB fifo do PCIe fifo
Ten výslednej performance hit mě taky docela zajímá

XHCI imho nepracuje s high level streamy, ale ring bufferem pro transfer USB paketu - requestu a odpovedi.
Ale tak neni nic jednodussiho, nez se podivat do XHCI specifikace, podivat se co za primitiva to pouziva (zrejme dma+irq), jaky je format bufferu a pak to naroubovat na ten PCIe endpoint.

Performance hit tam vidim v tom, ze musite pres SW uzavrit smycku mezi requestem a odpovedi, takze tam bude velka latence / roundtrip, a pak to segmentovani payloadu do paketu, kterym musite pridat hlavicky, takze ono to nakonec nebude ciste DMA, ale sw preskladani.

Pokud ridite oba konce spojeni (jako FW pro iMX8, tak host drivery), tak by bylo lepsi ten cas obetovat do napsani optimalniho V4L2 driveru (na coz mozna snadneji najdete exampl, pro ten pcie endpoint), nez do vytvoreni XHCI abstrakce. A jako nestandardni reseni na pul cesty, by byla implementace vlastniho virtualniho USB kontroleru, kdy nemusite resit XHCI formatovani registru/bufferu, ale nejak to protistrane predate po svem.

Kdybych se mel ridit cenout a nechtel psat drivery, tak ten iMX8 vyhodim a pouziji UVC streamer ASSP od FTDI (FT600/601)