AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Information?

Ein Thema von Razor · begonnen am 31. Jul 2007 · letzter Beitrag vom 22. Dez 2013
 
Razor
(Gast)

n/a Beiträge
 
#19

Re: Memory Information?

  Alt 5. Aug 2007, 15:21
Maybe this can help?
Delphi-Quellcode:

unit VIAProHosts;

interface

{$define OMCDrv}
//{$define ATTDrv}

uses
  i2c_h, i2c_dev,
  {$ifdef OMCDrv}
    OMCDrv,
  {$endif}
  {$ifdef ATTDrv}
    ATTDrv,
  {$endif}
  hPCI,
  Windows,
  SysUtils;

function VIAPro_access (var SMBusHost: tSMBusHost; addr, flags: Word; read_write: Byte;
                           command: Byte; size: DWord; var data: i2c_smbus_data): LongInt;
function VIAProGetHost(var SMBInterfaces: tSMBInterfaces; var HostsNum: Byte; HostDevice: tPCIDevice): boolean;
function VIAProFillHostIds: tHostIDs;

implementation

const
  SMBBA1 = $90;
  SMBBA2 = $80;
  SMBBA3 = $D0;

  //Other settings
  MAX_TIMEOUT   = 500;
  ENABLE_INT9   = 0;

  //VT82C596 constants
  VT596_QUICK = $00;
  VT596_BYTE = $04;
  VT596_BYTE_DATA = $08;
  VT596_WORD_DATA = $0C;
  VT596_BLOCK_DATA = $14;

  PCI_VENDOR_ID_VIA = $1106;

  PCI_DEVICE_ID_VIA_82C596_3 = $3050;
  PCI_DEVICE_ID_VIA_82C596B_3   = $3051;
  PCI_DEVICE_ID_VIA_82C686_4   = $3057;
  PCI_DEVICE_ID_VIA_8231_4    = $8235;
  PCI_DEVICE_ID_VIA_8233_0    = $3074;
  PCI_DEVICE_ID_VIA_8233A    = $3147;
  PCI_DEVICE_ID_VIA_8235    = $3177;
  PCI_DEVICE_ID_VIA_8237    = $3227;

var
  viapro_ids: array[0..7] of tHostID =
  (
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_82C596_3),
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_82C596B_3),
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_82C686_4),
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_8231_4),
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_8233_0),
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_8233A),
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_8235),
     (VendorID: PCI_VENDOR_ID_VIA; DeviceID: PCI_DEVICE_ID_VIA_8237)
   );

  //PCI Address Constants

  //SMBus data in configuration space can be found in two places,
  //We try to select the better one

  smb_cf_hstcfg: Word;

function SMBHSTCFG(smb_cf_hstcfg: Word): Word;
begin
  result:=smb_cf_hstcfg;
end;

function SMBSLVC(smb_cf_hstcfg: Word): Word;
begin
  result:=smb_cf_hstcfg + 1;
end;

function SMBSHDW1(smb_cf_hstcfg: Word): Word;
begin
  result:=smb_cf_hstcfg + 2;
end;

function SMBSHDW2(smb_cf_hstcfg: Word): Word;
begin
  result:=smb_cf_hstcfg + 3;
end;

function SMBREV(smb_cf_hstcfg: Word): Word;
begin
  result:=smb_cf_hstcfg + 4;
end;

//SMBus address offsets
function SMBHSTSTS(base: Word): DWord;
begin
  result:=base+0;
end;

function SMBHSLVSTS(base: Word): DWord;
begin
  result:=base+1;
end;

function SMBHSTCNT(base: Word): DWord;
begin
  result:=base+2;
end;

function SMBHSTCMD(base: Word): DWord;
begin
  result:=base+3;
end;

function SMBHSTADD(base: Word): DWord;
begin
  result:=base+4;
end;

function SMBHSTDAT0(base: Word): DWord;
begin
  result:=base+5;
end;

function SMBHSTDAT1(base: Word): DWord;
begin
  result:=base+6;
end;

function SMBBLKDAT(base: Word): DWord;
begin
  result:=base+7;
end;

function SMBSLVCNT(base: Word): DWord;
begin
  result:=base+8;
