Подскажите толковую доку по этим шинным интерфейсам компьютера. Какие данные я могу через них получить? И еще вопросс I2C шина, что сойдиняет Монитор с видюхай(DDC). Завязана на SMBus контролер или это две отдельные системы.
Сам протокол I2C прост как 5 копеек. Видимо, Вы ищете документацию по командам SMBus через I2C конкретно для видео. Посмотрите в исходниках Linux.
Quantum Сам протокол прост. Но я ищу информацию о том, что я могу получить через SMBus, для чего он нужен. Исходники уже посмотрел. И судя по ним: SMBus основан на шине I2C. DDC тоже основан на I2C. Но это две физическе отдельные шины.
У меня вопрос тоже про i2c&smbus. У меня задача достучаться в windows XP до i2c. Для начала просто попробовать поуправлять микросхемой повешенной на smbus. Мне посоветовали http://msdn.microsoft.com/library/, и там ввести слово SMBUS. Примеры использования искал пару дней - без результатно. Кто-нибудь пользовался ЭТИМ? Помогите пожалуйста, советом, докой. Я уже гуглил, яндексил, и йазаинел
Подскажите пожалуйста, как написать приложение, которое может общаться с микросхемой по i2c через SMBus. Я долго лазил по инету ничего толкового не нашёл. Нашёл только пример, написанный на Delphi&VB Title: SMBUS Inside Monitor Description: Read and Write SMBUS. Read PC temperature, Fan speed and voltage. Work only with Intel 82801 and 82371AB/EB (PIIX4). Asus 99127F or Winbond series. Но я не знаю дельфи и мне надо простейшее приложение. Мне нужно всего-лишь поуправлять микросхемой, повешенной на SMBUS. Intel® 82801DB I/O Controller Hub 4 (ICH4) SMBUS Inside Monitor у меня не работает, может я как-то не так скомпилировал... А ещё данный монитор использует драйвер DriverLINX Port I/O Driver for Win95 and WinNT DLPortIO.DLL -- Win32 DLL hardware I/O functions
Oxide У меня пример работает. Только он слишком сухой. Там только два чипсета и датчиков тоже не больше. PIIX4- Это под пениум 2. Я долго не возился, но дорабатывается легко. VBKesha Можешь у меня спросить может и отвечу, хотя я почти ничего не знаю. Проще посмотреть исходники биоса от них толку больше. Или доку от интел почитать.
Как то была тема, называлась Температура процессора, там был исходничек. Я сам опирался на него, а так же на исходники Im-sensors. Удалось достучатся до датчиков и сенсоров. В принцине все просто.
Pavia Меня вообще интересует как зная базовый адрес SMBus работать с устройствами на ней(получить их список, читать/писать данные). P.S. Температуру процессора часто можно получить без SMBus через микросхему SuperIO обычно она от WinBond на их сайте есть полные даташиты.
VBKesha SMBus выступает в качестве обертки для I2C. Список устройств получается при помощи сканирования всего диапозона адрессов и его проверки на каждое из устройств. Сейчас хочу попробовать написать прожку, только как то страшно приступать к этому делу.
где можно найти все адреса устройств на шине smbus я знаю только 50h-57h spd памяти А где найти остальные?
нельзя. Ответ основан на: 1. дизассме парочки VideoBIOSов 2. логическом рассуждении и изучении архитектуры шин и матерей... Поясняю. Пусть у нас мать без встроенного видио. Пусть видео у меня PCI катра. Тогда сама шина PCI электрически должна иметь провод(а), шину SMBUS среди своих контактов, а это не так на сколько помню. И далее соответственно эта карта PCI чудно вычитывается по DDC, без проблем. 3. DDC судя по дизассму использует некоторые свободные биты VGA портов для организации I2C обмена с чипом установленным в мониторе. Вот пример ковырятельства видиобивиса не помню какой древней машинки из разряда типа эпохи P1-P2: Код (Text): ORG 0x100 mov ax, 3 int 0x10 mov di, DDCdump ; mov cx, 0 ; mov bx, 1 call LoadEDID xor di, di mov si, DDCdump + 95 call prit add di, 4 mov si, DDCdump + 113 call prit int 0x20 prit: mov ax, 0xB8DC mov es, ax cli mov ah, 0xE @rep: lodsb or al, al jz quit stosw jmp @rep quit: ret portCL DW 0 portDL DW 0 bp_2 DB 0 bp_3 DB 0 bp_4 DB 0 bp_5 DB 0 bp_6 DB 0 bp_7 DB 0 bp_8 DB 0 LoadEDID: mov dx, 0x3C4 in al, dx mov [bp_3], al mov dx, 0x3CE in al, dx mov [bp_5], al mov dx, 0x3CC in al, dx mov dx, 0x3D4 test al, 1 jnz loc_444 mov dx, 0x3B4 loc_444: mov [portCL], dx mov [portDL], dx add [portDL], 6 in al, dx mov [bp_4], al mov al, 0x24 out dx, al inc dx in al, dx mov [bp_7], al mov dx, [portDL] in al, dx mov dx, 0x3C0 in al, dx mov [bp_6], al mov dx, 0x3C4 mov al, 1 out dx, al inc dx ; DX = 0x3C5 in al, dx mov [bp_8], al mov al, 0x11 dec dx ; DX = 0x3C4 out dx, al inc dx in al, dx mov [bp_2], al mov al, 0x92 out dx, al mov al, 0x59 mov dx, [portCL] out dx, al inc dx in al, dx or al, 0x10 out dx, al mov bx, 0xA0 mov cx, 0x80 call sub_232 mov al, 0x59 mov dx, [portCL] out dx, al inc dx in al, dx and al, 0xEF out dx, al mov dx, 0x3C4 mov al, 1 out dx, al inc dx in al, dx xor al, [bp_8] and al, 0x20 jz loc_5 ; mov ah, 8 ; call wait_1 ;wait_1: ; push cx mov cx, 0xFFFF mov dx, [portDL] loc446: in al, dx and al, 8 ; cmp al, ah ; je loc447 jne loc447 loop loc446 ; stc loc447: ;pop cx ; ret loc_5: mov al, [bp_8] out dx, al mov al, 0x11 mov dx, 0x3C4 out dx, al inc dx in al, dx mov al, [bp_2] out dx, al dec dx ; DX = 0x3C4 mov al, [bp_3] out dx, al mov dx, 0x3CE mov al, [bp_5] out dx, al mov dx, [portCL] mov al, [bp_4] out dx, al mov dx, [portDL] in al, dx mov dx, 0x3C0 mov al, [bp_6] out dx, al test [bp_7], byte 0x80 jnz loc_6 mov dx, [portDL] in al, dx loc_6: ret sub_232: mov al, 0x37 mov dx, [portCL] out dx, al inc dx in al, dx mov al, 0xF out dx, al call sub_242 call sub_236 jc loc_1041 and bl, 0xFE call sub_239 jnc loc_1039 call sub_236 call sub_239 jc loc_1041 loc_1039: xchg bl, bh call sub_239 jc loc_1041 call sub_237 call sub_236 jc loc_1041 xchg bl, bh or bl, 1 call sub_239 jc loc_1041 xor bl, bl locloop_1040: call ReadNewByteEDID or cx, cx jz loc_1041 mov [es:di], ah ; сохранение нового байта add bl, ah inc di loop locloop_1040 or bl, bl loc_1041: call sub_237 mov al, 0x37 mov dx, [portCL] out dx, al inc dx in al, dx mov al, 7 out dx, al ret sub_236: in al, dx or al, 0xD out dx, al call sub_242 mov al, 0xF out dx, al call sub_242 call sub_240 jc loc_ret_1042 mov al, 0xE out dx, al call sub_242 mov al, 0xC out dx, al call sub_242 loc_ret_1042: ret sub_237: mov al, 0xC out dx, al call sub_242 mov al, 0xE out dx, al call sub_242 call sub_240 mov al, 0xF out dx, al call sub_242 ret ReadNewByteEDID: push cx mov cx, 8 locloop_1043: mov al, 4 out dx, al call sub_242 or al, 2 out dx, al call sub_242 call sub_240 in al, dx rcr al, 1 rcl ah, 1 mov al, 4 out dx, al call sub_242 loop locloop_1043 pop cx mov al, 0xC cmp cx, 1 ja L_1044 mov al, 0xD L_1044: out dx, al call sub_242 or al, 2 out dx, al call sub_242 call sub_240 and al, 0xFD out dx, al call sub_242 ret sub_239: push cx mov cx, 8 locloop_1045: mov al, 0xC test bl, 0x80 jz loc_1046 or al, 1 loc_1046: out dx, al call sub_242 or al, 2 out dx, al call sub_242 call sub_240 and al, 0xFD out dx, al call sub_242 rol bl, 1 loop locloop_1045 pop cx mov al, 4 out dx, al call sub_242 or al, 2 out dx, al call sub_242 call sub_240 in al, dx and al, 0xFD or al, 8 out dx, al call sub_242 test al, 1 jz loc_ret_1047 stc loc_ret_1047: ret OldCntCnl DW 0 CmpOldTmr: push ax pushf xor ax, ax cli ; запрет прерывания на время измерения таймера out 0x43, al in al, 0x40 mov ah, al in al, 0x40 popf cmp ax, [OldCntCnl] mov [OldCntCnl], ax pop ax RET Delay1mcs: mov [OldCntCnl], 0xFFFF ; для гарантированного осуществления самого первого цикла @time1delay: call CmpOldTmr je @time1delay ; это следующий квант времени таймера ? RET DelayCXmcs: mov [OldCntCnl], 0xFFFF ; для гарантированного осуществления самого первого цикла @timeCXdelay: call CmpOldTmr je @timeCXdelay ; это следующий квант времени таймера ? loopw @timeCXdelay RET sub_242: ; out 0xEB, al ; out 0xEB, al ; out 0xEB, al ; out 0xEB, al ; ret push ax push cx mov cx, 8 locloop_1053: in al, 0x20 ; out 0xEB, al loop locloop_1053 ; call DelayCXmcs pop cx pop ax ret sub_240: push cx mov cx, 0x800 locloop_1048: in al, dx test al, 0x40 jnz loc_1049 call sub_242 loop locloop_1048 stc loc_1049: pop cx ret align 16 DDCdump: ; DB 512 DUP (0x55) 4. С другой стороны проскакивали сорцы (может и тут видел) Nvidia BIOS, там это дело выглядит аналогично, только беда биты другие.... Сволочи они буржуинские, кость им в голо!
Что значит найти? Найти присутствие на шине элементарно - перебором адресов. Сканируем диапазон, долго молчащие адреса - отсутствие, значит. А вот что они из себя фактически и особенно физически??? Играться втупую здесь, занчит попалить проц например, мать нафиг. Запросто собственно, остановтить кулер проца и забабахать умножитель частоты проца в заоблачную даль... и все это несколькими байтами всего то, парочку нужных out dx,al и при определённых условиях... "сушите вёсла!" Посему эта инфа удел немногих и пытливых, особенно дизасм биоса рулит с доной стороны с другой производители темнят и мутят, ну и защищаются... Вот пример скана SMBus адресов матери интела (это важно т.к. вендорозависимо например на VIA работать не будет) Код (Text): TestBuffSMBus = BUFF ;--------------------------------------- HST_STS = 0x00 ;Host Status HST_CNT = 0x02 ;Host Control R/W, WO HST_CMD = 0x03 ;Host Command R/W XMIT_SLVA = 0x04 ;Transmit Slave Address R/W HST_D0 = 0x05 ;Host Data 0 R/W HST_D1 = 0x06 ;Host Data 1 R/W HOST_BLOCK_DB = 0x07 ;Host Block Data Byte R/W PEC = 0x08 ;Packet Error Check R/W RCV_SLVA = 0x09 ;Receive Slave Address R/W SLV_DATA = 0x0A ;Slave Data R/W AUX_STS = 0x0C ;Auxiliary Status R/WC AUX_CTL = 0x0D ;Auxiliary Control R/W SMLINK_PIN_CTL = 0x0E ;SMLink Pin Control R/W, RO SMBUS_PIN_CTL = 0x0F ;SMBus Pin Control R/W, RO SLV_STS = 0x10 ;Slave Status R/WC SLV_CMD = 0x11 ;Slave Command R/W NOTIFY_DADDR = 0x14 ;Notify Device Address RO NOTIFY_DLOW = 0x16 ;Notify Data Low Byte RO NOTIFY_DHIGH = 0x17 ;Notify Data High Byte RO ;--------------------------------------- INTR = 0x02 ; DEV_ERR = 0x04 ; INUSE_STS = 0x40 ; BYTE_DONE_STS = 0x80 ;Byte Done Status ;--------------------------------------- ORG 0x100 mov di, BUFF xor ax, ax mov cx, 2000 rep stosw call cls mov dx, 0x5000 jmp @aa mov ax, 0xB103 ;найти mov ecx, 0x0C0500 ;класс SMBus устройства mov si, 0 int 0x1A jnc @sm1 ret @sm1: mov di, 0x20 ;номер читаемого регистра mov ax, 0xB109 ;читать WORD значение int 0x1A and cx, 0xFFFE mov dx, cx @aa: mov [BaseSMBus], dx mov ax, dx mov di, 80*4 ;начальная позиция видеобуфера строки отображения call PrintHexWord ;отображение содержимого регистра mov [pos], 80*4+16 ;начальная позиция видеобуфера строки отображения xor ecx, ecx mov edi, SMBusAdrMap @NxtTstAdrSMbus: mov esi, TestBuffSMBus push esi @RepTstReadSMBus: push ecx call @ICH_ReadWordSMBus pop ecx mov [esi], eax add esi, 4 cmp esi, TestBuffSMBus+5*4 jne @RepTstReadSMBus pop esi xor ebx, ebx @CalcSucReadAdrSMBus: mov eax, [esi] cmp eax, 0xFFFFFFFF je @t2 cmp eax, [esi+4] jne @t2 inc ebx @t2: add esi, 4 cmp esi, TestBuffSMBus+4*4 jne @CalcSucReadAdrSMBus cmp bl, 4 jc @notSMBusDev inc byte [edi] movzx ebx, byte [edi] mov [edi+ebx], ch @notSMBusDev: inc ch cmp ch, 0x80 jne @NxtTstAdrSMbus ; mov cx, 0x5000 call @ICH_ReadWordSMBus movzx cx, byte [edi] mov esi, edi inc esi call @prt_CX_1 mov cx, 0x5000 mov al, ch mov di, 80*8 call PrintHexByte mov [pos], 80*10 ;начальная позиция видеобуфера строки отображения call @ReadAdr mov dx, FN50 call saveF push es push ds pop es mov di, SMBusAdrMap movzx cx, byte [di] mov al, 0x2E repne scasb pop es jne @endPrt xor cx, cx mov ch, al mov di, 80*26 call PrintHexByte mov [pos], 80*28 ;начальная позиция видеобуфера строки отображения call @ReadAdr mov dx, FN2E call saveF @endPrt: xor ax, ax int 0x16 ret @ReadAdr: mov si, BUFF push si @repRd00: push ecx call @ICH_ReadByteSMBus pop ecx mov [si], al inc si inc cl cmp cl, 128 jne @repRd00 pop si mov cx, 128 jmp prt_CX ;--------------------------------------- @SmBwait: mov [CntWaitSMBus], 30 @wtSmBus: pusha xor cx, cx mov dx, 1000 mov ah, 0x86 int 0x15 popa xor eax, eax in al, dx ;get status out dx, al ;clear status test al, DEV_ERR ;device error ? jne @errDevSMBus or al, al je @readySMBus dec [CntWaitSMBus] jne @wtSmBus @errDevSMBus: in al, dx ;get status FOR CLEAR xor eax, eax dec eax stc ret @readySMBus: clc ret ;--------------------------------------- @ICH_SetCmdSMBus: mov dx, [BaseSMBus] call @SmBwait jc @retCmdSmHST add dx, XMIT_SLVA ;Transmit Slave Address Register mov al, ch rol al, 1 out dx, al dec dx ;Host Command Register mov al, cl out dx, al test ecx, 0x8000 ;read? bswap ecx jne @readCmdSMBus inc dx inc dx ;HST_D0 mov al, bl out dx, al cmp ch, 0x4C jne @WrOneByteSMBus inc dx ;HST_D1 mov al, bh out dx, al dec dx @WrOneByteSMBus: dec dx dec dx @readCmdSMBus: dec dx ;Host Control Register mov al, ch out dx, al bswap ecx test ecx, 0x8000 ;read? je @retCmdSmHST dec dx dec dx ;DX = Base SMBUS call @SmBwait jc @retCmdSmHST add dx, HST_D0 ;Host Data 0 REGISTER in ax, dx @retCmdSmHST: ret ;--------------------------------------- ; чтение одного BYTE @ICH_ReadByteSMBus: and ecx, 0xFFFF or ecx, 0x488000 jmp @ICH_SetCmdSMBus ;--------------------------------------- ; чтение одного WORD @ICH_ReadWordSMBus: and ecx, 0xFFFF or ecx, 0x4C8000 jmp @ICH_SetCmdSMBus ;--------------------------------------- @ICH_WriteByteSMBus: and ecx, 0x7FFF or ecx, 0x480000 jmp @ICH_SetCmdSMBus ;--------------------------------------- @ICH_WriteWordSMBus: and ecx, 0x7FFF or ecx, 0x4C0000 jmp @ICH_SetCmdSMBus ;--------------------------------------- @one: cmp al, 0xA jc @ncor add al, 7 @ncor: add al, 48 mov ah, 0xE ;цвет символа и фона stosw RET PrintHexWord: xchg al, ah call PrintHexByte xchg al, ah PrintHexByte: push ax push ax shr al, 4 call @one pop ax and al, 0xF call @one pop ax @RET: RET cls: mov ax, 0xB800 ; DX = сегмент памяти для начала видеобуфера mov es, ax ; ES = сегмент видеобуфера xor di, di ; DI = 0 - начальное смещение в памяти видеобуфера mov ax, 0x0E20 ; AH = байт атрибута для вывода на экран символа, AL = байт выводимого символа mov cx, 2000 ; CX = 25 x 80 - количество выводимых символов на экран rep stosw ; выводим на экран CX символов AL с атрибутом AH ret @prt_: mov di, [pos] ;начальная позиция видеобуфера строки отображения add [pos], 8;*2 mov al, [si] inc si pusha call PrintHexByte ;отображение содержимого регистра ; call PrintHexWord ;отображение содержимого регистра popa ret prt_CX: mov si, BUFF @prt_CX_1: call @prt_ loop @prt_CX_1 ret saveF: ; push cx xor cx, cx mov ah, 0x3C int 0x21 mov bx, ax mov dx, BUFF ; pop cx mov cx, 256 mov ah, 0x40 int 0x21 mov ah, 0x3E int 0x21 ret FN50 DB "50_dump.bin", 0 FN2E DB "2E_dump.bin", 0 ;--------------------------------------- pos DW 0 SMBusAdrMap DB 19 DUP(0) CntWaitSMBus DB 0 BaseSMBus DW 0 BUFF:
Понятно. Но эту инфу самому бы поиметь. Подозреваю там опять производителями наведен бардак и у каждого своё... Где то встречал инфу но она мутная какаято была и давно это было, собственно. Сорцы биоса рулят. Собственно многих если и интересует SMBus + адреса, то это память (SPD читать, менять, разгонять) либо мониторинг температур, вольтаж, кулеры... Опять же по собственному опыту тут точнее и наверняка дизасмить биос вернее и гуманнее нежели искать иголку в терабайтах тырнета. Тем более, что все равно без южного моста (изучение, вкуривание, познание) и его связки SMBus затем делать нечего в данных вопросах.
Некоторый список адресов I2C-шины (от которой и происходит smbus) есть в известном Ralf Brown Interrupt List, i2c.lst. В частности, структура данных, выдаваемая модулями памяти, там описана. Но в целом - нестандартизировано и implementation-dependent.
Очень сомневаюсь, что таккая древность, как Ralf Brown мог знать тогда про адреса SMBus. Беру SpeedFan, захожу на Find SMBus Devices жму Start Scanning, вываливает адреса 38h, 50h, 51h, 69h. 50h,51h понятно. 69h - кажись кто то когда то говаривал, уж не Pavia ли? Что это уножитель частоты CPU через него рулится. Тогда остается предположить, что 38h заведует мониторингом питаний, тем-р, кулеры... словом Видбонд какой нить, что при необходимости можно протестить другой прожкой... По поводу кода сказал выше, а еще скажу, что проверенный способ такой, выкл. комп., вскрытие, увелич.лупой шарим по головам микрух и выписываем на бумажечку, большие да с радиаторами не в счет далее гуглим PDF DataSheetsЫ и вкуриваем, анализируем оно или нет сюда к SMBus относится или нет. Пересечение нескольких веток (вариантов) информации завсегда на провду указать может, факт!