Programátor SPI FlashROM na paralelní port

      23.3.2008 Jelikož jsem takový šťoura, co se rád vrtá v kódech BIOSů počítačů a nedá si pokoj dokud obrazovka nadobro nezčerná :), tak také potřebuju mít možnost FlashROM ručně přeprogramovat. Dříve jsem to u paralelních flashek, které byli na desce v DIL32 nebo PLCC32 patici, řešil jednoduše hotflashem, kdy jsem měl v záloze připravený druhý čip s funkčním BIOSem. Ten jsem strčil do patice, za běhu vyměnil za špatně naprogramovaný čip a přeprogramoval.
      Teď jsem se na své nové základní desce Gigabyte GA-P31-DS3L setkal s novým typem paměti - vysokorychlostní sériovou SPI FlashROM Winbond 25X40VSIG v SMD pouzdru SO8, která je připájená přímo na desku. Jižní můstky intel ICHx již delší dobu podporují obě varianty FWH a SPI. Pomocí určitých registrů a pinů chipsetu lze vybírat, které z rozhraní se primárně použije pro BIOS. Díky tomu, že se u SMD součástky ušetří desetník za patici, celkově klesnou náklady na výrobu a manažeři tak mají více $ na lepší auta a kurvy ;). Nám šťouralům pak nezbývá, než vzít do ruky pájku... Aby se s tou flash dalo rozumně pracovat, připájel jsem ji na precizní DIL8 patici. Druhou patici DIL8 jsem pak připájel na základní desku. Protože bych se na daném místě s pájkou kolem patice (naproti SATA konektoru) už nedostal, nechal jsem ji plandat na dvou kouskách 4-žilové kšandy:

SPI FlashROM SO8 v DIL8 patici

      Následovala výroba programátoru. K připojení SPI zařízení k PC však stačí obyčejný paralelní port, 5 drátů, pár odporů a konektory. Zapojení vychází z programovacího SPI kabelu typu BSD na programování mikrokontrolérů Atmel AVR. Zmiňovaná paměť W25X40V je určená pro napájecí napětí 3,3V, proto jsem datové linky oddělil odpory, aby netrpěla vyšším napětím z LPT. Zároveň odpory plní funkci tlumení, bez nich totiž na delším (cca 1,5m) plochém kabelu bez stínicích linek mezi signálovými docházelo k přeslechům a tím chybnému přenosu dat. Zajímavé, že AVRka mi se stejným káblem fungujou bez potíží. K napájení jsem použil externí zdroj.

SPI FlashROM programator - schema

Celé to pak splácané na univerzálním plošňáku vypadá nějako takhle:

SPI FlashROM programator - hardware

      Další už je jen věc software, který jsem si musel napsat. Nejprve bylo třeba naprogramovat nejnižší vrstvu, která pracuje s registry LPT a nastavuje/čte požadované úrovně na daných SPI linkách. K tomuto tématu můžu odkázat na knížku Burkhard Kainka - Využití rozhraní PC z nakladatelství HEL 1997, z které jsem se kdysi učil, jak rozblikat svoji první LEDku na LPT. Ale i na Internetu je zdrojů k tomuto tématu víc než dost.
      Dále bych něco řekl k samotné sběrnici SPI. Ta sestává ze tří linek: SCK - Serial ClocK (až desítky MHz), MISO - Master Input Slave Output, MOSI - Master Output Slave Input a v tomto případě je zde ještě pomocná řídicí linka CS# - Chip Select. Komunikace typicky probíhá mezi dvěma zařízeními, z nichž jedno je Master (v tomto případě PC), který ovládá hodiny SCK (zde je klidová úroveň log. 0) a posílá příkazy/data na linku MOSI a přitom zároveň čte data z linky MISO. Slave zařízení (v tomto případě paměť) pak reaguje na hodiny SCK tím, že při sestupné hraně hodin odešle bit na linku MISO a při vzestupné hraně hodin čte bit z linky MOSI. Byte se odesílá v pořadí MSB jako první, LSB jako poslední. Po dokončení přenosu Master vrací hodiny na klidovou úroveň (log. 0). Sběrnice je tedy narozdíl třeba od I2C plně duplexní. Slave zařízení se neidentifikují žádnou adresou. Aby bylo možno připojit na linky SPI více Slave zařízení, musí být Master s každým zařízením propojen samostatnou řídicí linkou CS#, která úrovní log. 0 aktivuje jedno z n Slave zařízení (ostatní mají SPI výstupy ve stavu vysoké impedance, aby neovlivňovali probíhající komunikaci (SPI zařízení mají 3-stavové výstupy, nejsou potřeba pull-upy). V případě SPI Flash paměti se CS# používá pro začátek a konec rámce, takže ho nelze jednoduše spojit se zemí. Více napoví následující obrázek jak probíhá čtení z paměti:

