RISC-V/V203/usb
2024-11-15 13:27:53 +01:00
..
adc add usb adc test 2024-10-19 14:58:36 +02:00
cdc refactoring usb 2024-10-14 17:09:39 +02:00
ch32v203 spi add tx dma 2024-11-09 16:26:15 +01:00
common add scope 2024-10-21 10:26:41 +02:00
scope change ui colors 2024-11-15 13:27:53 +01:00
usart add fifo to usart, test 2024-10-17 13:36:01 +02:00
README.md add usb readme 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.