SuperIO expander s W83627HF na LPC

      26.11.2017 Na moderních základních deskách postrádám klasická rozhraní COM a LPT, která dnes implementuje jen pár výrobců (zejména Gigabyte) a to na velmi omezeném počtu modelů MB (nepočítám-li drahé industrial MB). Tomu jsem také podřídil výběr desky při posledním upgradu PC a koupil levnou bazarovou Gigabyte GA-P67-DS3-B3. Ještě horší je situace s řadičem disket (FDC), který přestali osazovat všichni výrobci. Resp. FDC je stále přítomen ve většině používaných SuperIO čipů (včetně mého ITE IT8728F), jen se návrhářům nechce potřebné piny vyvést na konektor za pár centů...
      Rozhodl jsem se tedy postavit si vlastní expanzní destičku s druhým SuperIO čipem, která se k MB připojí pomocí LPC sběrnice (sériová ISA, jde z ní dokonce udělat i klasická paralelní ISA). Na většině MB je totiž LPC vyvedena na snadno přístupný TPM header. Jako sekundární SuperIO čip jsem zvolil Winbond W83627HF-AW, kterých mám pár nakuchaných ze starých P4 desek, příp. se dá běžně koupit na eBay, AliExpressu, atd. Tento SuperIO čip umožňuje po zapnutí nastavit alternativní I/O adresu 4Eh pro konfigurační registr pomocí pull-up odporu na pinu HEFRAS (51), aby se nepomlátil s onboard SuperIO, který sídlí na I/O adrese 2Eh. Schéma vychází z demoboardu v datasheetu, které jsem si trochu zjednodušil.

LPC W83627HF schematic 1.0

      Problém je, že na TPM není vyvedeno napájení 5 V, které si tam však můžu snadno dodrátovat na nezapojený pin třeba z USB headeru nebo dovést přímo PC zdroje. Horší je, že tam chybí signál LDRQ# (LPC DMA request), který běžně využívá FDC v DMA režimu. V registru SuperIO CR74, bit 2:0 lze zápisem hodnoty 4 - 7 nastavit režim bez DMA (PIO), ale je otázka, jak se s tím popere BIOS či OS. Linux by to teoreticky měl umět pomocí kernel boot parametru floppy=nodma. Když bude nejhůř, můžu signál LDRQ# sebrat onboard SuperIO (ten by ho mohl využít jedině pro LPT port v režimu ECP, což nepotřebuju, stačí mi EPP) nebo najít druhý nevyužívaný LDRQ# signál na PCH a přidrátovat ho na další nezapojený pin TPM headeru.
      POZOR: na novějších chipsetech intel řady 1xx byl signál LDRQ# odstraněn (poslední chipsety, které ho ještě mají, jsou řady H/Z97 a X99) a u chipsetů řady 5xx pro CPU Rocket Lake (začátek roku 2021) sběrnice LPC zmizí úplně a bude nahrazena méně-pinovou sběrnicí eSPI (Enhanced Serial Peripheral Interface) a bude po legraci...
      Jestli se mi to vůbec podaří nainicializovat a rozchodit je zatím velká otázka, proto jsem se s PCB designem příliš nesral, jde o první ověřovací prototyp. Desku jsem v sobotu zaroutoval a poslal do výroby čínskému JLCPCB, které nabízí výrobu 5 dvouvrstvých prokovených desek 10 x 10 cm za úžasnou cenu 2 $, s dopravou obyč airmailem (15 - 30 dní) to vyšlo na 218 Kč (platil jsem přes PayPal). Tak snad se toho dočkám do Vánoc...

LPC W83627HF PCB 1.0 LPC W83627HF PCB 1.0 GERBER preview

      2.1.2018 Tak mi konečně dorazily ty plošňáky z JLCPCB, celkem 6 kusů. Kvalita je na první pohled stejná jako třeba u PragoBoardu, nenarazil jsem na žádný problém. Zásilka dorazila do ČR už před Vánoci, ale zasekla se na celní poště na Plzeňské. Součástky jsem měl už nachystané a tak jsem se hned pustil do osazování. Šlo to docela rychle, za večer bylo hotovo. Z konfiguračních odporů jsem osadil R24 (zařízení v SuperIO nebudou mít po zapnutí inicializované legacy I/O adresy) a R25 (výběr konfigurační I/O adresy SuperIO 4Eh), aby nedošlo ke kolizi s onboard SuperIO IT8728F.

manufactured LPC W83627HF PCBs assembled LPC W83627HF PCB

      20.1.2018 Teprve dnes jsem se dostal k připojení osazené destičky do PC a neobešlo se to bez problémů. Nejprve jsem musel olámat plastovou ohrádku TPM headeru na základní desce, protože se do něj nevešel konektor plochého kabelu, což se dělalo dost blbě, neboť bylo okolo málo místa a nechtělo se mi kvůli tomu vymontovávat celý MB z bedny. Napájení 5 V jsem vyvedl z nepoužívaného USB headeru. Dále jsem s osciloskopem hodinu bádal nad tím, proč obvod nekomunikuje a nefunguje mu správně krystalový oscilátor, jehož výstup byl podivně zatlumený, až jsem přišel na to, že v zápalu nadšeného osazování jsem na destičku připájel jiný SuperIO čip W83697HF místo W83627HF, který měl vstup OSCIN na jiné noze :) Takže jsem si ještě zablbnul s foukačkou a mikropájkou, osadil správný SuperIO čip a konečně se dostavil pozitivní výsledek. Pod Linuxem jsem pomocí utility isadump (už je i DOSová verze) přečetl konfigurační registry obou SuperIO:


