A-6
GPIO WDT Programming
MS-98M9
SMBus Access
3.
SMBus Access
The base address of SMBus must know before access. The relevant bus and device
information are as following.
#define IO_SC
0xCF8
#define IO_DA
0xCFC
#define PCIBASEADDRESS 0x80000000
#define PCI_BUS_NUM
0
#define PCI_DEV_NUM
31
#define PCI_FUN_NUM
4
3.1
Get SMBus Base Address
int SMBUS_BASE;
int DATA_ADDR = PCIBASEA (PCI_BUS_NUM<<16) +
(PCI_DEV_NUM<<11) +
(PCI_FUN_NUM<<8);
Outportl
(DAT 0x20, IO_SC);
SMBUS_BASE
=
Inportl
(IO_DA) & 0xfffffff0;
3.2
SMBus_ReadByte (char DEVID, char offset)
Read the value of OFFSET from SMBus device DEVID.
Outportb (LOWORD (
SMBUS_BASE
), 0xFE);
Outportb (LOWORD (
SMBUS_BASE
) + 0x04, DEVID + 1);
//out Base + 04, (DEVID + 1)
Outportb (LOWORD (
SMBUS_BASE
) + 0x03, OFFSET);
//out Base + 03, OFFSET
Outportb (LOWORD (
SMBUS_BASE
) + 0x02, 0x48);
//out Base + 02, 48H
mdelay (20);
//delay 20ms to let data ready
while ((Inportl (
SMBUS_BASE
) & 0x01) != 0);
//wait SMBus ready
SMB
_DATA
= Inportb (LOWORD (
SMBUS_BASE
) + 0x05);
//input Base + 05
3.3
SMBus_WriteByte (char DEVID, char offset, char DATA)
Write DATA to OFFSET on SMBus device DEVID.
Outportb (LOWORD (
SMBUS_BASE
), 0xFE);
Outportb (LOWORD (
SMBUS_BASE
) + 0x04, DEVID);
//out Base + 04, (DEVID)
Outportb (LOWORD (
SMBUS_BASE
) + 0x03, OFFSET);
//out Base + 03, OFFSET
Outportb (LOWORD (
SMBUS_BASE
) + 0x05, DATA);
//out Base + 05, DATA
Outportb (LOWORD (
SMBUS_BASE
) + 0x02, 0x48);
//out Base + 02, 48H
mdelay (20);
//wait 20ms