| 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.) |