Cubieboard2裸機開發之(五)看門狗操做

前言linux

       說到看門狗,應該不會陌生,看門狗說白了就是一個定時器,可是它有一個很是重要的功能就是復位系統。在A20裏,看門狗的操做很是簡單,只有兩個寄存器,不須要操做時鐘相關的東西,系統起來後能夠直接使用,它的最大定時時間爲16秒。函數

 

1、目的工具

       學習使用A20的看門狗,實現軟件復位系統。oop

 

2、源代碼說明學習

     start.S文件。首先禁止CPU的IRQ和FIQ,設置爲管理模式,須要注意的是,這裏設置異常向量表的起始地址爲start.S文件裏的第一指令的地址,學過ARM的都知道,ARM的異常向量表能夠設置在低地址(0地址),也能夠設置在高地址(0xffff0000地址,一般在使能了MMU後使用),可是目前Cortex-A7體系結構已經能夠指定異常向量表的地址,這樣就省去了搬移的操做。而後設置堆棧指針,最後調用C語言的main函數。spa

 1 /*
 2  * (C) Copyright 2014 conan liang <lknlfy@163.com>
 3  * 
 4  */
 5 
 6 
 7 /* global entry point */
 8 .global _start
 9 _start:
10     b    reset
11     
12 
13 reset:
14     /* disable IRQ & FIQ, set the cpu to SVC32 mode */
15     mrs r0, cpsr
16     and r1, r0, #0x1f
17     teq r1, #0x1a
18     bicne r0, r0, #0x1f
19     orrne r0, r0, #0x13
20     orr r0, r0, #0xc0
21     msr cpsr, r0
22 
23     /* set exception vector table */
24     ldr r0, =_start
25     mcr p15, 0, r0, c12, c0, 0
26 
27     /* setup stack, so we can call C code */
28     ldr sp, =(1024 * 10)
29     
30     /* jump to main function */
31     bl main
32 loop:
33     b loop

      main.c文件。首先初始化看門狗,設置它在3秒後執行系統復位操做(若是參數值小於0則表示關閉看門狗),而後初始化LED所在IO管腳,設置爲輸出功能,而且輸出低電平,即一開始兩個LED是熄滅的,接着是一段延時,目的是能夠看到兩個LED閃爍,若是觀察現象時看到兩個LED閃爍,那也說明了看門狗正常工做了。指針

 1 #include "io.h"
 2 #include "watchdog.h"
 3 
 4 
 5 #define SUNXI_PIO_BASE   (0x01C20800)
 6 #define PH_CFG2          (SUNXI_PIO_BASE + 0x104)
 7 #define PH_DAT           (SUNXI_PIO_BASE + 0x10C)
 8 
 9 
10 /* set two LEDs on */
11 static void set_led_on(void)
12 {
13     unsigned int tmp;
14     
15     /* PH20 and PH21 output 1 */
16     tmp = readl(PH_DAT);
17     tmp |= (0x1 << 20);
18     tmp |= (0x1 << 21);
19     writel(tmp, PH_DAT);
20 }
21 
22 /* init two PIOs */
23 static void led_init(void)
24 {
25     unsigned int tmp;
26     
27     /* configure PH20 and PH21 output */
28     tmp = readl(PH_CFG2);
29     tmp &= ~(0x7 << 16);
30     tmp &= ~(0x7 << 20);
31     tmp |= (0x1 << 16);
32     tmp |= (0x1 << 20);
33     writel(tmp, PH_CFG2);
34     /* PH20 and PH21 output 0 */
35     tmp = readl(PH_DAT);
36     tmp &= ~(0x1 << 20);
37     tmp &= ~(0x1 << 21);
38     writel(tmp, PH_DAT);
39 }
40 
41 
42 int main(void)
43 {
44     int i;
45 
46     /* let watchdog reset the system after 3 second */
47     sunxi_watchdog_init(3);
48     /* init LEDs */
49     led_init();
50     /* some delay, so we can see two LEDs off a while */
51     for (i = 0; i < 50000; i++);
52     /* set two LEDs on */
53     set_led_on();
54     while (1);
55     
56     return 0;
57 }

      watchdog.c文件。看門狗的驅動程序,很是簡單。rest

 1 #include "watchdog.h"
 2 #include "io.h"
 3 
 4 /* watchdog interval value */
 5 static unsigned int watchdog_intv_val [] = {
 6     0b0000, // 0.5s
 7     0b0001, // 1s
 8     0b0010, // 2s
 9     0b0011, // 3s
10     0b0100, // 4s
11     0b0101, // 5s
12     0b0110, // 6s
13     0b0111, // 8s
14     0b0111, // 8s
15     0b1000, // 10s
16     0b1000, // 10s
17     0b1001, // 12s
18     0b1001, // 12s
19     0b1010, // 14s
20     0b1010, // 14s
21     0b1011, // 16s
22     0b1011  // 16s
23 };
24 
25 /* reg bits */
26 #define WDOG_OFF     (-1)
27 #define WDOG_RST_EN  (1) 
28 #define WDOG_EN      (0)
29 #define WDOG_RSTART  (0)
30 
31 static void sunxi_watchdog_set(int time)
32 {
33     if (time >= 0) {
34         /* should not larger than 16 seconds */
35         if(time > 16)
36             time = 16;
37         writel((watchdog_intv_val[time] << 3) | (1 << WDOG_RST_EN) | (1 << WDOG_EN), SUNXI_WDOG_MODE_REG);
38     } else {
39         /* disable watchdog */
40         writel(0, SUNXI_WDOG_MODE_REG);
41     }
42     /* restart watchdog */
43     writel(1 << WDOG_RSTART, SUNXI_WDOG_CTRL_REG);
44 }
45 
46 int sunxi_watchdog_init(int val)
47 {
48     sunxi_watchdog_set(val);
49     
50     return 0;
51 }

 

3、驗證code

       使用arm-linux-gnueabihf工具編譯後生成watchdog.b文件,再使用mksunxiboot工具在watchdog.b文件前面加上一個頭部,最終生成watchdog.bin文件,使用如下命令將watchdog.bin文件燒寫到TF中:blog

#sudo dd if=./watchdog.bin of=/dev/sdb bs=1024 seek=8

     將TF卡插入Cubieboard2,上電便可看到兩個LED出現短時的週期閃爍,效果很差用圖片展現,所以就不上圖了。

相關文章
相關標籤/搜索