2011-08-22 9 views
5

Supermicro X7DWA anakartımdaki Winbond W83793 chip sıcaklık verilerini okumak için OpenHardwareMonitor almaya çalışıyorum. Sorun şu ki, düşük seviyeli bir programlama deneyimim yok ve mevcut çevrimiçi dokümanlar, sıcaklıklara nasıl erişileceğini açıklamakta yeterli görünmüyor. Ancak, bu sorun üzerinde çalıştığım ay boyunca, sorunumu çözmenin anahtarı olabilecek birkaç değer ve düşük düzeydeki yöntemleri keşfettim. Sadece istediğimi almak için onları nasıl kullanacağımı bulmalıyım. İşte sana dönüyorum, çünkü bu bilginin ne anlama geldiğini ve nasıl uygulanacağını bana anlayabiliyorsun. Çok sayıda mavi ekran ve bilgisayar yeniden başlatılmasıyla sonuçlanan, etrafta dolanmamdaki payımı çoktan yaptım. Yeterli tahmin, bu ipuçlarını birlikte eklemem gerek. İşte ben bugüne kadar bildiklerimiz: böyle CPUID HWMonitor olarak yolu izleme programları, bilgi alıyorsanız çünküWinbond W83793 yongasından çıkan sıcaklıkları okumama yardımcı olmak için aşağıdaki ipuçlarını bir araya getirebilir misiniz?

  1. yonga okumak için, bir şekilde, SMBus erişmek gerekir. OpenHardwareMonitor, bildiğim kadarıyla, SMBus'a erişmek için herhangi bir kod içermiyor, bu yüzden de çipten okunamayabilir. Ancak, OpenHardwareMonitor, diğer çiplerden gelen bilgilere erişmek için kullandığı Ring0 class'da aşağıdaki yöntemlere sahiptir.

    Kayıt Alanı: Benim için avantaj bu yöntemleri kullanmak mümkün olabilir: Bir raporu kaydetmek, diğer bilgiler arasında

    void Ring0.WriteIOPort(uint port, byte value); 
    byte Ring0.ReadIOPort(uint port); 
    
  2. , HWMonitör bana Winbond W83793 çipi hakkında aşağıdaki bilgileri raporlar : SMBus, taban adresi = 0x01100

    SMBus isteği: kanal 0X0, adres 0x2F

    Bu t benzeyen hese önemli değerlerdir, ancak tam olarak ne anlama geldiklerini ve yukarıdaki Ring0 yöntemleriyle nasıl kullanabileceğimi bilmiyorum. Hmm ... pek çok ipucu. HWMonitor'un bana gösterdiği diğer değerler, gerçek voltajlar, sıcaklıklar ve fan hızları ve çipin üzerindeki bir yerden gelen verileri temsil eden onaltılık bir değer dizisi olup, bunlara bakmak isterseniz burada yeniden üreteceğim. (Açık belge varsa)

  3. Son olarak, W83793 bilgi formunda, sayfa 53, burada sıcaklıkların hex adresleri (sanırım) Ben okumak istiyorum şunlardır:

    TD1 Okuma - Banka 0 Adres 1C

    TD2 Okuma - Banka 0 Adres 1D

    TD3 Okuma - Banka 0 Adres 1E

    TD4 Okuma - Banka 0 Adres 1F

    Düşük bit Okuma - Banka 0 Adres 22

    TR1 Okuma - Banka 0 Adres 20

    TR2 Okuma - olan Banka 0 Adres 21

tüm biliyorum defa .OpenHardwareMonitor, W83793 yongası ve Ring0 kodu, yukarıda verilen linkler aracılığıyla kullanılabilir. Daha önce de söylediğim gibi, bir aydır çalışıyorum ve henüz bu gizemi çözemedim. Umarım bana yardım edebilirsin. Tüm bu bilgiler biraz korkutucu görünebilir, ama eminim ki, bazı düşük seviyeli programlama deneyimlerine sahip biri için mantıklı olacaktır.

