2011-08-22 22 views
5

Sto cercando di ottenere OpenHardwareMonitor per leggere i dati di temperatura dal Winbond W83793 chip sulla mia scheda madre Supermicro X7DWA. Il problema è che non ho alcuna esperienza di programmazione di basso livello e che i documenti disponibili online non sembrano sufficienti a spiegare come accedere alle temperature.Riesci a mettere insieme i seguenti indizi per aiutarmi a leggere le temperature del chip Winbond W83793?

Tuttavia, nel corso del mese in cui ho lavorato a questo problema, ho scoperto alcuni valori e metodi di basso livello che potrebbero essere la chiave per risolvere il mio problema. Ho solo bisogno di capire come usarli per ottenere quello che voglio. È lì che mi rivolgo a te, perché potresti capire cosa significa questa informazione e come applicarla, a differenza di me. Ho già fatto la mia giusta parte di curiosità, causando molte schermate blu e riavvii del computer. Basta indovinare, devo mettere insieme questi indizi. Ecco quello che so finora:

  1. Per leggere dal chip, io in qualche modo bisogno di accedere al SMBus, perché questo è il modo in cui programmi di monitoraggio, come CPUID HWMonitor, stanno ottenendo le informazioni. OpenHardwareMonitor, per quanto ne so, non ha alcun codice in esso per accedere a SMBus, motivo per cui potrebbe non essere leggibile dal chip. Tuttavia, OpenHardwareMonitor ha i seguenti metodi inclusi nel suo Ring0 class, che utilizza per accedere alle informazioni da altri chip. Io possa essere in grado di utilizzare questi metodi a mio vantaggio:

    void Ring0.WriteIOPort(uint port, byte value); 
    byte Ring0.ReadIOPort(uint port); 
    
  2. Tra le altre informazioni, HWMonitor riporta le seguenti informazioni relative al chip Winbond W83793 a me quando ho salvare un rapporto:

    Registrati Spazio : SMBus, indirizzo di base = 0x01100

    SMBus richiesta: canale 0x0, indirizzo 0x2F

    sembra t questi sono valori importanti, ma non so esattamente cosa intendono e come posso usarli in combinazione con i metodi Ring0 sopra. Hmm ... tanti indizi. Gli altri valori che HWMonitor mi mostra sono le tensioni, le temperature e le velocità della ventola effettive e una serie di valori esadecimali che rappresentano dati da qualche parte sul chip, che riprodurrò qui se si vuole osservarli.

  3. Infine, nella scheda tecnica W83793, a pagina 53 (se avete il documento aperto), qui ci sono gli indirizzi in hex delle temperature vorrei leggere (credo):

    TD1 Lettura - Bank 0 Indirizzo 1C

    TD2 Lettura - Bank 0 Indirizzo 1D

    TD3 Lettura - Bank 0 Indirizzo 1E

    TD4 Lettura - Bank 0 Indirizzo 1F

    po 'bassa Lettura - Bank 0 Indirizzo 22

    TR1 Lettura - Bank 0 Indirizzo 20

    TR2 Lettura - Bank 0 Indirizzo 21

Questo è tutto quello che so finora .Il chip OpenHardwareMonitor, W83793 e Ring0 sono disponibili tramite i collegamenti forniti sopra. Come ho detto prima, ci sono stato per un mese, e non sono ancora riuscito a risolvere questo mistero. Spero che puoi aiutarmi. Tutte queste informazioni possono sembrare un po 'intimidatorie, ma sono sicuro che avrà senso per qualcuno con qualche esperienza di programmazione di basso livello.

Per riassumere la mia domanda, utilizzare gli indizi forniti sopra per capire come ottenere OpenHardwareMonitor per leggere le temperature dal chip W83793. Non ho bisogno di dettagli sulla creazione di un chip in OpenHardwareMonitor. Ho già una lezione pronta. Ho solo bisogno della sequenza e del formato per scrivere i comandi Ring0, se è quello che devo fare.

MODIFICA: ho trovato qualche altra informazione. Ho stampato un rapporto dispositivo SMBus da HWMonitor, e tra le altre cose, ho avuto questa linea, incluso qui perché dice 0x2F: dispositivo

SMB: I/O = 0x1100, indirizzo 0x2F, canale = 0

Ciò significa che è necessario combinare in qualche modo gli indirizzi dell'I/O con l'indirizzo del chip, che sembra essere 0x2F. Ho provato ad aggiungerli insieme, ma poi ho ottenuto tutte le letture di temperatura per essere 255, quindi non era la giusta ipotesi.

