Přejít na obsah
ARCHIVEKArchiv e-mailových konferencí o 8bitových počítačích Archiv Pandory 1999 až 2013

Zpět na zprávu

Celé vlákno · 4 zprávy

Unikarta FW rev.60

Michal Hučík SHARP MZ-800


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

Sharp na prodej

PvvS SHARP MZ-800

Pokud nekdo zhanite MZ800 (821) , tak v brne jsou na prodej jeste 2 kousky.Zazloutly plasty, ale jinak se zdaji byt v solidnim stavu.. S majitelem je vyborna domluva, ja si k tomu jeste vybral nejaky kazety s SW . KOntakt na majitele je Zdenda.Bartusek[doména skryta] .
PvvS

Re: Unikarta FW rev.60

Martin Lukasek SHARP MZ-800

Ahoj,

tak jsem se konecne dostal alespon k Ushell. Znovu jsem to preklopil na PC a tentokrat jsem si dal praci, abyh do toho nezasahoval moc zivelne a dalo se to kdykoli

aktualizovat, kdyz vydas novejsi verzi.

V podstate se lisi zacatek, kde otevirani toho serialu je fakt na Win a LINUX uplne jine. Muzeme to zavrapovat do nejake init funkce nebo udelat ifdefama. Pak jsem si napsal

par funkci, v podstate je potreba, abys obdobne zabalil read a write, ktery pouzivas, delal jsem to tak, abych se prizpusobil spis ja, takze v zasade staci ve Tvem zdrojaku

prejmenovat.

void ClosePort ( HANDLE pd, struct termios *oldtio )
void ReadResult ( HANDLE pd, char *result, unsigned char result_len )
BOOL WriteSer( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite )
BOOL ReadSer( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead )

Jinak jsem se s par drobnostmi docela natrapil, za prve polynom, ktery pouzivas na CRC je jiny nez ktery pouzivam ja a ktery pouzivaji standardni PC programy, takze mi chvili

trvalo, nez jsem pochopil, ze mi to ani vyjit nemuze. Jsem natvrdlej. Nakonec jsem zvolil nejjednodusii reseni a vzal jsem si zdrojaky na CRC32 z STM.

Dalsi legrace byla s prenosem. Cteni v pohode okolo 11,5 kB/s, ale zapis cca 1 kB/s. Pomerne rychle jsem prisel na to, ze to dela ten zapis po bajtu. Zajimavy je, ze u cteni

to nevadi. Jenze, kdyz jsem to zacal zapisovat po 128 bajtech, tak to nefungovalo spolehlive, padalo to, timeoutovalo, psalo blby data do souboru. Po par hodinach zkoumani

jsem prisel na uplne jednoduchou vec. Po kazdem zapisu na serial je potreba na chvili vratit cas systemu (Sleep(0)) a slape to jako vino. Takze jsem upravil zapisovou rutinu,

obodbne jako cteni. Vsechno flaknu do pameti a pak vysypu na serial jako x 128 bajtovych bufferu + zbytek. Rychlost zapisu cca 9.5 kB/s. To uz je docela ok.

Podle toho, jak se vypisuji ty tecky pri cteni a zapisu je videt, ze se cteni bufferuje cca po 2 kB, kdyzto zapis se hned a plynule odesila.

Jo, jeste jsem upravil na zacatku to vypisovani helpu, pri zadnem argumentu to nevypise help, ale vriti se to do otevreni portu a to mi na Win pada, kdyz sahnu na neexistujici

argument. Taky se neodalokovava RAM alokovana malloc(), ale je pravda, ze ten program pak proste skonci, takze co uz, ale tak nejak z principu to tam asi dodelam ;-) Jo a samo

se nepocita s mnohamegabajtovyma souborama, ktery by se nemusely vlezt do RAM, ale to asi nikdo pres seriak posilat nebude ;-)))) To jen, ze neni osetrenej ten malloc().

Taky mne napadlo jedno drobne vylepseni UShellu. Nechces tam dodelat VER prikaz? Ja si to obcas testuju pres Putty, idealne po nahrani noveho fw a tak bych hned vedel, ze je

to ok. Monza by stacilo jen prihodit verzi do hlasky po resetu.

Ve finale jsem chtel vyzkouset opravdovy serial a nejen USB, ale to mi teda neslo. Za prve je trochu zrada na Unikarte, asi jsem pouzil spatny konektor, ale je hodne vzadu od

kraje desky, takze mi tam nejde poradne zastrcit kabel s koncovkami. Tak jsem to pres redukce prodlouzil, ale ani tak mi to neslape. Mozna mam blby kabel, budu to muset

premerit. Taky muzu mit nejakou zradu na portu v PC. Nejlepsi co se mi podarilo dostat je pri resetu Unikarty par paznaku. Zkousel nekdo normalni serial na Unikarte?

Spustitelny EXE je na http://www.8bity.cz/files/Sharp/UniUSARTshell_exe.zip.
Zdrojaky se daji stahnout z http://www.8bity.cz/files/Sharp/UniUSARTshell_src.zip.

Krasny den, Martin.

Re: Unikarta FW rev.60

Michal Hučík SHARP MZ-800

Ahoj Martine,

podivam se do tveho zdrojaku, zalozim v svn dalsi adresar a pokusim se 
to dat cele dohromady tak, aby bylo mozne vyrobit kompilovanec pro oba 
systemy - kdyz tak detaily jeste doresime mimo konferu.

