mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 11:44:01 +08:00
136 lines
3.7 KiB
Plaintext
136 lines
3.7 KiB
Plaintext
|
Berkshire Products PC Watchdog Card
|
||
|
Support for ISA Cards Revision A and C
|
||
|
Documentation and Driver by Ken Hollis <kenji@bitgate.com>
|
||
|
|
||
|
The PC Watchdog is a card that offers the same type of functionality that
|
||
|
the WDT card does, only it doesn't require an IRQ to run. Furthermore,
|
||
|
the Revision C card allows you to monitor any IO Port to automatically
|
||
|
trigger the card into being reset. This way you can make the card
|
||
|
monitor hard drive status, or anything else you need.
|
||
|
|
||
|
The Watchdog Driver has one basic role: to talk to the card and send
|
||
|
signals to it so it doesn't reset your computer ... at least during
|
||
|
normal operation.
|
||
|
|
||
|
The Watchdog Driver will automatically find your watchdog card, and will
|
||
|
attach a running driver for use with that card. After the watchdog
|
||
|
drivers have initialized, you can then talk to the card using the PC
|
||
|
Watchdog program, available from http://ftp.bitgate.com/pcwd/.
|
||
|
|
||
|
I suggest putting a "watchdog -d" before the beginning of an fsck, and
|
||
|
a "watchdog -e -t 1" immediately after the end of an fsck. (Remember
|
||
|
to run the program with an "&" to run it in the background!)
|
||
|
|
||
|
If you want to write a program to be compatible with the PC Watchdog
|
||
|
driver, simply do the following:
|
||
|
|
||
|
-- Snippet of code --
|
||
|
/*
|
||
|
* Watchdog Driver Test Program
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <unistd.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <sys/ioctl.h>
|
||
|
#include <linux/types.h>
|
||
|
#include <linux/watchdog.h>
|
||
|
|
||
|
int fd;
|
||
|
|
||
|
/*
|
||
|
* This function simply sends an IOCTL to the driver, which in turn ticks
|
||
|
* the PC Watchdog card to reset its internal timer so it doesn't trigger
|
||
|
* a computer reset.
|
||
|
*/
|
||
|
void keep_alive(void)
|
||
|
{
|
||
|
int dummy;
|
||
|
|
||
|
ioctl(fd, WDIOC_KEEPALIVE, &dummy);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* The main program. Run the program with "-d" to disable the card,
|
||
|
* or "-e" to enable the card.
|
||
|
*/
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
fd = open("/dev/watchdog", O_WRONLY);
|
||
|
|
||
|
if (fd == -1) {
|
||
|
fprintf(stderr, "Watchdog device not enabled.\n");
|
||
|
fflush(stderr);
|
||
|
exit(-1);
|
||
|
}
|
||
|
|
||
|
if (argc > 1) {
|
||
|
if (!strncasecmp(argv[1], "-d", 2)) {
|
||
|
ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD);
|
||
|
fprintf(stderr, "Watchdog card disabled.\n");
|
||
|
fflush(stderr);
|
||
|
exit(0);
|
||
|
} else if (!strncasecmp(argv[1], "-e", 2)) {
|
||
|
ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
|
||
|
fprintf(stderr, "Watchdog card enabled.\n");
|
||
|
fflush(stderr);
|
||
|
exit(0);
|
||
|
} else {
|
||
|
fprintf(stderr, "-d to disable, -e to enable.\n");
|
||
|
fprintf(stderr, "run by itself to tick the card.\n");
|
||
|
fflush(stderr);
|
||
|
exit(0);
|
||
|
}
|
||
|
} else {
|
||
|
fprintf(stderr, "Watchdog Ticking Away!\n");
|
||
|
fflush(stderr);
|
||
|
}
|
||
|
|
||
|
while(1) {
|
||
|
keep_alive();
|
||
|
sleep(1);
|
||
|
}
|
||
|
}
|
||
|
-- End snippet --
|
||
|
|
||
|
Other IOCTL functions include:
|
||
|
|
||
|
WDIOC_GETSUPPORT
|
||
|
This returns the support of the card itself. This
|
||
|
returns in structure "PCWDS" which returns:
|
||
|
options = WDIOS_TEMPPANIC
|
||
|
(This card supports temperature)
|
||
|
firmware_version = xxxx
|
||
|
(Firmware version of the card)
|
||
|
|
||
|
WDIOC_GETSTATUS
|
||
|
This returns the status of the card, with the bits of
|
||
|
WDIOF_* bitwise-anded into the value. (The comments
|
||
|
are in linux/pcwd.h)
|
||
|
|
||
|
WDIOC_GETBOOTSTATUS
|
||
|
This returns the status of the card that was reported
|
||
|
at bootup.
|
||
|
|
||
|
WDIOC_GETTEMP
|
||
|
This returns the temperature of the card. (You can also
|
||
|
read /dev/watchdog, which gives a temperature update
|
||
|
every second.)
|
||
|
|
||
|
WDIOC_SETOPTIONS
|
||
|
This lets you set the options of the card. You can either
|
||
|
enable or disable the card this way.
|
||
|
|
||
|
WDIOC_KEEPALIVE
|
||
|
This pings the card to tell it not to reset your computer.
|
||
|
|
||
|
And that's all she wrote!
|
||
|
|
||
|
-- Ken Hollis
|
||
|
(kenji@bitgate.com)
|
||
|
|
||
|
(This documentation may be out of date. Check
|
||
|
http://ftp.bitgate.com/pcwd/ for the absolute latest additions.)
|