LPC2ISA bridge adapter

      5.12.2019 Mnoho let jsem se pídil po nějaké modernější základní desce s alespoň 1 ISA slotem pro nativní SB zvuk pod DOSem a vyzkoušel řadu jiných možností. Když už jsem si jeden takový industrial MB za těžký prachy objednal z Taiwanu, tak jsem zjistil, že na něm nefunguje ISA DMA a tím pádem zvukovka nepřehraje samplovaný zvuk přes DMA. Po nějakém bádání jsem zjistil, že funkční řešení přece jen existuje a to sice MB Portwell RUBY-9719VG2AR, který jako jeden z mála používá jiný způsob připojení ISA sběrnice skrze LPC2ISA bridge Fintek F85226FG (nikoliv přes polofunkční PCI2ISA bridge). Aby to opravdu fungovalo, musel si Tiido napsat vlastní konfigurační utilitu RUBYISA.EXE, která správně nastaví rozsahy I/O portů, jenž se budou dekódovat na ISA sběrnici. Z dalších debat na VOGONS fóru se pak zrodil nápad, že by se dal tento LPC2ISA bridge připojit i k jiným základním deskám přes TPM header, na kterém je vyvedená LPC sběrnice. S tím už jsem trochu experimentoval na předchozím projektu SuperIO expanderu. Nadšeně jsem si objednal tento čip na AliExpressu za 256 Kč a začal si připravovat schéma, ale pak na to nějak nebyl čas... 

      27.3.2023 jsem zjistil, že mě předběhl Rasteri, který mezi tím úspěšně dotáhl do konce svůj projekt dISAppointment. Na jeho řešení se mi ale nelíbilo, že deska je zbytečně velká a potřebuje k napájení celý ATX konektor, což znamená splitter na napájení ze zdroje s tlustým svazkem drátů (další bordel v case). To mě motivovalo dotáhnout do konce svoji verzi. Schéma vychází z katalogového zapojení můstku F85226FG, které jsem doplnil klasickým SMPS obvodem MC34063, s nímž jsme si už kdysi hráli na FELu u Jiráska s Krejčiříka. Vysoká univerzálnost tohoto obvodu ho umožňuje zapojit jako step up/down a invertor. Zde vyrábí napětí -12 V z +5 V, z nějž se dále lineárním regulátorem 79M05 vyrábí napětí -5 V. Tyto záporné větve mohou být potřeba pro funkci operačních zesilovačů na ISA zvukových kartách, nepředpokládám zde větší proudový odběr než pár desítek mA. Díky tomu mi stačí k napájení adaptéru obyčejný Molex konektor (3,3 V pro napájení bridge se bere přímo z TPM headeru).

LPC2ISA schematic

      4.4.2023 Aby to nebylo tak jednoduché, zapojení TPM headeru není úplně standardní a u různých výrobců MB se liší. Pro správnou funkcionalitu ISA DMA je kruciální mít vyvedený signál LDRQ# a jak vidíte, ten zrovna na TPM headeru Gigabyte chybí. Někteří výrobci MB ho mají na pinu 20. Chipsety intel PCH obvykle poskytují 2 LDRQ# signály, z nichž 1 vede do SuperIO čipu. Ten může využívat DMA pro řadič disket či LPT port v režimu ECP. Druhý LDRQ# signál nemusí být vyveden vůbec nebo může být použitý jako GPIO a nebo je vyvedený někam do rezervy. Naštěstí k MB od Gigabyte jsou hojně dostupná leaknutá schémata, z kterých lze zjistit, že zrovna Gigabyte k nám byl milostivý a signál LDRQ1# nám naservíroval na docela dobře přístupný odpůrek poblíž PCH čipu. Na pokusné desce Gigabyte GA-P67A-D3-B3 jsem tedy provedl další drátkový mod a signál dotáhnul na pin 20 TPM headeru (původní SUSCLK jsem odpojil), abych ho měl připravený.
      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 zmizela úplně a byla nahrazena méně-pinovou sběrnicí eSPI (Enhanced Serial Peripheral Interface), takže pak je jedinou možností pro zvuk v nativním DOSu softwarová emulace SBEMU.

      11.12.2023 Dokončil jsem PCB layout (vešlo se mi to na 2-vrstvou desku o rozměrech 55 x 139 mm) a spolu s dalšími plošňáky jsem zadal výrobu v JLCPB. Zvolil jsem běžnou dopravu EuroPacket, tak snad to přijde do Vánoc nebo během svátků, abych si měl s čím hrát.

