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
* oznacuje piny zatim nevyuzite ve fw.
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.
Originál
čínský klon
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ří.
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 :-).
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept All”, you consent to the use of ALL the cookies. However, you may visit "Cookie Settings" to provide a controlled consent.
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the ...
Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
Cookie
Duration
Description
cookielawinfo-checkbox-analytics
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".
cookielawinfo-checkbox-functional
11 months
The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
cookielawinfo-checkbox-necessary
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-others
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.
cookielawinfo-checkbox-performance
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".
viewed_cookie_policy
11 months
The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.
Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.