end;

function SMBSHDWCMD(base: Word): DWord;
begin
  result:=base+9;
end;

function SMBSLVEVT(base: Word): DWord;
begin
  result:=base+$A;
end;

function SMBSLVDAT(base: Word): DWord;
begin
  result:=base+$C;
end;

function vt596_transaction(Base: Word): LongInt;
var
  tmp: Byte;
  temp, res, timeout: integer;
begin
  res:=0;
  timeout:=0;

  tmp:=GetInstance.IPortIORef.B[SMBHSTCNT(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTCMD(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTADD(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTDAT0(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTDAT1(Base)];
  tmp:=0;

   //Make sure the SMBus host is ready to start transmitting
  temp:=GetInstance.IPortIORef.B[SMBHSTSTS(Base)];
  //ShowMessage(format('%x', [temp]));
   if (temp and $1F) <> 0 then
  begin
    //ShowMessage('Here');
    GetInstance.IPortIORef.B[SMBHSTSTS(Base)]:=temp;
    temp:=GetInstance.IPortIORef.B[SMBHSTSTS(Base)];
      if (temp and $1F) <> 0 then
    begin
         result:=-1;
         exit;
      end;
   end;

  //start the transaction by setting bit 6
  tmp:=GetInstance.IPortIORef.B[SMBHSTCNT(Base)];
  GetInstance.IPortIORef.B[SMBHSTCNT(Base)]:=tmp or $40;

  //We will always wait for a fraction of a second!
  //I don't know if VIA needs this, Intel did
  repeat
    sleep(1);
    temp:=GetInstance.IPortIORef.B[SMBHSTSTS(Base)];
    inc(timeout);
  until not(((temp and $01)<>0) and (timeout < MAX_TIMEOUT));

   //If the SMBus is still busy, we give up */
   if (timeout >= MAX_TIMEOUT) then res:=-1;

  if (temp and $10) <> 0 then res:=-1;
   if (temp and $08) <>0 then res:=-1; //Clock stops and slave is stuck in mid-transmission
   if (temp and $04) <> 0 then res:=-1;


  temp:=GetInstance.IPortIORef.B[SMBHSTSTS(Base)];
  if (temp and $1F) <> 0 then
  begin
    GetInstance.IPortIORef.B[SMBHSTSTS(Base)]:=temp;
    temp:=GetInstance.IPortIORef.B[SMBHSTSTS(Base)];
  end;

  tmp:=GetInstance.IPortIORef.B[SMBHSTCNT(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTCMD(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTADD(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTDAT0(Base)];
  tmp:=GetInstance.IPortIORef.B[SMBHSTDAT1(Base)];
  
  result:=res;
end;

function VIAPro_access(var SMBusHost: tSMBusHost; addr, flags: Word; read_write: Byte;
                           command: Byte; size: DWord; var data: i2c_smbus_data): LongInt;
begin

  case size of

    I2C_SMBUS_QUICK: begin
      GetInstance.IPortIORef.B[SMBHSTADD(SMBusHost.base)]:=((addr and $7f) shl 1) or (read_write and $01);
        size:=VT596_QUICK;
    end;
     I2C_SMBUS_BYTE: begin
      GetInstance.IPortIORef.B[SMBHSTADD(SMBusHost.base)]:=((addr and $7f) shl 1) or (read_write and $01);
        if (read_write = I2C_SMBUS_WRITE) then GetInstance.IPortIORef.B[SMBHSTCMD(SMBusHost.base)]:=command;
        size:=VT596_BYTE;
      end;
     I2C_SMBUS_BYTE_DATA: begin
      GetInstance.IPortIORef.B[SMBHSTADD(SMBusHost.base)]:=((addr and $7f) shl 1) or (read_write and $01);
      GetInstance.IPortIORef.B[SMBHSTCMD(SMBusHost.base)]:=command;
        if (read_write = I2C_SMBUS_WRITE) then GetInstance.IPortIORef.B[SMBHSTDAT0(SMBusHost.base)]:=data.ByteData;
        size:=VT596_BYTE_DATA;
      end;
     I2C_SMBUS_WORD_DATA: begin
      GetInstance.IPortIORef.B[SMBHSTADD(SMBusHost.base)]:=((addr and $7f) shl 1) or (read_write and $01);
      GetInstance.IPortIORef.B[SMBHSTCMD(SMBusHost.base)]:=command;
        if (read_write = I2C_SMBUS_WRITE) then
      begin
        GetInstance.IPortIORef.B[SMBHSTDAT0(SMBusHost.base)]:=data.WordData and $ff;
        GetInstance.IPortIORef.B[SMBHSTDAT1(SMBusHost.base)]:=(data.WordData and $ff00) shr 8;
        end;
        size:=VT596_WORD_DATA;
      end;
  end;

  GetInstance.IPortIORef.B[SMBHSTCNT(SMBusHost.base)]:=(size and $1C) + (ENABLE_INT9 and 1);

  if vt596_transaction(SMBusHost.base)=-1 then
  begin
    result:=-1;
    exit;
  end;

  if ((read_write = I2C_SMBUS_WRITE) or (size = VT596_QUICK)) then
  begin
    result:=0;
    exit;
  end;

  case size of
    VT596_BYTE: begin
        //Where is the result put? I assume here it is in
        //SMBHSTDAT0 but it might just as well be in the
        //SMBHSTCMD. No clue in the docs
      data.ByteData:=GetInstance.IPortIORef.B[SMBHSTDAT0(SMBusHost.base)];
      end;
     VT596_BYTE_DATA: begin
      data.ByteData:=GetInstance.IPortIORef.B[SMBHSTDAT0(SMBusHost.base)];
    end;
     VT596_WORD_DATA: begin
      data.WordData:=GetInstance.IPortIORef.B[SMBHSTDAT0(SMBusHost.base)]+(GetInstance.IPortIORef.B[SMBHSTDAT1(SMBusHost.base)] shl 8);
    end;
  end;

end;

function VIAProGetHost(var SMBInterfaces: tSMBInterfaces; var HostsNum: Byte; HostDevice: tPCIDevice): boolean;
var
  DeviceID, wdata: Word;
  pdata: DWord;
  BaseAddr: Byte;
  CurrentHost: DWord;
begin
  inc(HostsNum);
  SetLength(SMBInterfaces, HostsNum);
  CurrentHost:=HostsNum-1;
  
  GetInstance.IPCIIORef.GetPCIRDWord(HostDevice.DevRegs.dwBus, HostDevice.DevRegs.dwDev, HostDevice.DevRegs.dwFunc, 0, pdata);
  DeviceID:=Word(pdata shr 16);
  case DeviceID of
       PCI_DEVICE_ID_VIA_82C596_3: BaseAddr:=SMBBA1;
      PCI_DEVICE_ID_VIA_82C596B_3: BaseAddr:=SMBBA1;
      PCI_DEVICE_ID_VIA_82C686_4:    BaseAddr:=SMBBA1;
      PCI_DEVICE_ID_VIA_8233_0: BaseAddr:=SMBBA3;
      PCI_DEVICE_ID_VIA_8233A: BaseAddr:=SMBBA3;
      PCI_DEVICE_ID_VIA_8235:    BaseAddr:=SMBBA3;
      PCI_DEVICE_ID_VIA_8237:    BaseAddr:=SMBBA3;
      PCI_DEVICE_ID_VIA_8231_4:    BaseAddr:=SMBBA1;
  end;

  GetInstance.IPCIIORef.GetPCIRWord(HostDevice.DevRegs.dwBus, HostDevice.DevRegs.dwDev, HostDevice.DevRegs.dwFunc, BaseAddr, wdata);
  //if not (wdata and 1) <> 0) then

  wdata:=wdata and $fff0;

  SMBInterfaces[CurrentHost].SMBusHosts.base:=wdata;

  //ShowMessage(format('%x', [wdata]));
end;

function VIAProFillHostIds: tHostIDs;
var
  i: byte;
begin
  for i:=Low(viapro_ids) to High(viapro_ids) do
    begin
      SetLength(result, i+1);
      result[i].VendorID := viapro_ids[i].VendorID;
      result[i].DeviceID := viapro_ids[i].DeviceID;
    end;
end;

end.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz