diff options
Diffstat (limited to 'board/eNET/eNET.c')
| -rw-r--r-- | board/eNET/eNET.c | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/board/eNET/eNET.c b/board/eNET/eNET.c index ad71f7e5d..7f0e2577f 100644 --- a/board/eNET/eNET.c +++ b/board/eNET/eNET.c @@ -45,6 +45,9 @@ DECLARE_GLOBAL_DATA_PTR;  unsigned long monitor_flash_len = CONFIG_SYS_MONITOR_LEN; +static void enet_timer_isr(void); +static void enet_toggle_run_led(void); +  void init_sc520_enet (void)  {  	/* Set CPU Speed to 100MHz */ @@ -160,6 +163,10 @@ int last_stage_init(void)  	major = minor = 0; +	outb(0x00, LED_LATCH_ADDRESS); + +	register_timer_isr (enet_timer_isr); +  	printf("Serck Controls eNET\n");  	return 0; @@ -218,3 +225,41 @@ void setup_pcat_compatibility()  	writeb(SC520_IRQ_DISABLED, &sc520_mmcr->wpvmap);  	writeb(SC520_IRQ_DISABLED, &sc520_mmcr->icemap);  } + +void enet_timer_isr(void) +{ +	static long enet_ticks = 0; + +	enet_ticks++; + +	/* Toggle Watchdog every 100ms */ +	if ((enet_ticks % 100) == 0) +		hw_watchdog_reset(); + +	/* Toggle Run LED every 500ms */ +	if ((enet_ticks % 500) == 0) +		enet_toggle_run_led(); +} + +void hw_watchdog_reset(void) +{ +	/* Watchdog Reset must be atomic */ +	long flag = disable_interrupts(); + +	if (sc520_mmcr->piodata15_0 & WATCHDOG_PIO_BIT) +		sc520_mmcr->pioclr15_0 = WATCHDOG_PIO_BIT; +	else +		sc520_mmcr->pioset15_0 = WATCHDOG_PIO_BIT; + +	if (flag) +		enable_interrupts(); +} + +void enet_toggle_run_led(void) +{ +	unsigned char leds_state= inb(LED_LATCH_ADDRESS); +	if (leds_state & LED_RUN_BITMASK) +		outb(leds_state &~ LED_RUN_BITMASK, LED_LATCH_ADDRESS); +	else +		outb(leds_state | LED_RUN_BITMASK, LED_LATCH_ADDRESS); +}  |