Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | Berkshire Products PC Watchdog Card |
| 2 | Support for ISA Cards Revision A and C |
| 3 | Documentation and Driver by Ken Hollis <kenji@bitgate.com> |
| 4 | |
| 5 | The PC Watchdog is a card that offers the same type of functionality that |
| 6 | the WDT card does, only it doesn't require an IRQ to run. Furthermore, |
| 7 | the Revision C card allows you to monitor any IO Port to automatically |
| 8 | trigger the card into being reset. This way you can make the card |
| 9 | monitor hard drive status, or anything else you need. |
| 10 | |
| 11 | The Watchdog Driver has one basic role: to talk to the card and send |
| 12 | signals to it so it doesn't reset your computer ... at least during |
| 13 | normal operation. |
| 14 | |
| 15 | The Watchdog Driver will automatically find your watchdog card, and will |
| 16 | attach a running driver for use with that card. After the watchdog |
| 17 | drivers have initialized, you can then talk to the card using the PC |
| 18 | Watchdog program, available from http://ftp.bitgate.com/pcwd/. |
| 19 | |
| 20 | I suggest putting a "watchdog -d" before the beginning of an fsck, and |
| 21 | a "watchdog -e -t 1" immediately after the end of an fsck. (Remember |
| 22 | to run the program with an "&" to run it in the background!) |
| 23 | |
| 24 | If you want to write a program to be compatible with the PC Watchdog |
| 25 | driver, simply do the following: |
| 26 | |
| 27 | -- Snippet of code -- |
| 28 | /* |
| 29 | * Watchdog Driver Test Program |
| 30 | */ |
| 31 | |
| 32 | #include <stdio.h> |
| 33 | #include <stdlib.h> |
| 34 | #include <string.h> |
| 35 | #include <unistd.h> |
| 36 | #include <fcntl.h> |
| 37 | #include <sys/ioctl.h> |
| 38 | #include <linux/types.h> |
| 39 | #include <linux/watchdog.h> |
| 40 | |
| 41 | int fd; |
| 42 | |
| 43 | /* |
| 44 | * This function simply sends an IOCTL to the driver, which in turn ticks |
| 45 | * the PC Watchdog card to reset its internal timer so it doesn't trigger |
| 46 | * a computer reset. |
| 47 | */ |
| 48 | void keep_alive(void) |
| 49 | { |
| 50 | int dummy; |
| 51 | |
| 52 | ioctl(fd, WDIOC_KEEPALIVE, &dummy); |
| 53 | } |
| 54 | |
| 55 | /* |
| 56 | * The main program. Run the program with "-d" to disable the card, |
| 57 | * or "-e" to enable the card. |
| 58 | */ |
| 59 | int main(int argc, char *argv[]) |
| 60 | { |
| 61 | fd = open("/dev/watchdog", O_WRONLY); |
| 62 | |
| 63 | if (fd == -1) { |
| 64 | fprintf(stderr, "Watchdog device not enabled.\n"); |
| 65 | fflush(stderr); |
| 66 | exit(-1); |
| 67 | } |
| 68 | |
| 69 | if (argc > 1) { |
| 70 | if (!strncasecmp(argv[1], "-d", 2)) { |
| 71 | ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD); |
| 72 | fprintf(stderr, "Watchdog card disabled.\n"); |
| 73 | fflush(stderr); |
| 74 | exit(0); |
| 75 | } else if (!strncasecmp(argv[1], "-e", 2)) { |
| 76 | ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD); |
| 77 | fprintf(stderr, "Watchdog card enabled.\n"); |
| 78 | fflush(stderr); |
| 79 | exit(0); |
| 80 | } else { |
| 81 | fprintf(stderr, "-d to disable, -e to enable.\n"); |
| 82 | fprintf(stderr, "run by itself to tick the card.\n"); |
| 83 | fflush(stderr); |
| 84 | exit(0); |
| 85 | } |
| 86 | } else { |
| 87 | fprintf(stderr, "Watchdog Ticking Away!\n"); |
| 88 | fflush(stderr); |
| 89 | } |
| 90 | |
| 91 | while(1) { |
| 92 | keep_alive(); |
| 93 | sleep(1); |
| 94 | } |
| 95 | } |
| 96 | -- End snippet -- |
| 97 | |
| 98 | Other IOCTL functions include: |
| 99 | |
| 100 | WDIOC_GETSUPPORT |
| 101 | This returns the support of the card itself. This |
| 102 | returns in structure "PCWDS" which returns: |
| 103 | options = WDIOS_TEMPPANIC |
| 104 | (This card supports temperature) |
| 105 | firmware_version = xxxx |
| 106 | (Firmware version of the card) |
| 107 | |
| 108 | WDIOC_GETSTATUS |
| 109 | This returns the status of the card, with the bits of |
| 110 | WDIOF_* bitwise-anded into the value. (The comments |
| 111 | are in linux/pcwd.h) |
| 112 | |
| 113 | WDIOC_GETBOOTSTATUS |
| 114 | This returns the status of the card that was reported |
| 115 | at bootup. |
| 116 | |
| 117 | WDIOC_GETTEMP |
| 118 | This returns the temperature of the card. (You can also |
| 119 | read /dev/watchdog, which gives a temperature update |
| 120 | every second.) |
| 121 | |
| 122 | WDIOC_SETOPTIONS |
| 123 | This lets you set the options of the card. You can either |
| 124 | enable or disable the card this way. |
| 125 | |
| 126 | WDIOC_KEEPALIVE |
| 127 | This pings the card to tell it not to reset your computer. |
| 128 | |
| 129 | And that's all she wrote! |
| 130 | |
| 131 | -- Ken Hollis |
| 132 | (kenji@bitgate.com) |
| 133 | |
| 134 | (This documentation may be out of date. Check |
| 135 | http://ftp.bitgate.com/pcwd/ for the absolute latest additions.) |