SMBus на nvidia nforce

Тема в разделе "WASM.OS.DEVEL", создана пользователем spirom, 6 авг 2011.

  1. spirom

    spirom New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    Подскажите пожалуйста где можно найти информацию о контроллере smbus для чипсета nvidia nforce или вообще чипсетов nvidia. Заранее спасибо
     
  2. Pavia

    Pavia Well-Known Member

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

    spirom New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    2Pavia
    Проблема в том, что гугл дает инфу только для интеловских чипсетов... Если Вы располагаете какой-либо информацией о чипсетах нвидиа, то поделитесь пожалуйста ссылкой/ами ))
     
  4. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    spirom
    самое простое и быстрое скачать исходники линукса. и посмотреть драйверы smbus. они маленькие и понятные. мне помогло. ссылку не помню но точно знаю что когда-то видел датащит на nforce2. ищи лучше
     
  5. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    spirom
    Вот немного информации.
    Код (Text):
    1. const
    2.   PCI_VENDOR_ATI           = $1002;  // ATI Technologies
    3.   PCI_VENDOR_SIS           = $1039;  // Silicon Integrated System
    4.   PCI_VENDOR_AMD           = $1022;  // Advanced Micro Devices
    5.   PCI_VENDOR_NVIDIA        = $10DE;  // Nvidia Corporation
    6.   PCI_VENDOR_VIATECH       = $1106;  // VIA Technologies
    7.   PCI_VENDOR_INTEL         = $8086;  // Intel
    8.  
    9. const
    10.   PCI_CONFADR     = $0CF8;
    11.   PCI_CONFDATA    = $0CFC;
    12.  
    13. const
    14.   ICH_XMIT_SLVA         = $04;    // transmit slave address
    15.     ICH_XMIT_SLVA_READ  = $01;    // direction: read
    16.     ICH_XMIT_SLVA_WRITE = $00;    // direction: write
    17.  
    18. const
    19.   // nVidia nForce2 SMBus control register definitions
    20.   // (Newer incarnations use standard BARs 4 and 5 instead)
    21.   NFORCE_PCI_SMB1       = $50;
    22.   NFORCE_PCI_SMB2       = $54;
    23.  
    24.   // ACPI 2.0 chapter 13 SMBus 2.0 EC register model
    25.   NVIDIA_SMB_PRTCL      = $00;    // protocol, PEC
    26.   NVIDIA_SMB_STS        = $01;    // status
    27.   NVIDIA_SMB_ADDR       = $02;    // address
    28.   NVIDIA_SMB_CMD        = $03;    // command              // acpi_sbs_read_str
    29.   NVIDIA_SMB_DATA0      = $04;    // 32 data registers
    30.   NVIDIA_SMB_DATA1      = $05;
    31.   NVIDIA_SMB_BCNT       = $24;    // number of data bytes
    32.   NVIDIA_SMB_ALRM_A     = $25;    // alarm address
    33.   NVIDIA_SMB_ALRM_D     = $26;    // 2 bytes alarm data
    34.  
    35.   NVIDIA_SMB_STS_DONE   = $80;
    36.   NVIDIA_SMB_STS_ALRM   = $40;
    37.   NVIDIA_SMB_STS_RES    = $20;
    38.   NVIDIA_SMB_STS_STATUS = $1F;
    39.  
    40.   NVIDIA_SMB_PRTCL_WRITE           = $00;
    41.   NVIDIA_SMB_PRTCL_READ            = $01;
    42.   NVIDIA_SMB_PRTCL_QUICK           = $02;
    43.   NVIDIA_SMB_PRTCL_BYTE            = $04;
    44.   NVIDIA_SMB_PRTCL_BYTE_DATA       = $06;
    45.   NVIDIA_SMB_PRTCL_WORD_DATA       = $08;
    46.   NVIDIA_SMB_PRTCL_BLOCK_DATA      = $0a;
    47.   NVIDIA_SMB_PRTCL_PROC_CALL       = $0c;
    48.   NVIDIA_SMB_PRTCL_BLOCK_PROC_CALL = $0d;
    49.   NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA  = $4a;
    50.   NVIDIA_SMB_PRTCL_PEC             = $80;
    51.  
    52. // --- поиск адреса SMBus ---------
    53.  
    54.   // с этими чипами через SMBus как то не получилось работать
    55.   if (VendorID = PCI_VENDOR_NVIDIA) and (DeviceID = $01B4) then Exit;   // not supported   // nForce1
    56.   if (VendorID = PCI_VENDOR_NVIDIA) and (DeviceID = $0AA2) then Exit;   // not supported   // NVidia ION2
    57.  
    58.   SMBusBaseOff := 0;    // смещение адреса SMBus
    59.   bsp := PDWORD(@e^.PCIHead.Named.ProgIf)^ and $00FFFFFF;
    60.   if bsp = $0C0500 then begin
    61.     // 0x0C0500 сигнализирует о стандартном SMBus, т.е. смещение адреса выдираем из BAR регистров
    62.     // для чипов от NVIDIA не встречал ещё расположение адреса SMBus за пределами BAR регистров !!!
    63.    
    64.     ... читаем тут все BAR регистры
    65.    
    66.     // Примечание: у Intel адрес SMBus находится в BAR4
    67.     // Примечание: у NVIDIA обычно в BAR регистрах можно найти 2 адреса SMBus
    68.   end;
    69.  
    70. // ------- функции чтения для NVIDIA ---------------
    71.  
    72. function SMBusNVidia_WaitPortAnswer(SMBusAddr: Word): Boolean;
    73. var
    74.   b: Byte;
    75.   i: DWORD;
    76. begin
    77.   Result := False;
    78.   b := 0;
    79.   for i:=0 to $FA00 do begin
    80.     b := PortInB(Driver, SMBusAddr + NVIDIA_SMB_STS);   // +1
    81.     if (b and (NVIDIA_SMB_STS_STATUS + NVIDIA_SMB_STS_DONE)) <> 0 then Break;
    82.     NEWIODELAY;   // 250 us
    83.     NEWIODELAY;   // 250 us
    84.     NEWIODELAY;   // 250 us
    85.   end;
    86.   if (b and (NVIDIA_SMB_STS_STATUS + NVIDIA_SMB_STS_ALRM + NVIDIA_SMB_STS_RES) <> 0) and
    87.      (b and NVIDIA_SMB_STS_STATUS <> NVIDIA_SMB_STS_STATUS) then Result := True;
    88. end;
    89.  
    90. // SMBusAddr - адрес SMBus
    91. // SMBusDev - номер девайса
    92. // Addr - смещение запрашиваемого байтика
    93. function SMBusNVidia_ReadByte(SMBusAddr: Word; SMBusDev: Byte; Addr: Byte; var Res: Byte): Boolean;
    94. var
    95.   b: Byte;
    96. begin
    97.   Result := False;
    98.   PortOutB(Driver, SMBusAddr + NVIDIA_SMB_STS, NVIDIA_SMB_STS_STATUS);   // +1
    99.   PortOutB(Driver, SMBusAddr + NVIDIA_SMB_ADDR, (SMBusDev shl 1) or ICH_XMIT_SLVA_READ);  // +2
    100.   PortOutB(Driver, SMBusAddr + NVIDIA_SMB_CMD, Addr);   // +3
    101.   PortOutB(Driver, SMBusAddr + NVIDIA_SMB_PRTCL, NVIDIA_SMB_PRTCL_READ or NVIDIA_SMB_PRTCL_BYTE_DATA);   // +0
    102.   if SMBusNVidia_WaitPortAnswer(SMBusAddr) then Exit;
    103.   Res := PortInB(Driver, SMBusAddr + NVIDIA_SMB_DATA0);
    104.   Result := True;
    105. end;
    ЗЫ. Привёл на паскале, что бы форум не забыл что это такое)
     
  6. spirom

    spirom New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2010
    Сообщения:
    24
    Спасибо всем! Вроде все получилось
     
  7. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    T800
    на паскале проще разбираться, а на си писать- но разобрать потом трудно)