GPIO Control Using WinDDK Genport.sys Driver on (AMD) ATI SB600 SMBus Controller

Discussion created by bill03055 on Oct 30, 2008
Having trouble getting Genport.sys to work on SB600 SMBus Contoller

I am trying to gain control over a GPIO port on an (AMD) ATI IXP SB600 SMBus controller (PCI VendorID: 1002 DevID: 4385)

using the Genport.sys, Gpdwrite.exe, and Gpdread.exe utilities supplied in the Windows Driver Develpment Kit (2008 edition

No. 6001.18001). I have successfully built the genport driver and the read/write utilities according to the instructions

included with the source code, and by following the instructions for installing the driver on Windows XP using the "Add

Hardware" wizard and the Genport.inf file (with the appropriately modified Logical Configuration, see below), the driver

appears to have been installed, and in Device Manager is assigned the use of I/O ports 0xB80 and 0xB81, in accordance with

the AMD SB600 Register Reference Manual, which identifies the SMBus controller as Bus:0, Device:20, Function:0, and the GPIO3

I/O port that I am interested in as being controlled through register 0x80.

************************ fragment from Genport.inf:
;IOConfig=300-303(3ff:  ; 10 bit decode ranging from 300 - 303
IOConfig=b80-b81(fff:  ; 16 bit decode ranging from b80 - b81

AMD supplies a utility called ATI Register Explorer which gives you the ability to "peek and poke" values on the various PCI

devices present on the system (at least the AMD ones). Using this utility I can successfully control the behavior of the

GPIO3 port on the 4385 (SMBus Controller) by poking the words "0A70" and "0A78" to port 0x80, but when I do the same using

the Gpdwrite.exe utility, the GPIO3 port does not respond. The command line I use is:

gpdwrite -w 0 a78

and the command line response is:

Wrote data a78 to port 0

but the GPIO3 port shows no sign of change. (I have an LED connected, which does respond when I use the AMD Register Explorer


Other utilities I have run corroborate the identity, port assignments, and values of the hardware, and the command line

responses seem to indicate that I am close, but something is just not working. Does anyone have any suggestions about what

might be wrong or missing in my approach?