VOGONS


First post, by strobo

User metadata
Rank Newbie
Rank
Newbie

Hi people,

When I was in elementary school we had our first PC at home. It had a Pentium II 400 MHz and a Matrox video card (G400 I think), running Windows 98 SE.
Now I remember that I wanted to play one particular game and it gave me one of these helpful error messages along the lines of "ahh so sorry, you need a 3D accelerator to play this game, please refer to the manual". My father then got me a used 3Dfx Voodoo and of course none of us had any idea what we were doing. It's very likely that it never actually accelerated anything at all until it was sold once we got an Athlon XP machine.

What I have kept is this fascination with the concept of having a separate 3D card with the external loop cable (it's not actually a loop, is it?) or maybe we can call it a trauma because this experience always kept creeping up to me, telling me to buy a Voodoo card and finally figure out what I have missed.

But I didn't just want to spend a bunch of money to solve the problem, I felt like I have to earn it so I bought a broken one.

dmg1.jpg
Filename
dmg1.jpg
File size
202.59 KiB
Views
2594 views
File comment
Chuck, lower left corner
File license
CC-BY-4.0
dmg1_1.jpg
Filename
dmg1_1.jpg
File size
297.74 KiB
Views
2594 views
File comment
Chuck, lower left corner, alternate angle
File license
CC-BY-4.0
dmg2.jpg
Filename
dmg2.jpg
File size
160.02 KiB
Views
2594 views
File comment
Chuck, lower right corner
File license
CC-BY-4.0
dmg3.jpg
Filename
dmg3.jpg
File size
175.42 KiB
Views
2594 views
File comment
C166 missing
File license
CC-BY-4.0

As far as I can tell the seller was honest about the damage and seemed genuinely interested in the card being brought back to life. According to him it was stored with other unused, but not broken parts where the damage happened. Before selling it he had tried to solder some wire to the chip where the legs are missing and at some point made a picture of the card showing up in the device manager.

I do have a soldering iron, a (borrowed) hot air soldering station, some no-clean SMD flux and mediocre soldering skills. I'm quite optimistic. My analysis so far:
* the damaged chip is called Chuck
* two legs are missing: pin 255 = DEVSEL# and pin 256 = GND
** DEVSEL# input resistance is rising -> infinity. Good.
** diode voltage measured with multimeter from GND to DEVSEL# is 0.444V. Some internal protection diode seems to be intact?! Same on address pins.
* some other legs are bent (63-64, 245-256) and some are also off their pads a little (245, 253-254)
* C166 is missing and look somebody has posted a component map, how cool is that? Thanks sdz!

This is something I wanted to share with you but I also wonder if you have some repair advice. Replacing the capacitor should be easy. If I'm careful I should be able to fix the bent legs without ripping them off. The two missing legs are obviously the hardest part.

How about taking a small grinder like a Dremel to expose more of the legs - any experience with that? Otherwise I'll try to solder to what I'm seeing - maybe half a milimeter of metal. Find two really thin pieces of wire, hold them in parallel, then use hot air to solder?

Attachments

  • back.jpg
    Filename
    back.jpg
    File size
    293.55 KiB
    Views
    2593 views
    File comment
    Back of the card
    File license
    CC-BY-4.0

Reply 1 of 32, by auron

User metadata
Rank Oldbie
Rank
Oldbie

dremeling is definitely what you are looking at here - i really doubt much would stick to what little metal is visible. see here for an example of how such a repair can look like: https://imgur.com/gallery/Amt1b

i'm not sure that hot air is really needed in this case, just using a regular soldering iron with ample flux is probably a lot less thermally stressful on the chip. but what is with the solder on that PCI edge connector, though? that's certainly not something you want on there as you will wind up with bits of solder in your PCI slot if you insert that card.

Reply 2 of 32, by pentiumspeed

User metadata
Rank l33t
Rank
l33t

I did exactly the same long ago but soldering iron I had was difficult to do. Best thing is prepare the IC for jumpers and give it to phone repair shop that has a tech who does the microsoldering finish this. These skill was used to repair broken tracks and broken pads from flexing under the BGA chips (phones). Take a google of phone repair doing this. And phone are far more tiny and microscopic than you think.

For example 36 ball tristar IC is 2mm x 2mm used in iphones.

Cheers,

Great Northern aka Canada.

Reply 3 of 32, by strobo

User metadata
Rank Newbie
Rank
Newbie

auron that's exactly what I was hoping to find after griding off some of the case, awesome, that gallery is very encouraging. I also like this flex cable approach. In my mind it's already fixed and working.

I thought of using hot air to.. well.. I didn't think this through and was hoping for some advice. Thanks! With regard to the solder on the pins I had just accepted the fact that it's there and didn't wonder too much. I'll try to get it off, maybe the plating is damaged underneath, let's see.

pentiumspeed, leaving the soldering to a repair tech is also a sane idea. Mhh.. right now I don't have any repair shop in my area that I trust so I'll give it a try myself for now. And as I said - I want to earn it 😁

Reply 4 of 32, by pentiumspeed

User metadata
Rank l33t
Rank
l33t

Strand of wire from old cable is just thick enough. The main problem is solder go crusty trying to solder due to insufficient flux. Need flux paste, put lots on and does make solder very easy and nice looking.

Cheers,

Great Northern aka Canada.

Reply 5 of 32, by Blaster

User metadata
Rank Newbie
Rank
Newbie
pentiumspeed wrote on 2021-02-28, 22:20:

Strand of wire from old cable is just thick enough. The main problem is solder go crusty trying to solder due to insufficient flux. Need flux paste, put lots on and does make solder very easy and nice looking.

Cheers,

There is no such thing as too much flux Louis Rossmann

Reply 6 of 32, by Byrd

User metadata
Rank Member
Rank
Member

I wouldn't use a dremel; someone with a fine hand + scalpel blade would be able to get the corner two pins revealed just a little more - tin these, I'd use legs from a capacitor for replacement legs, insulate all when done.

Reply 7 of 32, by pentiumspeed

User metadata
Rank l33t
Rank
l33t
Blaster wrote on 2021-03-02, 00:55:

There is no such thing as too much flux Louis Rossmann

Indeed. I repair phones of common issues mostly, and knows this. I also do general console repairs but I usually ask customers to send theirs to other repair shop who is more experienced with large BGA repair or reprogramming the NAND for cellphones as these is too expensive to invest (reprogramming and large BGA rework station costs above 1,500 but our in case canadian meant 2,000 easily.) and not much call at our type of shop.

Cheers,

Great Northern aka Canada.

Reply 8 of 32, by strobo

User metadata
Rank Newbie
Rank
Newbie

I was hesitant to order some grinding and polishing bits for my dremel-like tool and I liked the idea of using a scalpel. Why use power tools when there's a good way to get it done without? Then I remembered that I have an angle grinder with a flap disk.

angle1.JPG
Filename
angle1.JPG
File size
180.95 KiB
Views
2272 views
File comment
Approach (don't do this at home)
File license
CC-BY-4.0
grind1.JPG
Filename
grind1.JPG
File size
129.98 KiB
Views
2272 views
File comment
Result of angle grinder, 1
File license
CC-BY-4.0
grind2.JPG
Filename
grind2.JPG
File size
110.56 KiB
Views
2272 views
File comment
Result of angle grinder, 2
File license
CC-BY-4.0

I guess I was lucky that I didn't completely remove or rip out the traces. For the connections I used strands from some old cable as suggested by pentiumspeed, I think it's ideal. I soldered a long piece to each spot on the PCB, then aligned it with the IC and cut it to length. The actual soldering to the IC then went really quick.
I did use a bunch of flux which I cleaned with 2-propanol and toilet paper, leaving these nasty lints behind.
Note that there is a third wire: pin 254 had come off. The pad was loose (pad 253 too) and I couldn't separate it from the pin to realign it.

soldered1.JPG
Filename
soldered1.JPG
File size
176.81 KiB
Views
2272 views
File comment
Soldering result, 1
File license
CC-BY-4.0

The results looked good to me when I was done and checking everything. I think I was just in such a good mood and not willing to put it at risk that I refused to perceive any imperfections. Not all solder came off the edge connector pads. Pins 252 (FRAME#) and 253 (IREADY#) almost touching each other might be the worst. Also I'm wondering how to secure this. Any suggestions?

soldered2.JPG
Filename
soldered2.JPG
File size
250.83 KiB
Views
2272 views
File comment
Soldering result, 2
File license
CC-BY-4.0

As for testing I didn't have an appropriate machine at hand, just an Intel Core 2 board with a live Linux. The Voodoo appears in `lspci` and I can read the registers, memory-mapped to 0x90000000, like this (iotool by Aaron Durbin):

$ sudo ./iotools mmio_read32 0x90000000
0x0ffff37f
$ sudo ./iotools mmio_read32 0x90000004
0x80000000

According to the Voodoo 2 manual these are the "status" and "intCtrl" registers and the values that I get seem reasonable.
So now to see if it actually works with games I should set up a machine for this. I do have some Pentium II/III era stuff to play with, but that is for another day. Thanks everyone so far!

Reply 10 of 32, by auron

User metadata
Rank Oldbie
Rank
Oldbie

i would have tried to use kynar wire here if the space permitted it, that way you'd have insulation on most of the cable. with long enough wires you could have taped/glued them down to the board (though there might be limitations on length depending on signal). looking at this now i don't see any way to secure it so just leave it like that if it works.

for the edge connector i would put on sone no-clean SMD flux and wick it off, preferably with a chisel tip and good iron.

Reply 13 of 32, by drosse1meyer

User metadata
Rank Member
Rank
Member

this thread makes me wanna buy a broken voodoo

i find it funny how you went full tim allen on this - from 'maybe use the dremel' to 'oh a scalpel is interesting' to MORE POWER angle grinder 😜

P1: Packard Bell - 233 MMX, Voodoo1, 64 MB, ALS100+
P2-V2: Dell Dimension - 400 Mhz, Voodoo2, 256 MB
P!!! Custom: 1 Ghz, GeForce2 Pro/64MB, 384 MB

Reply 14 of 32, by strobo

User metadata
Rank Newbie
Rank
Newbie

The angle grinder might not have been the smartest option but it certainly was fun - thanks for sharing my enthusiasm and sorry to anyone who had to hold back their anger 😀 yeah next time I might use a file first.
@auron you're right, the wire is too short to tape or glue it down. I'll have to leave it like this.

Now to tests: after setting up things, getting lost in Windows 98 and then setting up more things to analyze the situation I am now ready for an update. I'll give my conclusion first, no need for a big suspense:
The repair job seems to be OK, but something related to the TMU(s) is broken.
What follows is technical details of my unfinished efforts to test the card and locate the problem.

This is what I put together from my stash of retro loot:

MSI MS-6159, Socket 370, Intel 440LX
(On-board ATi Rage Pro)
(On-board Creative/Ensoniq AudioPCI ES1373)
Intel Celeron something 400 MHz not sure
IDE-to-CF adapter + Transcend CF170 16GB (this I actually bought for this purpose)

This was the first time I installed Windows 98 SE in ages and I didn't have an IDE CD-ROM drive at hand. I used QEMU on my Linux PC with a card reader to set up the CF card (format to FAT with startup files, copy Win98 installation files). Then I was able to boot that CF card in the actual system and install Windows from there. That procedure was useful, maybe I should document it publicly somewhere..

Driver installation was awful. The latest Creative driver seemed to have files missing, or I did something wrong, whatever, in the end it worked somehow. The card consistently shows up in the device manager. With one particular driver setup I even had the 3Dfx control panel showing up.

But starting games or dxdiag either hung the application or the whole system, or it wouldn't detect the card. Something is wrong!

Digging deeper into the topic I found that mojo.exe from Glide SDK v2.43 (found here) is a useful tool for low-level analysis. It has two distinct outcomes with this card, which one happens is random, see below:

  1. mojo.exe warns: Bogus number of TMUs (57005), driver log: sst1InitResetTmus(): Could not reset TMUs...
    Otherwise the program exits normally and I'm back at the DOS prompt. Note that decimal 57005 is equivalent to 0xDEAD.
    SST.LOG
    sst1Init Routines: InitCode $Revision: 8 $
    sst1InitMapBoard(): BoardsInSystem = 1
    sst1InitMapBoard(): vAddr:0xe7000000 pAddr:0xe7000008 Dev:0x9 Board:0
    sst1InitRegisters(): Setting TREX-to-FBI FIFO THRESHOLD to 0x8...
    sst1InitRegisters(): Setting PRELIM FT-CLK delay to 0x8...
    sst1InitDacDetect(): Entered...
    sst1InitDacDetectICS(): Entered...
    dacWr(0x7,0xb)
    dacRd(0x5,0x79)
    dacRd(0x5,0x2e)
    dacWr(0x7,0x1)
    dacRd(0x5,0x55)
    dacRd(0x5,0x49)
    dacWr(0x7,0x7)
    dacRd(0x5,0x71)
    dacRd(0x5,0x29)
    sst1InitDacDetectICS(): Exiting...
    sst1InitRegisters(): Storing TREX0INIT0=0x5441
    sst1InitRegisters(): Storing TREX0INIT1=0xf420
    sst1InitRegisters(): Storing TREX1INIT0=0x5441
    sst1InitRegisters(): Storing TREX1INIT1=0xf420
    sst1InitRegisters(): Storing TREX2INIT0=0x5441
    sst1InitRegisters(): Storing TREX2INIT1=0xf420
    sst1InitSetGrxClk(): Entered...
    dacWr(0x7,0xe)
    dacRd(0x5,0x0)
    dacWr(0x4,0xa)
    dacWr(0x5,0x7b)
    dacWr(0x5,0x6c)
    dacWr(0x4,0xe)
    dacWr(0x5,0x0)
    sst1InitSetGrxClk(): Resetting TMUs after clock change...
    sst1InitResetTmus(): Could not reset TMUs...
    Meanwhile on the screen:
    photo_2021-04-07_23-06-44.jpg
    Filename
    photo_2021-04-07_23-06-44.jpg
    File size
    117.02 KiB
    Views
    2038 views
    File comment
    mojo fail 1: 0xDEAD
    File license
    CC-BY-4.0
  2. Driver gets stuck at sst1InitRegisters(): Storing TREX0INIT1=0xf420
    Screenshot with mojo.exe and driver output on console:
    photo_2021-04-07_23-31-20.jpg
    Filename
    photo_2021-04-07_23-31-20.jpg
    File size
    202.8 KiB
    Views
    2038 views
    File comment
    mojo fail 2: Storing TREX0INIT1
    File license
    CC-BY-4.0

Now I'm assuming this is a hardware issue, unrelated to the repaired PCI-related pins on the FBI chip. I have already started to check some things with my oscilloscope and multimeter but I'll try to keep it short:

  • PCI signals at the repaired pins look good to me
  • the TMU on the right (far from the VGA connectors) is not really getting warm, it seems to stay at room temperature, while the other one gets noticeably warmer
  • there is a differential clock signal output on FBI pins 169 and 170, going into each TMU at pins 13 and 14. A few days ago it seemed to have around 45 MHz, last evening it was 16 MHz (picture). Seems suspicious.
    photo_2021-04-08_00-23-51.jpg
    Filename
    photo_2021-04-08_00-23-51.jpg
    File size
    125.39 KiB
    Views
    2038 views
    File comment
    Ch 1/2: differential clock signal, f1: difference between channels
    File license
    CC-BY-4.0

My vague plan is to check for broken capacitors and maybe trying to reflow the TMU on the right. Then maybe try to source a new TMU. Any ideas?

For completeness:

The source code for mojo.exe and the underlying driver is useful and I should get more into it. For mojo.c I can only find this, for Glide I grabbed the CVS repo from sourceforge:
cvs -z3 -d:pserver:anonymous@glide.cvs.sourceforge.net:/cvsroot/glide co .

Other test systems were a Socket 7 ASUS SP97-V with a K6-III-400 that I had access to last weekend,
and a Socket 775 Acer G43T-AM3 with an Intel Core 2 Quad and DDR3 RAM booting FreeDOS from USB,
with no apparent differences in mojo.exe behavior.

Reply 15 of 32, by strobo

User metadata
Rank Newbie
Rank
Newbie

Okayyyy so first of all the scope picture in my last post is not ideal, I had my oscilloscope set to "realtime" instead of "repetitive" mode. With the repetitive mode it can make use of the full analog bandwidth (400 MHz). The passive probes are rated at 500 MHz.

fbi_clkout_tmu1_16mhz.jpg
Filename
fbi_clkout_tmu1_16mhz.jpg
File size
158.5 KiB
Views
1951 views
File comment
FBI clock output at 16 MHz on pins 170, 169
File license
CC-BY-4.0

That being clarified I will now dive into the details of my analysis. You might not feel like reading it so my conclusion first:
I think TMU #0 has failed.

One mystery was: why am I seeing either 16 MHz or 45 MHz?
Answer: the card initializes with 45 MHz. When running mojo.exe it calls sst1InitRegisters() from the driver. In the case where it gets stuck at "Storing TREX0INIT1=0xf420" it doesn't reach the point where sst1InitSetGrxClk() is called to set it to 16 MHz.

It gets stuck at "Storing TREX0INIT1=0xf420" because the SST_FBI_BUSY bit of the status register doesn't clear (from the spec: "Chuck graphics engine busy").
It finishes with "sst1InitResetTmus(): Could not reset TMUs..." because the SST_TREX_BUSY bit of the status register doesn't clear (from the spec: "Bruce busy").

(check sources in ./glide2x/sst1/ for reference)

The hang at "Storing TREX0INIT1=0xf420" also coincides with the signal on a pin from TMU #0 pin 28 -> FBI pin 156 being high.
I don't know where the "Bruce busy" bit is coming from - is it a dedicated pin between the TMU(s) and the FBI or a part of the data that comes from the TMU?

Mystery all over the place, I needed an overview of the interaction between the chips, and a pinout.. I couldn't find much. I got some good advice in Re: Bare 3Dfx Voodoo 2 board pictures. Here's a schematic overview that I made by beeping around with my multimeter:

Voodoo2.png
Filename
Voodoo2.png
File size
35.75 KiB
Views
1951 views
File comment
Voodoo 2 chipset interaction (just a draft!! don't rely on it)
File license
Public domain

It contains some vague assumptions and speculation.. if you know more or have ideas what some signals are I would be glad to hear about them.

In the meantime I found that the clock signal that comes with the data from TMU #1 -> TMU #0 is present, but from TMU #0 to FBI it is not. I think it should be. Instead I observed the following on my oscilloscope: when I start the PC the clock on TMU #0 pins 40/41 appears briefly for a varying amount of time, then gets stuck at either 0V or 3.5V. When I turn it off (with the on/off button) it sometimes starts to oscillate again, and I couldn't catch the end of that.. probably after all capacitors are sucked out.

tmu1_clkout_45m.jpg
Filename
tmu1_clkout_45m.jpg
File size
214.02 KiB
Views
1951 views
File comment
TMU #1 clock output at 45 MHz on pins 40, 41
File license
CC-BY-4.0
tmu0_clkout_start.jpg
Filename
tmu0_clkout_start.jpg
File size
151.39 KiB
Views
1951 views
File comment
TMU #0 clock output on pins 40, 41 not coming up
File license
CC-BY-4.0

Another thing to mention is that TMU #0 is not totally inactive: the output on pin 184 towards TMU #1 repetitively goes high for 16 clocks, then low for 48 clocks. Not sure if that is active all the time, I saw it once. What is it? A reset? A read enable?

tmu1_pin184.jpg
Filename
tmu1_pin184.jpg
File size
118.35 KiB
Views
1951 views
File comment
TMU #1 pin 184 to TMU #0 pin 26
File license
CC-BY-4.0

Well now my best bet is that TMU #0 has some internal failure. First I will check what happens without the series resistors at the TMU #0 clock output. If that doesn't change the clock output then I will swap the TMUs - that should allow communication between FBI and the good TMU that will then be on the right.

Reply 16 of 32, by strobo

User metadata
Rank Newbie
Rank
Newbie

Forgot to attach the draw.io file for the schematic. In the end I'm hoping for others to help improving it 😁
I'm not sure if I can claim any copyright on it, so I'm declaring it as Public Domain instead of CC-BY-4.0.

Attachments

  • Filename
    v2_drawio.zip
    File size
    2.8 KiB
    Downloads
    75 downloads
    File comment
    Created with the draw.io tool
    File license
    Public domain

Reply 19 of 32, by strobo

User metadata
Rank Newbie
Rank
Newbie
SSTV2 wrote on 2021-04-17, 15:53:

Hi, how did you figure out which TMU is which (0/1), have you determined their locations by analyzing card or have you relied on some external source (datasheet/forum post)?

Hi, the Voodoo 2 specifications by 3Dfx (rev. 1.16, found e.g. here just for reference) has a diagram on page 15 that shows the flow of data from Bruce (TMU) #2 -> Bruce #1 -> Bruce #0 -> Chuck (FBI). I think the direction of data flow defines the numbering of the TMUs. TMU #0 must always be present for rendering, being the input to the FBI. In the diagram the flow starts at Bruce #2 which itself has no input from another Bruce.

Now to visual inspection of the card. Since the TMUs are identical, whatever is TMU #1 would have some inputs unconnected. Also you would find some output pins on each TMU that are either connected to TMU #0 or the FBI. It would go into TMU #0 where TMU #1 had unconnected inputs. Also refer to sdz's statements here: Re: Bare 3Dfx Voodoo 2 board pictures
With that in mind the arrangement on the Voodoo 2 reference card becomes quite obvious: the TMU on the left has a range of pins in the lower left corner collectively tied to 3.5V through a 4.7 kOhm resistor. The TMU on the right has these pins connected to the TMU on the left.
And when I say "obvious" I assume that people enjoy staring at board traces that frequently jump to the other side of the card where you quickly lose track of them - I do accept that others might feel differently.

I saw the terms "upstream" and "downstream" being used for TMUs. Upstream should be referring to the higher number (where data is coming from) and downstream to the lower number (where data is going to).

@sdz Thanks for checking, I tried to find PCI bus reset (PCI slot pin A15) on these pins but found no connection, just on FBI pin 11.
With the stall signal you mean that the receiver of data (e.g. FBI) tells the sender (e.g. TMU #0) "hey I'm not ready for new data", analogous to a FIFO full signal?