Подскажите пожалуйста где можно найти информацию о контроллере smbus для чипсета nvidia nforce или вообще чипсетов nvidia. Заранее спасибо
2Pavia Проблема в том, что гугл дает инфу только для интеловских чипсетов... Если Вы располагаете какой-либо информацией о чипсетах нвидиа, то поделитесь пожалуйста ссылкой/ами ))
spirom самое простое и быстрое скачать исходники линукса. и посмотреть драйверы smbus. они маленькие и понятные. мне помогло. ссылку не помню но точно знаю что когда-то видел датащит на nforce2. ищи лучше
spirom Вот немного информации. Код (Text): const PCI_VENDOR_ATI = $1002; // ATI Technologies PCI_VENDOR_SIS = $1039; // Silicon Integrated System PCI_VENDOR_AMD = $1022; // Advanced Micro Devices PCI_VENDOR_NVIDIA = $10DE; // Nvidia Corporation PCI_VENDOR_VIATECH = $1106; // VIA Technologies PCI_VENDOR_INTEL = $8086; // Intel const PCI_CONFADR = $0CF8; PCI_CONFDATA = $0CFC; const ICH_XMIT_SLVA = $04; // transmit slave address ICH_XMIT_SLVA_READ = $01; // direction: read ICH_XMIT_SLVA_WRITE = $00; // direction: write const // nVidia nForce2 SMBus control register definitions // (Newer incarnations use standard BARs 4 and 5 instead) NFORCE_PCI_SMB1 = $50; NFORCE_PCI_SMB2 = $54; // ACPI 2.0 chapter 13 SMBus 2.0 EC register model NVIDIA_SMB_PRTCL = $00; // protocol, PEC NVIDIA_SMB_STS = $01; // status NVIDIA_SMB_ADDR = $02; // address NVIDIA_SMB_CMD = $03; // command // acpi_sbs_read_str NVIDIA_SMB_DATA0 = $04; // 32 data registers NVIDIA_SMB_DATA1 = $05; NVIDIA_SMB_BCNT = $24; // number of data bytes NVIDIA_SMB_ALRM_A = $25; // alarm address NVIDIA_SMB_ALRM_D = $26; // 2 bytes alarm data NVIDIA_SMB_STS_DONE = $80; NVIDIA_SMB_STS_ALRM = $40; NVIDIA_SMB_STS_RES = $20; NVIDIA_SMB_STS_STATUS = $1F; NVIDIA_SMB_PRTCL_WRITE = $00; NVIDIA_SMB_PRTCL_READ = $01; NVIDIA_SMB_PRTCL_QUICK = $02; NVIDIA_SMB_PRTCL_BYTE = $04; NVIDIA_SMB_PRTCL_BYTE_DATA = $06; NVIDIA_SMB_PRTCL_WORD_DATA = $08; NVIDIA_SMB_PRTCL_BLOCK_DATA = $0a; NVIDIA_SMB_PRTCL_PROC_CALL = $0c; NVIDIA_SMB_PRTCL_BLOCK_PROC_CALL = $0d; NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA = $4a; NVIDIA_SMB_PRTCL_PEC = $80; // --- поиск адреса SMBus --------- // с этими чипами через SMBus как то не получилось работать if (VendorID = PCI_VENDOR_NVIDIA) and (DeviceID = $01B4) then Exit; // not supported // nForce1 if (VendorID = PCI_VENDOR_NVIDIA) and (DeviceID = $0AA2) then Exit; // not supported // NVidia ION2 SMBusBaseOff := 0; // смещение адреса SMBus bsp := PDWORD(@e^.PCIHead.Named.ProgIf)^ and $00FFFFFF; if bsp = $0C0500 then begin // 0x0C0500 сигнализирует о стандартном SMBus, т.е. смещение адреса выдираем из BAR регистров // для чипов от NVIDIA не встречал ещё расположение адреса SMBus за пределами BAR регистров !!! ... читаем тут все BAR регистры // Примечание: у Intel адрес SMBus находится в BAR4 // Примечание: у NVIDIA обычно в BAR регистрах можно найти 2 адреса SMBus end; // ------- функции чтения для NVIDIA --------------- function SMBusNVidia_WaitPortAnswer(SMBusAddr: Word): Boolean; var b: Byte; i: DWORD; begin Result := False; b := 0; for i:=0 to $FA00 do begin b := PortInB(Driver, SMBusAddr + NVIDIA_SMB_STS); // +1 if (b and (NVIDIA_SMB_STS_STATUS + NVIDIA_SMB_STS_DONE)) <> 0 then Break; NEWIODELAY; // 250 us NEWIODELAY; // 250 us NEWIODELAY; // 250 us end; if (b and (NVIDIA_SMB_STS_STATUS + NVIDIA_SMB_STS_ALRM + NVIDIA_SMB_STS_RES) <> 0) and (b and NVIDIA_SMB_STS_STATUS <> NVIDIA_SMB_STS_STATUS) then Result := True; end; // SMBusAddr - адрес SMBus // SMBusDev - номер девайса // Addr - смещение запрашиваемого байтика function SMBusNVidia_ReadByte(SMBusAddr: Word; SMBusDev: Byte; Addr: Byte; var Res: Byte): Boolean; var b: Byte; begin Result := False; PortOutB(Driver, SMBusAddr + NVIDIA_SMB_STS, NVIDIA_SMB_STS_STATUS); // +1 PortOutB(Driver, SMBusAddr + NVIDIA_SMB_ADDR, (SMBusDev shl 1) or ICH_XMIT_SLVA_READ); // +2 PortOutB(Driver, SMBusAddr + NVIDIA_SMB_CMD, Addr); // +3 PortOutB(Driver, SMBusAddr + NVIDIA_SMB_PRTCL, NVIDIA_SMB_PRTCL_READ or NVIDIA_SMB_PRTCL_BYTE_DATA); // +0 if SMBusNVidia_WaitPortAnswer(SMBusAddr) then Exit; Res := PortInB(Driver, SMBusAddr + NVIDIA_SMB_DATA0); Result := True; end; ЗЫ. Привёл на паскале, что бы форум не забыл что это такое)