2013-09-04 5 views
2

Я пытаюсь получить доступ к аппаратной сторожевой панели на процессоре Linux. Это то, чего я никогда не делал раньше, так что моих знаний очень мало. Ссылка для руководства пользователя RTD: http://www.rtd.com/NEW_manuals/hardware/cpumodules/CMV34M_BDM610000077A.pdf (см. Стр. 64 для информации сторожевого таймера) и мою небольшую примерную программу, которую я нашел в Интернете и отредактировал. Я включил регистрацию Watchdog Setup в BIOS и запустил подключенную программу. Программа запускается и не выводит никаких ошибок, но, похоже, ничего не делает, поскольку моя система не сбрасывается (как и должно быть, если вы не «пинаете собаку»), хотя я предоставляю сторожевому псору записи 1s. Надеюсь, кто-то может понять, что я делаю неправильно.Запись/доступ к устройству порта ввода-вывода watchdog register linux

#include <stdio.h> 
#include <unistd.h> 
#include <sys/io.h> 
#include <stdlib.h> 

#define BASEPORT 0x985 

int main() 
{ 
    /* Get access to the ports */ 
    if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);} 

    /* Set the data signals (D0-7) of the port to all high (1) */ 
    outb(1, BASEPORT); 

    /* Sleep for a while (100 ms) */ 
    usleep(100000); 

    /* Read from the status port (BASE+1) and display the result */ 
    printf("status: %d\n", inb(BASEPORT + 1)); 

    /* We don't need the ports anymore */ 
    if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);} 

    exit(0); 
} 
+0

Документ для 'ioperm' говорит: * Если turn_on отличен от нуля, вызывающий поток должен быть привилегированным (CAP_SYS_RAWIO). * Выполнено ли это условие? Кроме того, ваш вызов 'outb (1, BASEPORT)' просто устанавливает 'BASEPORT'' 0x01', а не «все высокие», как говорит ваш комментарий. Если вы хотите «все высоко», вам нужно «outb (0xFF, BASEPORT)». – lurker

+0

Вы правы, мне нужно было использовать 0xFF, а не 1. Исправлена ​​проблема. СПАСИБО!!! – user2494298

+0

Прохладный. Я разместил его как «ответ». – lurker

ответ

1

Док для ioperm говорит, Если turn_on не равен нулю, то вызывающий поток должен быть привилегированным (CAP_SYS_RAWIO). Вы должны убедиться, что это условие выполнено. Кроме того, ваш звонок outb(1, BASEPORT) просто устанавливает BASEPORT в 0x01, а не «все высокие», как говорится в вашем комментарии. Если вы хотите «все высоко», вам нужно outb(0xFF, BASEPORT).

1

Если вы думаете о использовании watchdog timer, вы можете сделать это путем нормального по writing a driver for that bit of hardware, который представляет интерфейс /dev/watchdog, а затем с помощью watchdog daemon, который поддерживает несколько общесистемных тесты, а также просто держа собака кормилась.

Примеров существующего кода сторожевого пса водителей можно найти здесь:

http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/watchdog/

Информацию о работе сторожевого таймера демона (и моей собственной экспериментальной версии) можно найти здесь:

http://www.sat.dundee.ac.uk/~psc/watchdog/Linux-Watchdog.html

2

Попробуйте с iopl (3) перед вашими командами outb(). iopl() не очень «приятная» и переносимая команда, но я успешно использовал ее для аналогичной проблемы сторожевого таймера.