2011-08-22 24 views
5

मैं अपने सुपरमिक्रो X7DWA मदरबोर्ड पर Winbond W83793 chip से तापमान डेटा पढ़ने के लिए OpenHardwareMonitor प्राप्त करने का प्रयास कर रहा हूं। समस्या यह है कि मेरे पास कोई निम्न स्तर का प्रोग्रामिंग अनुभव नहीं है, और उपलब्ध दस्तावेज़ों को ऑनलाइन तापमान तक पहुंचने के तरीके में पर्याप्त प्रतीत नहीं होता है।क्या आप Winbond W83793 चिप से तापमान को पढ़ने में मेरी सहायता के लिए निम्न संकेतों को एक साथ जोड़ सकते हैं?

हालांकि, इस समस्या पर काम करने वाले महीने में, मैंने कुछ मूल्यों और निम्न-स्तरीय विधियों की खोज की है जो मेरी समस्या को हल करने की कुंजी हो सकती हैं। मुझे बस यह पता लगाने की जरूरत है कि मैं जो चाहता हूं उसे पाने के लिए उनका उपयोग कैसे करें। यही वह जगह है जहां मैं आपको बदलता हूं, क्योंकि आप समझ सकते हैं कि इस जानकारी का अर्थ क्या है, और इसे कैसे लागू करें, मेरे विपरीत। मैंने पहले ही पोकिंग के अपने उचित हिस्से को पूरा कर लिया है, जिसके परिणामस्वरूप कई नीली स्क्रीन और कंप्यूटर पुनरारंभ होता है। पर्याप्त अनुमान है, मुझे इन सुरागों को एकसाथ टुकड़ा करने की जरूरत है। यहाँ मैं अब तक क्या पता है:

  1. चिप से पढ़ने के लिए, मैं किसी भी तरह, SMBus में पहुंचना होगा क्योंकि है कि इस तरह के CPUID HWMonitor के रूप में जिस तरह से निगरानी कार्यक्रम,, जानकारी हो रही है। जहां तक ​​मुझे पता है, OpenHardwareMonitor, SMBus तक पहुंचने के लिए इसमें कोई कोड नहीं है, यही कारण है कि यह चिप से नहीं पढ़ा जा सकता है। हालांकि, OpenHardwareMonitor में निम्न विधियों को Ring0 class में शामिल किया गया है, जो यह अन्य चिप्स से जानकारी तक पहुंचने के लिए उपयोग करता है। मैं अपने लाभ के लिए इन तरीकों का उपयोग करने में सक्षम हो सकता है:

    void Ring0.WriteIOPort(uint port, byte value); 
    byte Ring0.ReadIOPort(uint port); 
    
  2. अन्य जानकारी के अलावा, HWMonitor मेरे लिए Winbond W83793 चिप के बारे में निम्नलिखित जानकारी की रिपोर्ट जब मैं एक रिपोर्ट को सहेजने:

    रजिस्टर अंतरिक्ष : SMBus, आधार का पता = 0x01100

    SMBus अनुरोध: चैनल 0x0, पता 0x2F

    यह टी की तरह दिखता है हेस महत्वपूर्ण मूल्य हैं, लेकिन मुझे नहीं पता कि उनका क्या मतलब है, और मैं उन्हें ऊपर की रिंग 0 विधियों के साथ कैसे उपयोग कर सकता हूं। हम्म ... इतने सारे सुराग। एचडब्ल्यू मॉनिटर के अन्य मूल्य मुझे दिखाते हैं कि वास्तविक वोल्टेज, तापमान और प्रशंसक गति, और हेक्साडेसिमल मानों की एक सरणी है जो चिप पर कहीं से डेटा का प्रतिनिधित्व करती है, जिसे मैं यहां देखना चाहूंगा यदि आप इसे देखना चाहते हैं।

  3. अंत में, W83793 डाटा शीट में, पेज 53 पर (यदि आप दस्तावेज़ खुला है), यहां तापमान के हेक्स में पते मैंने पढ़ा करना चाहते हैं (मेरा मानना ​​है कि):

    TD1 पढ़ा गया - बैंक 0 पता 1C

    TD2 पढ़ा गया - बैंक 0 पता -1 डी

    TD3 पढ़ा गया - बैंक 0 पता 1E

    TD4 पढ़ा गया - बैंक 0 पता 1F

    कम बिट पढ़ा गया - बैंक 0 पता 22

    TR1 पढ़ा गया - बैंक 0 पता 20

    TR2 पढ़ा गया - बैंक 0 पता 21