Sorumu özetlersek, OpenHardwareMonitor'un W83793 yongası dışındaki sıcaklıkları okumasını öğrenmek için yukarıda verilen ipuçlarını kullanın. OpenHardwareMonitor'da bir çip oluşturma konusunda detaylara ihtiyacım yok. Zaten hazır bir sınıfım var. Ring0 komutlarını yazmak için sıraya ve formata ihtiyacım var, eğer yapmam gereken buysa.

DÜZENLEME: Daha fazla bilgi buldum. Ben HWMonitor bir SMBus cihaz raporunu basılı ve diğer şeylerin yanı sıra, bu çizgiyi var, 0x2F diyor çünkü buraya dahil:

SMB cihazı: I/O = 0x1100, adres 0x2F, kanal = 0

Bu, bir şekilde I/O adreslerini çipin adresiyle birleştirmek zorunda olduğum anlamına gelir, ki bu 0x2F gibi görünüyor. Onları toplamaya çalıştım ama sonra tüm sıcaklık okumalarını 255 olarak aldım, bu doğru tahmin değildi.

cevap

1

Sonuçta, OpenHardwareMonitor'un yazarı bana yardımcı oldu ve şimdi çipimin dışındaki sıcaklıkları okuyabiliyorum. Bu soruna tüm çözüm biraz daha karmaşık ve benim için hala ötesindeyken, burada ilgilenen herkes için Ring0 sınıfını kullanarak temel okuma ve yazma. Bunun makinem ve çip için özel olduğunu unutmayın. Sizin için temel adres ve bağımlı adres farklı olabilir, ancak bir rapor yazarak bunları CPUID HWMonitor kullanarak bulabilirsiniz.

// first wait until ready 
byte status; 
do 
{ 
    status = Ring0.ReadIoPort(BASE_ADDRESS + HOST_STAT_REG); 
} while ((status & HOST_BUSY) > 0); 
if ((status & 0x1E) != 0) 
{ 
    Ring0.WriteIoPort(BASE_ADDRESS + HOST_STAT_REG, status); 
} 

// now get the value 
Ring0.WriteIoPort(BASE_ADDRESS + HOST_DATA_0_REG, 0); 
Ring0.WriteIoPort(BASE_ADDRESS + HOST_COMM_REG, theRegister) 
Ring0.WriteIoPort(BASE_ADDRESS + T_SLAVE_ADR_REG, 
      (byte)((SLAVE_ADDRESS << 1) | READ)); 
Ring0.WriteIoPort(BASE_ADDRESS + HOST_CTRL_REG, 
      START_COMM | BYTE_DATA_COMM); 
Ring0.ReadIoPort(BASE_ADDRESS + HOST_DATA_0_REGISTER); // this returns the value 

// now wait for it to end 
while ((Ring0.ReadIoPort(BASE_ADDRESS + HOST_STAT_REG) & HOST_BUSY) > 0) {} 

ı don iken:

private const int BASE_ADDRESS = 0x1100; 
private const uint SLAVE_ADDRESS = 0X2F; // as we figured out already 
private const byte HOST_STAT_REG = 0; // host status register 
private const byte HOST_BUSY  = 1;  
private const byte HOST_CTRL_REG = 2; // host control register 
private const byte HOST_CMD_REG = 3; // host command register 
private const byte T_SLAVE_ADR_REG = 4; // transmit slave address register 
private const byte HOST_DATA_0_REG = 5; 
private const byte BYTE_DATA_COMM = 0x08; // byte data command 
private const byte START_COMM  = 0x40; // start command 
private const byte READ   = 1; 
private const byte WRITE   = 0; 

Sonraki burada çip üzerinde bir kasadan belli bayt okumak için temel kodu şöyledir:

Birincisi, burada kullanıldı sabitlerdir Bunu çok iyi anlayabildim, bu da benzer bir problemi olan benden daha düşük seviyeli deneyime sahip birine kaba bir rehber olarak hizmet edebilir.

