SMBus, I2C и др.

Тема в разделе "WASM.OS.DEVEL", создана пользователем Pavia, 7 апр 2006.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Подскажите толковую доку по этим шинным интерфейсам компьютера. Какие данные я могу через них получить?

    И еще вопросс I2C шина, что сойдиняет Монитор с видюхай(DDC). Завязана на SMBus контролер или это две отдельные системы.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Сам протокол I2C прост как 5 копеек. Видимо, Вы ищете документацию по командам SMBus через I2C конкретно для видео. Посмотрите в исходниках Linux.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Quantum

    Сам протокол прост. Но я ищу информацию о том, что я могу получить через SMBus, для чего он нужен.

    Исходники уже посмотрел. И судя по ним:

    SMBus основан на шине I2C.

    DDC тоже основан на I2C.

    Но это две физическе отдельные шины.
     
  4. Oxide

    Oxide New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2006
    Сообщения:
    4
    Адрес:
    Russia
    У меня вопрос тоже про i2c&smbus.

    У меня задача достучаться в windows XP до i2c. Для начала просто попробовать поуправлять микросхемой повешенной на smbus. Мне посоветовали http://msdn.microsoft.com/library/, и там ввести слово SMBUS. Примеры использования искал пару дней - без результатно. Кто-нибудь пользовался ЭТИМ? Помогите пожалуйста, советом, докой. Я уже гуглил, яндексил, и йазаинел :)
     
  5. Oxide

    Oxide New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2006
    Сообщения:
    4
    Адрес:
    Russia
    Подскажите пожалуйста, как написать приложение, которое может общаться с микросхемой по 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
     
  6. VBKesha

    VBKesha New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    39
    вот статья в MSDN по SMBUS.
    Правда она мало что прояснила.
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Oxide
    У меня пример работает. Только он слишком сухой. Там только два чипсета и датчиков тоже не больше.
    PIIX4- Это под пениум 2. Я долго не возился, но дорабатывается легко.
    VBKesha
    Можешь у меня спросить может и отвечу, хотя я почти ничего не знаю.
    Проще посмотреть исходники биоса от них толку больше. Или доку от интел почитать.
     
  8. Dust112

    Dust112 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2002
    Сообщения:
    16
    Адрес:
    Russia
    Как то была тема, называлась Температура процессора, там был исходничек. Я сам опирался на него, а так же на исходники Im-sensors. Удалось достучатся до датчиков и сенсоров. В принцине все просто.
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Dust112
    Согласен только LM_sensors
     
  10. VBKesha

    VBKesha New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    39
    Pavia
    Меня вообще интересует как зная базовый адрес SMBus работать с устройствами на ней(получить их список, читать/писать данные).
    P.S. Температуру процессора часто можно получить без SMBus через микросхему SuperIO обычно она от WinBond на их сайте есть полные даташиты.
     
  11. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    VBKesha
    SMBus выступает в качестве обертки для I2C. Список устройств получается при помощи сканирования всего диапозона адрессов и его проверки на каждое из устройств. Сейчас хочу попробовать написать прожку, только как то страшно приступать к этому делу.
     
  12. VBKesha

    VBKesha New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2004
    Сообщения:
    39
    А можно ссылку на доку от интел.
     
  13. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    где можно найти все адреса устройств на шине smbus
    я знаю только 50h-57h spd памяти

    А где найти остальные?
     
  14. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    и еще вопрос: можно ли прочитать ddc черес smbus
     
  15. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    нельзя. Ответ основан на:
    1. дизассме парочки VideoBIOSов
    2. логическом рассуждении и изучении архитектуры шин и матерей... Поясняю. Пусть у нас мать без встроенного видио. Пусть видео у меня PCI катра. Тогда сама шина PCI электрически должна иметь провод(а), шину SMBUS среди своих контактов, а это не так на сколько помню. И далее соответственно эта карта PCI чудно вычитывается по DDC, без проблем.
    3. DDC судя по дизассму использует некоторые свободные биты VGA портов для организации I2C обмена с чипом установленным в мониторе.
    Вот пример ковырятельства видиобивиса не помню какой древней машинки из разряда типа эпохи P1-P2:
    Код (Text):
    1.         ORG     0x100
    2.  
    3.         mov     ax, 3
    4.         int     0x10
    5.         mov     di, DDCdump
    6. ;        mov     cx, 0
    7. ;        mov     bx, 1
    8.         call    LoadEDID
    9.         xor     di, di
    10.         mov     si, DDCdump + 95
    11.         call    prit
    12.         add     di, 4
    13.         mov     si, DDCdump + 113
    14.         call    prit
    15.         int     0x20
    16. prit:
    17.         mov     ax, 0xB8DC
    18.         mov     es, ax
    19.         cli
    20.         mov     ah, 0xE
    21. @rep:   lodsb
    22.         or      al, al
    23.          jz     quit
    24.         stosw
    25.         jmp    @rep
    26. quit:      ret
    27.  
    28.  
    29. portCL  DW  0
    30. portDL  DW  0
    31. bp_2    DB  0
    32. bp_3    DB  0
    33. bp_4    DB  0
    34. bp_5    DB  0
    35. bp_6    DB  0
    36. bp_7    DB  0
    37. bp_8    DB  0
    38.  
    39.  
    40. LoadEDID:
    41.         mov     dx, 0x3C4
    42.         in      al, dx
    43.         mov     [bp_3], al
    44.         mov     dx, 0x3CE
    45.         in      al, dx
    46.         mov     [bp_5], al
    47.         mov     dx, 0x3CC
    48.         in      al, dx
    49.         mov     dx, 0x3D4
    50.         test    al, 1
    51.          jnz    loc_444
    52.         mov     dx, 0x3B4
    53. loc_444:
    54.         mov     [portCL], dx
    55.         mov     [portDL], dx
    56.         add     [portDL], 6
    57.         in      al, dx
    58.         mov     [bp_4], al
    59.         mov     al, 0x24
    60.         out     dx, al
    61.         inc     dx
    62.         in      al, dx
    63.         mov     [bp_7], al
    64.         mov     dx, [portDL]
    65.         in      al, dx
    66.         mov     dx, 0x3C0
    67.         in      al, dx
    68.         mov     [bp_6], al
    69.         mov     dx, 0x3C4
    70.         mov     al, 1
    71.         out     dx, al
    72.         inc     dx                      ; DX = 0x3C5
    73.         in      al, dx
    74.         mov     [bp_8], al
    75.         mov     al, 0x11
    76.         dec     dx                      ; DX = 0x3C4
    77.         out     dx, al
    78.         inc     dx
    79.         in      al, dx
    80.         mov     [bp_2], al
    81.         mov     al, 0x92
    82.         out     dx, al
    83.         mov     al, 0x59
    84.         mov     dx, [portCL]
    85.         out     dx, al
    86.         inc     dx
    87.         in      al, dx
    88.         or      al, 0x10
    89.         out     dx, al
    90.  
    91.         mov     bx, 0xA0
    92.         mov     cx, 0x80
    93.         call    sub_232
    94.  
    95.         mov     al, 0x59
    96.         mov     dx, [portCL]
    97.         out     dx, al
    98.         inc     dx
    99.         in      al, dx
    100.         and     al, 0xEF
    101.         out     dx, al
    102.         mov     dx, 0x3C4
    103.         mov     al, 1
    104.         out     dx, al
    105.         inc     dx
    106.         in      al, dx
    107.         xor     al, [bp_8]
    108.         and     al, 0x20
    109.          jz     loc_5
    110.  
    111. ;        mov     ah, 8
    112. ;        call    wait_1
    113. ;wait_1:
    114. ;        push    cx
    115.         mov     cx, 0xFFFF
    116.         mov     dx, [portDL]
    117. loc446:
    118.         in      al, dx
    119.         and     al, 8
    120. ;        cmp     al, ah
    121. ;         je     loc447
    122.          jne     loc447
    123.  
    124.         loop    loc446
    125. ;        stc
    126. loc447: ;pop     cx
    127. ;           ret
    128.  
    129.  
    130. loc_5:  mov     al, [bp_8]
    131.         out     dx, al
    132.         mov     al, 0x11
    133.         mov     dx, 0x3C4
    134.         out     dx, al
    135.         inc     dx
    136.         in      al, dx
    137.         mov     al, [bp_2]
    138.         out     dx, al
    139.         dec     dx                      ; DX = 0x3C4
    140.         mov     al, [bp_3]
    141.         out     dx, al
    142.         mov     dx, 0x3CE
    143.         mov     al, [bp_5]
    144.         out     dx, al
    145.         mov     dx, [portCL]
    146.         mov     al, [bp_4]
    147.         out     dx, al
    148.         mov     dx, [portDL]
    149.         in      al, dx
    150.         mov     dx, 0x3C0
    151.         mov     al, [bp_6]
    152.         out     dx, al
    153.         test    [bp_7], byte 0x80
    154.          jnz    loc_6
    155.         mov     dx, [portDL]
    156.         in      al, dx
    157. loc_6:     ret
    158.  
    159.  
    160. sub_232:
    161.         mov     al, 0x37
    162.         mov     dx, [portCL]
    163.         out     dx, al
    164.         inc     dx
    165.         in      al, dx
    166.         mov     al, 0xF
    167.         out     dx, al
    168.         call    sub_242
    169.         call    sub_236
    170.          jc     loc_1041
    171.         and     bl, 0xFE
    172.         call    sub_239
    173.          jnc    loc_1039
    174.         call    sub_236
    175.         call    sub_239
    176.          jc     loc_1041
    177. loc_1039:
    178.         xchg    bl, bh
    179.         call    sub_239
    180.          jc     loc_1041
    181.         call    sub_237
    182.         call    sub_236
    183.          jc     loc_1041
    184.         xchg    bl, bh
    185.         or      bl, 1
    186.         call    sub_239
    187.          jc     loc_1041
    188.         xor     bl, bl
    189. locloop_1040:
    190.         call    ReadNewByteEDID
    191.         or      cx, cx
    192.          jz     loc_1041
    193.         mov     [es:di], ah             ; сохранение нового байта
    194.         add     bl, ah
    195.         inc     di
    196.         loop    locloop_1040
    197.         or      bl, bl
    198. loc_1041:
    199.         call    sub_237
    200.         mov     al, 0x37
    201.         mov     dx, [portCL]
    202.         out     dx, al
    203.         inc     dx
    204.         in      al, dx
    205.         mov     al, 7
    206.         out     dx, al
    207.            ret
    208.  
    209. sub_236:
    210.         in      al, dx
    211.         or      al, 0xD
    212.         out     dx, al
    213.         call    sub_242
    214.         mov     al, 0xF
    215.         out     dx, al
    216.         call    sub_242
    217.         call    sub_240
    218.          jc     loc_ret_1042
    219.         mov     al, 0xE
    220.         out     dx, al
    221.         call    sub_242
    222.         mov     al, 0xC
    223.         out     dx, al
    224.         call    sub_242
    225. loc_ret_1042:
    226.            ret
    227.  
    228. sub_237:
    229.         mov     al, 0xC
    230.         out     dx, al
    231.         call    sub_242
    232.         mov     al, 0xE
    233.         out     dx, al
    234.         call    sub_242
    235.         call    sub_240
    236.         mov     al, 0xF
    237.         out     dx, al
    238.         call    sub_242
    239.            ret
    240.  
    241. ReadNewByteEDID:
    242.         push    cx
    243.         mov     cx, 8
    244. locloop_1043:
    245.         mov     al, 4
    246.         out     dx, al
    247.         call    sub_242
    248.         or      al, 2
    249.         out     dx, al
    250.         call    sub_242
    251.         call    sub_240
    252.         in      al, dx
    253.         rcr     al, 1
    254.         rcl     ah, 1
    255.         mov     al, 4
    256.         out     dx, al
    257.         call    sub_242
    258.         loop    locloop_1043
    259.         pop     cx
    260.         mov     al, 0xC
    261.         cmp     cx, 1
    262.          ja     L_1044
    263.         mov     al, 0xD
    264. L_1044:
    265.         out     dx, al
    266.         call    sub_242
    267.         or      al, 2
    268.         out     dx, al
    269.         call    sub_242
    270.         call    sub_240
    271.         and     al, 0xFD
    272.         out     dx, al
    273.         call    sub_242
    274.            ret
    275.  
    276.  
    277. sub_239:
    278.         push    cx
    279.         mov     cx, 8
    280. locloop_1045:
    281.         mov     al, 0xC
    282.         test    bl, 0x80
    283.          jz     loc_1046
    284.         or      al, 1
    285. loc_1046:
    286.         out     dx, al
    287.         call    sub_242
    288.         or      al, 2
    289.         out     dx, al
    290.         call    sub_242
    291.         call    sub_240
    292.         and     al, 0xFD
    293.         out     dx, al
    294.         call    sub_242
    295.         rol     bl, 1
    296.         loop    locloop_1045
    297.         pop     cx
    298.         mov     al, 4
    299.         out     dx, al
    300.         call    sub_242
    301.         or      al, 2
    302.         out     dx, al
    303.         call    sub_242
    304.         call    sub_240
    305.         in      al, dx
    306.         and     al, 0xFD
    307.         or      al, 8
    308.         out     dx, al
    309.         call    sub_242
    310.         test    al, 1
    311.          jz    loc_ret_1047
    312.         stc
    313. loc_ret_1047:
    314.            ret
    315.  
    316. OldCntCnl   DW  0
    317.  
    318. CmpOldTmr:
    319.         push    ax
    320.         pushf
    321.         xor     ax, ax
    322.         cli                     ; запрет прерывания на время измерения таймера
    323.         out     0x43, al
    324.         in      al, 0x40
    325.         mov     ah, al
    326.         in      al, 0x40
    327.         popf
    328.         cmp     ax, [OldCntCnl]
    329.         mov     [OldCntCnl], ax
    330.         pop     ax
    331.            RET
    332.  
    333. Delay1mcs:
    334.         mov     [OldCntCnl], 0xFFFF      ; для гарантированного осуществления самого первого цикла
    335. @time1delay:
    336.         call    CmpOldTmr
    337.          je     @time1delay     ; это следующий квант времени таймера ?
    338.            RET
    339.  
    340. DelayCXmcs:
    341.         mov     [OldCntCnl], 0xFFFF      ; для гарантированного осуществления самого первого цикла
    342. @timeCXdelay:
    343.         call    CmpOldTmr
    344.          je     @timeCXdelay    ; это следующий квант времени таймера ?
    345.         loopw   @timeCXdelay
    346.            RET
    347.  
    348. sub_242:
    349. ;        out     0xEB, al
    350. ;        out     0xEB, al
    351. ;        out     0xEB, al
    352. ;        out     0xEB, al
    353. ;        ret
    354.         push    ax
    355.         push    cx
    356.         mov     cx, 8
    357. locloop_1053:
    358.         in      al, 0x20
    359. ;        out     0xEB, al
    360.         loop    locloop_1053
    361. ;        call    DelayCXmcs
    362.         pop     cx
    363.         pop     ax
    364.            ret
    365.  
    366. sub_240:
    367.         push    cx
    368.         mov     cx, 0x800
    369. locloop_1048:
    370.         in      al, dx
    371.         test    al, 0x40
    372.          jnz    loc_1049
    373.         call    sub_242
    374.         loop    locloop_1048
    375.         stc
    376. loc_1049:
    377.         pop     cx
    378.            ret
    379.  
    380.  
    381.  
    382. align  16
    383. DDCdump: ;       DB  512  DUP (0x55)
    4. С другой стороны проскакивали сорцы (может и тут видел) Nvidia BIOS, там это дело выглядит аналогично, только беда биты другие....
    Сволочи они буржуинские, кость им в голо!
     
  16. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Что значит найти? Найти присутствие на шине элементарно - перебором адресов. Сканируем диапазон, долго молчащие адреса - отсутствие, значит.
    А вот что они из себя фактически и особенно физически???
    Играться втупую здесь, занчит попалить проц например, мать нафиг. Запросто собственно, остановтить кулер проца и забабахать умножитель частоты проца в заоблачную даль... и все это несколькими байтами всего то, парочку нужных out dx,al и при определённых условиях... "сушите вёсла!"
    Посему эта инфа удел немногих и пытливых, особенно дизасм биоса рулит с доной стороны с другой производители темнят и мутят, ну и защищаются... :)
    Вот пример скана SMBus адресов матери интела (это важно т.к. вендорозависимо например на VIA работать не будет)
    Код (Text):
    1. TestBuffSMBus   =  BUFF
    2. ;---------------------------------------
    3. HST_STS     =  0x00  ;Host Status
    4. HST_CNT     =  0x02  ;Host Control       R/W, WO
    5. HST_CMD     =  0x03  ;Host Command       R/W
    6. XMIT_SLVA       =  0x04  ;Transmit Slave Address R/W
    7. HST_D0      =  0x05  ;Host Data 0        R/W
    8. HST_D1      =  0x06  ;Host Data 1        R/W
    9. HOST_BLOCK_DB   =  0x07  ;Host Block Data Byte   R/W
    10. PEC         =  0x08  ;Packet Error Check     R/W
    11. RCV_SLVA    =  0x09  ;Receive Slave Address  R/W
    12. SLV_DATA    =  0x0A  ;Slave Data         R/W
    13. AUX_STS     =  0x0C  ;Auxiliary Status       R/WC
    14. AUX_CTL     =  0x0D  ;Auxiliary Control      R/W
    15. SMLINK_PIN_CTL  =  0x0E  ;SMLink Pin Control     R/W, RO
    16. SMBUS_PIN_CTL   =  0x0F  ;SMBus Pin Control      R/W, RO
    17. SLV_STS     =  0x10  ;Slave Status       R/WC
    18. SLV_CMD     =  0x11  ;Slave Command      R/W
    19. NOTIFY_DADDR    =  0x14  ;Notify Device Address  RO
    20. NOTIFY_DLOW     =  0x16  ;Notify Data Low Byte   RO
    21. NOTIFY_DHIGH    =  0x17  ;Notify Data High Byte  RO
    22. ;---------------------------------------
    23. INTR        =  0x02  ;
    24. DEV_ERR     =  0x04  ;
    25. INUSE_STS       =  0x40  ;
    26. BYTE_DONE_STS   =  0x80  ;Byte Done Status
    27. ;---------------------------------------
    28.  
    29.  
    30.     ORG     0x100
    31.  
    32.     mov     di, BUFF
    33.     xor     ax, ax
    34.     mov     cx, 2000
    35.     rep stosw
    36.  
    37.     call    cls
    38.  
    39.     mov     dx, 0x5000
    40.     jmp  @aa
    41.  
    42.     mov     ax, 0xB103      ;найти
    43.     mov     ecx, 0x0C0500   ;класс SMBus устройства
    44.     mov     si, 0
    45.     int     0x1A
    46.      jnc    @sm1
    47.       ret
    48. @sm1:
    49.     mov     di, 0x20    ;номер читаемого регистра
    50.     mov     ax, 0xB109      ;читать WORD значение
    51.     int     0x1A
    52.     and     cx, 0xFFFE
    53.     mov     dx, cx
    54.  
    55. @aa:
    56.     mov     [BaseSMBus], dx
    57.  
    58.     mov     ax, dx
    59.     mov     di, 80*4    ;начальная позиция видеобуфера строки отображения
    60.     call    PrintHexWord    ;отображение содержимого регистра
    61.     mov     [pos], 80*4+16  ;начальная позиция видеобуфера строки отображения
    62.  
    63.  
    64.     xor     ecx, ecx
    65.     mov     edi, SMBusAdrMap
    66. @NxtTstAdrSMbus:
    67.     mov     esi, TestBuffSMBus
    68.     push    esi
    69. @RepTstReadSMBus:
    70.     push    ecx
    71.     call    @ICH_ReadWordSMBus
    72.     pop     ecx
    73.     mov     [esi], eax
    74.     add     esi, 4
    75.     cmp     esi, TestBuffSMBus+5*4
    76.      jne    @RepTstReadSMBus
    77.     pop     esi
    78.     xor     ebx, ebx
    79. @CalcSucReadAdrSMBus:
    80.     mov     eax, [esi]
    81.     cmp     eax, 0xFFFFFFFF
    82.      je     @t2
    83.     cmp     eax, [esi+4]
    84.      jne    @t2
    85.     inc     ebx
    86. @t2:    add     esi, 4
    87.     cmp     esi, TestBuffSMBus+4*4
    88.      jne    @CalcSucReadAdrSMBus
    89.     cmp     bl, 4
    90.      jc     @notSMBusDev
    91.     inc     byte [edi]
    92.     movzx   ebx, byte [edi]
    93.     mov     [edi+ebx], ch
    94. @notSMBusDev:
    95.     inc     ch
    96.     cmp     ch, 0x80
    97.      jne    @NxtTstAdrSMbus
    98. ;
    99.     mov     cx, 0x5000
    100.     call    @ICH_ReadWordSMBus
    101.  
    102.  
    103.     movzx   cx, byte [edi]
    104.     mov     esi, edi
    105.     inc     esi
    106.     call    @prt_CX_1
    107.  
    108.     mov     cx, 0x5000
    109.     mov     al, ch
    110.     mov     di, 80*8
    111.     call    PrintHexByte
    112.     mov     [pos], 80*10    ;начальная позиция видеобуфера строки отображения
    113.     call    @ReadAdr
    114.     mov     dx, FN50
    115.     call    saveF
    116.  
    117.     push    es
    118.     push    ds
    119.     pop     es
    120.     mov     di, SMBusAdrMap
    121.     movzx   cx, byte [di]
    122.     mov     al, 0x2E
    123.     repne scasb
    124.     pop     es
    125.      jne    @endPrt
    126.     xor     cx, cx
    127.     mov     ch, al
    128.     mov     di, 80*26
    129.     call    PrintHexByte
    130.     mov     [pos], 80*28    ;начальная позиция видеобуфера строки отображения
    131.     call    @ReadAdr
    132.     mov     dx, FN2E
    133.     call    saveF
    134.  
    135. @endPrt:
    136.     xor      ax, ax
    137.     int      0x16
    138.         ret
    139.  
    140. @ReadAdr:
    141.     mov     si, BUFF
    142.     push    si
    143. @repRd00:
    144.     push    ecx
    145.     call    @ICH_ReadByteSMBus
    146.     pop     ecx
    147.     mov     [si], al
    148.     inc     si
    149.     inc     cl
    150.     cmp     cl, 128
    151.      jne    @repRd00
    152.     pop     si
    153.     mov     cx, 128
    154.     jmp     prt_CX
    155. ;---------------------------------------
    156.  
    157. @SmBwait:
    158.     mov     [CntWaitSMBus], 30
    159. @wtSmBus:
    160.     pusha
    161.     xor     cx, cx
    162.     mov     dx, 1000
    163.     mov     ah, 0x86
    164.     int     0x15
    165.     popa
    166.     xor     eax, eax
    167.     in      al, dx      ;get status
    168.     out     dx, al      ;clear status
    169.     test    al, DEV_ERR     ;device error ?
    170.      jne    @errDevSMBus
    171.     or      al, al
    172.      je     @readySMBus
    173.  
    174.     dec     [CntWaitSMBus]
    175.      jne    @wtSmBus
    176.  
    177. @errDevSMBus:
    178.     in      al, dx      ;get status FOR CLEAR
    179.     xor     eax, eax
    180.     dec     eax
    181.     stc
    182.        ret
    183. @readySMBus:
    184.     clc
    185.        ret
    186. ;---------------------------------------
    187.  
    188. @ICH_SetCmdSMBus:
    189.     mov     dx, [BaseSMBus]
    190.     call    @SmBwait
    191.      jc     @retCmdSmHST
    192.     add     dx, XMIT_SLVA   ;Transmit Slave Address Register
    193.     mov     al, ch
    194.     rol     al, 1
    195.     out     dx, al
    196.     dec     dx          ;Host Command Register
    197.     mov     al, cl
    198.     out     dx, al
    199.     test    ecx, 0x8000     ;read?
    200.     bswap   ecx
    201.      jne    @readCmdSMBus
    202.     inc     dx
    203.     inc     dx          ;HST_D0
    204.     mov     al, bl
    205.     out     dx, al
    206.     cmp     ch, 0x4C
    207.      jne    @WrOneByteSMBus
    208.     inc     dx          ;HST_D1
    209.     mov     al, bh
    210.     out     dx, al
    211.     dec     dx
    212. @WrOneByteSMBus:
    213.     dec     dx
    214.     dec     dx
    215. @readCmdSMBus:
    216.     dec     dx          ;Host Control Register
    217.     mov     al, ch
    218.     out     dx, al
    219.     bswap   ecx
    220.     test    ecx, 0x8000     ;read?
    221.      je     @retCmdSmHST
    222.     dec     dx
    223.     dec     dx          ;DX = Base SMBUS
    224.     call    @SmBwait
    225.      jc     @retCmdSmHST
    226.     add     dx, HST_D0      ;Host Data 0 REGISTER
    227.     in      ax, dx
    228. @retCmdSmHST:
    229.        ret
    230. ;---------------------------------------
    231. ; чтение одного BYTE
    232. @ICH_ReadByteSMBus:
    233.     and     ecx, 0xFFFF
    234.     or      ecx, 0x488000
    235.     jmp     @ICH_SetCmdSMBus
    236. ;---------------------------------------
    237. ; чтение одного WORD
    238. @ICH_ReadWordSMBus:
    239.     and     ecx, 0xFFFF
    240.     or      ecx, 0x4C8000
    241.     jmp     @ICH_SetCmdSMBus
    242. ;---------------------------------------
    243.  
    244. @ICH_WriteByteSMBus:
    245.     and     ecx, 0x7FFF
    246.     or      ecx, 0x480000
    247.     jmp     @ICH_SetCmdSMBus
    248. ;---------------------------------------
    249.  
    250. @ICH_WriteWordSMBus:
    251.     and     ecx, 0x7FFF
    252.     or      ecx, 0x4C0000
    253.     jmp     @ICH_SetCmdSMBus
    254. ;---------------------------------------
    255.  
    256. @one:   cmp     al, 0xA
    257.      jc     @ncor
    258.     add     al, 7
    259. @ncor:  add     al, 48
    260.     mov     ah, 0xE     ;цвет символа и фона
    261.     stosw
    262.       RET
    263.  
    264. PrintHexWord:
    265.     xchg    al, ah
    266.     call    PrintHexByte
    267.     xchg    al, ah
    268. PrintHexByte:
    269.     push    ax
    270.     push    ax
    271.     shr     al, 4
    272.     call    @one
    273.     pop     ax
    274.     and     al, 0xF
    275.     call    @one
    276.     pop     ax
    277. @RET:      RET
    278.  
    279. cls:
    280.     mov     ax, 0xB800          ; DX = сегмент памяти для начала видеобуфера
    281.     mov     es, ax          ; ES = сегмент видеобуфера
    282.     xor     di, di          ; DI = 0 - начальное смещение в памяти видеобуфера
    283.     mov     ax, 0x0E20          ; AH = байт атрибута для вывода на экран символа, AL = байт выводимого символа
    284.     mov     cx, 2000        ; CX = 25 x 80 - количество выводимых символов на экран
    285.     rep  stosw              ; выводим на экран CX символов AL с атрибутом AH
    286.       ret
    287.  
    288. @prt_:
    289.     mov     di, [pos]       ;начальная позиция видеобуфера строки отображения
    290.     add     [pos], 8;*2
    291.     mov     al, [si]
    292.     inc     si
    293.     pusha
    294.     call    PrintHexByte    ;отображение содержимого регистра
    295. ;        call    PrintHexWord    ;отображение содержимого регистра
    296.     popa
    297.        ret
    298.  
    299. prt_CX:
    300.     mov      si, BUFF
    301. @prt_CX_1:
    302.     call     @prt_
    303.     loop     @prt_CX_1
    304.        ret
    305. saveF:
    306. ;        push    cx
    307.     xor     cx, cx
    308.     mov     ah, 0x3C
    309.     int     0x21
    310.     mov     bx, ax
    311.     mov     dx, BUFF
    312. ;        pop     cx
    313.     mov     cx, 256
    314.     mov     ah, 0x40
    315.     int     0x21
    316.     mov     ah, 0x3E
    317.     int     0x21
    318.        ret
    319.  
    320. FN50    DB "50_dump.bin", 0
    321. FN2E    DB "2E_dump.bin", 0
    322. ;---------------------------------------
    323. pos         DW  0
    324. SMBusAdrMap     DB  19 DUP(0)
    325. CntWaitSMBus    DB  0
    326. BaseSMBus       DW  0
    327. BUFF:
     
  17. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    я имел ввиде второе.
    какие адреса и что значат)
     
  18. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Понятно. Но эту инфу самому бы поиметь. Подозреваю там опять производителями наведен бардак и у каждого своё...
    Где то встречал инфу но она мутная какаято была и давно это было, собственно.
    Сорцы биоса рулят.
    Собственно многих если и интересует SMBus + адреса, то это память (SPD читать, менять, разгонять) либо мониторинг температур, вольтаж, кулеры...
    Опять же по собственному опыту тут точнее и наверняка дизасмить биос вернее и гуманнее нежели искать иголку в терабайтах тырнета. Тем более, что все равно без южного моста (изучение, вкуривание, познание) и его связки SMBus затем делать нечего в данных вопросах.
     
  19. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Некоторый список адресов I2C-шины (от которой и происходит smbus) есть в известном Ralf Brown Interrupt List, i2c.lst. В частности, структура данных, выдаваемая модулями памяти, там описана. Но в целом - нестандартизировано и implementation-dependent.
     
  20. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Очень сомневаюсь, что таккая древность, как Ralf Brown мог знать тогда про адреса SMBus.
    Беру SpeedFan, захожу на Find SMBus Devices жму Start Scanning, вываливает адреса 38h, 50h, 51h, 69h. 50h,51h понятно. 69h - кажись кто то когда то говаривал, уж не Pavia ли? Что это уножитель частоты CPU через него рулится. Тогда остается предположить, что 38h заведует мониторингом питаний, тем-р, кулеры... словом Видбонд какой нить, что при необходимости можно протестить другой прожкой...
    По поводу кода сказал выше, а еще скажу, что проверенный способ такой, выкл. комп., вскрытие, увелич.лупой шарим по головам микрух и выписываем на бумажечку, большие да с радиаторами не в счет :) далее гуглим PDF DataSheetsЫ и вкуриваем, анализируем оно или нет сюда к SMBus относится или нет.
    Пересечение нескольких веток (вариантов) информации завсегда на провду указать может, факт! ;)