35 lines
2.1 KiB
Markdown
35 lines
2.1 KiB
Markdown
# 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.
|