है बस इतना ही मैं अब तक पता ।ओपनहार्डवेयर मॉनिटर, W83793 चिप, और रिंग 0 कोड ऊपर दिए गए लिंक के माध्यम से उपलब्ध हैं। जैसा कि मैंने पहले कहा था, मैं एक महीने के लिए इस पर रहा हूं, और मैं अभी तक इस रहस्य को हल करने में सक्षम नहीं हूं। मुझे आशा है आप मेरी मदद कर सकते हैं। यह सारी जानकारी थोड़ा डरावनी प्रतीत हो सकती है, लेकिन मुझे यकीन है कि यह किसी निम्न स्तर के प्रोग्रामिंग अनुभव वाले किसी व्यक्ति को समझ जाएगा।

मेरे प्रश्न को संक्षेप में सारांशित करने के लिए ऊपर दिए गए संकेतों का उपयोग करें ताकि यह पता चल सके कि W83793 चिप से तापमान को पढ़ने के लिए OpenHardwareMonitor को कैसे प्राप्त किया जाए। मुझे OpenHardwareMonitor में चिप बनाने के विवरण की आवश्यकता नहीं है। मेरे पास पहले से ही एक कक्षा तैयार है। मुझे बस रिंग 0 कमांड लिखने के लिए अनुक्रम और प्रारूप की आवश्यकता है, अगर मुझे ऐसा करने की ज़रूरत है।

संपादित करें: मुझे कुछ और जानकारी मिली है। मैं HWMonitor से एक SMBus डिवाइस रिपोर्ट मुद्रित, और अन्य बातों के अलावा, मैं इस लाइन है, यहाँ शामिल है क्योंकि यह 0x2F का कहना है:

एसएमबी डिवाइस: मैं/हे = 0x1100, पता 0x2F, चैनल = 0

इसका मतलब यह होगा कि मुझे किसी भी तरह चिप के पते के साथ I/O के पते को गठबंधन करने की आवश्यकता है, जो 0x2F प्रतीत होता है। मैंने उन्हें एक साथ जोड़ने की कोशिश की लेकिन फिर मुझे सभी तापमान रीडिंग 255 होने के लिए मिल गया, इसलिए यह सही अनुमान नहीं था।

उत्तर

1

अंत में, ओपनहार्डवेयर मॉनिटर के लेखक ने कृपया मेरी मदद की, और अब मैं अपने चिप से तापमान को पढ़ने में सक्षम हूं। हालांकि इस समस्या का पूरा समाधान थोड़ा और जटिल है और अभी भी मेरे बाहर है, यहां रुचि रखने वाले किसी भी व्यक्ति के लिए रिंग 0 कक्षा का उपयोग करके मूल पढ़ना और लिखना है। ध्यान दें कि यह मेरी मशीन और चिप के लिए विशिष्ट है। आपके लिए, मूल पता और दास पता अलग-अलग हो सकता है, लेकिन आप रिपोर्ट प्रिंट करके CPUID HWMonitor का उपयोग करके उन्हें पा सकते हैं।

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

जब मैं डॉन:

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; 

इसके बाद, यहाँ चिप पर एक रजिस्टर से एक विशेष बाइट पढ़ने के लिए बुनियादी कोड है:

सबसे पहले, यहाँ स्थिरांक कि इस्तेमाल किया गया हैं यह अच्छी तरह से समझ में नहीं आता है, यह किसी ऐसे व्यक्ति के लिए एक मोटा गाइड के रूप में काम कर सकता है जिसकी तुलना में मुझे कम समस्या है।

4

आईओ विधियों की आपको आवश्यकता है। X86 हार्डवेयर पर वास्तव में दो पता पूल हैं, एक नहीं। एक स्मृति के लिए है, निर्देशों को पढ़ने के दौरान चिप द्वारा संदर्भित किया गया है और इसमें हजारों उपयोगी और सुविधाजनक पहुंच विधियां हैं। दूसरा बाहरी चिप्स को संबोधित करने के लिए है और पढ़ने और लिखने के संचालन के बहुत सीमित और अपेक्षाकृत धीमे सेट हैं। आपके द्वारा पहचाने गए तरीकों से आप दूसरे क्षेत्र तक पहुंच सकते हैं।

