SL-C7x0用リセット

ダメ元でcpu_reset()でリセットしてくれないかなーと試してみたけど(やっぱり)ダメだったんでWatchdog Resetをとりあえずテキトーに実装してみるテスト。ってもFreeBSDpxa_timer.cから拝借してきただけだけど。

とりあえず自分のSL-C700では2回ほど動いたのを確認したけど、細かく確認する前にまたSDカードが飛んで起動不能になってしまい面倒くさくなったので丸投げ。そもそもC700は裏蓋スイッチでリセットできるので俺得ですらない正に誰得なパッチだしなー(ぉぃ

Index: src/sys/arch/arm/sa11x0/sa11x0_ost.c
==================================================================
--- src/sys/arch/arm/sa11x0/sa11x0_ost.c
+++ src/sys/arch/arm/sa11x0/sa11x0_ost.c
@@ -56,6 +56,7 @@
 #include <arm/sa11x0/sa11x0_reg.h> 
 #include <arm/sa11x0/sa11x0_var.h>
 #include <arm/sa11x0/sa11x0_ostreg.h>
+#include <arm/sa11x0/sa11x0_ostvar.h>
 
 static int	saost_match(device_t, cfdata_t, void *);
 static void	saost_attach(device_t, device_t, void *);
@@ -327,3 +328,23 @@
 		otick = xtick;
 	}
 }
+
+int saost_reset(void)
+{
+	struct saost_softc *sc = saost_sc;
+	uint32_t counter;
+	u_int saved_ints;
+
+	saved_ints = disable_interrupts(I32_bit|F32_bit);
+
+	counter = bus_space_read_4(sc->sc_iot, sc->sc_ioh, SAOST_CR);
+	counter += TIMER_FREQUENCY;
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, SAOST_MR3, counter);
+	bus_space_write_4(sc->sc_iot, sc->sc_ioh, SAOST_WR, 1);
+
+	delay(1 * 1000 * 1000);
+
+	/* not reached */
+	restore_interrupts(saved_ints);
+	return 0;
+}

ADDED    src/sys/arch/arm/sa11x0/sa11x0_ostvar.h
Index: src/sys/arch/arm/sa11x0/sa11x0_ostvar.h
==================================================================
--- src/sys/arch/arm/sa11x0/sa11x0_ostvar.h
+++ src/sys/arch/arm/sa11x0/sa11x0_ostvar.h
@@ -0,0 +1,6 @@
+#ifndef _SA11X0_OSTVAR_H
+#define _SA11X0_OSTVAR_H
+
+int saost_reset(void);
+
+#endif /* _SA11X0_OSTVAR_H */

Index: src/sys/arch/zaurus/zaurus/machdep.c
==================================================================
--- src/sys/arch/zaurus/zaurus/machdep.c
+++ src/sys/arch/zaurus/zaurus/machdep.c
@@ -162,6 +162,8 @@
 #include <arm/xscale/pxa2x0reg.h>
 #include <arm/xscale/pxa2x0var.h>
 #include <arm/xscale/pxa2x0_gpio.h>
+
+#include <arm/sa11x0/sa11x0_ostvar.h>
 
 #include <arch/zaurus/zaurus/zaurus_reg.h>
 #include <arch/zaurus/zaurus/zaurus_var.h>
@@ -466,8 +468,7 @@
 		/* External reset circuit presumably asserts nRESET_GPIO. */
 		pxa2x0_gpio_set_function(89, GPIO_OUT | GPIO_SET);
 	} else if (ZAURUS_ISC860) {
-		/* XXX not yet */
-		printf("zaurus_restart() for C7x0 is not implemented yet.\n");
+		saost_reset();
 	}
 	delay(1 * 1000* 1000);	/* wait 1s */
 }