2011-08-22 20 views
5

Tôi đang cố gắng để có được OpenHardwareMonitor để đọc dữ liệu nhiệt độ trong số Winbond W83793 chip trên bo mạch chủ Supermicro X7DWA của tôi. Vấn đề là tôi không có bất kỳ kinh nghiệm lập trình cấp thấp nào và các tài liệu trực tuyến có sẵn dường như không đủ để giải thích cách truy cập nhiệt độ.Bạn có thể ghép các đầu mối sau đây để giúp tôi đọc nhiệt độ trên chip Winbond W83793 không?

Tuy nhiên, trong tháng mà tôi đã làm việc về vấn đề này, tôi đã phát hiện ra một vài giá trị và phương pháp cấp thấp có thể là chìa khóa để giải quyết vấn đề của tôi. Tôi chỉ cần tìm ra cách sử dụng chúng để có được những gì tôi muốn. Đó là nơi tôi quay sang bạn, bởi vì bạn có thể hiểu ý nghĩa của thông tin này và cách áp dụng nó, không giống như tôi. Tôi đã thực hiện phần chia sẻ công bằng của mình, tạo ra nhiều màn hình màu xanh và khởi động lại máy tính. Đủ đoán, tôi cần phải ghép những manh mối này lại với nhau. Dưới đây là những gì tôi biết cho đến nay:

  1. Để đọc từ chip, tôi sẽ bằng cách nào đó cần truy cập vào SMBus, bởi vì đó là chương trình giám sát bằng cách nào, chẳng hạn như CPUID HWMonitor, đang nhận được thông tin. OpenHardwareMonitor, theo như tôi biết, không có bất kỳ mã nào trong đó để truy cập vào SMBus, đó là lý do tại sao nó có thể không được đọc từ chip. Tuy nhiên, OpenHardwareMonitor có các phương pháp sau đây bao gồm trong Ring0 class của nó, mà nó sử dụng để truy cập thông tin từ các chip khác. Tôi có thể sử dụng các phương pháp này để lợi thế của tôi:

    void Ring0.WriteIOPort(uint port, byte value); 
    byte Ring0.ReadIOPort(uint port); 
    
  2. Trong số thông tin khác, HWMonitor báo cáo các thông tin sau về chip Winbond W83793 với tôi khi tôi tiết kiệm một báo cáo:

    Đăng ký Space : SMBus, địa chỉ cơ sở = 0x01100

    SMBus yêu cầu: kênh 0x0, địa chỉ 0x2F

    Dường như t hese là những giá trị quan trọng, nhưng tôi không biết chính xác ý nghĩa của chúng, và cách tôi có thể sử dụng chúng cùng với các phương thức Ring0 ở trên. Hmm ... rất nhiều manh mối. Các giá trị khác mà HWMonitor chỉ cho tôi là điện áp thực tế, nhiệt độ và tốc độ quạt, và một loạt các giá trị thập lục phân đại diện cho dữ liệu từ đâu đó trên chip, mà tôi sẽ tái tạo ở đây nếu bạn muốn xem nó.

  3. Cuối cùng, trong các bảng dữ liệu W83793, trên trang 53 (nếu bạn có các tài liệu đang mở), sau đây là các địa chỉ trong hex của nhiệt độ Tôi muốn đọc (Tôi tin):

    TD1 Readout - Ngân hàng 0 Địa chỉ 1C

    TD2 Readout - Ngân hàng 0 Địa chỉ 1D

    TD3 Readout - Ngân hàng 0 Địa chỉ 1E

    TD4 Readout - Ngân hàng 0 Địa chỉ 1F

    chút Readout Low - Ngân hàng 0 Địa chỉ 22

    TR1 Readout - Ngân hàng 0 Địa chỉ 20

    TR2 Readout - Ngân hàng 0 Địa chỉ 21

Đó là tất cả tôi biết cho đến nay .Mã OpenHardwareMonitor, W83793 và mã Ring0 có sẵn thông qua các liên kết được cung cấp ở trên. Như tôi đã nói lúc trước, tôi đã ở đó trong một tháng, và tôi vẫn chưa thể giải được bí ẩn này. Tôi hy vọng bạn có thể giúp tôi. Tất cả các thông tin này có vẻ hơi đáng sợ, nhưng tôi chắc chắn nó sẽ có ý nghĩa đối với một người nào đó với một số kinh nghiệm lập trình cấp thấp.

Để tóm tắt câu hỏi của tôi, hãy sử dụng các gợi ý được cung cấp ở trên để tìm hiểu cách tải OpenHardwareMonitor để đọc nhiệt độ ngoài chip W83793. Tôi không cần chi tiết về việc tạo ra một con chip trong OpenHardwareMonitor. Tôi đã có sẵn một lớp rồi. Tôi chỉ cần trình tự và định dạng để viết các lệnh Ring0, nếu đó là những gì tôi cần làm.

EDIT: Tôi tìm thấy một số thông tin khác. Tôi in một báo cáo thiết bị SMBus từ HWMonitor, và trong số những thứ khác, tôi nhận được dòng này, bao gồm ở đây vì nó nói 0x2F: Thiết bị

SMB: I/O = 0x1100, địa chỉ 0x2F, kênh = 0

Điều này có nghĩa là tôi cần phải bằng cách nào đó kết hợp các địa chỉ của I/O với địa chỉ của chip, có vẻ là 0x2F. Tôi đã thử thêm chúng lại với nhau nhưng sau đó tôi nhận được tất cả các bài đọc nhiệt độ là 255, do đó, đó không phải là đoán đúng.

