RISC-V/V203/usb/README.md

36 lines
2.1 KiB
Markdown
Raw Normal View History

2024-10-12 16:47:13 +02:00
# USB
Tyhle procesory obsahují dokonce několik komplikovaných USB řadičů.
Zatím se mi podařilo zprovoznit USB OTG FS řadič v režimu DEVICE,
přičemž jako nejužitečnější třída se mi jeví CDC, tedy sériový port.
## CDC
Ten číňan to má zřejmě docela dobře zmáklé, bohužel dokumentace je pro
takhle složité zařízení prakticky k ničemu, takže zbývají jen příklady
zdrojových kódů. Ty jsou ale napsány způsobem, že z toho vůbec není zřejmé
jak to vůbec funguje. A už vůbec se z toho nedá vyloupnout použitelné
programové rozhraní.
Takže jsem se snažil alespoň to nějak zapouzdřit do třídy. Není v tom žádná
abstrakce jako je rozdělení problému na jádro, vlastní USB CLASS a endpointy,
bylo by to složité a zatím to nepotřebuji, takže co šlo jsem převzal
přímo od WCH, trochu rozbil tu šílenou špagetu IRQ a vytvořil rozhraní,
které standardně používám i v jiných projektech.
Rozhraní tvoří (virtuální) metody Up (), která předává data z PC (host) do
uP (device) a Down() fungující opačným směrem. Je nutno mít na paměti,
že metoda Up() je volána z přerušení od USB, takže návazná obsluha musí být
velmi rychlá (nesmí blokovat). Metoda Down(), kterou volá uživatel není
blokující, vrací skutečný počet odeslaných bytů.
Řetězení potomků třídy BaseLayer je poměrně abstraktní, ale při pochopení
principu velmi jednoduché a funkční. V tomto příkladu se metoda Up() vůbec
nepoužívá, jsou to jen výpisy na terminál (eg. minicom).
## Poznámka
Překlad lze uskutečnit standardním riscv64-unknown-elf-g++ nebo clang, není potřeba nějaký
podivný klon od WCH. Sice asi nebude tak efektivní při obsluze přerušení, ale čert se v tom vyznej.
Pokud jsem to pochopil, tak číňan využívá speciálního módu přerušení, který se musí nastavit
ve startupu a ten pak ukládá na zásobník nějaké rámce podobně jako Cortex-Mx. Ale může to
být úplně jinak, je to celkem fuk, ono každé ukládání na zásobník chvíli trvá a překladač
snad ví co uložit musí a co ne. Jinak by to těžko mohlo fungovat.