@@ -20,7 +20,7 @@ typedef void (*ambiq_wdt_cfg_func_t)(void);
20
20
struct wdt_ambiq_config {
21
21
uint32_t base ;
22
22
uint32_t irq_num ;
23
- uint8_t clk_freq ;
23
+ uint32_t clk_freq ;
24
24
ambiq_wdt_cfg_func_t cfg_func ;
25
25
};
26
26
@@ -30,6 +30,13 @@ struct wdt_ambiq_data {
30
30
bool reset ;
31
31
};
32
32
33
+ uint32_t wdt_ambiq_clk_select [] =
34
+ #if defined(CONFIG_SOC_SERIES_APOLLO3X ) || defined(CONFIG_SOC_SERIES_APOLLO4X )
35
+ {128 , 16 , 1 };
36
+ #else
37
+ {128 , 16 , 1 , 32768 , 16384 };
38
+ #endif
39
+
33
40
static void wdt_ambiq_isr (void * arg )
34
41
{
35
42
const struct device * dev = (const struct device * )arg ;
@@ -39,7 +46,7 @@ static void wdt_ambiq_isr(void *arg)
39
46
am_hal_wdt_int_clear ();
40
47
#else
41
48
uint32_t status ;
42
- am_hal_wdt_interrupt_status_get (AM_HAL_WDT_MCU , & status , false );
49
+ am_hal_wdt_interrupt_status_get (AM_HAL_WDT_MCU , & status , true );
43
50
am_hal_wdt_interrupt_clear (AM_HAL_WDT_MCU , status );
44
51
#endif
45
52
@@ -79,7 +86,15 @@ static int wdt_ambiq_setup(const struct device *dev, uint8_t options)
79
86
cfg .eClockSource = AM_HAL_WDT_16HZ ;
80
87
} else if (dev_cfg -> clk_freq == 1 ) {
81
88
cfg .eClockSource = AM_HAL_WDT_1HZ ;
89
+ #if defined(CONFIG_SOC_SERIES_APOLLO5X )
90
+ } else if (dev_cfg -> clk_freq == 32768 ) {
91
+ cfg .eClockSource = AM_HAL_WDT_XTAL_HS ;
92
+ } else if (dev_cfg -> clk_freq == 16384 ) {
93
+ cfg .eClockSource = AM_HAL_WDT_XTAL_HS_DIV2 ;
82
94
}
95
+ #else
96
+ }
97
+ #endif
83
98
84
99
cfg .bInterruptEnable = true;
85
100
cfg .ui32InterruptValue = data -> timeout ;
@@ -116,7 +131,7 @@ static int wdt_ambiq_install_timeout(const struct device *dev, const struct wdt_
116
131
return - EINVAL ;
117
132
}
118
133
119
- data -> timeout = cfg -> window .max / 1000 * dev_cfg -> clk_freq ;
134
+ data -> timeout = cfg -> window .max * dev_cfg -> clk_freq / 1000 ;
120
135
data -> callback = cfg -> callback ;
121
136
122
137
switch (cfg -> flags ) {
@@ -145,17 +160,22 @@ static int wdt_ambiq_feed(const struct device *dev, int channel_id)
145
160
#else
146
161
am_hal_wdt_restart (AM_HAL_WDT_MCU );
147
162
#endif
148
- LOG_DBG ("Fed the watchdog" );
149
163
150
164
return 0 ;
151
165
}
152
166
153
167
static int wdt_ambiq_init (const struct device * dev )
154
168
{
155
169
const struct wdt_ambiq_config * dev_cfg = dev -> config ;
156
-
157
- if (dev_cfg -> clk_freq != 128 && dev_cfg -> clk_freq != 16 && dev_cfg -> clk_freq != 1 ) {
158
- return - ENOTSUP ;
170
+ uint8_t clk_index = sizeof (wdt_ambiq_clk_select ) / sizeof (uint32_t );
171
+
172
+ for (uint8_t i = 0 ; i < clk_index ; i ++ ) {
173
+ if (dev_cfg -> clk_freq == wdt_ambiq_clk_select [i ]) {
174
+ break ;
175
+ }
176
+ if (i == clk_index - 1 ) {
177
+ return - ENOTSUP ;
178
+ }
159
179
}
160
180
161
181
NVIC_ClearPendingIRQ (dev_cfg -> irq_num );
0 commit comments