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