summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k/efi68k/startup/efi68k_wd.c
blob: 0ba0ec14992575a6f7c9ae864ce676612a0f5105 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
 *-------------------------------------------------------------------
 *
 * This file contains the subroutines necessary to initalize
 * and maintain the MAX791 based watchdog timer used on efi68k
 *
 * This file has been created by John S. Gwynne for the efi68k
 * project.
 *
 *  The license and distribution terms for this file may in
 *  the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *------------------------------------------------------------------
 *
 *  $Id$
 */
#include <bsp.h>

void wd_interrupt(void) {
  /* toggle WDI of the MAX791. A more sophisticated routine
     can be inserted into the exception table after booting. */

  /* 3 changes guaranty a pulse independent of initial state */
  *MCR |= OUT1;
  *MCR &= ~OUT1;
  *MCR |= OUT1;
}

/* _catchWDint is the interrupt front-end */
extern void _catchWDint();
asm("   .text\n\
        .align 2\n\
        .globl _catchWDint\n\
_catchWDint:\n\
        lea    %sp@(4),%sp                /* pop return address */\n\
        moveml %d0-%d7/%a0-%a6,%sp@-       /* save registers */\n\
        jbsr    wd_interrupt\n\
        moveml  %sp@+,%d0-%d7/%a0-%a6			        \n\
        rte\n\
    ");

void watch_dog_init(void) {
  set_vector(_catchWDint, WD_ISR_LEVEL+24, 0);
}