SMBus, I2C и др.

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

  1. zicker

    zicker Member

    Публикаций:
    0
    Регистрация:
    23 дек 2008
    Сообщения:
    132
    VaStaNi
    Посмотри здесь: может поможет
     
  2. abcd008

    abcd008 New Member

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

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    abcd008
    Даташиты к устройствам не так просто достать.
    На Intel'овские поделки можно отыскать в нете даташиты, а всё остально не просто.
    Даже тот самый SPD памяти приходится читать 4-мя разными способами (для каждого вендора чем то и отличается).
    А вообще не понятно зачем знать "специфичные" адреса smbus.
     
  4. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    с первым согласен, но не совсем.
    intel досихпор не открыла доки на usb 3.0 (xHCI). они доступны только избранным.

    А адреса smbus нужны не все а стандартные.
    нсколько я помню адреса 0-127 стандартизированы и постоянны.
     
  5. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    народ подскажите такую вешь.
    я считал тайминги из spd памяти, а как мне установить эти тайминги.
    куда их надо писать. или при записи в spd они автоматом меняются???
    заранее спасибо.
     
  6. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    тайминги надо записать в спд, если не ошибаюсь и при загрузке биоса он их оттуда считает и установит.
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    drem1lin
    Насколько помню из SPD биос читает 3 байта чтобы определить размер памяти.
    Тайминги железо выбирает само. Также если в биосе выброно ручное управление то настройки выставляются те что выбрал пользователь. В последних биосах появилась настройка загружать тайминги из SPD, но по умолчанию она отключена. Записать аналогична чтению там разницы почти никакой.
     
  8. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    а куда биос их записывает. ведь в спд апосто информация а частоту надо задовать в контроллере, но как?
     
  9. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    В соответствующие регистры контроллера памяти записывается, есно. А в какие именно и как именно, зависит от особенностей этого самого контроллера.
     
  10. FalseMaster

    FalseMaster New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2011
    Сообщения:
    1
    Очень нужна помощь в определении мультика ADM1031 и получении посредством его температуры железа. Накрапал нижеследующий код, но ни хрена не детектится и AX перед сравнением в нулях вместо 0x4130.

    0x2E - address port
    0x2F - data port
    0x3D - chip ID register
    0x3E - manufacturer ID register
    Код (Text):
    1.   xor   cl, cl
    2. // sio enter
    3.   mov   al, $55
    4.   out   0x2E, al
    5. // detect
    6.   mov   al, 0x3E
    7.   out   0x2E, al
    8.   in    al, 0x2F
    9.   mov   ah, al
    10.   mov   al, 0x3D
    11.   out   0x2E, al
    12.   in    al, 0x2F
    13.   and   al, 0xFE
    14.   cmp   ax, 0x4130
    15.   jne   exit
    16.   inc   cl
    17. exit:
    18.   call  SioExit
    19.   mov   al, cl
    Подозреваю, что в части детекта использую не те "address" и "data" порты. Исходники "lm-sensors" курил, но чё-то не фкурил. В файле "sensors-detect" присутствуют функции:
    Код (Text):
    1. sub adm1031_detect
    2. {
    3.   my ($file, $addr, $chip) = @_;
    4.   my $mid = i2c_smbus_read_byte_data($file, 0x3e);
    5.   my $cid = i2c_smbus_read_byte_data($file, 0x3d);
    6.   ...
    7. }
    8.  
    9. sub i2c_smbus_read_byte_data
    10. {
    11.   my ($file, $command, $nocache) = @_;
    12.   my @data;
    13.  
    14.   return $i2c_byte_cache[$command] if !$nocache && exists $i2c_byte_cache[$command];
    15.  
    16.   i2c_smbus_access($file, SMBUS_READ, $command, SMBUS_BYTE_DATA, \@data) or return -1;
    17.   return ($i2c_byte_cache[$command] = $data[0]);
    18. }
    19.  
    20. sub i2c_smbus_access
    21. {
    22.   my ($file, $read_write, $command, $size, $data) = @_;
    23.   my $data_array = pack("C32", @$data);
    24.   my $ioctl_data = pack("C2x2Ip", $read_write, $command, $size, $data_array);
    25.  
    26.   ioctl($file, IOCTL_I2C_SMBUS, $ioctl_data) or return 0;
    27.   @{$_[4]} = unpack("C32", $data_array);
    28.   return 1;
    29. }
    Как видно, в итоге всё сводится к вызову сишной функции "ioctl", но я не вижу во всём этом коде в какой порт надо пихать адреса внутренних регистров чипа и из какого считывать значения. Ткните носом пожалуйста.