SMBus
От: santos  
Дата: 05.06.06 13:24
Оценка:
Кто нибудь знает каким образом просканить SMBus?? Может кто делал уже подобную программу или драйвер??
Re: SMBus
От: dosik Россия www.dosik.ru
Дата: 06.06.06 04:10
Оценка:
Здравствуйте, santos, Вы писали:

S>Кто нибудь знает каким образом просканить SMBus?? Может кто делал уже подобную программу или драйвер??


Вот, писал когда то на Delphi. Я думаю разберетесь. Если будут вопросы. Пишите...

а у нас есть спец таг pascal для такого кода — модератор

function smbWaitForFree(BaseAddr: word) : boolean;
procedure smbWaitForEnd(BaseAddr: word);
function smbCallBus(BaseAddr: word; CMD: byte; Slave: byte; RW: byte): cardinal;
function smbGetReg(BaseAddr: word; Reg: byte; Slave: byte): word;
procedure smbSetReg(BaseAddr: word; Reg: byte; Chip_Add: byte; Data: byte);

function smbWaitForFree(BaseAddr: word) : boolean;
var
  StartTick,
  Status    : DWORD;
begin
  Result:=False;
  InPort(BaseAddr,@Status,PORT_BYTE);
  StartTick:=GetTickCount;
  while (Status and 1)<>0 do begin
    InPort(BaseAddr,@Status,PORT_BYTE);
    if GetTickCount>StartTick+2000 then
      exit;
  end;
  if (Status and $1e)<>0 then
  OutPort(BaseAddr,Status,PORT_BYTE);
  Result:=True;
end;

procedure smbWaitForEnd(BaseAddr: word);
var
  Status : DWORD;
begin
  InPort(BaseAddr,@Status,PORT_BYTE);
  while (Status and 1)=1 do
    InPort(BAseAddr,@Status,PORT_BYTE);
end;

function smbCallBus(BaseAddr: word; CMD: byte; Slave: byte; RW: byte): cardinal;
var
  Dump1,
  Dump2 : word;
begin
  smbWaitForFree(BaseAddr);
  OutPort(BaseAddr+3,CMD,PORT_BYTE);
  OutPort(BaseAddr+4,(Slave shl 1) or RW,PORT_BYTE);
  OutPort(BaseAddr+2,$48,PORT_BYTE);
  sleep(1);
  smbWaitForEnd(BaseAddr);
  InPort(BaseAddr+6,@Dump1,PORT_WORD);
  Dump1:=Dump1 shl 8;
  InPort(BaseAddr+5,@Dump2,PORT_WORD);
  Result:=Dump1 or Dump2;
end;

function smbGetReg(BaseAddr: word; Reg: byte; Slave: byte): word;
var
  Data : cardinal;
begin
  smbWaitForFree(BaseAddr);
  OutPort(BaseAddr+5,0,PORT_BYTE);
  OutPort(BaseAddr+6,0,PORT_BYTE);
  Data:=smbCallBus(BaseAddr,Reg,Slave,1);
  Result:=(Data and $ff);
end;

procedure smbSetReg(BaseAddr: word; Reg: byte; Chip_Add: byte; Data: byte);
begin
  smbWaitForFree(BaseAddr);
  OutPort(BaseAddr+5,Data,PORT_BYTE);
  OutPort(BaseAddr+6,Data,PORT_BYTE);
  smbCallBus(BaseAddr,Reg,Chip_Add,0);
end;
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.