risposta

1

Alla fine, l'autore di OpenHardwareMonitor mi ha gentilmente aiutato, e ora sono in grado di leggere le temperature dal mio chip. Mentre l'intera soluzione a questo problema è un po 'più complessa ed è ancora al di là di me, ecco la lettura e la scrittura di base utilizzando la classe Ring0, per chiunque sia interessato. Si noti che questo è specifico per la mia macchina e il mio chip. Per voi, l'indirizzo di base e l'indirizzo slave possono essere diversi, ma è possibile trovarli utilizzando CPUID HWMonitor, stampando un report.

primo luogo, qui sono le costanti che sono stati usati:

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; 

Avanti, ecco il codice di base per leggere un particolare byte da un registro sul chip:

// 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) {} 

Mentre don capisco bene, questo potrebbe servire come una guida approssimativa per qualcuno con più esperienza di basso livello di me che sta avendo un problema simile.

4

I metodi IO sono ciò di cui hai bisogno. Sull'hardware x86 ci sono in realtà due pool di indirizzi, non uno. Uno è pensato per la memoria, è referenziato dal chip durante la lettura delle istruzioni e ha migliaia di metodi di accesso utili e convenienti. L'altro è pensato per indirizzare i chip esterni e ha un insieme molto limitato e relativamente lento di operazioni di lettura e scrittura. I metodi che hai identificato ti danno accesso alla seconda area.

Poiché i registri che si desidera leggere sono in banca 0, per prima cosa è necessario selezionare il banco 0 sul chip, come da pagina 12. Per lo schema nella sezione 8.1.2.1 è necessario scrivere 0x80 all'indirizzo 00. Basato sul tuo rapporto che l'indirizzo di base per il chip è 0x01100, che dovrebbe significare scrivere da 0x80 a 0x01100 tramite WriteIOPort.

E 'quindi probabile che si dovrebbe essere in grado di leggere i valori desiderati tramite ReadIOPort da 0x01100 + 0x1c, 0x01100 + 0x1d, ecc

non ho avuto il tempo di digerire pienamente il documento si collega a, ma quelle sono supposizioni ragionevoli. Alcuni chip hanno una procedura leggermente più complicata in cui devi scrivere un valore e quindi riconoscere il risultato, ma non vedo nulla di simile nella documentazione. Bisogna anche stare attenti al multitasking - se il codice viene interrotto tra l'impostazione del banco 0 e la lettura dei registri rilevanti, allora qualche processo intermedio può impostare qualche altro banco, facendo sì che i valori letti siano arbitrariamente altri valori. Presumo che OpenHardwareMonitor abbia un qualche tipo di meccanismo per gestirlo, ma vale la pena tenerlo a mente se si tenta un'implementazione di uno spazio utente veloce e occasionalmente si ottengono risultati strani.

+0

Ciò è estremamente utile, grazie! Ho provato a utilizzare questi metodi nel modo specificato, ma ho finito con tutti gli 0 per le prime 4 temperature (1C - 1F) e 255 per le ultime due (20 e 21). Ma ho fatto una nuova scoperta (controlla le mie modifiche alla domanda sopra). Sembra che 0x1100 non sia l'indirizzo del chip ma l'indirizzo del canale SMBus (o qualcosa del genere), mentre 0x2F è l'indirizzo del chip. Potrei sbagliarmi. Ho provato ad aggiungere l'indirizzo di base al presunto indirizzo del chip, ma i risultati erano ancora errati. Qualche idea? – Dalal

+0

Ho perso l'indizio di SMBus; la mia comprensione è che è necessario istruire il controller SMBus da cui si desidera leggere o scrivere su un indirizzo specifico su un dispositivo specifico. La specifica SMBus (http://smbus.org/specs/) stabilisce come i dispositivi su SMBus saranno parlati e rispondenti, ma inevitabilmente non definisce come un controller SMBus dovrebbe parlare a una CPU nel mondo x86. Quindi la prossima cosa da scoprire è una scheda tecnica per il controller SMBus della tua scheda madre, o per scoprire se sono abbastanza generiche da far funzionare qualsiasi vecchio datasheet. I miei primi due google non hanno funzionato, ma continuerò a cercare. – Tommy

+0

Ho trovato la scheda tecnica per Intel 5400 MCH (http://www.intel.com/Assets/PDF/datasheet/318610.pdf), che sembra essere un 'Hub controller di memoria' per la mia scheda madre, secondo il mio scheda tecnica della scheda madre. Non sono sicuro se questo è ciò di cui abbiamo bisogno. – Dalal