जिन रजिस्टरों को आप पढ़ना चाहते हैं, वे बैंक 0 में हैं, तो पहले आपको पृष्ठ पर पृष्ठ 0 के अनुसार बैंक 0 का चयन करना होगा। धारा 8.1.2.1 में आरेख के अनुसार आपको 00x80 पते पर लिखने की आवश्यकता है। आपकी रिपोर्ट पर कि चिप के लिए मूल पता 0x01100 है, जिसका अर्थ 0x80 से 0x01100 WriteIOPort के माध्यम से लिखना चाहिए।

यह है, तो संभावना है कि आप ReadIOPort 0x01100 0x1d से + 0x1c, 0x01100 + के माध्यम से मानों आप चाहते हैं पढ़ने में सक्षम होना चाहिए आदि

मैं समय पूरी तरह से दस्तावेज़ आप लिंक को पचाने के लिए नहीं किया है, लेकिन वे उचित अनुमान हैं। कुछ चिप्स में थोड़ी अधिक जटिल प्रक्रिया होती है जहां आपको एक मूल्य लिखना होता है, फिर परिणाम को स्वीकार करते हैं, लेकिन मुझे दस्तावेज़ में ऐसा कुछ भी दिखाई नहीं देता है। आपको मल्टीटास्किंग से सावधान रहने की भी आवश्यकता है - यदि आपका कोड बैंक 0 सेट करने और प्रासंगिक रजिस्टरों को पढ़ने के बीच बाधित है तो बीच में कुछ प्रक्रिया कुछ अन्य बैंक सेट कर सकती है, जिससे आपके द्वारा पढ़े जाने वाले मान मनमाने ढंग से अन्य मूल्यों के कारण होते हैं। मुझे लगता है कि OpenHardwareMonitor के साथ निपटने के लिए कुछ प्रकार की तंत्र है, लेकिन यदि आप त्वरित रूप से उपयोगकर्ता स्पेस कार्यान्वयन का प्रयास करते हैं और कभी-कभी अजीब परिणाम प्राप्त करते हैं तो यह ध्यान में रखना महत्वपूर्ण है।

+0

यह बेहद सहायक है, धन्यवाद! मैंने आपके द्वारा निर्दिष्ट तरीके से उन विधियों का उपयोग करने का प्रयास किया, लेकिन पिछले दो (20 और 21) के लिए पहले 4 तापमान (1 सी -1 एफ) और 255 के लिए सभी 0 के साथ समाप्त हो गया। लेकिन मैंने एक नई खोज की है (उपरोक्त प्रश्न पर मेरे संपादन की जांच करें)। ऐसा लगता है कि 0x1100 चिप का पता नहीं है लेकिन एसएमबीस चैनल (या कुछ) का पता है, जबकि 0x2F चिप का पता है। मै गलत हो सकता हूँ। मैंने अनुमानित चिप पते पर आधार पता जोड़ने का प्रयास किया लेकिन परिणाम अभी भी गलत थे। कोई विचार? – Dalal

+0

मुझे एसएमबीस सुराग याद आया; मेरी समझ यह है कि आपको उस SMBus नियंत्रक को निर्देश देने की आवश्यकता है जिसे आप किसी विशिष्ट डिवाइस पर किसी विशिष्ट पते से पढ़ना या लिखना चाहते हैं। एसएमबीस विनिर्देश (http://smbus.org/specs/) यह निर्धारित करता है कि एसएमबीस पर डिवाइस किस प्रकार बोली जाएंगे और जवाब देंगे लेकिन अनिवार्य रूप से परिभाषित नहीं करता है कि कैसे एक एसएमबीस नियंत्रक को x86 दुनिया में एक सीपीयू से बात करनी चाहिए। तो खोजने के लिए अगली चीज़ आपके मदरबोर्ड के एसएमबीस नियंत्रक के लिए डेटाशीट है, या यह पता लगाने के लिए कि क्या वे सामान्य हैं कि कोई पुराना डेटाशीट करेगा। मेरे पहले दो गूगल्स ने काम नहीं किया है, लेकिन मैं देख रहा हूं। – Tommy

+0

मुझे इंटेल 5400 एमसीएच (http://www.intel.com/Assets/PDF/datasheet/318610.pdf) के लिए डेटा शीट मिली, जो मेरे मदरबोर्ड के लिए 'मेमोरी कंट्रोलर हब' प्रतीत होता है, मेरे अनुसार मदरबोर्ड की डेटा शीट। मुझे यकीन नहीं है कि क्या हमें यही चाहिए। – Dalal