add usb readme
This commit is contained in:
parent
360871f7fb
commit
6770ef1f7e
1 changed files with 35 additions and 0 deletions
35
V203/usb/README.md
Normal file
35
V203/usb/README.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
# 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.
|
Loading…
Reference in a new issue