![]() |
Memory Information?
How to get memory info(voltage,refresh rate,latency,precharge,type,fsb:dram)?
|
Re: Memory Information?
*push*
|
Re: Memory Information?
*push*
|
Re: Memory Information?
OMG nobody knows how to do it? :(
|
Re: Memory Information?
Okay some guy said i have to comunicate with EEPROM on memory chips through smbus but how do i comunicate?Is there a really good component for smbus?
|
Re: Memory Information?
There is definitly no component. It is not just putting your components together on the form and finish. You have to access the SMBus register of the chipset (where this register chances by vendor and even by chipset model). To access these register, you have to do hardware port access to the hardware ports of the chipset, where a new problem will come up: Windows NT and following doesn't allow application to do so. But this problem can be solved - the most problems is to collect the different chipset hardware informations about accessing the SMBus and further the documentation of the different sensor ICs connected to the SMBus. There is a wide range of different ICs. The commonly known is the
![]() If you want some source for accessing SMBus, try to search for HWMon. This name is used by a hardware monitor in linux but also for Delphi application for measuring the fan rpms, voltages etc. They are accessed through the SMBus interface. |
Re: Memory Information?
Thanks!
My motherboard is Asrock p4v88 :lol: with Winbond W83697HF sensor,speed fan shows memory info such as memory voltage and other bullshit... Datasheet,but where to look for ports as you said.. ![]() |
Re: Memory Information?
Zitat:
|
Re: Memory Information?
Speed fan shows this :)
Scanning SMBus at $0400... Decoding DIMM #0 Memory type is DDR Module Rows : 2 Levels : 2.5V Parity : NO PARITY Refresh Rate : 7.8us Total Size : 512MB Decoding DIMM #3 Memory type is DDR Module Rows : 1 Levels : 2.5V Parity : NO PARITY Refresh Rate : 7.8us Total Size : 512MB Southbrige is VIA® 8237 |
Re: Memory Information?
Zitat:
|
Re: Memory Information?
Linked ISA BUS at $0290
Linked VIA VT8237 SMBUS at Scaning SMBUS at $0400 device found at $50 device found at $53 device found at $69 device found at $6A Maybe this information? :) |
Re: Memory Information?
Okay i know this isn't probably it but tell me where can i get.Maybe some program that reads info or some asm would do? :)
Since i don't know how speed fan can access it without datasheets it's a freeware project BTW. |
Re: Memory Information?
|
Re: Memory Information?
Okay i read it but it dosent show how to get information if you know i mean it only shows only information about smbus bus. :|
|
Re: Memory Information?
|
Re: Memory Information?
I get ????? all over the place why is that? :?
On the debug page it says: Load from... Scan PCI PCI not found or uknown STOP PROGRAM!!! |
Re: Memory Information?
Read before download:
Zitat:
Another example: The author of motherboard monitor (MBM) has discontinued his application, because it is an enormious work to support every new hardware, IC, etc. Also he can not give the code to another author with more time, because he signed so many NDA's to get the informations and also work hand in hand with some manufactures (where he got internal information) so he can not publish the source code. It is really not a simple thing - there is it quite easy to collect all the CPU informations (e.g. CPUID codes, etc). |
Re: Memory Information?
Do you have any idea where can i get that documentation,how did speedfan's author did it? :|
|
Re: Memory Information?
As I wrote before: You can the documentation directly from the manufactures, but not all offer them.
Intel: public available for download and also free shipping in printed form for the chipsets AMD: public available for download, partly after registration or validation as hardware manufacturer VIA: no public informations. Detailed informationen on chipset etc only as validated hardware manufacturer and with a (not small) fee. Only to name the big ones. And see my editions on my earlier posting... |
Re: Memory Information?
Ill mail Speed fan's author and we will see what goes from there
|
Re: Memory Information?
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. |
Re: Memory Information?
Nice, this should help. Now search for code to access the PCI configuration space to evaluate the SMBus controllers. This you need to gather the I/O port for the SMBus register. After this, access the SMBus as shown in the code above.
Nearly finished: no time to waste, just copy and paste... |
Re: Memory Information?
Gotcha,make sure you test this Muetze1 :)
Delphi-Quellcode:
unit PCI;
interface uses OMCDrv, CmnTnC, hPCI; type DWord = LongWord; tPCIDevices = record DevRegs: tDevRegs; ClassDescr, DeviceDescr: string[80]; DeviceDump: array[0..$FF] of byte; Detected: boolean; end; type cPCIInfo = class private DatFileName: string; procedure GetClassDescr; procedure GetDeviceDescr; function GetFileFromResource: string; function ReadFromDatFile(Section, Ident, DefValue: string): string; public PCIDevices: array of tPCIDevices; DevCount: byte; Scanned: boolean; NorthBridge, SouthBridge: tPCIDevices; procedure ScanPCIBus; constructor Create; destructor Destroy; end; function GetPciInfoInstance(): cPCIInfo; implementation uses SysUtils, Classes, Windows, Dialogs; var this_: cPCIInfo; function GetPciInfoInstance(): cPCIInfo; begin if (not Assigned(this_)) then this_ := cPCIInfo.Create; result := this_; end; {$I DevClass.inc} {$R PCIInfoData.res} constructor cPCIInfo.Create; begin inherited Create; Scanned := false; ScanPCIBus; end; procedure cPCIInfo.ScanPCIBus; var dwBus, dwDev, dwFunc: byte; pdata: DWord; bdata, DevInd, i: byte; begin if not GetInstance.isLoad then exit; DevCount:=0; SetLength(PCIDevices,DevCount); for dwBus:=0 to 255 do for dwDev:=0 to 31 do begin if not GetInstance.IPCIIORef.ProbeDevice(dwBus, dwDev) then continue; for dwFunc:=0 to 7 do begin GetInstance.IPCIIORef.GetPCIRDWord(dwBus, dwDev, dwFunc, 0, pdata); if pdata=$FFFFFFFF then continue; if dwFunc=0 then DevInd:=DevCount; GetInstance.IPCIIORef.GetPCIRDWord(dwBus, dwDev, dwFunc, 8, pdata); if DevInd>=1 then begin pdata:=(pdata shr 8); if pdata=PCIDevices[DevInd].DevRegs.ClassCode then continue; end; inc(DevCount); SetLength(PCIDevices,DevCount); PCIDevices[DevCount-1].DevRegs.dwBus:=dwBus; PCIDevices[DevCount-1].DevRegs.dwDev:=dwDev; PCIDevices[DevCount-1].DevRegs.dwFunc:=dwFunc; GetInstance.IPCIIORef.GetPCIRDWord(dwBus, dwDev, dwFunc, 0, pdata); PCIDevices[DevCount-1].DevRegs.VendorID:=Word(pdata); PCIDevices[DevCount-1].DevRegs.DeviceID:=Word(pdata shr 16); GetInstance.IPCIIORef.GetPCIRDWord(dwBus, dwDev, dwFunc, 8, pdata); PCIDevices[DevCount-1].DevRegs.RID := Byte(pdata); PCIDevices[DevCount-1].DevRegs.ClassCode:=pdata shr 8; GetInstance.IPCIIORef.GetPCIRDWord(dwBus, dwDev, dwFunc, $2C, pdata); PCIDevices[DevCount-1].DevRegs.SVID := Word(pdata); PCIDevices[DevCount-1].DevRegs.SID := Word(pdata shr 16); for i:=0 to $FF do begin GetInstance.IPCIIORef.GetPCIRByte(dwBus, dwDev, dwFunc, i, bdata); PCIDevices[DevCount-1].DeviceDump[i]:=bdata; end; end; end; GetClassDescr; DatFileName:=GetFileFromResource; GetDeviceDescr; Scanned := true; end; procedure cPCIInfo.GetClassDescr; var i, j: byte; begin for i:=Low(PCIDevices) to High(PCIDevices) do begin for j:=Low(fDevClassTable) to High (fDevClassTable) do begin if PCIDevices[i].DevRegs.ClassCode = fDevClassTable[j].DevClass then begin PCIDevices[i].ClassDescr:=fDevClassTable[j].ClassDescr; break; end; end; end; end; procedure cPCIInfo.GetDeviceDescr; function IntToHexForm(val: integer; index: byte): string; var i: byte; begin result:=(format('%x',[val])); for i:=1 to index-Length(result) do insert('0', result, 0); end; var i, j: byte; ident: string; begin for i:=Low(PCIDevices) to High(PCIDevices) do begin ident:=IntToHexForm(PCIDevices[i].DevRegs.VendorID, 4)+IntToHexForm(PCIDevices[i].DevRegs.DeviceID, 4); case PCIDevices[i].DevRegs.ClassCode of $060000: begin PCIDevices[i].DeviceDescr:=ReadFromDatFile('NorthBridge', ident, 'Unknown device'); if NorthBridge.Detected then continue; NorthBridge.DevRegs.VendorID:=PCIDevices[i].DevRegs.VendorID; NorthBridge.DevRegs.DeviceID:=PCIDevices[i].DevRegs.DeviceID; NorthBridge.DevRegs.ClassCode:=PCIDevices[i].DevRegs.ClassCode; NorthBridge.DevRegs.dwBus:=PCIDevices[i].DevRegs.dwBus; NorthBridge.DevRegs.dwDev:=PCIDevices[i].DevRegs.dwDev; NorthBridge.DevRegs.dwFunc:=PCIDevices[i].DevRegs.dwFunc; NorthBridge.DeviceDescr:=PCIDevices[i].DeviceDescr; NorthBridge.Detected:=true; end; $060100, $060200: begin PCIDevices[i].DeviceDescr:=ReadFromDatFile('SouthBridge', ident, 'Unknown device'); if SouthBridge.Detected then continue; SouthBridge.DevRegs.VendorID:=PCIDevices[i].DevRegs.VendorID; SouthBridge.DevRegs.DeviceID:=PCIDevices[i].DevRegs.DeviceID; SouthBridge.DevRegs.ClassCode:=PCIDevices[i].DevRegs.ClassCode; SouthBridge.DevRegs.dwBus:=PCIDevices[i].DevRegs.dwBus; SouthBridge.DevRegs.dwDev:=PCIDevices[i].DevRegs.dwDev; SouthBridge.DevRegs.dwFunc:=PCIDevices[i].DevRegs.dwFunc; SouthBridge.DeviceDescr:=PCIDevices[i].DeviceDescr; SouthBridge.Detected:=true; end; end; end; end; function cPCIInfo.GetFileFromResource: string; var TR:TResourceStream; lpBuffer: array[0..255] of Char; begin GetWindowsDirectory(lpBuffer, 255); result:=StrPas(lpBuffer)+'\PCIinfo.dat'; try DeleteFile(PAnsiChar(result)); except end; if FileExists(result) then exit; TR:=TResourceStream.Create(0, 'PCIINFODATA', RT_RCDATA); TR.SaveToFile(result); TR.Free; end; function cPCIInfo.ReadFromDatFile(Section, Ident, DefValue: string): string; var DatFile: TextFile; TmpStr, TmpStr2: string; i: DWord; begin try //ShowMessage(Ident); //debug message AssignFile(DatFile, DatFileName); Reset(DatFile); result:=DefValue; //Finding proper section while not eof(DatFile) do begin readln(DatFile, TmpStr); if TmpStr<>'' then if TmpStr[1]='[' then begin Delete(TmpStr, 1, 1); Delete(TmpStr, length(TmpStr), 1); if TmpStr=Section then begin while not eof(DatFile) do begin readln(DatFile, TmpStr); if TmpStr<>'' then if TmpStr[1]<>';' then begin if TmpStr[1]='[' then exit; TmpStr2:=Copy(TmpStr, 1, 8); if TmpStr2=Ident then begin result:=Copy(TmpStr, 10, length(TmpStr)-10+1); exit; end; end; end; end; end; end; CloseFile(DatFile); except result:=DefValue; end; end; destructor cPCIInfo.Destroy; begin DevCount:=0; SetLength(PCIDevices,DevCount); try DeleteFile(PAnsiChar(DatFileName)); except end; inherited Destroy; end; initialization this_ := nil; finalization if (Assigned(this_)) then this_.Destroy; end. |
Re: Memory Information?
Zitat:
|
Re: Memory Information?
Okay where do i put base address in?
|
Re: Memory Information?
Zitat:
![]() |
Re: Memory Information?
Ok i tested this monster can i somehow convert this to a normal project?I want to display the info in a listbox?Or maybe memo..
|
Re: Memory Information?
spd bus specification
![]()
Delphi-Quellcode:
unit Memory;
interface type DWord = LongWord; tCtrl_Info = packed record index, poll, cap, mode: integer; dwBus, dwDev, dwFunc: DWord; end; tTimings = packed record CAS, RCD, RP, RAS: single; end; tgRAMInfo = packed record DRAMClock: double; RamSize: DWord; DRAMCoef, DRAMCnls, DRAMType, DRAMAccel: string; end; tGetFSBMethod = procedure (lCPUClock, FSB: double; Mult: single; var GRAMInfo: tGRAMInfo); tGetTmngsMethod = procedure (var Timings: tTimings; var gRAMInfo: tGRAMInfo); tSetupECCMethod = procedure; Memory_Controller = packed record VendorID, DeviceID: Word; name: string; tested: integer; GetFSBMethod: tGetFSBMethod; GetTmngsMethod: tGetTmngsMethod; SetupECCMethod: tSetupECCMethod; end; cMemory = class private public fCtrl_Info: tCtrl_Info; fTimings: tTimings; fgRAMInfo: tgRAMInfo; constructor Create; destructor Destroy; override; procedure DetectMemCtrl; function GetPhysMemSize: DWord; procedure FillMemCtrlInfo(lCPUClock, FSB: double; Mult: single); end; var MemInfo: cMemory; implementation uses SysUtils, Windows, Dialogs; //nVidia nForce 2 Methods procedure poll_fsb_nf2(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var mempll: DWord; mem_m, mem_n: byte; begin //Get the coef (COEF = N/M) - Here is for Crush17 GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 3, $70, mempll); mem_m:=mempll and $0F; mem_n:=(mempll shr 4) and $0F; //ShowMessage(format('%x', [oHWIO.MemReadLong($5620)])); //If something goes wrong, the chipset is probably a Crush18 if (mem_m = 0) or (mem_n = 0) then begin GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 3, $7C, mempll); mem_m:=mempll and $0F; mem_n:=(mempll shr 4) and $0F; end; //Computing DRAM Frequency gRAMInfo.DRAMClock:=FSB*(mem_n/mem_m); //Forming DRAM : FSB Divider if (mem_n = mem_m) then gRAMInfo.DRAMCoef:='1:1' else gRAMInfo.DRAMCoef:=IntToStr(mem_m)+':'+IntToStr(mem_n); end; procedure poll_timings_nf2(var Timings: tTimings; var gRAMInfo: tGRAMInfo); var dramtlr, dramtlr2, dramtlr3, temp: DWord; dimm1p, dimm2p, dimm3p: DWord; begin GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 1, $90, dramtlr); GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 1, $A0, dramtlr2); GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 1, $84, dramtlr3); GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 2, $40, dimm1p); GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 2, $44, dimm2p); GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 2, $48, dimm3p); //CAS Latency (tCAS) temp:=(dramtlr2 shr 4) and $7; if (temp = $2) then Timings.CAS:=2 else if (temp = $6) then Timings.CAS:=2.5 else if (temp = $3) then Timings.CAS:=3; //RAS-To-CAS (tRCD) Timings.RCD:=(dramtlr shr 20) and $F; //RAS Precharge (tRP) Timings.RP:=(dramtlr shr 28) and $F; //RAS Active to precharge (tRAS) Timings.RAS:=(dramtlr shr 15) and $F; //Print 64 or 128 bits mode //If DIMM1 & DIMM3 or DIMM1 & DIMM2 populated, than Dual Channel. if (((dimm3p and 1)+(dimm2p and 1) = 2) or ((dimm3p and 1)+(dimm1p and 1) = 2)) then gRAMInfo.DRAMCnls:='Dual' else gRAMInfo.DRAMCnls:='Single'; gRAMInfo.DRAMType:='DDR-SDRAM' end; //AMD64 Methods procedure poll_fsb_amd64(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var dramchr, temp: DWord; clockratio: single; begin GetInstance.IPCIIORef.GetPCIRDWord(0, 24, 2, $94, dramchr); temp:=(dramchr shr 20) and $7; clockratio:=Mult; case temp of $0: clockratio:=trunc(Mult*2.0); $2: clockratio:=trunc((Mult*3.0/2.0)+0.81); $4: clockratio:=trunc((Mult*4.0/3.0)+0.81); $5: clockratio:=trunc((Mult*6.0/5.0)+0.81); $6: clockratio:=trunc((Mult*10.0/9.0)+0.81); $7: clockratio:=trunc(Mult+0.81); end; gRAMInfo.DRAMClock:=lCPUClock/clockratio; gRAMInfo.DRAMCoef:='CPU/'+IntToStr(trunc(clockratio)); end; procedure poll_timings_amd64(var Timings: tTimings; var gRAMInfo: tGRAMInfo); var dramtlr, dramclr, temp: DWord; begin GetInstance.IPCIIORef.GetPCIRDWord(0, 24, 2, $88, dramtlr); GetInstance.IPCIIORef.GetPCIRDWord(0, 24, 2, $90, dramclr); //CAS Latency (tCAS) temp:=dramtlr and $7; if (temp = $1) then Timings.CAS:=2 else if (temp = $2) then Timings.CAS:=3 else if (temp = $5) then Timings.CAS:=2.5; //RAS-To-CAS (tRCD) Timings.RCD:=(dramtlr shr 12) and $7; //RAS Precharge (tRP) Timings.RP:=(dramtlr shr 24) and $7; //RAS Active to precharge (tRAS) Timings.RAS:=(dramtlr shr 20) and $F; if (((dramclr shr 16) and 1) = 1) then gRAMInfo.DRAMCnls:='Dual' else gRAMInfo.DRAMCnls:='Single'; gRAMInfo.DRAMType:='DDR-SDRAM' end; //nVidia nForce 4 SLI Intel Edition procedure poll_fsb_nf4ie(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var mratio, nratio: byte; reg60: DWord; reg74: Word; DRAMRatio: double; begin //Find dramratio GetInstance.IPCIIORef.GetPCIRWord(0, 0, 2, $74, reg74); GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 2, $60, reg60); mratio:=reg74 and $F; nratio:=(reg74 shr 4) and $F; //If M or N = 0, then M or N = 16 if (mratio = 0) then mratio:=16; if (nratio = 0) then nratio:=16; //Check if synchro or pseudo-synchro mode if (((reg60 shr 22) and 1) = 1) then DRAMRatio:=1 else DRAMRatio:=nratio/mratio; gRAMInfo.DRAMClock:=FSB*DRAMRatio; if (DRAMRatio = 1) then gRAMInfo.DRAMCoef:='1:1' else gRAMInfo.DRAMCoef:=IntToStr(mratio)+':'+IntToStr(nratio); end; procedure poll_timings_nf4ie(var Timings: tTimings; var gRAMInfo: tGRAMInfo); var regd0, reg8c, reg9c: DWord; reg80: byte; begin //Now, read Registers GetInstance.IPCIIORef.GetPCIRDWord( 0, 1, 1, $D0, regd0); GetInstance.IPCIIORef.GetPCIRByte( 0, 1, 1, $80, reg80); GetInstance.IPCIIORef.GetPCIRDWord( 0, 1, 0, $8C, reg8c); GetInstance.IPCIIORef.GetPCIRDWord( 0, 1, 0, $9C, reg9c); //Then, detect timings Timings.CAS:=(regd0 shr 4) and $7; Timings.RCD:=(reg8c shr 24) and $F; Timings.RP:=(reg9c shr 8) and $F; Timings.RAS:=(reg8c shr 16) and $3F; if ((reg80 and $3) <> 0) then gRAMInfo.DRAMCnls:='Dual' else gRAMInfo.DRAMCnls:='Single'; gRAMInfo.DRAMType:='DDRII-SDRAM' end; //Intel i875 Methods procedure poll_fsb_i875(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var smfs: DWord; mchcfg: Word; DRAMRatio: single; begin GetInstance.IPCIIORef.GetPCIRWord(0, 0, 0, $C6, mchcfg); smfs:=(mchcfg shr 10) and 3; DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; if ((mchcfg and 3) = 3) then begin DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; end; if ((mchcfg and 3) = 2) then begin if (smfs = 2) then begin DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; end; if (smfs = 1) then begin DRAMRatio:=1.25; gRAMInfo.DRAMCoef:='5:4'; end; if (smfs = 0) then begin DRAMRatio:=1.5; gRAMInfo.DRAMCoef:='3:2'; end; end; if ((mchcfg and 3) = 1) then begin if (smfs = 2) then begin DRAMRatio:=0.6666666666; gRAMInfo.DRAMCoef:='2:3'; end; if (smfs = 1) then begin DRAMRatio:=0.8; gRAMInfo.DRAMCoef:='4:5'; end; if (smfs = 0) then begin DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; end; end; if ((mchcfg and 3) = 0) then begin DRAMRatio:=0.75; gRAMInfo.DRAMCoef:='3:4'; end; gRAMInfo.DRAMClock:=FSB/DRAMRatio; end; procedure poll_timings_i875(var Timings: tTimings; var gRAMInfo: tGRAMInfo); var dev6, dev62, temp: DWord; tmp1, tmp2: DWord; begin //Read the MMR Base Address & Define the pointer GetInstance.IPCIIORef.GetPCIRDWord(0, 6, 0, $10, dev6); //Now, the PAT ritual ! (Kant and Luciano will love this) GetInstance.IPCIIORef.GetPCIRDWord(0, 6, 0, $40, dev62); tmp2:=GetInstance.MemReadLong(dev6+$68); tmp1:=GetInstance.MemReadLong(dev6+$60); if (((dev62 and $3) = 0) and (((tmp2 shr 14) and 1) = 1)) then gRAMInfo.DRAMAccel:='Enabled' else gRAMInfo.DRAMAccel:='Disabled'; //CAS Latency (tCAS) temp:=(tmp1 shr 5) and $3; if (temp = $0) then Timings.CAS:=2.5 else if (temp = $1) then Timings.CAS:=2 else Timings.CAS:=3; //RAS-To-CAS (tRCD) temp:=(tmp1 shr 2) and $3; if (temp = $0) then Timings.RCD:=4 else if (temp = $1) then Timings.RCD:=3 else Timings.RCD:= 2; //RAS Precharge (tRP) temp:=tmp1 and $3; if (temp = $0) then Timings.RP:=4 else if (temp = $1) then Timings.RP:=3 else Timings.RP:=2; //RAS Active to precharge (tRAS) temp:=(tmp1 shr 7) and $7; Timings.RAS:=10-temp; //64 or 128 bits mode if (((tmp2 shr 21) and 3) > 0) then gRAMInfo.DRAMCnls:='Dual' else gRAMInfo.DRAMCnls:='Single'; gRAMInfo.DRAMType:='DDR-SDRAM' end; //Intel i925 Methods procedure poll_fsb_i925(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var mchcfg, mchcfg2, dev0, drc, idetect, tmp: DWord; DRAMRatio: single; begin GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 0, $02, idetect); idetect:=(idetect shr 16) and $FFFF; //Find dramratio GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 0, $44, dev0); dev0:=dev0 and $FFFFC000; tmp:=GetInstance.MemReadLong(dev0+$C00); mchcfg:=tmp and $FFFF; tmp:=GetInstance.MemReadLong(dev0+$120); drc:=tmp and $FFFF; DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; mchcfg2:=(mchcfg shr 4) and 3; if ((drc and 3) <> 2) then begin // We are in DDR1 Mode if (mchcfg2 = 1) then begin DRAMRatio:=0.8; gRAMInfo.DRAMCoef:='5:4'; end else begin DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; end; end else begin // We are in DDR2 Mode if (((mchcfg shr 2) and 1) = 1) then begin // We are in FSB1066 Mode if (mchcfg2 = 2) then begin DRAMRatio:=0.75; gRAMInfo.DRAMCoef:='4:3'; end else begin DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; end; end else case mchcfg2 of 1: begin DRAMRatio:=0.66667; gRAMInfo.DRAMCoef:='3:2'; end; 2: if (idetect<>$2590) then begin DRAMRatio:=1; gRAMInfo.DRAMCoef:='1:1'; end else begin DRAMRatio:=1.5; gRAMInfo.DRAMCoef:='2:3'; end; 3: begin // Checking for FSB533 Mode & Alviso if ((mchcfg and 1) = 0) then begin DRAMRatio:=1.33334; gRAMInfo.DRAMCoef:='3:4'; end else if (idetect = $2590) then begin DRAMRatio:=2; gRAMInfo.DRAMCoef:='2:1'; end else begin DRAMRatio:=1.5; gRAMInfo.DRAMCoef:='2:3'; end; end; end end; gRAMInfo.DRAMClock:=FSB*DRAMRatio; end; procedure poll_timings_i925(var Timings: tTimings; var gRAMInfo: tGRAMInfo); var dev0, drt, drc, dcc, idetect, temp, tmp: DWord; begin //Now, read MMR Base Address GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 0, $44, dev0); GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 0, $02, idetect); idetect:=(idetect shr 16) and $FFFF; dev0:=dev0 and $FFFFC000; //Set pointer for DRT tmp:=GetInstance.MemReadLong(dev0+$114); drt:=tmp and $FFFFFFFF; //Set pointer for DRC tmp:=GetInstance.MemReadLong(dev0+$120); drc:=tmp and $FFFFFFFF; //Set pointer for DCC tmp:=GetInstance.MemReadLong(dev0+$200); dcc:=tmp and $FFFFFFFF; //CAS Latency (tCAS) temp:=(drt shr 8) and $3; if ((drc and 3) = 2) then begin // Timings DDR-II gRAMInfo.DRAMType:='DDRII-SDRAM'; if (temp = $0) then Timings.CAS:=5 else if (temp = $1) then Timings.CAS:=4 else Timings.CAS:=3; end else begin // Timings DDR-I gRAMInfo.DRAMType:='DDR-SDRAM'; if (temp = $0) then Timings.CAS:=3 else if (temp = $1) then Timings.CAS:=2.5 else Timings.CAS:=2; end; //RAS-To-CAS (tRCD) Timings.RCD:=((drt shr 4) and $3)+2; //RAS Precharge (tRP) Timings.RP:=(drt and $3)+2; //RAS Active to precharge (tRAS) //If Lakeport, than change tRAS computation (Thanks to CDH, again) if (idetect = $2770) or (idetect = $2774) then Timings.RAS:=(drt shr 19) and $1F else Timings.RAS:=(drt shr 20) and $F; temp:=dcc and $3; if (temp = 1) then gRAMInfo.DRAMCnls:='Dual' else if (temp = 2) then gRAMInfo.DRAMCnls:='Dual' else gRAMInfo.DRAMCnls:='Single'; end; //Intel i945 Methods procedure poll_fsb_i945(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var mchcfg, dev0, tmp: DWord; DRAMRation: single; begin //Find dramratio GetInstance.IPCIIORef.GetPCIRDWord(0, 0, 0, $44, dev0); dev0:=dev0 and $FFFFC000; tmp:=GetInstance.MemReadLong(dev0+$C00); mchcfg:=tmp and $FFFF; DRAMRation:=1; case ((mchcfg shr 4) and 7) of 1: begin DRAMRation:=1; gRAMInfo.DRAMCoef:='1:1'; end; 2: begin DRAMRation:=1.33334; gRAMInfo.DRAMCoef:='3:4'; end; 3: begin DRAMRation:=1.66667; gRAMInfo.DRAMCoef:='3:5'; end; 4: begin DRAMRation:=2; gRAMInfo.DRAMCoef:='1:2'; end; end; gRAMInfo.DRAMClock:=FSB*DRAMRation; end; //KT266 Methods procedure poll_fsb_kt266(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var reg69: Byte; begin GetInstance.IPCIIORef.GetPCIRByte(0, 0, 0, $69, reg69); reg69:=(reg69 shr 6) and $3; case reg69 of 0: begin gRAMInfo.DRAMCoef:='1:1'; gRAMInfo.DRAMClock:=FSB; end; 1: begin gRAMInfo.DRAMCoef:='FSB+33'; gRAMInfo.DRAMClock:=FSB+33; end; 2: begin gRAMInfo.DRAMCoef:='FSB-33'; gRAMInfo.DRAMClock:=FSB-33; end; 3: begin gRAMInfo.DRAMCoef:='FSB+66'; gRAMInfo.DRAMClock:=FSB+66; end; end; end; procedure poll_timings_kt266(var Timings: tTimings; var gRAMInfo: tGRAMInfo); var reg60, reg64: Byte; begin GetInstance.IPCIIORef.GetPCIRByte(0, 0, 0, $60, reg60); GetInstance.IPCIIORef.GetPCIRByte(0, 0, 0, $64, reg64); //CAS Latency (tCAS) reg60:=reg60 and $F; if (reg60 = 0) then //SDR-SDRAM begin gRAMInfo.DRAMType:='SDR-SDRAM'; case ((reg64 shr 4) and $3) of 0: Timings.CAS:=1; 1: Timings.CAS:=2; 2: Timings.CAS:=3; end; end else begin //DDR-SDRAM gRAMInfo.DRAMType:='DDR-SDRAM'; case ((reg64 shr 4) and $3) of 1: Timings.CAS:=2; 2: Timings.CAS:=2.5; 3: Timings.CAS:=3; end; end; //RAS-To-CAS (tRCD) if ((reg64 shr 2) and $1) = 1 then Timings.RCD:=3 else Timings.RCD:=2; //RAS Precharge (tRP) if ((reg64 shr 7) and $1) = 1 then Timings.RP:=3 else Timings.RP:=2; //RAS Active to precharge (tRAS) if ((reg64 shr 6) and $1) = 1 then Timings.RAS:=6 else Timings.RAS:=5; end; //CN333 Methods procedure poll_fsb_cn333(lCPUClock, FSB: double; Mult: single; var gRAMInfo: tGRAMInfo); var reg68: Byte; begin GetInstance.IPCIIORef.GetPCIRByte(0, 0, 3, $68, reg68); reg68:=reg68 and $F; case reg68 of 0: begin gRAMInfo.DRAMCoef:='1:1'; gRAMInfo.DRAMClock:=FSB; end; 1: begin gRAMInfo.DRAMCoef:='FSB+33'; gRAMInfo.DRAMClock:=FSB+33; end; 5: begin gRAMInfo.DRAMCoef:='FSB+66'; gRAMInfo.DRAMClock:=FSB+66; end; end; end; procedure poll_timings_cn333(var Timings: tTimings; var gRAMInfo: tGRAMInfo); var reg56: Byte; begin GetInstance.IPCIIORef.GetPCIRByte(0, 0, 3, $56, reg56); //CAS Latency (tCAS) Timings.CAS:=(((reg56 shr 4) and 3)+3)/2; //RAS-To-CAS (tRCD) Timings.RCD:=((reg56 shr 2) and 3)+2; //RAS Precharge (tRP) Timings.RP:=(reg56 and 3)+2; //RAS Active to precharge (tRAS) Timings.RAS:=((reg56 shr 6) and 3)+6; end; const KnownControllers = 27; var Controllers: array[1..KnownControllers] of Memory_Controller = ( //AMD (VendorID: $1022; DeviceID: $1100; name: 'AMD 8000'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $1022; DeviceID: $7454; name: 'AMD 8000'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), //ALI (VendorID: $10b9; DeviceID: $1687; name: 'ALI M1687'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $10b9; DeviceID: $1689; name: 'ALI M1689'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $10b9; DeviceID: $1695; name: 'ALI M1695'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), //ATI (VendorID: $1002; DeviceID: $5950; name: 'ATI RS482'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), //nVidia (VendorID: $10de; DeviceID: $01A4; name: 'nVidia nForce'; tested: 0; GetFSBMethod: nil; GetTmngsMethod: nil; SetupECCMethod: nil), (VendorID: $10de; DeviceID: $01E0; name: 'nVidia nForce2 SPP'; tested: 0; GetFSBMethod: poll_fsb_nf2; GetTmngsMethod: poll_timings_nf2; SetupECCMethod: nil), (VendorID: $10de; DeviceID: $00D1; name: 'nVidia nForce3'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $10de; DeviceID: $00E1; name: 'nVidia nForce3 250'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $10de; DeviceID: $005E; name: 'nVidia nForce4'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $10de; DeviceID: $0071; name: 'nForce4 SLI Intel Edition'; tested: 0; GetFSBMethod: poll_fsb_nf4ie; GetTmngsMethod: poll_timings_nf4ie; SetupECCMethod: nil), //VIA (VendorID: $1106; DeviceID: $3099; name: 'VIA KT266(A)/KT333'; tested: 0; GetFSBMethod: poll_fsb_kt266; GetTmngsMethod: poll_timings_kt266; SetupECCMethod: nil), (VendorID: $1106; DeviceID: $3123; name: 'VIA CLE266'; tested: 0; GetFSBMethod: poll_fsb_kt266; GetTmngsMethod: poll_timings_kt266; SetupECCMethod: nil), (VendorID: $1106; DeviceID: $0259; name: 'VIA CN333'; tested: 0; GetFSBMethod: poll_fsb_cn333; GetTmngsMethod: poll_timings_cn333; SetupECCMethod: nil), (VendorID: $1106; DeviceID: $3188; name: 'VIA K8T800'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $1106; DeviceID: $0282; name: 'VIA K8T800Pro'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), (VendorID: $1106; DeviceID: $3238; name: 'VIA K8T890'; tested: 0; GetFSBMethod: poll_fsb_amd64; GetTmngsMethod: poll_timings_amd64; SetupECCMethod: nil), //Intel (VendorID: $8086; DeviceID: $2588; name: 'Intel E7221'; tested: 0; GetFSBMethod: nil{poll_fsb_i925}; GetTmngsMethod: nil{poll_timings_i925}; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $2570; name: 'Intel i848/i865'; tested: 0; GetFSBMethod: nil{poll_fsb_i875}; GetTmngsMethod: nil{poll_timings_i875}; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $2578; name: 'Intel i875P'; tested: 0; GetFSBMethod: nil{poll_fsb_i875}; GetTmngsMethod: nil{poll_timings_i875}; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $3340; name: 'Intel i855PM'; tested: 0; GetFSBMethod: nil; GetTmngsMethod: nil; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $2580; name: 'Intel i915P/G'; tested: 0; GetFSBMethod: nil{poll_fsb_i925}; GetTmngsMethod: nil{poll_timings_i925}; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $2590; name: 'Intel i915PM/GM'; tested: 0; GetFSBMethod: nil{poll_fsb_i925}; GetTmngsMethod: nil{poll_timings_i925}; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $2584; name: 'Intel i925X/XE'; tested: 0; GetFSBMethod: nil{poll_fsb_i925}; GetTmngsMethod: nil{poll_timings_i925}; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $2770; name: 'Intel i945P/G'; tested: 0; GetFSBMethod: nil{poll_fsb_i945}; GetTmngsMethod: nil{poll_timings_i925}; SetupECCMethod: nil), (VendorID: $8086; DeviceID: $2774; name: 'Intel i955X'; tested: 0; GetFSBMethod: nil{poll_fsb_i945}; GetTmngsMethod: nil{poll_timings_i925}; SetupECCMethod: nil) ); constructor cMemory.Create; begin inherited Create; fCtrl_Info.index:=0; fCtrl_Info.dwBus:=0; fCtrl_Info.dwDev:=0; fCtrl_Info.dwFunc:=0; DetectMemCtrl; end; procedure cMemory.DetectMemCtrl; var VendorID, DeviceID: DWord; pdata: DWord; i: byte; begin GetInstance.IPCIIORef.GetPCIRDWord(fCtrl_Info.dwBus, fCtrl_Info.dwDev, fCtrl_Info.dwFunc, 0, pdata); VendorID:=Word(pdata); DeviceID:=Word(pdata shr 16); for i:=Low(Controllers) to High(Controllers) do if ((Controllers[i].VendorID = VendorID) and (Controllers[i].DeviceID = DeviceID)) then begin fCtrl_Info.index:=i; break; end; end; function cMemory.GetPhysMemSize: DWord; var memStatus: TMemoryStatus; begin memStatus.dwLength:=sizeOf(memStatus); GlobalMemoryStatus(memStatus); result:=trunc(memStatus.dwTotalPhys/1048576)+1; end; procedure cMemory.FillMemCtrlInfo(lCPUClock, FSB: double; Mult: single); begin if fCtrl_Info.index<=0 then exit; fgRAMInfo.RamSize:=GetPhysMemSize; if Assigned(Controllers[fCtrl_Info.index].GetFSBMethod) then Controllers[fCtrl_Info.index].GetFSBMethod(lCPUClock, FSB, Mult, fgRAMInfo); if Assigned(Controllers[fCtrl_Info.index].GetTmngsMethod) then Controllers[fCtrl_Info.index].GetTmngsMethod(fTimings, fgRAMInfo); //ShowMessage(format('%x', [oHWIO.MemReadLong($20)])); //oHWIO.MemReadLong($5) end; destructor cMemory.Destroy; begin inherited Destroy; end; end. Report for Muetze1 from pci 32 program,is this usefull? [delphi] Address 1 is a Memory Address (anywhere in 0-4Gb) : FFEFF400h System IRQ 11, INT# A Expansion ROM of 64Kb decoded by this card (Currently disabled) New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Supports PME# signalling from mode(s) D1, D2, D3hot, D3cold PME# signalling is currently enabled Current Power State : D0 (Device operational, no power saving) 3.3v AUX Current required : 375mA Bus 0 (PCI), Device Number 15, Device Function 0 Vendor 1106h VIA Technologies Inc Device 3149h VIA SATA RAID Controller Command 0007h (I/O Access, Memory Access, BusMaster) Status 0290h (Has Capabilities List, Supports Back-To-Back Trans., Medium Timin g) Revision 80h, Header Type 80h, Bus Latency Timer 20h Self test 00h (Self test not supported) PCI Class Storage, type RAID Subsystem ID 31491849h Unknown Subsystem Vendor 1849h ASRock Inc Address 0 is an I/O Port : 0000EC00h Address 1 is an I/O Port : 0000E800h Address 2 is an I/O Port : 0000E400h Address 3 is an I/O Port : 0000E000h Address 4 is an I/O Port : 0000DC00h Address 5 is an I/O Port : 0000D800h System IRQ 10, INT# B New Capabilities List Present: Power Management Capability, Version 1.1 Does not support low power State D1 or D2 Does not support PME# signalling Current Power State : D0 (Device operational, no power saving) Bus 0 (PCI), Device Number 15, Device Function 1 Vendor 1106h VIA Technologies Inc Device 0571h VT82xxxx EIDE Controller (All VIA Chipsets) Command 0007h (I/O Access, Memory Access, BusMaster) Status 0290h (Has Capabilities List, Supports Back-To-Back Trans., Medium Timin g) Revision 06h, Header Type 00h, Bus Latency Timer 20h Self test 00h (Self test not supported) PCI Class Storage, type IDE (ATA) PCI EIDE Controller Features : BusMaster EIDE is supported Primary Channel is at I/O Port 01F0h and IRQ 14 Secondary Channel is at I/O Port 0170h and IRQ 15 Subsystem ID 05711849h Unknown Subsystem Vendor 1849h ASRock Inc Address 4 is an I/O Port : 0000FC00h New Capabilities List Present: Power Management Capability, Version 1.1 Does not support low power State D1 or D2 Does not support PME# signalling Current Power State : D0 (Device operational, no power saving) Bus 0 (PCI), Device Number 16, Device Function 0 Vendor 1106h VIA Technologies Inc Device 3038h VT82xxxxx UHCI USB 1.1 Controller (All VIA Chipsets) Command 0017h (I/O Access, Memory Access, BusMaster, MemWrite+Invalidate) Status 0210h (Has Capabilities List, Medium Timing) Revision 81h, Header Type 80h, Bus Latency Timer 20h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Serial, type USB (UHCI) Subsystem ID 30381849h Unknown Subsystem Vendor 1849h ASRock Inc Address 4 is an I/O Port : 0000C000h System IRQ 11, INT# A New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Supports PME# signalling from mode(s) D0, D1, D2, D3hot, D3cold PME# signalling is currently disabled Current Power State : D0 (Device operational, no power saving) 3.3v AUX Current required : 375mA Bus 0 (PCI), Device Number 16, Device Function 1 Vendor 1106h VIA Technologies Inc Device 3038h VT82xxxxx UHCI USB 1.1 Controller (All VIA Chipsets) Command 0017h (I/O Access, Memory Access, BusMaster, MemWrite+Invalidate) Status 0210h (Has Capabilities List, Medium Timing) Revision 81h, Header Type 80h, Bus Latency Timer 20h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Serial, type USB (UHCI) Subsystem ID 30381849h Unknown Subsystem Vendor 1849h ASRock Inc Address 4 is an I/O Port : 0000C400h System IRQ 11, INT# A New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Supports PME# signalling from mode(s) D0, D1, D2, D3hot, D3cold PME# signalling is currently disabled Current Power State : D0 (Device operational, no power saving) 3.3v AUX Current required : 375mA Bus 0 (PCI), Device Number 16, Device Function 2 Vendor 1106h VIA Technologies Inc Device 3038h VT82xxxxx UHCI USB 1.1 Controller (All VIA Chipsets) Command 0017h (I/O Access, Memory Access, BusMaster, MemWrite+Invalidate) Status 0210h (Has Capabilities List, Medium Timing) Revision 81h, Header Type 80h, Bus Latency Timer 20h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Serial, type USB (UHCI) Subsystem ID 30381849h Unknown Subsystem Vendor 1849h ASRock Inc Address 4 is an I/O Port : 0000C800h System IRQ 10, INT# B New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Supports PME# signalling from mode(s) D0, D1, D2, D3hot, D3cold PME# signalling is currently disabled Current Power State : D0 (Device operational, no power saving) 3.3v AUX Current required : 375mA Bus 0 (PCI), Device Number 16, Device Function 3 Vendor 1106h VIA Technologies Inc Device 3038h VT82xxxxx UHCI USB 1.1 Controller (All VIA Chipsets) Command 0017h (I/O Access, Memory Access, BusMaster, MemWrite+Invalidate) Status 0210h (Has Capabilities List, Medium Timing) Revision 81h, Header Type 80h, Bus Latency Timer 20h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Serial, type USB (UHCI) Subsystem ID 30381849h Unknown Subsystem Vendor 1849h ASRock Inc Address 4 is an I/O Port : 0000CC00h System IRQ 10, INT# B New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Supports PME# signalling from mode(s) D0, D1, D2, D3hot, D3cold PME# signalling is currently disabled Current Power State : D0 (Device operational, no power saving) 3.3v AUX Current required : 375mA Bus 0 (PCI), Device Number 16, Device Function 4 Vendor 1106h VIA Technologies Inc Device 3104h VT6202/12 USB 2.0 Enhanced Host Controller Command 0017h (I/O Access, Memory Access, BusMaster, MemWrite+Invalidate) Status 0210h (Has Capabilities List, Medium Timing) Revision 86h, Header Type 80h, Bus Latency Timer 20h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Serial, type USB 2.0 (EHCI) Subsystem ID 31041849h Unknown Subsystem Vendor 1849h ASRock Inc Address 0 is a Memory Address (anywhere in 0-4Gb) : FFEFF800h System IRQ 5, INT# C New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Supports PME# signalling from mode(s) D0, D1, D2, D3hot, D3cold PME# signalling is currently disabled Current Power State : D0 (Device operational, no power saving) 3.3v AUX Current required : 375mA Bus 0 (PCI), Device Number 17, Device Function 0 Vendor 1106h VIA Technologies Inc Device 3227h VT8237 PCI to ISA Bridge Command 0087h (I/O Access, Memory Access, BusMaster, Wait Cycles) Status 0210h (Has Capabilities List, Medium Timing) Revision 00h, Header Type 80h, Bus Latency Timer 00h Self test 00h (Self test not supported) PCI Class Bridge, type PCI to ISA Subsystem ID 32271849h Unknown Subsystem Vendor 1849h ASRock Inc New Capabilities List Present: Power Management Capability, Version 1.1 Does not support low power State D1 or D2 Does not support PME# signalling Current Power State : D0 (Device operational, no power saving) Bus 0 (PCI), Device Number 17, Device Function 5 Vendor 1106h VIA Technologies Inc Device 3059h VT8233/A AC'97 Enhanced Audio Controller Command 0001h (I/O Access) Status 0210h (Has Capabilities List, Medium Timing) Revision 60h, Header Type 00h, Bus Latency Timer 00h Self test 00h (Self test not supported) PCI Class Multimedia, type Audio Subsystem ID 97611849h VT8233 AC'97 Enhanced Audio Controller (Guess Only!) Subsystem Vendor 1849h ASRock Inc Address 0 is an I/O Port : 0000D000h System IRQ 5, INT# C New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Does not support PME# signalling Current Power State : D0 (Device operational, no power saving) Bus 0 (PCI), Device Number 18, Device Function 0 Vendor 1106h VIA Technologies Inc Device 3065h VT6102 Rhine II Fast Ethernet Adapter Command 0117h (I/O Access, Memory Access, BusMaster, MemWrite+Invalidate, Syste m Errors) Status 0210h (Has Capabilities List, Medium Timing) Revision 78h, Header Type 00h, Bus Latency Timer 20h Minimum Bus Grant 03h, Maximum Bus Latency 08h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Network, type Ethernet Subsystem ID 30651849h Unknown Subsystem Vendor 1849h ASRock Inc Address 0 is an I/O Port : 0000D400h Address 1 is a Memory Address (anywhere in 0-4Gb) : FFEFFC00h System IRQ 11, INT# A New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Supports PME# signalling from mode(s) D0, D1, D2, D3hot, D3cold PME# signalling is currently enabled Current Power State : D0 (Device operational, no power saving) 3.3v AUX Current required : 0mA (Self powered) Bus 1 (AGP), Device Number 0, Device Function 0 Vendor 1002h ATI Technologies Inc Device 7280h Unknown Command 0107h (I/O Access, Memory Access, BusMaster, System Errors) Status 02B0h (Has Capabilities List, Supports 66MHz, Supports Back-To-Back Tran s., Medium Timing) Revision 9Ah, Header Type 80h, Bus Latency Timer FFh Minimum Bus Grant 08h, Maximum Bus Latency 00h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Display, type VGA Subsystem ID E190174Bh Unknown Subsystem Vendor 174Bh PC Partner Ltd Address 0 is a Memory Address (anywhere in 0-4Gb, Prefetchable) : C0000000h Address 1 is an I/O Port : 0000A800h Address 2 is a Memory Address (anywhere in 0-4Gb) : FFDF0000h System IRQ 11, INT# A Expansion ROM of 128Kb decoded by this card (Currently disabled) New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Does not support PME# signalling Current Power State : D0 (Device operational, no power saving) AGP Capability, Version 3.0 (AGP 8x and 4x, core register support) AGP Speed(s) Supported : 4x 8x FW Transfers Supported : Yes >4Gb Address Space Supported : No Sideband Addressing Supported : Yes AGP v3.0 Operation Mode Available : Yes Isosynchronous Transactions Supported : No Maximum Command Queue Length : 256 bytes AGP Speed Selected : 8x FW Transfers Enabled : Yes >4Gb Address Space Enabled : No AGP Enabled : Yes Sideband Addressing Enabled : Yes AGP v3.0 Operation Mode : Enabled Current Command Queue Length : 32 bytes Message Signalled Interrupt Capability MSI is disabled MSI function can generate 64-bit addresses Bus 1 (AGP), Device Number 0, Device Function 1 Vendor 1002h ATI Technologies Inc Device 72A0h Unknown Command 0007h (I/O Access, Memory Access, BusMaster) Status 02B0h (Has Capabilities List, Supports 66MHz, Supports Back-To-Back Tran s., Medium Timing) Revision 9Ah, Header Type 00h, Bus Latency Timer 20h Minimum Bus Grant 08h, Maximum Bus Latency 00h Self test 00h (Self test not supported) Cache line size 32 Bytes (8 DWords) PCI Class Display, type Other Subsystem ID E191174Bh Unknown Subsystem Vendor 174Bh PC Partner Ltd Address 0 is a Memory Address (anywhere in 0-4Gb) : FFDE0000h New Capabilities List Present: Power Management Capability, Version 1.1 Supports low power State D1 Supports low power State D2 Does not support PME# signalling Current Power State : D0 (Device operational, no power saving) IRQ Summary: IRQs 5,10,11,14,15 are used by PCI devices Shared IRQs: IRQ 5 is shared by 2 PCI Devices IRQ 10 is shared by 3 PCI Devices IRQ 11 is shared by 5 PCI Devices [delphi] |
Re: Memory Information?
@ Razor
Hello... Error Message: [Fehler] Memory.pas(67): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(67): Operator oder Semikolon fehlt [Fehler] Memory.pas(77): Operator oder Semikolon fehlt [Fehler] Memory.pas(95): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(95): Operator oder Semikolon fehlt [Fehler] Memory.pas(96): Operator oder Semikolon fehlt [Fehler] Memory.pas(97): Operator oder Semikolon fehlt [Fehler] Memory.pas(98): Operator oder Semikolon fehlt [Fehler] Memory.pas(99): Operator oder Semikolon fehlt [Fehler] Memory.pas(100): Operator oder Semikolon fehlt [Fehler] Memory.pas(132): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(132): Operator oder Semikolon fehlt [Fehler] Memory.pas(154): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(154): Operator oder Semikolon fehlt [Fehler] Memory.pas(155): Operator oder Semikolon fehlt [Fehler] Memory.pas(188): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(188): Operator oder Semikolon fehlt [Fehler] Memory.pas(189): Operator oder Semikolon fehlt [Fehler] Memory.pas(213): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(213): Operator oder Semikolon fehlt [Fehler] Memory.pas(214): Operator oder Semikolon fehlt [Fehler] Memory.pas(215): Operator oder Semikolon fehlt [Fehler] Memory.pas(216): Operator oder Semikolon fehlt [Fehler] Memory.pas(245): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(245): Operator oder Semikolon fehlt [Fehler] Memory.pas(293): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(293): Operator oder Semikolon fehlt [Fehler] Memory.pas(298): Operator oder Semikolon fehlt [Fehler] Memory.pas(300): Operator oder Semikolon fehlt [Fehler] Memory.pas(301): Operator oder Semikolon fehlt [Fehler] Memory.pas(346): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(346): Operator oder Semikolon fehlt [Fehler] Memory.pas(350): Operator oder Semikolon fehlt [Fehler] Memory.pas(352): Operator oder Semikolon fehlt [Fehler] Memory.pas(354): Operator oder Semikolon fehlt [Fehler] Memory.pas(396): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(396): Operator oder Semikolon fehlt [Fehler] Memory.pas(397): Operator oder Semikolon fehlt [Fehler] Memory.pas(402): Operator oder Semikolon fehlt [Fehler] Memory.pas(406): Operator oder Semikolon fehlt [Fehler] Memory.pas(410): Operator oder Semikolon fehlt [Fehler] Memory.pas(456): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(456): Operator oder Semikolon fehlt [Fehler] Memory.pas(458): Operator oder Semikolon fehlt [Fehler] Memory.pas(477): Undefinierter Bezeichner: 'GetInstance' [Fehler] Memory.pas(477): Operator oder Semikolon fehlt |
Re: Memory Information?
The memory information could be got via SMBus read and write byte....But for Smbus read word i dont know what that does..
|
Re: Memory Information?
SMBUS read&write byte is for memory information but does anybody knows if this works? :|
|
Re: Memory Information?
Zitat:
And how it works? The SM-Bus is completly documented because it is a hardware standard. |
Re: Memory Information?
@Muetze1:But where to get ports for example nforce motherboards?Basicly datasheets?But i think nforce info is gathered via PCI.
|
Re: Memory Information?
Zitat:
But for you once again: mostly all chipsets implement a SMBus controller PCI device. The device PCI register contains the port address of the SMBus interface. The ports are mostly a little bit vendor specific. Look for a PCI device with class id 0x0c and sub class id 0x05. |
Re: Memory Information?
Thank you i will post my results after i make it. :)
|
Re: Memory Information?
But i think i found an easier way
Delphi-Quellcode:
The caption is 0 after i press it size is cardinal :(
procedure TMainFrm.Button3Click(Sender: TObject);
begin MiTeC_Machine1.SMBIOS.RefreshData;; mainfrm.Caption:=inttostr(MiTeC_Machine1.SMBIOS.MemoryModule[1].Size); end; |
AW: Memory Information?
Hi !
I need to access SDP from my Delphi 7 free application... where can i find the complete memory.pas module that have been discussed here ? Thanks !! |
AW: Memory Information?
|
AW: Memory Information?
Thank you !
Same error as EarthQuaker : Zitat:
|
AW: Memory Information?
add
Delphi-Quellcode:
uses OMCDrv;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz