|
@@ -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);
|
|
|
+}
|