Initial cut of the open ath9k htc firmware.
[open-ath9k-htc-firmware.git] / target_firmware / magpie_fw_dev / build / magpie_1_1 / sboot / cmnos / wdt / src / cmnos_wdt.c
1
2 #include "sys_cfg.h"
3
4 #include "athos_api.h"
5
6 #if SYSTEM_MODULE_WDT
7
8
9 typedef struct {
10     BOOLEAN             state;
11     T_WDT_ACTION_TYPE   action;
12     uint32_t            timeout;
13 }T_WDT_CTRL;
14
15
16 LOCAL T_WDT_CTRL wdt_ctrl;
17
18 /*!- Initialize watchdog timer
19  *
20  */
21 LOCAL T_BOOT_TYPE
22 cmnos_wdt_last_boot(void)
23 {  
24 #if 0
25     if (HAL_WORD_REG_READ(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR) & 0x80000000 )
26         return ENUM_WDT_BOOT;
27     else
28         return ENUM_COLD_BOOT;
29 #endif
30
31 #if defined(PROJECT_MAGPIE)
32     if ( *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == WDT_MAGIC_PATTERN )
33         return ENUM_WDT_BOOT;
34     else if ( *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == SUS_MAGIC_PATTERN )
35         return ENUM_SUSP_BOOT;
36     else
37         return ENUM_COLD_BOOT;
38 #elif defined(PROJECT_K2)
39     //if (HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == WDT_MAGIC_PATTERN || HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == SUS_MAGIC_PATTERN)
40     if ( HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == WDT_MAGIC_PATTERN )
41         return ENUM_WDT_BOOT;
42     else if ( HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == SUS_MAGIC_PATTERN )
43         return ENUM_SUSP_BOOT;
44     else
45         return ENUM_COLD_BOOT;
46 #endif /* #if defined(PROJECT_MAGPIE) */
47 }
48
49
50 /*!- trigger a wdt reset.
51  *
52  */
53 LOCAL void
54 cmnos_wdt_reset()
55 {
56     HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, WDT_ACTION_RESET);
57     HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, 0x100); 
58     while(1);   // never return;   
59 }
60
61
62 /*!- setup the timeout value.
63  *
64  */
65 LOCAL void
66 cmnos_wdt_set(T_WDT_CMD wdt_cmd)
67 {
68     switch(wdt_cmd.cmd)
69     {
70         case WDT_TIMEOUT:
71             if( wdt_cmd.timeout>0 ) //dummy check
72             {
73                 wdt_ctrl.timeout = wdt_cmd.timeout;
74                 HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, wdt_ctrl.timeout); 
75             }
76             break;
77
78         case WDT_ACTION:
79             if( wdt_cmd.action < WDT_ACTION_UNKNOWN )
80             {
81                 wdt_ctrl.action = wdt_cmd.action;
82                 HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, wdt_ctrl.action);
83             }
84     }
85 }
86
87
88 /*!- Enable watchdog timer.
89  *
90  */
91 LOCAL void
92 cmnos_wdt_enable()
93 {
94     T_WDT_CMD wdt_cmd;
95     wdt_ctrl.state = TRUE;
96
97     wdt_cmd.cmd = WDT_ACTION;
98     wdt_cmd.action = WDT_ACTION_RESET;
99     cmnos_wdt_set(wdt_cmd);
100     //HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, HAL_WORD_REG_READ(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR)|(BIT0|BIT1));
101 }
102
103 /*!- Disable watchdog timer.
104  *
105  */
106 LOCAL void
107 cmnos_wdt_disable()
108 {
109     T_WDT_CMD wdt_cmd;
110
111     wdt_ctrl.state = FALSE;
112
113     wdt_cmd.cmd = WDT_ACTION;
114     wdt_cmd.action = WDT_ACTION_NO;
115     cmnos_wdt_set(wdt_cmd);
116 //    HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR, (HAL_WORD_REG_READ(MAGPIE_REG_RST_WDT_TIMER_CTRL_ADDR)&(~(BIT0|BIT1))));
117 //    MAGPIE_REG_RST_WDT_TIMER_CTRL &= ~(BIT0|BIT1);
118 }
119
120
121 /*!- Initialize watchdog timer
122  *
123  */
124 LOCAL void
125 cmnos_wdt_init(void)
126 {
127     T_WDT_CMD wdt_cmd;
128     
129     //wdt_init_done = TRUE;
130     wdt_ctrl.state = FALSE;
131     wdt_ctrl.action = WDT_ACTION_NO;
132     wdt_ctrl.timeout = WDT_DEFAULT_TIMEOUT_VALUE;
133
134     // should be init outside but just kick it ticking at here for workaround
135     cmnos_wdt_enable();
136
137     wdt_cmd.cmd = WDT_TIMEOUT;
138     wdt_cmd.timeout= wdt_ctrl.timeout;
139     cmnos_wdt_set(wdt_cmd);
140 }
141
142
143 /*!- update the watchdog timer timerout value.
144  *
145  */
146 LOCAL void
147 cmnos_wdt_task()
148 {
149     // if wdt is not enable, just skip the update
150     if( wdt_ctrl.state )
151     {
152         HAL_WORD_REG_WRITE(MAGPIE_REG_RST_WDT_TIMER_ADDR, wdt_ctrl.timeout); 
153     }
154     
155 }
156
157 void
158 cmnos_wdt_module_install(struct wdt_api *tbl)
159 {
160     tbl->_wdt_init          = cmnos_wdt_init;
161     tbl->_wdt_enable        = cmnos_wdt_enable;
162     tbl->_wdt_disable       = cmnos_wdt_disable;
163     tbl->_wdt_set           = cmnos_wdt_set;
164     tbl->_wdt_task          = cmnos_wdt_task;
165     tbl->_wdt_reset         = cmnos_wdt_reset;
166     tbl->_wdt_last_boot     = cmnos_wdt_last_boot;
167 }
168
169 #endif /* SYSTEM_MODULE_WDT */
170