Konference: Počítač SHARP MZ-800 a emulátory
Od: | Michal Hučík |
Datum: | 26.10.2011 13:43 |
Předmět: | Unikarta FW rev.60 |
Takze jsem nahrubo otestoval chovani SIO a tady je dalsi znackovana verze. Prozatim jeste taguju "postaru". Od priste to mozna zacneme znacit nejak chytreji.
Zmeny a novinky (nektere uz tady byly zmineny, ale chci aby bylo vse pohromade):
1.) Je potreba udelat opravu zapojeni signalu RTS a CTS u obvodu FT232RL - viz tento strucny navod http://ordoz.com/sharp/unicard_files/oprava_PCB_RTSCTS_u_FT232RL/
2.) Byl konecne nejak dotazen Ushell, tady je jednou a naposledy jeho kompletni popis, ktery lze jinak nalezt v hlavicce souboru USARTshell.c:
/*
*
* USARTshell bezi na USART1, ktery se pri startu nastavi na 115200 bps.
*
* Pokud existuje soubor /unicard/ushelldisabled.cfg, tak je po startu USART1 ihned k dispozici
* pro Sharpa jako emulovane SIO.
*
* Po startu se USARTshell vzdy ozve hlasenim "Unicard - USART Shell" a na dalsim radku
* oznami reset prostredi "OK:RESET".
*
* Chovani USARTshellu je ovlivnitelne ze Sharpa pres API MZFREPO:
*
* cmdUSHELLON - zapnuti shellu, vypnuti emu_SIO
* cmdUSHELLOFF - vypnuti shellu, zapnuti emu_SIO
* cmdUSART1BPS - nastaveni BPS pro USART1
*
* Pri vkladani prikazu je na USART1 vraceno s kazdym znakem jeho echo, takze v terminalu
* bude videt co se do unikarty pise.
*
* Zadost o provedeni vkladaneho prikazu se provede zaslanim znaku s hodnotou
* mensi jak 0x20 a vetsi, nez 0x00. Po vlozeni takoveho znaku posle unikarta
* znak '\'n' (0x0d, 0x0a).
*
*
* Prikazy USARTshellu:
* ====================
*
*
* \'x00
* Jediny binarni prikaz.
* Provede reset vstupniho prikazoveho bufferu.
* Pokud se cte soubor, nebo adresar, tak bude zavren.
* Po vykonani prikazu unikarta odpovi "\'nOK:RESET\'n".
*
*
* MKDIR <path>
* Vytvorit adresar. Odpoved "OK:MKDIR <path>\'n" pokud se jej podarilo
* vytvorit, jinak "ERR:MKDIR <path>\'n".
*
*
* UNLINK <filepath>
* Smazat soubor/adresar. "OK:UNLINK <filepath>\'n" pokud se smazal,
* nebo "ERR:UNLINK <filepath>\'n" pri chybe.
*
*
* FILELIST <path>
* Vypise obsah adresare stejnym zpusobem, jakym to dela MZFREPO jen s
* tim rozdilem, ze mezi polozkami posila 0x0d, 0x0a.
* Pri uspesnem otevreni adresare vraci "OK:FILELIST <path>\'n", pak
* nasleduje seznam souboru. Na konci seznamu posle "OK:FILELIST_DONE\'n".
* Pokud se nepodarilo adresar otevrit, tak vraci "ERR:FILELIST <path>\'n".
* Pokud pri nacitani jednotlivych polozek adresare dojde k chybe,
* tak unikarta posle "ERR:READDIR\'n"
*
* READDIR <path>
* Precteni polozek adresare v binarni strukture FILINFO.
*
* READ <filepath>
* Otevre soubor pro cteni. Vraci "OK:READ <filepath>\'n". Potom nasleduje
* jiz v binarnim tvaru jako DWORD pocet bajtu, ktere budou poslany a
* za nimi je poslan obsah souboru.
* Po uspesnem odeslani nasleduje hlaseni o uzavreni souboru a CRC32 "OK:CLOSE 0x????????\'n".
* Pokud pri cteni souboru dojde k chybe, tak posle "ERR:READ\'n" a dalsi data jiz neposila.
*
*
* OPEN <filepath>
* NEW <filepath>
* Otevre soubor pro zapis. NEW - zaklada vzdy novy soubor, pokud
* jiz existuje, tak vrati "ERR:NEW <filepath>\'n", jinak "OK:NEW <filepath>\'n".
* Pri pouziti OPEN bude existujici soubor prepsan, pokud neexistuje, tak
* se vytvori novy a nasleduje OK:, nebo ERR:.
* Po uspesnem otevreni souboru prejde vstup USARTshellu do binarniho rezimu
* ve kterem ocekava jako DWORD pocet bajtu, ktere budou do souboru zapsany.
* Po prijeti techto 4 bajtu unikarta posle HEX ASCII hodnotu cisla, ktere
* prijala, napr. "OK:SIZE 0xdeadbeef\'n". Dalsi bajty uz jsou ulozeny do
* otevreneho souboru.
* Po uspesnem prenosu oznami uzavreni souboru a CRC32 "OK:CLOSE 0x????????\'n".
* Pokud pri zapisu dojde k chybe, tak unikarta posle "ERR:WRITE\'n" a
* ukonci binarni rezim.
* Pokud dele nez 2 sekundy neprijdou zadna data, tak unikarta soubor
* uzavre a prejde zpet do prikazoveho rezimu s hlasenim "ERR:DATA_TIMEOUT\'n".
*
*
* FDDREMOUNT <0..3>
* Odmountuje prislusnou FD mechaniku a zavola remount, ktery se provede
* standardne podle obsahu /unicard/fd<0..3>.cfg
*
* DATE
* DATE YYYY-MM-DD HH:MM:SS
* Bez parametru vrati aktualni cas. Pokud jsou uvedeny parametry,
* tak se pokusi podle nich nastavit datum a cas v RTC a vrati takovy
* cas, jaky se po teto zmene vyskytuje v RTC.
*
*
*/
3. Byl pridan modul emu_SIO, ktery zpristupnil pro Sharpa USART1. Pro spravnou funkci SIO je potreba aktualizovat firmware arbitra CPLD XC9356.
Zde je popis chovani a obsluhy, ktery je mozne nalezt v hlavicce souboru emu_SIO.c:
/*
*
* SIO data port: 0x52
* SIO cmd/status port: 0x53
*
*
* Rychlost portu v bps se nastavuje pres API MZFREPO jako dword.
*
*
* Status:
* =======
* 0. bit - nastaven oznamuje data v prijimacim bufferu
*
* 1. bit - sdeluje aktualni stav signalu CTS
*
* 2. bit - oznamuje volne misto v odesilacim bufferu
*
* 3. bit -
*
* 4. bit - 1 = aktivni RX interrupt
*
* 5. bit - 1 = aktivni TX interrupt
*
* 6. bit - 1 == error, RX data lost - doslo k pokusu o zapis do RX bufferu
* ve kterem uz nebylo v tu chvili misto
* Po vyskytu chyby zustane bit nastaven az do RESET, nebo ERRRES.
*
* 7. bit - 1 == error, TX data lost - doslo k pokusu o zapis do TX bufferu
* ve kterem uz nebylo v tu chvili misto
* Po vyskytu chyby zustane bit nastaven az do RESET, nebo ERRRES.
*/
/*
*
* Prikazy:
* ========
*
* Pozn.: Horni 2 bity prikazu se pouzivaji pro rizeni internich stavu WR,RD a dalsi bajt registru.
* Prikaz je nyni dekodovan jako 4 bitove cislo podle bitu 0 az 3.
*/
#define siocmdRESET 0x00
/*
* RESET Provede reset portu, tzn.: zlikviduje aktualni obsah prijimaciho i
* odesilaciho bufferu, vynuluje registry RXINT a TXINT, zakaze
* generovani interruptu EINT = 0, zapne RTS a CTS rizeni toku.
* Vynuluje citac ztracenych bajtu a tim i bity 6 a 7 ve statusu.
*/
#define siocmdERRRES 0x01
/*
* ERRRES Vynuluje citac ztracenych bajtu a tim i bity 6 a 7 ve statusu.
*/
#define siocmdERRGET 0x02
/* ERRGET Vrati 2 bajty - stav citace ztracenych bajtu pro RX a TX. Pokud je
* pocet ztracenych bajtu vetsi, nez 255, tak vraci 0xff.
*/
#define siocmdEINT 0x03
/*
* EINT Povoli generovani interruptu, EINT = 1.
*/
#define siocmdDINT 0x04
/*
* DINT Zakaze generovani interruptu, EINT = 0.
*/
#define siocmdRXINT 0x05
/*
* RXINT Nasledujicim zapisem se nastavi minimalni pocet bajtu, ktere musi byt
* v prijimacim bufferu, aby byl vyvolan interrupt. Nulova hodnota zakazuje
* generovani interruptu podle stavu prijimaciho bufferu.
* Pokud po prikazu nasleduje cteni, tak obdrzime hodnotu, ktera je nyni v RXINT.
*/
#define siocmdTXINT 0x06
/*
* TXINT Nasledujicim zapisem se nastavi minimalni pocet volnych bajtu, ktere musi byt
* k dispozici v odesilacim bufferu, aby byl vyvolan interrupt. Nulova hodnota zakazuje
* generovani interruptu podle stavu odesilaciho bufferu.
* Pokud po prikazu nasleduje cteni, tak obdrzime hodnotu, ktera je nyni v TXINT.
*/
#define siocmdRXBUF 0x07
/*
* RXBUF Naslednym ctenim zjistime aktualni pocet bajtu v prijimacim bufferu.
* Prectenim dalsiho bajtu obdrzime celkovou velikost prijimaciho bufferu - 1.
*/
#define siocmdTXBUF 0x08
/*
* TXBUF Naslednym ctenim zjistime aktualni pocet volnych bajtu v odesilacim bufferu.
* Prectenim dalsiho bajtu obdrzime celkovou velikost odesilaciho bufferu - 1.
*/
#define siocmdRTS 0x09
/*
* RTS Zapisem dalsiho bajtu nastavime rizeni toku RTS 0 - vypnuto, cokoliv jineho zapnuto.
* Ctenim zjistime aktualni stav tohoto nastaveni.
* Po vypnuti eizeni toku prejde signal RTS do urovne '1'.
*/
#define siocmdCTS 0x0a
/*
* CTS Zapisem dalsiho bajtu nastavime rizeni toku CTS 0 - vypnuto, cokoliv jineho zapnuto.
* Ctenim zjistime aktualni stav tohoto nastaveni.
*/
#define siocmdRTSBIT 0x0b
/*
* RTSBIT Prectenim bajtu zjistime aktualni stav signalu RTS. Pokud je rizeni toku
* pomoci RTS vypnuto, tak potom zapisem muzeme uroven tohoto signalu zmenit.
* Pri zapnutem rizeni toku pres RTS bude zapis ignorovan.
*/
4. Do MZFREPO byl pridan prikaz pro zjisteni stavu interruptu volaneho z unikarty:
#define cmdINTCALLER 0x11 // Sdeli kdo je volajicim interruptu. Kody volajicich periferii jsou definovany v mzint.
//
// Vystup: 1B - mzintFLAG
V tuto chvili mame v mzint definovany tyto 3 ID periferii, ktere mohou volat interrupt:
#define mzintFDC (1 << 0)
#define mzintSIORX (1 << 1)
#define mzintSIOTX (1 << 2)
5. V souvislosti s Ushellem a SIO byly do MZFREPO pridany tyto prikazy:
// USART:
#define cmdUSHELLON 0x70 // Zapne USARTshell, vypne emu_SIO.
#define cmdUSHELLOFF 0x71 // Vypne USARTshell, zapne emu_SIO.
#define cmdUSARTBPS 0x72 // Nastaveni BPS pro USART1.
//
// Vstup: DWORD - rychlost
Na mem webu je nyni aktualni verze .bin s FW pro STM32. Stejne tak jsem tam nahral i .jed a .svf s FW pro CPLD.
Zdrojove kody a Linuxovy komunikacni program pro praci s Ushellem naleznete na svn.
Michal
Ostatní příspěvky vlákna:
[2011/1 (52)] [2011/2 (9)] [2011/3 (2)] [2011/4 (9)] [2011/5 (8)] [2011/7 (1)] [2011/8 (40)] [2011/9 (146)] [2011/10 (116)] [2011/11 (29)] [2011/12 (110)]
[1999 (1)]
[2000 (168)]
[2001 (733)]
[2002 (459)]
[2003 (654)]
[2004 (224)]
[2005 (105)]
[2006 (182)]
[2007 (201)]
[2008 (294)]
[2009 (363)]
[2010 (782)]
[2011 (522)]
[2012 (642)]
[2013 (442)]