LPC2ISA PCB layout LPC2ISA PCB 3D model JLCPCB batch order
layout 3D model PCB JLCPCB objednávka

      28.12.2023 Plošňáky konečně dorazily. Už 17.12. byly v Lipské třídírně DHL, ale poslední míle u nás trvá nejdéle. Během večera jsem desku kompletně osadil. Zatím jsem jen otestoval funkčnost spínaného zdroje, záporné napájecí větve fungují správně.

batch of PCBs from JLCPCB in the box splitted PCBs from JLCPCB LPC2ISA assembled PCB-top LPC2ISA assembled PCB-bottom
zásilka z JLCPCB PCB z JLCPCB osazená deska LPC2ISA-top osazená deska LPC2ISA-bottom

      2.1.2024 Pustil jsem se do testování na upravené desce GA-P67A-D3-B3. Nejprve jsem si musel vyrobit cca 15cm 20-žilový plochý propojovací kablík s konektory PFL20, které jsou ale trochu širší než černá plastová ohrádka TPM headeru na desce, takže jsem musel boky ohrádky vyštípnout ostrými kleštěmi. Do ISA slotu jsem zasunul celkem obyčejnou zvukovou kartu ESS AudioDrive ES1869F s 1MB wavetable ROM a připojil napájecí Molex. Deska bez potíží nabootovala do DOSu, kde jsem spustil konfigurační utilitu SAPPHISA.EXE bez parametrů (s výchozími okny I/O portů, ty mohou být max. 4). Utilita ohlásila, že úspěšně našla můstek F85226FG a provedla nastavení.


C:\>dos\drivers\sapphisa.exe
Malformed args, using defaults
Found Intel LPC Controller.
Found Fintek F85226FG LPC-ISA Bridge
Enabling Range 0 : Base 200, Mask fc, LPC fc0201
Ports : 200-2FF

Enabling Range 1 : Base 300, Mask 70, LPC 700301
Ports : 300-303,310-313,320-323,330-333,340-343,350-353,360-363,370-373

Enabling Range 2 : Base 388, Mask 1c, LPC 1c0389
Ports : 380-39F

Enabling Range 3 : Base a00, Mask fc, LPC fc0a01
Ports : A00-AFF

Pak jsem zkusil inicializovat zvukovou kartu univerzální utilitou Unisound 0.80a.


C:\DOS\DRIVERS>unisound.exe
Universal ISA PnP Sound Card Driver for DOS v0.80a. (c) JazeFox 2019-2022
PnP card found: [ESS1869] ESS ES1869 Plug and Play AudioDrive
Loading Unisound default settings...
ADD:220 OPL:388 MPU:330 IRQ:5 DMA:1/0 CTR:660 JOY:201
Initialization done.
ESS Mixer [VOL:85 WAV:80 FM:80 LIN:0 CD:0 MIC:0 3D:0]

      DOSová utilita HWiNFO také zvukovku vidí, ale z Dooma ani jiných programů se mi nepodařilo vyloudit žádný zvuk. A to ani FM syntézu, které by měly stačit jen funkční I/O porty bez IRQ a DMA. Divné je, že originální konfigurační utilita ESSCFG.EXE zvukovku taky nenajde. Pokud na začátku nespustím konfiguraci LPC2ISA bridge, tak zvukovku nenajde ani Unisound ani HWiNFO (patrně ji detekují přes Plug & Play porty v posledním I/O okně A00 - AFFh). Pro jistotu jsem zvukovku otestoval ve starší desce s nativní ISA a funguje. Také jsem znovu zkontroloval schéma a pinouty bridge a ISA konektoru, prohlédl jsem zapájený adaptér pod zvětšovákem, ale žádnou chybu jsem nenašel.

      3.1.2024 Tak jsem se posunul trochu dále. Napadlo mě strčit do ISA slotu místo zvukovky POST kartu, nastavit I/O okno pro port 80h a zkusit tam něco poslat. A vida, na displeji se rozsvítily zapsané hodnoty, takže základní funkcionalita adresové a datové sběrnice na ISA by měla být v pořádku.


