Konference: Počítač SHARP MZ-800 a emulátory

Od: Michal Hučík
Datum: 26.10.2011 16: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)]