From 97b390e7aa3e0e5141470fb30e8c75768da8492d Mon Sep 17 00:00:00 2001 From: Furkan Akkiz Date: Fri, 24 Nov 2023 13:53:17 +0300 Subject: [PATCH 1/3] Add clock selection feature to WDT Add clock selection feature of revB WDT to MAX32655, MAX32662, MAX32670, MAX32672, MAX32675, MAX32680, MAX32690, MAX78000 and MAX78002. Signed-off-by: Furkan Akkiz --- .../PeriphDrivers/Include/MAX32655/wdt.h | 17 +++++++ .../PeriphDrivers/Include/MAX32662/wdt.h | 20 ++++++++ .../PeriphDrivers/Include/MAX32670/wdt.h | 20 ++++++++ .../PeriphDrivers/Include/MAX32672/wdt.h | 20 ++++++++ .../PeriphDrivers/Include/MAX32675/wdt.h | 17 +++++++ .../PeriphDrivers/Include/MAX32680/wdt.h | 12 +++++ .../PeriphDrivers/Include/MAX32690/wdt.h | 17 +++++++ .../PeriphDrivers/Include/MAX78000/wdt.h | 17 +++++++ .../PeriphDrivers/Include/MAX78002/wdt.h | 20 ++++++++ Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c | 35 ++++++++++++++ Libraries/PeriphDrivers/Source/WDT/wdt_me12.c | 27 +++++++++++ Libraries/PeriphDrivers/Source/WDT/wdt_me15.c | 46 +++++++++++++++++++ Libraries/PeriphDrivers/Source/WDT/wdt_me17.c | 44 ++++++++++++++++++ Libraries/PeriphDrivers/Source/WDT/wdt_me18.c | 33 +++++++++++++ Libraries/PeriphDrivers/Source/WDT/wdt_me21.c | 35 ++++++++++++++ Libraries/PeriphDrivers/Source/WDT/wdt_revb.c | 6 +++ Libraries/PeriphDrivers/Source/WDT/wdt_revb.h | 1 + 17 files changed, 387 insertions(+) diff --git a/Libraries/PeriphDrivers/Include/MAX32655/wdt.h b/Libraries/PeriphDrivers/Include/MAX32655/wdt.h index 1d7bb652e25..1cc3b6d2cc1 100644 --- a/Libraries/PeriphDrivers/Include/MAX32655/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX32655/wdt.h @@ -120,6 +120,16 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, + MXC_WDT_ERTCO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +244,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX32662/wdt.h b/Libraries/PeriphDrivers/Include/MAX32662/wdt.h index e0d292d78a5..0556ce8ae2a 100644 --- a/Libraries/PeriphDrivers/Include/MAX32662/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX32662/wdt.h @@ -120,6 +120,19 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IPO_CLK, + MXC_WDT_IBRO_CLK, + MXC_WDT_NANO_CLK, + MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, + MXC_WDT_ERFO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +247,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX32670/wdt.h b/Libraries/PeriphDrivers/Include/MAX32670/wdt.h index 1f061f8bd46..daf8393fa18 100644 --- a/Libraries/PeriphDrivers/Include/MAX32670/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX32670/wdt.h @@ -120,6 +120,19 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IPO_CLK, + MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, + MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, + MXC_WDT_ERFO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +247,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX32672/wdt.h b/Libraries/PeriphDrivers/Include/MAX32672/wdt.h index c3800a44f60..657ccea3181 100644 --- a/Libraries/PeriphDrivers/Include/MAX32672/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX32672/wdt.h @@ -120,6 +120,19 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IPO_CLK, + MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, + MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, + MXC_WDT_ERFO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +247,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX32675/wdt.h b/Libraries/PeriphDrivers/Include/MAX32675/wdt.h index 6d324c1b768..0d483ec86b8 100644 --- a/Libraries/PeriphDrivers/Include/MAX32675/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX32675/wdt.h @@ -124,6 +124,16 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IPO_CLK, + MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -238,6 +248,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX32680/wdt.h b/Libraries/PeriphDrivers/Include/MAX32680/wdt.h index 6d1f9ed2143..193b062c26d 100644 --- a/Libraries/PeriphDrivers/Include/MAX32680/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX32680/wdt.h @@ -120,6 +120,11 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { MXC_WDT_PCLK = 0, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK } mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +239,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX32690/wdt.h b/Libraries/PeriphDrivers/Include/MAX32690/wdt.h index 8c941e9fd7b..a1a15964287 100644 --- a/Libraries/PeriphDrivers/Include/MAX32690/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX32690/wdt.h @@ -120,6 +120,16 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, + MXC_WDT_ERTCO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +244,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX78000/wdt.h b/Libraries/PeriphDrivers/Include/MAX78000/wdt.h index eea2a246045..8b71270ce49 100644 --- a/Libraries/PeriphDrivers/Include/MAX78000/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX78000/wdt.h @@ -120,6 +120,16 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, + MXC_WDT_ERTCO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +244,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Include/MAX78002/wdt.h b/Libraries/PeriphDrivers/Include/MAX78002/wdt.h index fe35f084814..8d4b8048b46 100644 --- a/Libraries/PeriphDrivers/Include/MAX78002/wdt.h +++ b/Libraries/PeriphDrivers/Include/MAX78002/wdt.h @@ -120,6 +120,19 @@ typedef enum { MXC_WDT_WINDOWED = 1, } mxc_wdt_mode_t; +/** + * @brief Peripheral Clock settings + */ +typedef enum { + MXC_WDT_PCLK = 0, + MXC_WDT_IPO_CLK, + MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, + MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, + MXC_WDT_ERFO_CLK +} mxc_wdt_clock_t; + /** * @brief Timer Configuration */ @@ -234,6 +247,13 @@ int MXC_WDT_GetIntFlag(mxc_wdt_regs_t *wdt); */ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt); +/** + * @brief Sets clock source. + * @param wdt Pointer to watchdog registers. + * @param clock_source Clock source. + */ +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source); + /**@} end of group wdt */ #ifdef __cplusplus diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c b/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c index 7688630bbf5..c2a9b1263d9 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c @@ -157,3 +157,38 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) { MXC_WDT_RevB_ClearIntFlag((mxc_wdt_revb_regs_t *)wdt); } + +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) +{ + const uint8_t clock_source_num = 8; + uint8_t idx = 0; + uint8_t instance = 0; + mxc_wdt_clock_t clock_sources[2][8] = { + { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF }, + { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF } + }; + + if (wdt == MXC_WDT0) { + instance = 0; + } else if (wdt == MXC_WDT1) { + instance = 1; + } else { + return E_BAD_PARAM; + } + + for (idx = 0; idx < clock_source_num; idx++) { + if (clock_sources[instance][idx] == clock_source) { + break; + } + } + + if (idx == clock_source_num) { + return E_BAD_PARAM; + } + + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + + return E_NO_ERROR; +} diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c index 26330516925..10d25eb570b 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c @@ -163,3 +163,30 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) { MXC_WDT_RevB_ClearIntFlag((mxc_wdt_revb_regs_t *)wdt); } + +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) +{ + const uint8_t clock_source_num = 8; + uint8_t idx = 0; + mxc_wdt_clock_t clock_sources[1][8] = { { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, + MXC_WDT_NANO_CLK, MXC_WDT_ERTCO_CLK, MXC_WDT_EXT_CLK, + MXC_WDT_ERFO_CLK, 0xFF } }; + + if (wdt != MXC_WDT0) { + return E_BAD_PARAM; + } + + for (idx = 0; idx < clock_source_num; idx++) { + if (clock_sources[0][idx] == clock_source) { + break; + } + } + + if (idx == clock_source_num) { + return E_BAD_PARAM; + } + + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + + return E_NO_ERROR; +} diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c index 2780e30d0fe..d23ecea5809 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c @@ -153,3 +153,49 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) { MXC_WDT_RevB_ClearIntFlag((mxc_wdt_revb_regs_t *)wdt); } + +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) +{ + const uint8_t clock_source_num = 8; + uint8_t idx = 0; + uint8_t instance = 0; + +#if TARGET_NUM == 32670 + mxc_wdt_clock_t clock_sources[2][8] = { + { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF }, + { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF } + }; +#elif TARGET_NUM == 32675 + mxc_wdt_clock_t clock_sources[2][8] = { { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF }, + { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, + MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF } }; +#else + mxc_wdt_clock_t clock_sources[2][8] = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } }; +#endif + + if (wdt == MXC_WDT0) { + instance = 0; + } else if (wdt == MXC_WDT1) { + instance = 1; + } else { + return E_BAD_PARAM; + } + + for (idx = 0; idx < clock_source_num; idx++) { + if (clock_sources[instance][idx] == clock_source) { + break; + } + } + + if (idx == clock_source_num) { + return E_BAD_PARAM; + } + + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + + return E_NO_ERROR; +} diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c index 2780e30d0fe..1591463ce6d 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c @@ -153,3 +153,47 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) { MXC_WDT_RevB_ClearIntFlag((mxc_wdt_revb_regs_t *)wdt); } + +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) +{ + const uint8_t clock_source_num = 8; + uint8_t idx = 0; + uint8_t instance = 0; + +#if TARGET_NUM == 32655 || TARGET_NUM == 78000 + mxc_wdt_clock_t clock_sources[2][8] = { + { MXC_WDT_PCLK, MXC_WDT_IBRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { MXC_WDT_IBRO_CLK, MXC_WDT_ERTCO_CLK, MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + }; +#elif TARGET_NUM == 32680 + mxc_wdt_clock_t clock_sources[2][8] = { + { MXC_WDT_PCLK, MXC_WDT_IBRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { MXC_WDT_IBRO_CLK, 0xFF, MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + }; +#else + mxc_wdt_clock_t clock_sources[2][8] = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } }; +#endif + + if (wdt == MXC_WDT0) { + instance = 0; + } else if (wdt == MXC_WDT1) { + instance = 1; + } else { + return E_BAD_PARAM; + } + + for (idx = 0; idx < clock_source_num; idx++) { + if (clock_sources[instance][idx] == clock_source) { + break; + } + } + + if (idx == clock_source_num) { + return E_BAD_PARAM; + } + + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + + return E_NO_ERROR; +} diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c index 2780e30d0fe..7c39ee621a9 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c @@ -153,3 +153,36 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) { MXC_WDT_RevB_ClearIntFlag((mxc_wdt_revb_regs_t *)wdt); } + +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) +{ + const uint8_t clock_source_num = 8; + uint8_t idx = 0; + uint8_t instance = 0; + mxc_wdt_clock_t clock_sources[2][8] = { + { MXC_WDT_PCLK, MXC_WDT_IBRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + }; + + if (wdt == MXC_WDT0) { + instance = 0; + } else if (wdt == MXC_WDT1) { + instance = 1; + } else { + return E_BAD_PARAM; + } + + for (idx = 0; idx < clock_source_num; idx++) { + if (clock_sources[instance][idx] == clock_source) { + break; + } + } + + if (idx == clock_source_num) { + return E_BAD_PARAM; + } + + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + + return E_NO_ERROR; +} diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c index 2780e30d0fe..292586dd6ee 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c @@ -153,3 +153,38 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) { MXC_WDT_RevB_ClearIntFlag((mxc_wdt_revb_regs_t *)wdt); } + +int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) +{ + const uint8_t clock_source_num = 8; + uint8_t idx = 0; + uint8_t instance = 0; + mxc_wdt_clock_t clock_sources[2][8] = { + { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF }, + { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, + MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF } + }; + + if (wdt == MXC_WDT0) { + instance = 0; + } else if (wdt == MXC_WDT1) { + instance = 1; + } else { + return E_BAD_PARAM; + } + + for (idx = 0; idx < clock_source_num; idx++) { + if (clock_sources[instance][idx] == clock_source) { + break; + } + } + + if (idx == clock_source_num) { + return E_BAD_PARAM; + } + + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + + return E_NO_ERROR; +} diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c b/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c index 630dc255dc5..ff9dcdb5d22 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c @@ -154,3 +154,9 @@ void MXC_WDT_RevB_ClearIntFlag(mxc_wdt_revb_regs_t *wdt) { wdt->ctrl &= ~(MXC_F_WDT_REVB_CTRL_INT_LATE | MXC_F_WDT_REVB_CTRL_INT_EARLY); } + +void MXC_WDT_RevB_SetClockSource(mxc_wdt_revb_regs_t *wdt, int clock_source) +{ + MXC_SETFIELD(wdt->clksel, MXC_F_WDT_REVB_CLKSEL_SOURCE, + (clock_source << MXC_F_WDT_REVB_CLKSEL_SOURCE_POS)); +} diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_revb.h b/Libraries/PeriphDrivers/Source/WDT/wdt_revb.h index 7e950b7eb20..ae72c106a38 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_revb.h +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_revb.h @@ -110,5 +110,6 @@ int MXC_WDT_RevB_GetResetFlag(mxc_wdt_revb_regs_t *wdt); void MXC_WDT_RevB_ClearResetFlag(mxc_wdt_revb_regs_t *wdt); int MXC_WDT_RevB_GetIntFlag(mxc_wdt_revb_regs_t *wdt); void MXC_WDT_RevB_ClearIntFlag(mxc_wdt_revb_regs_t *wdt); +void MXC_WDT_RevB_SetClockSource(mxc_wdt_revb_regs_t *wdt, int clock_source); #endif // LIBRARIES_PERIPHDRIVERS_SOURCE_WDT_WDT_REVB_H_ From d449d3b78b8980b27ab48be7e5257e38ba827ef6 Mon Sep 17 00:00:00 2001 From: Furkan Akkiz Date: Wed, 29 Nov 2023 14:51:41 +0300 Subject: [PATCH 2/3] Optimize code by given feedback in PR. Optimized code for some target numbers which has same clock sources for all instances. Signed-off-by: Furkan Akkiz --- Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c | 28 ++------------ Libraries/PeriphDrivers/Source/WDT/wdt_me12.c | 20 ++-------- Libraries/PeriphDrivers/Source/WDT/wdt_me15.c | 37 +++---------------- Libraries/PeriphDrivers/Source/WDT/wdt_me17.c | 3 +- Libraries/PeriphDrivers/Source/WDT/wdt_me21.c | 28 ++------------ 5 files changed, 15 insertions(+), 101 deletions(-) diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c b/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c index c2a9b1263d9..b6a23fdf9e1 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c @@ -160,35 +160,13 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { - const uint8_t clock_source_num = 8; - uint8_t idx = 0; - uint8_t instance = 0; - mxc_wdt_clock_t clock_sources[2][8] = { - { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, - MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF }, - { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, - MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF } - }; + const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; - if (wdt == MXC_WDT0) { - instance = 0; - } else if (wdt == MXC_WDT1) { - instance = 1; - } else { - return E_BAD_PARAM; - } - - for (idx = 0; idx < clock_source_num; idx++) { - if (clock_sources[instance][idx] == clock_source) { - break; - } - } - - if (idx == clock_source_num) { + if ((clock_source < 0) || (clock_source > last_clock_source)) { return E_BAD_PARAM; } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; } diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c index 10d25eb570b..3b3dc07308a 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c @@ -166,27 +166,13 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { - const uint8_t clock_source_num = 8; - uint8_t idx = 0; - mxc_wdt_clock_t clock_sources[1][8] = { { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, - MXC_WDT_NANO_CLK, MXC_WDT_ERTCO_CLK, MXC_WDT_EXT_CLK, - MXC_WDT_ERFO_CLK, 0xFF } }; + const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; - if (wdt != MXC_WDT0) { + if ((clock_source < 0) || (clock_source > last_clock_source)) { return E_BAD_PARAM; } - for (idx = 0; idx < clock_source_num; idx++) { - if (clock_sources[0][idx] == clock_source) { - break; - } - } - - if (idx == clock_source_num) { - return E_BAD_PARAM; - } - - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; } diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c index d23ecea5809..c5b151f31f7 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c @@ -156,46 +156,19 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { - const uint8_t clock_source_num = 8; - uint8_t idx = 0; - uint8_t instance = 0; - #if TARGET_NUM == 32670 - mxc_wdt_clock_t clock_sources[2][8] = { - { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, - MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF }, - { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, - MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF } - }; + const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; #elif TARGET_NUM == 32675 - mxc_wdt_clock_t clock_sources[2][8] = { { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, - MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF }, - { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, - MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF } }; + const uint8_t last_clock_source = MXC_WDT_INRO_CLK; #else - mxc_wdt_clock_t clock_sources[2][8] = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, - { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } }; +#error ME15 WDT driver does not support given target number. #endif - if (wdt == MXC_WDT0) { - instance = 0; - } else if (wdt == MXC_WDT1) { - instance = 1; - } else { - return E_BAD_PARAM; - } - - for (idx = 0; idx < clock_source_num; idx++) { - if (clock_sources[instance][idx] == clock_source) { - break; - } - } - - if (idx == clock_source_num) { + if ((clock_source < 0) || (clock_source > last_clock_source)) { return E_BAD_PARAM; } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; } diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c index 1591463ce6d..252301f900e 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c @@ -171,8 +171,7 @@ int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { MXC_WDT_IBRO_CLK, 0xFF, MXC_WDT_INRO_CLK, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } }; #else - mxc_wdt_clock_t clock_sources[2][8] = { { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, - { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } }; +#error ME17 WDT driver does not support given target number. #endif if (wdt == MXC_WDT0) { diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c index 292586dd6ee..ac74b190aad 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c @@ -156,35 +156,13 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { - const uint8_t clock_source_num = 8; - uint8_t idx = 0; - uint8_t instance = 0; - mxc_wdt_clock_t clock_sources[2][8] = { - { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, - MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF }, - { MXC_WDT_PCLK, MXC_WDT_IPO_CLK, MXC_WDT_IBRO_CLK, MXC_WDT_INRO_CLK, MXC_WDT_ERTCO_CLK, - MXC_WDT_EXT_CLK, MXC_WDT_ERFO_CLK, 0xFF } - }; + const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; - if (wdt == MXC_WDT0) { - instance = 0; - } else if (wdt == MXC_WDT1) { - instance = 1; - } else { - return E_BAD_PARAM; - } - - for (idx = 0; idx < clock_source_num; idx++) { - if (clock_sources[instance][idx] == clock_source) { - break; - } - } - - if (idx == clock_source_num) { + if ((clock_source < 0) || (clock_source > last_clock_source)) { return E_BAD_PARAM; } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); + MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; } From a32227c3d44363480efa3e68f567fc0d9ba2fa05 Mon Sep 17 00:00:00 2001 From: Furkan Akkiz Date: Mon, 4 Dec 2023 13:54:21 +0300 Subject: [PATCH 3/3] Moved clock source number check into RevB function Moved clock source check to RevB function and removed 'last_clock_source' parameter. Signed-off-by: Furkan Akkiz --- Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c | 6 ------ Libraries/PeriphDrivers/Source/WDT/wdt_me12.c | 6 ------ Libraries/PeriphDrivers/Source/WDT/wdt_me15.c | 12 ------------ Libraries/PeriphDrivers/Source/WDT/wdt_me17.c | 4 ---- Libraries/PeriphDrivers/Source/WDT/wdt_me18.c | 4 ---- Libraries/PeriphDrivers/Source/WDT/wdt_me21.c | 6 ------ Libraries/PeriphDrivers/Source/WDT/wdt_revb.c | 3 +++ 7 files changed, 3 insertions(+), 38 deletions(-) diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c b/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c index b6a23fdf9e1..fc22118db34 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_ai87.c @@ -160,12 +160,6 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { - const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; - - if ((clock_source < 0) || (clock_source > last_clock_source)) { - return E_BAD_PARAM; - } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c index 3b3dc07308a..10aad739fcc 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me12.c @@ -166,12 +166,6 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { - const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; - - if ((clock_source < 0) || (clock_source > last_clock_source)) { - return E_BAD_PARAM; - } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c index c5b151f31f7..1bab3de8fb5 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me15.c @@ -156,18 +156,6 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { -#if TARGET_NUM == 32670 - const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; -#elif TARGET_NUM == 32675 - const uint8_t last_clock_source = MXC_WDT_INRO_CLK; -#else -#error ME15 WDT driver does not support given target number. -#endif - - if ((clock_source < 0) || (clock_source > last_clock_source)) { - return E_BAD_PARAM; - } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c index 252301f900e..d23bd097448 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me17.c @@ -188,10 +188,6 @@ int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) } } - if (idx == clock_source_num) { - return E_BAD_PARAM; - } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); return E_NO_ERROR; diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c index 7c39ee621a9..df82e890816 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me18.c @@ -178,10 +178,6 @@ int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) } } - if (idx == clock_source_num) { - return E_BAD_PARAM; - } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, idx); return E_NO_ERROR; diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c b/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c index ac74b190aad..1bab3de8fb5 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_me21.c @@ -156,12 +156,6 @@ void MXC_WDT_ClearIntFlag(mxc_wdt_regs_t *wdt) int MXC_WDT_SetClockSource(mxc_wdt_regs_t *wdt, mxc_wdt_clock_t clock_source) { - const uint8_t last_clock_source = MXC_WDT_ERFO_CLK; - - if ((clock_source < 0) || (clock_source > last_clock_source)) { - return E_BAD_PARAM; - } - MXC_WDT_RevB_SetClockSource((mxc_wdt_revb_regs_t *)wdt, (int)clock_source); return E_NO_ERROR; diff --git a/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c b/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c index ff9dcdb5d22..a2a28425f85 100644 --- a/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c +++ b/Libraries/PeriphDrivers/Source/WDT/wdt_revb.c @@ -157,6 +157,9 @@ void MXC_WDT_RevB_ClearIntFlag(mxc_wdt_revb_regs_t *wdt) void MXC_WDT_RevB_SetClockSource(mxc_wdt_revb_regs_t *wdt, int clock_source) { + const uint8_t clock_source_num = 8; // Max number of clock sources for Rev B WDT + + MXC_ASSERT((clock_source < clock_source_num) && (clock_source >= 0)); MXC_SETFIELD(wdt->clksel, MXC_F_WDT_REVB_CLKSEL_SOURCE, (clock_source << MXC_F_WDT_REVB_CLKSEL_SOURCE_POS)); }