Víceučelová karta emulující ROM a RAM. Obsah ROM je načítán z SD karty, stejně tak jednodílné programy ve strojovém kódu uložené v CAS formátu. Níže uvádím kompletní návod jak si Flexi Card vyrobit.
Úvod
Flexi card (dále jen FC) by patrně nikdy nevznikla, kdybych onehdá nenarazil na stránky Kernelcrashe1, který mě svými projekty inspiroval a z nichž FC vychází. Některé části jeho kódu jsou použity v mém projektu beze změn. Děkuji KC za to, že si své poznatky nenechal pro sebe, a já mohl z jeho zkušeností čerpat. Proto i já tento projekt dávám k dispozici ostatním.
Hardware
FC využívá čínskou vývojovou desku DevEBox2. Výhodou této desky je malá velikost, nízká cena3, přítomnost slotu pro micro SD kartu. Disponuje velkým počtem IO portů a hlavně, a to je také důvod volby tohoto procesoru, že většina jeho GPIO portů je 5V tolerantních, což je pro spolupráci s TTL logikou zásadní. Také se velmi snadno programuje a obsahuje debug port. Srdcem této desky je procesor STM32F407 z rodiny procesorů Arm Cortex-M4. Konkrétně varianta VET6, která disponuje 512 KB Flash paměti. Není třeba dodávat, že pro projekt není použití vývojové desky zásadní, pokud jste schopni navrhnout vlastní PCB s minimálním zapojením procesoru plus potřebné součástky pro provoz SD karty. Já zvolil vývojovou desku, která je výhodnější na prototypování a obsahuje vše potřebné.
Zapojení pinů
Výběr použitých pinů se zdá být chaotický, ale je třeba zdůraznit, že každý pin u STM zastavá několik funkcí, které jsou aktivovány/deaktivovány softwarově. Takže záleží jaké periférie budete chtít využívat.
Sord | GPIO pin |
---|---|
IOWR | PB0 |
IORD | PB1 |
RFSH | *PC1 |
WAIT | PC5 |
RST | PB10 |
MRD | PC3 |
MWR | PC2 |
ROMDS | PC13 |
ROM0 | PC0 |
MRQ | PC4 |
CLK | *PC6 |
D0..D7 | PD8-PD15 |
A0..A15 | PE0-PE15 |
used by FLASH | |
/CS | PA15 |
MOSI | PB5 |
SCK | PB3 |
MISO | PB4 |
used by SWD | |
SWDIO | PA13 |
SWCLK | PA14 |
SWO | PB3 |
user LEDS | |
LED1 | PA1 |
used by SD | |
DAT2 | PC10 |
DAT3 | PC11 |
CMD | PD2 |
CLK | PC12 |
DAT0 | PC8 |
DAT1 | PC9 |
debugging output (not used in normal mode except PA1 for LED) PA0-PA3
Důležité:
Napájení FC je možné realizovat několika způsoby. Pro finální provoz je deska připravena použít napájení Sorda. Aby toto fungovalo, je nutné použít jumper JMP1. Pokud ale budete FC programovat nebo připojovat pomocí STLINK donglu, je potřeba nejprve JMP1 rozpojit, jinak hrozí poškození FC nebo Sord!
Funkce
Po resetu nebo zapnutí FC testuje přítomnost SD karty. Nalézá-li se v rootu adresář sordm5, což je jakýsi indikátor, že SD karta obsahuje kompatibilní programy, testuje se přítomnost obslužného programu menu.rom v rootu karty. Pokud je nalezen, je načten na adresu 2000H (tedy jako ROM cartridge) a spuštěn. Ten pak uživateli zobrazí obsah SD karty a umožní vybírat programy. Alternativně pokud je nalezen v rootu soubor s názvem debug.cas, je zaveden do paměti také. Často jsem toho využíval k debugování z80 kódu.
Pokud něco z tohoto testování selže, přejde FC do režimu Basic – F + 32kB RAM a SD karta není využita.
Program má časově kritickou část napsanou v arm assembleru. Jedná se o obslužení MREQ,
kde emulujeme RAM a ROM. Zbytek je napsán v C, který je jednodušší na psaní, i když já osobně ho nemusím, proto omluvte případné nesmysly v kódu. Jak již bylo řečeno, bez SD karty se FC chová jako DIY karta 64KBF (možná v budoucnu předělám do trochu jiného režimu), která u upraveného Sorda4 umožňuje odpojováním MONITOR ROM a kartridže dosáhnout 64kB RAM. U neupraveného Sorda samozřejmě pouze 32kB. Aby se předešlo poškození neupraveného Sorda, je na FC umístěn jumper ROM0, který rozpojený zabrání ovládání signálu ROM0 sloužícího k odpojování MONITORU ROM. Režimy paměti se ovládají pomocí portu 30h a to následovně:
Je-li na MREQ zaznamenána sestupná hrana, je generováno přerušení, ve kterém se zjišťuje čtením signálu MWR a MRD, zda-li se jedná o čtení či zápis do paměti RAM či ROM. Čas potřebný k zahájení obslužné rutiny je zhruba 83nS a trvá ~583nS při maximální frekvenci procesoru.
Dále je zjišťováno podle nastaveného režimu paměti, zda je paměťová oblast v režii FC a je-li v případě zápisu oblast typu RAM. V opačném případě se přerušení urychleně ukončí, abychom přenechali procesor hlavnímu vláknu.
To je tvořeno nekonečnou smyčkou, ve které se testuje stav proměnné main_thread_cmd, která indikuje, zda-li Sord po FC kartě něco vyžaduje (nebo naopak). Tato proměnná je nastavována v přerušení aktivovaným sestupnou hranou na IOWR, které se iniciuje zápisem příkazu na port 81h. Poté se podle příkazu posílají nebo čtou data na portu 80h. V současné době rozeznává FC tyto příkazy:
0 | BREAK | Breaks current command |
1 | GET_COUNT | Returns the file count |
2 | SET_INDEX | Sets pointer position on file number |
3 | GET_INDEX | Gets pointer position |
4 | NEXT_FILE | Increase pointer position by 1 |
5 | PREV_FILE | Decrease pointer position by 1 |
6 | FIRST_FILE | Resets pointer |
7 | GET_FILENAME | Reads filename at pointer position from buffer |
8 | LOAD_FILE | Loads file to memory |
9 | RESET_SORD | Not implemented yet |
10 | DIR_SORD | Dirs SD card to buffer |
11 | OFFSET_RAM_ON | Offsets FC ram region 7000-7FFF to 8000-8FFF |
12 | OFFSET_RAM_OFF | Disables FC ram offset |
Program menu.rom je napsán v z80 assembleru. Program zajišťuje zobrazení programů nacházejících se na SD kartě ve stránkovatelném menu. Poté, co uživatel vybere program za použití cmd8, načte se do oblasti RAM. V případě, že se ale program nachází v oblasti 7000-7fff, je „přikryt“ vnitřní pamětí RAM Sorda. Pro tyto účely slouží cmd11, který dočasně dokáže „přikrytou“ oblast offsetnout o +1000h, tedy do oblasti 8000-8fff. Pak je již na menu.rom, aby odtud překopíroval data do vnitřní paměti Sorda a poté offset cmd12 zrušil. Tohoto triku se hlavně využívá u programu MSX, kde se v oblasti 7000-7fff nachází MSX bios.
Dalším úkolem hlavní smyčky je test signálu RST. Pokud se detekuje jeho aktivita, zaznamenává se doba stisknutí. Je-li kratší než cca 3s, pak se resetuje pouze Sord (FC nereaguje). Je-li delší, dochází k resetování i FC. Další možností, jak vyresetovat FC nezávisle na Sordu, je použití tlačítka RST pod SD slotem.
Pro komunikaci FC s SD kartou se používa opensource knihovna FatFs.5
Kompilace
Budete potřebovat arm cross compiler. Popis jak si jej obstarat zrovna pro vaši platformu je nad rámec tohoto článku. Já používám WSL, tudýž následující popis bude používat linuxové prostředí.
Ve většině linuxových distribucí ho nainstalujete:
1 2 3 |
sudo apt install build-essential sudo apt install gcc-arm-none-eabi sudo apt install gdb-multiarch |
Dále pak budete potřebovat firmware balík pro desku STM32F4DISCOVERY ze stránek st.com.
Nazývá se STSW-STM320686, někam si ho rozbalte a nastavte tento adresář v souboru Makefile v proměnné STM_COMMON.
Pak budete potřebovat Basic-F rom, kterou nakopírujte do adresáře roms, přejmenujte ji na basic-f.rom. Pokud chcete provozovat MSX, budete potřebovat i msx.rom. Jakmile budete mít vše pohromadě, kompilaci spustíte takto:
1 2 |
cd src make |
Ke kompilaci menu.rom budete potřebovat z80 cross compiler. Já používám pasmo7, které můžete nainstalovat pomocí
1 |
sudo apt install pasmo |
A pak zkompilujete příkazem
1 |
make menu |
Firmware flashing
Flashovat můžete v podstatě dvěma způsoby. Buď přes vestavěný USB port v DFU režimu, do kterého kartu přepnete tím, že pin BOOT0 přepojíte z GND na 3V3. Pak připojíte k počítači a flashujete pomocí programu dfu-util8 na Linuxu příkazem make flash-dfu
nebo pomocí DfuSe Demo pro Windows. V tomto případě budete potřebovat váš zkompilovaný kód ve formátu dfu. Pro vytvoření dfu formátu můžete použít tuto utilitku: hex2dfu9.
Druhý způsob vyžaduje STLINK programátor. V tomto případě nemusíte přepínat BOOT0 vůbec, programátor vše zařídí sám. Já používal linuxový program st-flash10, který zavoláte příkazem make flash
.
Příprava SD karty
Naformátovatujte kartu na formát FAT32. KernelCrash doporučuje karty malé kapacity, nebo je alespoň formátovat na menší velikost, protože jsou pak méně problémové. Ja sem zatím během testování používal 4GB kartu bez problémů.
Do rootu karty umístěte menu.rom a případně debug.cas. Vytvořte zde adresář sordm5 a do něj pak nakopírujte soubory, které chcete spouštět. Pamatujte však, že řazení není abecední, ale podle toho, v jakém pořadí jste je na kartu zapsali. Aby se programy správně rozpoznaly, je třeba upravit přípony programů následovně:
- ROM nebo BIN: moduly ROM (cartridge)
- CAS: programy s autostartem ve strojovém kódu
- MSX: MSX programy, které se spouštějí pod MSX. Jsou uloženy v klasickém CAS formátu.
Výroba PCB
No tady zálěží kde chcete desku vyrobit. Já použil PCB Prototype & PCB Fabrication Manufacturer – JLCPCB, stačí použít soubor Gerber z repozitáře ze složky pcb a nastavit požadované vlastnosti desky. Minimalní počet desek je 5ks, ale i tak je služba docela levná, na to, kolik starostí vám to ušetří.
Závěr
No a to je vše. Zdrojové kódy najdete github.com/dlabi/sordm5-flexicard.git.
Možností jak využít potenciál STM desky je spousta, takže se dá co zlepšovat. Zatím umí FC to nejzákladnější. Možná v budoucnu funkčnost trochu překopu, podle toho jak se stávajicí řešení (ne)osvědčí.
Pokud byste chtěli něco ode mne rozepsat nebo doplnit, napište do komentářů. A pokud jste jěště neviděli tadz je ještě taková pseudo reklama na Flexi Card :-).
- www.kernelcrash.com ↩︎
- https://stm32-base.org/boards/STM32F407VET6-STM32F4XX-M ↩︎
- např. https://www.aliexpress.com/item/1005005124722843.html ↩︎
- https://dlabi.cz/programove-odepinani-monitor-rom-pro-sord-m5/ ↩︎
- http://elm-chan.org/fsw/ff/ ↩︎
- https://www.st.com/en/embedded-software/stsw-stm32068.html ↩︎
- https://pasmo.speccy.org ↩︎
- sudo apt install dfu-utils ↩︎
- https://github.com/encedo/hex2dfu ↩︎
- sudo apt install stlink-tools ↩︎