日期:2014-05-16  浏览次数:20566 次

linux-2.6.29 s3c6410 reboot实现
S3C6410 BSP驱动默认并未实现reboot机制,reboot的底层驱动实现接口为arch_reset, 该函数在system.h中实现。

实现方式可参考UBOOT中的实现:
.globl reset_cpu
reset_cpu:
        ldr     r1, =ELFIN_CLOCK_POWER_BASE
        ldr     r2, [r1, #SYS_ID_OFFSET]
        ldr     r3, =0xffff
        and     r2, r3, r2, lsr #12
        str     r2, [r1, #SW_RST_OFFSET]
_loop_forever:
        b       _loop_forever


也可以通过看门狗来复位:
static inline void arch_wdt_reset(void)
{
	struct clk *wdtclk;

	printk("arch_reset: attempting watchdog reset\n");

	__raw_writel(0, S3C2410_WTCON);	  /* disable watchdog, to be safe  */

	wdtclk = clk_get(NULL, "watchdog");
	if (!IS_ERR(wdtclk)) {
		clk_enable(wdtclk);
	} else
		printk(KERN_WARNING "%s: warning: cannot get watchdog clock\n", __func__);

	/* put initial values into count and data */
	__raw_writel(0x80, S3C2410_WTCNT);
	__raw_writel(0x80, S3C2410_WTDAT);

	/* set the watchdog to go and reset... */
	__raw_writel(S3C2410_WTCON_ENABLE|S3C2410_WTCON_DIV16|S3C2410_WTCON_RSTEN |
		     S3C2410_WTCON_PRESCALE(0x20), S3C2410_WTCON);

	/* wait for reset to assert... */
	mdelay(500);

	printk(KERN_ERR "Watchdog reset failed to assert reset\n");

	/* delay to allow the serial port to show the message */
	mdelay(50);