C:\DOS\DRIVERS>sapphisa.exe 80 0f
Found Intel LPC Controller.
Found Fintek F85226FG LPC-ISA Bridge
Enabling Range 0 : Base 80, Mask f, LPC f0081
Ports : 80-8F

C:\DOS>smb.exe /dbg
CMD:> outportb(80, aa)
AAh -> port[0080h]
CMD:> outportb(80, bb)
BBh -> port[0080h]

      Pak jsem se znovu pořádně podíval na výpis Unisoundu a všiml si, že tam reportuje nějaký port "CTR:660" (asi řídicí), který není zahrnutý ve výchozím nastavení I/O oken utility sapphisa.exe. Zkusil jsem jej tedy přidat místo 4. I/O okna A00-AFFh a po té už originální konfigurační utilita esscfg.exe zvukovku našla a inicializovala (bylo slyšet i lupnutí ve sluchátkách).


C:\DOS\DRIVERS>sapphisa.exe 200 fc 300 70 388 1c 660 3f
Found Intel LPC Controller.
Found Fintek F85226FG LPC-ISA Bridge
Enabling Range 0 : Base 200, Mask fc, LPC fc0201
Ports : 200-2FF

Enabling Range 1 : Base 300, Mask 70, LPC 700301
Ports : 300-303,310-313,320-323,330-333,340-343,350-353,360-363,370-373

Enabling Range 2 : Base 388, Mask 1c, LPC 1c0389
Ports : 380-39F

Enabling Range 3 : Base 660, Mask 3f, LPC 3f0661
Ports : 640-67F

      Avšak teď mě zas trápí nějaký problém s IRQ. Zkoušel jsem inicializace s IRQ 5 a 7, ale nefunguje ani jedno. Sound Blaster Pro Test Program 1.91 hlásí, že nemůže najít žádné odpovídající IRQ a v Doomu nehrajou zvuky, ale už aspoň hraje hudba přes FM syntézu i MIDI. Přitom DOSový přehrávač hudby MPXPlay mi přehrál MP3 bez problémů. Při tomto testu jsem měl v SETUPu vypnutý paralelní port, aby nezabíral žádné IRQ. Ale ve výpisu IRQ HWiNFa jsem zjistil, že se na uvolněná IRQčka hned nasraly nějaká 2 onboard PCI zařízení a nevím, jak tomu zabránit. Novější BIOSy bohužel v SETUPu postrádají volby pro nastavení Plug & Play, kde bylo možno rezervovat IRQ pro legacy zařízení. Po bližším zkoumání jsem zjistil, že onboard USB 3.0 řadič (PCI device 8086:1C12h) primárně obsadí IRQ 5 (pokud je volné) a taktéž onboard USB 2.0 řadič (PCI device 8086:1C26h) obsadí IRQ 5 (pokud je volné) a pokud jsou zapnuté oba USB řadiče, přesune se USB 2.0 řadič na IRQ 7. Onboard LPT port má vyšší prioritu přiřazování IRQ než onboard PCI zařízení, takže vždy dostane IRQ 5 nebo 7 podle explicitní volby v SETUPu. Např. při IRQ 5 se USB 2.0 řadič přesune na IRQ 3 a USB 3.0 řadič na IRQ 7.