$ isadump -y -k 0x87,0x01,0x55,0x55 0x2e 0x2f
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 87 28 01 00 00 00 f7 10 00 00 00 48 00 00 00 00
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00
c0: 01 04 00 40 00 00 00 00 01 04 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 01 01 01 00 00 00 7e
f0: 10 40 00 00 00 00 1c 00 00 00 00 00 80 00 00 00

$ isadump -y -k 0x87,0x87 0x4e 0x4f
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: ff ff ff ff ff ff ff 00 ff ff ff ff ff ff ff ff
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
20: 52 17 ff fe 81 00 40 ff 00 00 7c c0 ff 30 00 ff
30: 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
60: 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
70: 00 ff ff ff 04 ff ff ff ff ff ff ff ff ff ff ff
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
a0: ff ff ff ff ff ff ff ff ff ff 00 00 00 00 00 00
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
f0: 0e 00 ff ff 00 00 ff ff ff ff ff ff ff ff ff ff

      Aby bylo možné registry SuperIO číst / zapisovat, je nejprve nutné ho přepnout do rozšířeného funkčního režimu zápisem klíče - pro SuperIO Winbond to jsou 2 po sobě jdoucí Byte 87h na port 4Eh. Aby pak nemohlo dojít k náhodnému přepisu registrů, opustí se rozšířený režim zápisem 1 Byte AAh na port 4Eh. Ve Windows jsem si se SuperIO popovídal pomocí programu Read & Write Everything, který podporuje i přepínání banků registrů zařízení a rozblikal jsem si LEDky (nastavení bitu 7 v registru F5h) logického bloku 8 - GPIO2 se rozbliká PLED na GP23 frekvencí 1 Hz).

      19.3.2024 Po delší pauze jsem zas trochu pohnul s konfigurační utilitou pro DOS a přidal kód pro konfiguraci a zapnutí SuperIO bloku řadiče disket. Jelikož na MB ve svém hlavním PC zatím nemám vyvedený LDRQ# signál, testoval jsem v pod Linuxem, který implementuje i PIO režim (bez DMA). Aby Linux disketovku našel, musel jsem mu předat kernel boot parametr "floppy=0,4,cmos nodma messages". Poté jsem v dmesg našel řádek "Floppy drive(s): fd0 is 1.44M" a také blokové zařízení /dev/fd0. Zkusil jsem tedy mount, napřed bez diskety. Mechanika krátce blikla a hrábla a dostal jsem podle očekávání chybu:


[   71.265686] blk_update_request: I/O error, dev fd0, sector 0
[   71.268236] floppy: error -5 while reading block 0
[   71.295694] blk_update_request: I/O error, dev fd0, sector 0
[   71.298239] floppy: error -5 while reading block 0

Pak jsem to zkusil znovu s vloženou naformátovanou disketou, ale to nedopadlo dobře. Pouze se roztočil motor, svítila LED a mount vytuhnul. Měl jsem podezření, že nechodí přerušení, ale pohled do /proc/interrupts potvrdil, že přerušení chodí. Každou vteřinu se počet navýšil asi o 5, takže tam problém nebude. Pro jistotu jsem vyzkoušel ještě další dvě 3,5" mechaniky, které jsem otestoval v jiném PC a chovalo se to stejně, tak tedy netuším, kde by mohl být problém...


           CPU0       CPU1       CPU2       CPU3
  6:          3          0          0          0   IO-APIC   6-edge      floppy
  6:          6          0          0          0   IO-APIC   6-edge      floppy

      1.4.2024 Tak jsem zjistil, že jsem já kokot špatně předával parametry Linux kernelu skrze linld.com, správně to mělo být "floppy=0,4,cmos floppy=nodma floppy=messages". Jelikož je navíc délka příkazové řádky v MS-DOSu poměrně omezená, je lepší více parametrů zapsat do textového souboru (každý parametr na samostatný řádek) a linld.com pak zavolat s parametrem cl=@jmenosouboru.txt, u mě tedy např. takto:
linld.com image=vmlinuz.433 initrd=initrd.433 cl=@kcmdline.txt vga=773
Po nabootování je možné si předané kernel boot parametry zkontrolovat vypsáním souboru /proc/cmdline. Nyní už Linux pochopil, že nechci používat DMA a při mountu disketová jednotka ožila. Vyzkoušel jsem 1 krabičku disket a zhruba polovina z nich už při mountu sypala v dmesg hromadu errorů, někdy se ani nepodařilo vypsat seznam souborů. U jiných disket prošlo čtení i zápis bez jediné chyby. Asi už po těch desítkách let nejsou úplně v kondici nebo byly formátované na jednotce s jinak seřízenýma hlavama. Nicméně to lze považovat za velký úspěch, konečně mám po 9 letech v primárním PC zase funkční nativní disketovku (nepočítám USB náhražku, kterou jsem musel párkrát nouzově použít).
      Dále bych chtěl disketovku rozchodit i v DOSu. K tomu asi bude potřeba napsat vlastní TSR, který se hookne na přerušení INT 13h a doplní chybějící obsluhu FDD. Zatím se mi podařilo najít jedinou DOSovou testovací utilitu (díky Laacovi), která umí pracovat i v non-DMA režimu, ale čtení funguje dost nespolehlivě, nepodařilo se mi ani jednou přečíst správně celý sektor. Většinou přečte kolem 450 - 510 Byte a pokaždé jinak zmršené, jindy přestane číst úplně s chybou: "NDMA read failed -2 (d0h)". Tak alespoň zdrojáky poslouží pro studijní účely.

DOS test.exe - NDMA read failed -2 (d0h) DOS test.exe - read sector 461B



Zpět

Aktualizováno 3.4.2024 v 5:20