From 6770ef1f7e9f3dba62ef0515da003f0cc69e90f5 Mon Sep 17 00:00:00 2001 From: Kizarm Date: Sat, 12 Oct 2024 16:47:13 +0200 Subject: [PATCH] add usb readme --- V203/usb/README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 V203/usb/README.md diff --git a/V203/usb/README.md b/V203/usb/README.md new file mode 100644 index 0000000..3b9c816 --- /dev/null +++ b/V203/usb/README.md @@ -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.