test setup with ISA POST card LPC2ISA with ES1869F ISA soundcad HWiNFO IRQ assignment when onboard LPT is disabled Sound Blaster Pro Test Program 1.91 probing IRQ7 Sound Blaster Pro Test Program 1.91 IRQ7 error
POST test zvukovka ES1869F HWiNFO výpis IRQ SBPro Test IRQ 7 SBPro Test IRQ 7 err.

      Zdá se tedy, že jediná možnost je nechat paralelní port zapnutý a jeho IRQ sdílet se zvukovkou. Při nastavení na LPT2 s IRQ5 zvukovku záhadně nenajde ani HWiNFO ani Unisound ani ESSCFG. Při nastavení na LPT1 s IRQ7 se zvukovka na IRQ 7 inicializuje správně (též jsem upravil proměnnou prostředí BLASTER), ale Sound Blaster Pro Test si pořád stěžuje, že nenašel IRQ i když spustím ruční nastavení a vyberu IRQ 7. Nicméně Doom po ručním nastavení game setupu začal hrát i SFX, takže fakticky sdílené IRQ 7 funguje, akorát to působí problém některým programům při autodetekci zvukovky. Např. demo Boost, které používá zvukovou knihovnu MIDAS 1.1.1, tak zvukovku nenajde. Pak jsem zjistil, že lze při spuštění s parametrem -m vyvolat konfigurační menu a po ručním nastavení SB Pro s IRQ 7 demo začne hrát. Bohužel ne každý program umožňuje manuální konfiguraci, jako třeba DOSový ZDoom, tam jsem na žádný takový parametr nepřišel. UPDATE: knihovna MIDAS se řídí proměnnou prostředí BLASTER, jen jsem ji špatně nastavoval. Přemýšlím, jestli by pomohlo po bootu paralelní port v SuperIO či jeho IRQ nějak deaktivovat, aby zůstalo vyhrazené jen pro zvukovku, ale zatím nevím jak...

      8.1.2024 Vyzkoušel jsem pár nápadů. Napřed jsem se podíval do IVT na vektor přerušení INT 0Fh - IRQ 7, jestli se nějak mění jeho hodnota je-li LPT zapnutý nebo vypnutý, ale je tam pořád stejná adresa 0070:0465h (DOS, IRET), což je asi nějaký defaultní printer handler DOSu. Pokud ten vektor přepíšu na 0:0, tak Sound Blaster Pro Test při detekci IRQ zamrzne. Dále jsem zkoumal 2 hodnoty v BDA (BIOS Data Area), kde na adrese 0040:0008h je word s bázovou adresou LPT a na adrese 0040:0011h v bitech 7:6 je počet LPT portů. Se zapnutým LPT tam byla dle očekávání bázová adresa 378h a počet portů 1. Zkusil jsem tedy tyto hodnoty vynulovat. HWiNFO přestalo vypisovat LPT port v seznamu periferií, ale jinak se nic nezměnilo. Zkoušel jsem spustit ještě nějakou intel ICU (ISA Configuration Utility), ale ta zfailovala s chybou "An internal error has caused incorrect number of System Device Nodes in NVS".
      Abych se ujistil, že Sound Blaster Pro Test funguje správně a nehledá náhodou přes Plug & Play, což je u programu z roku 1992 velmi nepravděpodobné, spustil jsem ho na staré 386 desce bez LPT portu (a pochopitelně bez PnP, ESCD a pod. novot). Konfigurační utilita esscfg.exe zvukovku našla a inicializovala na IRQ 7 a Sound Blaster Pro Test toto IRQ správně detekoval a přehrál všechny testovací zvuky.
      Nakonec došlo na nápad deaktivovat celý LPT port v SuperIO ITE IT8728F v CR 30h logického zařízení 3 (LPT) zápisem 0 do bitu 0, viz datasheet na straně 59. Zápis do registrů SuperIO není úplně triviální, ale kamarád Ruik mi pomohl a přeportoval linuxové utility ISADUMP a ISASET pro DOS/DJGPP. Vynulování onoho registru se provede následující sekvencí příkazů (předpokládá se, že SuperIO komunikuje přes I/O registry 2Eh - index a 2Fh - data):