SPI FlashROM read command

      Nejprve Master zahájí rámec přechodem CS# do log. 0 a tím se aktivuje paměť. Pak Master spustí hodiny a vysílá první Byte příkaz 3h - čtení z paměti. Paměť zjišťuje, cože to po ní chceme a ví, že musí ještě dostat adresu. Tu posílá master v následujících 3 Bytech. Paměť adresu dekóduje a okamžitě začíná v dalším Byte posílat data. Pokud Master požaduje data i z následujících adres, nechá spuštěné hodiny a paměť automaticky inkrementuje adresu. Další příchozí data od Mastera se ignorují. Konec rámce pak Master ukončí přechodem hodin do klidového stavu log. 0 a přechodem CS# do klidového stavu log. 1.
      Paměť podporuje určitou standardní množinu příkazů, mezi něž patří třeba čtení, zápis, mazání stránky, mazání sektoru, mazaní celého čipu, zamknutí, odemknutí, identifikace výrobce a typu čipu JEDEC ID, čtení stavového registru, ... Některé příkazy jsou jednobajtové, jiné mají parametry a data. Na některé paměť odpovídá vysláním dat, na jiné ne. Další podrobnosti viz datasheet ke konkrétní paměti.
      Dalším krokem bylo tedy napsání funkcí pro odesílání a příjem Bytů a bloků dat a nakonec funkce pro zpracování jednotlivých příkazů Flash paměti. Současná verze programu umožňuje identifikovat typ paměti /i , číst a zobrazit blok dat dané velikosti od dané adresy /r, přečíst celou paměť do souboru /d, naprogramovat celou paměť ze souboru /p, smazat celou paměť /e a odemknout write protect bity /u. Dalšími parametry /l= lze nastavit bázovou adresu LPT a /d= prodloužení doby SCK pulsu v mikrosekundách (vyjma Windowsí verze, kde není k dispozici časovač s vyšším rozlišením jak 1 ms). V balíčku ke stažení jsou 3 verze pro DOS, Windows a Linux (Linuxovou verzi jsem netestoval).
      Vzhledem k limitované rychlosti LPT a sériovému způsobu přenosu trvá čtení nebo zápis desítky sekund až minuty. Doba mazání čipu závisí na rychlosti interních mechanismů v paměti a trvá zhruba jednotky až desítky sekund. Rychlejší komunikace by šlo dosáhnout pomocí mikrokontroléru, nejlépe s hardwarovým SPI řadičem, který by s PC komunikoval buď 8-bitově po LPT nebo po USB. Ukázka akce programu s pamětí ST M25P32:


SPI FlashROM Programmer 1.0 (C) 2008 by Martin Rehak; rayer^seznam*cz
Compiled by GCC 3.4.5 (mingw special) at 18:41:28, Mar 26 2008

SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
FlashROM JEDEC ID, type: 202016h
ST Microelectronic M25P32 (4MB)
Reading sector at: 00396000h (89%)



Zpět

Aktualizováno 6.4.2008 v 1:24