S tim CRC jsem se taky natrapil uz kdyz jsem prepisoval Xmodem pro Z80, 
protoze mi nesedely moje soucty s temi, ktere posilal na konci packetu 
protokol z minicomu.
Nakonec jsem prisel na to, ze ty prenosove protokoly zrejme pouzivaji 
trochu jine CRC16 a CRC32, nez jake jake je bezne zvykem.
Do unikarty jsem pouzil CRC z baliku protokolu lrzsz, ktere v Linuxu 
pouziva minicom.

Co se tyka toho malloc, tak mas pravdu - mel bych to osetrit a nebo 
jeste lepe bych to mel zacit stahovat data do PC nejakym jinym zpusobem ...

Trochu se bojim, ze ty potize, ktere jsi zaznamenal s prenosem do 
unikarty by mohly mit co docineni s manualnim vystavovanim RTS :(
Pri svych experimentech s RS232 na unikarte jsem zjistil, ze i kdyz 
unikarta nastavi RTS = 1, tak PC jeste chvilku posila data. Tohle mi 
delalo problemy, kdyz jsem ponechal nastavovani RTS ciste na STM32 - 
procesor ihned po prijeti jednoho bajtu nastavil RTS = 1 a drzel ho v 
teto urovni dokud jsem si ten bajt neprevzal. To fungovalo pekne do 
doby, nez nastal cas pro ulozeni dat z bufferu na SD.  Prave tehdy jsem 
zjistil, ze PC ze setrvacnosti poslalo dalsi bajt navzdory tomu, ze uz 
mu to uroven RTS zakazovala. V STM32 pak prijeti tohoto bajtu zpusobilo 
to, ze se RTS opet nastavilo do urovne 0. Proto jsem ten semafor zacal 
ridit rucne tak, ze vystavuju RTS=1 ve chvili, kdy mi zbyvaji posledni 2 
volne bajty v bufferu a RTS = 0 ve chvili, kdy mam volne alespon 3 
bajty. Mozna mas ukecanejsi RS232 a 2 bajty pak nestaci.
Na tohle si budu muset najit trochu vic casu. Pichnu to na analyzer a 
zkusim si s tim RS232 pohrat v nejakem samostatnem kodu mimo unikartu, 
protoze to chovani je akosi divne a to rucni rizeni asi nebude uplne 
idealni zpusob jak to resit :(

Zobrazit citovaný text (3 řádky)
> Podle toho, jak se vypisuji ty tecky pri cteni a zapisu je videt, ze 
> se cteni bufferuje cca po 2 kB, kdyzto zapis se hned a plynule odesila.
>
S temi buffery v PC je to docela legracni. Kdyz experimentalne na 
unikarte ignoruju CTS a snazim se poslat vse najednou, tak v PC 
samozrejme nepochytam vsechny bajty. Proto jsem prave zacal pouzivat ten 
malloc() se kterym jsem si nejprve udelal dostatecne misto pro prijem 
dat. Kdyz jsem pak chtel v PC precist vse pres read ( pd, memory, 
kompletni_delka ), tak jsem odchytil jen prvnich 24 bajtu.
Kdyz jsem to vsak dal cist po jednom bajtu, ktery se hned ulozil do te 
alokovane pameti, tak jsem precetl prvni 4kB a zbytek sel nekam do haje. 
Experimentoval jsem potom i s tim, ze se unikarta snazila davkovat data 
pro PC, ale to uz jsou takove docela obskurni metody pro rizeni 
komunikace :)

Zobrazit citovaný text (6 řádků)
> Taky mne napadlo jedno drobne vylepseni UShellu. Nechces tam dodelat 
> VER prikaz? Ja si to obcas testuju pres Putty, idealne po nahrani 
> noveho fw a tak bych hned vedel, ze je
>
> to ok. Monza by stacilo jen prihodit verzi do hlasky po resetu.
>
Pridal bych to asi jako dalsi parametr za hlasku OK:RESET txt_verze_firmware

Zobrazit citovaný text (1 řádek)
 > kraje desky, takze mi tam nejde poradne zastrcit kabel s koncovkami. 
Tak jsem to pres redukce prodlouzil, ale ani tak mi to neslape. Mozna 
mam blby kabel, budu to muset
Zobrazit citovaný text (5 řádků)
>
> premerit. Taky muzu mit nejakou zradu na portu v PC. Nejlepsi co se mi 
> podarilo dostat je pri resetu Unikarty par paznaku. Zkousel nekdo 
> normalni serial na Unikarte?
>
Konektor pro RS232 je na unikarte trochu utopeny, takze jsem musel z 
konektoru na kabelu sundat krytky, abych ho tam dokazal natlacit. Pro 
komunikaci mezi PC a unikartou je potreba krizeny kabel ve kterem jsou 
piny propojeny nasledovne:

Rx - Tx
Tx - Rx
RTS - CTS
CTS - RTS
GND - GND

Pak je samozrejme potreba prepojit oba switche, ktere jsou mezi RS232 a 
miniUSB tak, aby se propojil krajni a stredni pin pobliz toho konektoru, 
ktery chces pouzivat - bez prehozeni switche nelze posilat data z portu 
do unikarty.

Michal