4

IO yöntemleri ihtiyacınız olan şeydir. X86 donanımında aslında iki adres havuzu var, bir değil. Bir bellek için kastedilen, talimatları okurken çip tarafından başvurulan ve binlerce yararlı ve kullanışlı erişim yöntemleri vardır. Diğeri ise, harici yongaları ele almak içindir ve çok sınırlı ve nispeten yavaş okuma ve yazma işlemlerine sahiptir. Tanımladığınız yöntemler, ikinci alana erişim sağlar.

Okumak istediğiniz kayıtlar banka 0'da olduğu için, önce sayfa 12'deki çip üzerinde banka 0'ı seçmeniz gerekir. Bölüm 8.1.2.1'deki şemaya göre 00 no'lu adrese 0x80 yazmanız gerekmektedir. Raporunuzda çip için temel adresin 0x01100 olduğunu, bu WriteIOPort üzerinden 0x01100 0x01100 yazma anlamına gelmelidir.

Bu size ReadIOPort 0x1d + 0x01100, 0x1c + 0x01100 den aracılığıyla istediğiniz değerleri okumak mümkün olmalıdır sonra büyük olasılıkla vb

Ben bağlanmak belgeyi sindirmek için tam zamanım olmadı

, ama bunlar makul tahminlerdir. Bazı çipler, bir değer yazmanız ve sonra sonucu kabul etmeniz gereken biraz daha karmaşık bir prosedüre sahiptir, ancak belgelerindeki gibi bir şey göremiyorum. Aynı zamanda çoklu görevden de dikkatli olmanız gerekir - eğer kodunuz banka 0'ın ayarlanması ile ilgili kayıtların okunması arasında kesintiye uğrarsa, aradaki bazı işlemler başka bir bankayı ayarlayabilir ve okuduğunuz değerlerin keyfi diğer değerler olmasına neden olabilir. OpenHardwareMonitor'un bununla başa çıkmak için bir çeşit mekanizması olduğunu düşünürüm, ancak tamamen kullanıcılara yönelik bir uygulama yapmayı denediğinizde ve zaman zaman garip sonuçlar elde edersiniz.

+0

Bu çok yararlı, teşekkürler! Bu yöntemleri belirttiğiniz şekilde kullanmaya çalıştım, ancak ilk 4 sıcaklık (1C - 1F) ve son ikisi için 255 (20 ve 21) için tüm 0'larla bitti. Ancak yeni bir keşif yaptım (yukarıdaki soruya yaptığım düzenlemeleri kontrol et). 0x1100 çipin adresi değil, SMBus kanalının (ya da bir şeyin) adresi değil, çipin 0x2F adresidir. Yanlış olabilirim. Temel adresi sözde çip adresine eklemeyi denedim, ancak sonuçlar hala yanlıştı. Herhangi bir fikir? – Dalal

+0

SMBus ipucunu özledim; Benim anlayışım, okumak istediğiniz SMBus denetleyicisine belirli bir aygıttaki belirli bir adrese yazmanız veya yazmanız gerektiğidir. SMBus şartname (http://smbus.org/specs/) bir SMBus kontrolör x86 dünyasında bir CPU konuşmak nasıl tanımlamıyor kaçınılmaz SMBus üzerinde cihazlar sözlü olarak nasıl öngören ve yanıt verir ama. Bu durumda, bir sonraki ana kartınızın SMBus denetleyicisine ait bir veri sayfası ya da herhangi bir eski veri sayfasının yapacağı kadar genel olup olmadıklarını öğrenmek. İlk iki Googles çalışmadı, ama bakmaya devam edeceğim. – Tommy

+0

Ben göre, benim anakart için bir 'Bellek Denetleyici Hub' gibi görünüyor, Intel 5400 MCH (http://www.intel.com/Assets/PDF/datasheet/318610.pdf) için bir fiş bulundu benim anakartın veri sayfası. İhtiyacımız olan şey bu olduğundan emin değilim. – Dalal