Trả lời

1

Cuối cùng, tác giả của OpenHardwareMonitor vui lòng giúp tôi, và bây giờ tôi có thể đọc được nhiệt độ ngoài chip của mình. Trong khi toàn bộ giải pháp cho vấn đề này phức tạp hơn một chút và vẫn còn xa hơn tôi, đây là đọc và viết cơ bản bằng cách sử dụng lớp Ring0, cho bất kỳ ai quan tâm. Lưu ý rằng điều này là dành riêng cho máy và chip của tôi. Đối với bạn, địa chỉ cơ sở và địa chỉ nô lệ có thể khác nhau, nhưng bạn có thể tìm chúng bằng cách sử dụng CPUID HWMonitor, bằng cách in báo cáo.

Thứ nhất, đây là những hằng số đã được sử dụng:

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; 

Tiếp theo, đây là mã cơ bản để đọc một byte cụ thể từ một thanh ghi trên 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) {} 

Trong khi tôi don Không hiểu nó tốt, điều này có thể phục vụ như là một hướng dẫn thô cho một người có kinh nghiệm cấp thấp hơn tôi là người có một vấn đề tương tự.

4

Các phương pháp IO là những gì bạn cần. Trên phần cứng x86 có hai hồ bơi địa chỉ, không phải là một. Một là dành cho bộ nhớ, được tham chiếu bởi chip khi đọc hướng dẫn và có hàng ngàn phương pháp truy cập hữu ích và thuận tiện. Phương thức khác dành cho việc giải quyết các chip bên ngoài và có một số hoạt động đọc và ghi rất hạn chế và tương đối chậm. Các phương pháp bạn đã xác định cung cấp cho bạn quyền truy cập vào khu vực thứ hai.

Khi sổ đăng ký bạn muốn đọc nằm trong ngân hàng 0 thì trước tiên bạn cần chọn ngân hàng 0 trên chip, theo trang 12. Theo sơ đồ trong phần 8.1.2.1 bạn cần viết 0x80 để giải quyết 00. Dựa trên báo cáo của bạn rằng địa chỉ cơ sở cho chip là 0x01100, điều đó có nghĩa là viết 0x80 đến 0x01100 qua WriteIOPort.

Đó là sau đó có khả năng là bạn sẽ có thể đọc các giá trị bạn muốn qua ReadIOPort từ 0x01100 + 0x1c, 0x01100 + 0x1d vv

Tôi đã không có thời gian đầy đủ để tiêu hóa các tài liệu mà bạn liên kết đến, nhưng đó là những dự đoán hợp lý. Một số chip có một thủ tục phức tạp hơn một chút, nơi bạn phải viết một giá trị sau đó xác nhận kết quả, nhưng tôi không thấy bất cứ điều gì như thế trong tài liệu. Bạn cũng cần phải cảnh giác với đa nhiệm - nếu mã của bạn bị gián đoạn giữa cài đặt ngân hàng 0 và đọc sổ đăng ký có liên quan thì một số quy trình ở giữa có thể đặt một số ngân hàng khác, khiến giá trị bạn đọc là các giá trị khác tùy ý. Tôi cho rằng OpenHardwareMonitor có một số loại cơ chế để giải quyết vấn đề đó, nhưng đáng lưu ý nếu bạn thử thực hiện hoàn toàn không gian người dùng hoàn toàn và đôi khi có kết quả lạ.

+0

Điều đó cực kỳ hữu ích, cảm ơn bạn! Tôi đã thử sử dụng các phương pháp đó theo cách bạn đã chỉ định, nhưng kết thúc bằng tất cả 0 cho 4 nhiệt độ đầu tiên (1C - 1F) và 255 cho hai phương thức cuối (20 và 21). Nhưng tôi đã thực hiện một khám phá mới (kiểm tra các chỉnh sửa của tôi đối với câu hỏi ở trên). Có vẻ như 0x1100 không phải là địa chỉ của chip nhưng địa chỉ của kênh SMBus (hoặc cái gì đó), trong khi 0x2F là địa chỉ của chip. Tôi có thể sai. Tôi đã thử thêm địa chỉ cơ sở vào địa chỉ chip được giả định nhưng kết quả vẫn không chính xác. Bất kỳ ý tưởng? – Dalal

+0

Tôi đã bỏ lỡ đầu mối SMBus; sự hiểu biết của tôi là bạn cần hướng dẫn bộ điều khiển SMBus mà bạn muốn đọc từ hoặc ghi vào một địa chỉ cụ thể trên một thiết bị cụ thể. Đặc tả SMBus (http://smbus.org/specs/) quy định cách các thiết bị trên SMBus sẽ được nói và trả lời nhưng chắc chắn không xác định cách một bộ điều khiển SMBus nên nói chuyện với một CPU trong thế giới x86. Vì vậy, điều tiếp theo để tìm là một biểu dữ liệu cho bộ điều khiển SMBus của bo mạch chủ của bạn, hoặc để tìm hiểu xem chúng có đủ chung hay không mà bất kỳ biểu dữ liệu cũ nào cũng sẽ làm. Hai Googles đầu tiên của tôi đã không làm việc, nhưng tôi sẽ tiếp tục tìm kiếm. – Tommy

+0

Tôi tìm thấy bảng dữ liệu cho Intel 5400 MCH (http://www.intel.com/Assets/PDF/datasheet/318610.pdf), có vẻ như là 'Memory Controller Hub' cho bo mạch chủ của tôi, theo bảng dữ liệu của bo mạch chủ. Tôi không chắc đây có phải là điều chúng ta cần không. – Dalal