# konfigurační klíč:
isaset.exe -f 0x2e 0x87
isaset.exe -f 0x2e 0x01
isaset.exe -f 0x2e 0x55
isaset.exe -f 0x2e 0x55
# volba logického zařízení č. 3 (LPT)
isaset.exe 0x2e 0x2f 0x07 0x03
# vynulování CR 30h
isaset.exe 0x2e 0x2f 0x30 0x00
# výpis všech registrů logického zařízení č. 3 pro kontrolu
isadump.exe -k 0x87,0x01,0x55,0x55 0x2e 0x2f 3

      Po té HWiNFO přestalo vypisovat LPT port v seznamu periferií a také ve výpisu přerušení bylo IRQ 7 označeno jako volné. Pak jsem zinicializoval LPC2ISA bridge a zvukovku, ale Sound Blaster Pro Test pořád nenašel IRQ 7. Programy používající knihovnu MIDAS (např. dema Boost a Dream a DOSový ZDoom) se správně nastavenou proměnnou prostředí BLASTER fungovaly bez ohledu na to, jestli jsem LPT port deaktivoval nebo ne. Zde jsem narychlo natočil jedno mizerné video na mobil jak to funguje.

      14.1.2024 Občas se mi záhadně stalo (třeba při 1 z 20 bootů), že Sound Blaster Pro Test najednou správně detekoval IRQ 7, ale nebyl jsem nikdy schopen tento stav nějak konzistentně navodit znovu. Zkusil jsem připojit SATA HDD a bootovat z něj DOS místo z USB flashky, abych mohl kompletně deaktivovat onboard USB řadiče i LPT port a tím uvolnil IRQ 5 a 7. Bohužel ani tak Sound Blaster Pro Test ve většině případů IRQ 7 nedetekoval, pouze asi ve 2 náhodných případech. Zkusil jsem tedy nastavení ESSCFG změnit na IRQ 5 a najednou Sound Blaster Pro Test spolehlivě detekoval zvukovku při každém bootu. Abych zabránil obsazení IRQ 5 onboard USB řadiči, zapnul jsem LPT port s volbou IRQ 5 (jako LPT2 na 278h). Pak bylo nutné po bootu do DOSu LPT port deaktivovat výše uvedeným způsobem, jinak ESSCFG ani Unisound zvukovku nenašel. S tímto nastavením zůstal Sound Blaster Pro Test funkční a také pár dalších programů, které měly předtím problém s IRQ 7, začalo s IRQ 5 fungovat. To považuju za uspokojivý výsledek. Jediný potenciální problém by mohl být s nějakými programy, které používají natvrdo adresu LPT1, pak bych holt musel změnit nastavení LPT v SETUPu nebo zkusit v SuperIO přenastavit bázovou adresu LPT za běhu.

      27.1.2024 Uživatel dartfrog na VOGONS fóru objevil, že existují můstky z nové sběrnice eSPI na LPC, např. Microchip ECE1200 a Fintek F85227N. Někteří výrobci průmyslových a embedded základních desek (např. Arbor, DFI a iEi) je používají pro připojení LPC SuperIO čipů, aby mohli nabídnout klasické sériové porty. Takže by mohlo být možné můstky zřetězit a získat ISA slot. Avšak je tu opět problém s ISA DMA, resp. LDRQ#. V datasheetu ECE1200 se přímo píše, že DMA nepodporuje a datasheet k F85227 jsem zatím nenašel. I tak je otázka, jestli legacy DMA transakce přes eSPI bude podporovat PCH chipset. V intelí eSPI specifikaci 1.0 je na str. 13 explicitně napsáno, že 8237 DMA nepodporuje i když podporuje bus mastering. Také se objevil nový můstek z PCI Express 1.1 na ISA Fintek F85526, ale v jeho popisu je uvedeno, že pro ISA DMA používá LPC interface, tedy zřejmě opět LDRQ#, takže to problém neřeší.
      Na platformách AMD se socketem AM3(+) byla LPC sběrnice integrovaná v southbridge, v APU před architekturou Zen v FCH (Fusion Controller Hub) a na AM4/SP4 se přesunula přímo do CPU/APU (s celým FCH) a koexistuje s eSPI. Bohužel na AM5/SP5 byla LPC odstraněna a zbylo jen eSPI. Některé MB s AM5, jako např. Asrock Taichi X670E, využívají též zmíněný eSPI2LPC bridge F85227N pro připojení hned 2 LPC SuperIO čipů NCT6796D-S a NCT6686D, což je zajímavé, když oba mají i eSPI (na eSPI je možno připojit více slave zařízení pomocí více SS# signálů). Deska přitom jejich potenciál moc nevyužívá, neboť nenabízí žádný COM ani LPT port, takže ani legacy DMA nepotřebuje.



Zpět

Aktualizováno 29.1.2024 v 00:53