From 6432cf4af9acd514e742e08f7ebb06ff7191af46 Mon Sep 17 00:00:00 2001 From: Sherman Date: Fri, 22 Oct 2021 15:12:56 +0800 Subject: [PATCH] =?UTF-8?q?[add]=20=E6=B7=BB=E5=8A=A0=20RTC=E3=80=81WDT=20?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/ra6m4-cpk/.config | 10 +- bsp/ra6m4-cpk/.settings/standalone.prefs | 8 +- bsp/ra6m4-cpk/README.md | 13 +- bsp/ra6m4-cpk/buildinfo.gpdsc | 13 + bsp/ra6m4-cpk/configuration.xml | 40 +++ bsp/ra6m4-cpk/docs/picture/rascuart.png | Bin 30785 -> 47912 bytes bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md | 77 +++++- bsp/ra6m4-cpk/drivers/Kconfig | 22 ++ bsp/ra6m4-cpk/drivers/SConscript | 3 + bsp/ra6m4-cpk/drivers/drv_gpio.c | 282 +++++++++++----------- bsp/ra6m4-cpk/drivers/drv_rtc.c | 221 +++++++++++++++++ bsp/ra6m4-cpk/drivers/drv_wdt.c | 95 ++++++++ 12 files changed, 634 insertions(+), 150 deletions(-) create mode 100644 bsp/ra6m4-cpk/drivers/drv_rtc.c create mode 100644 bsp/ra6m4-cpk/drivers/drv_wdt.c diff --git a/bsp/ra6m4-cpk/.config b/bsp/ra6m4-cpk/.config index f40cd8d190..c13c3cc198 100644 --- a/bsp/ra6m4-cpk/.config +++ b/bsp/ra6m4-cpk/.config @@ -144,10 +144,12 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set -# CONFIG_RT_USING_RTC is not set +CONFIG_RT_USING_RTC=y +CONFIG_RT_USING_ALARM=y +# CONFIG_RT_USING_SOFT_RTC is not set # CONFIG_RT_USING_SDIO is not set # CONFIG_RT_USING_SPI is not set -# CONFIG_RT_USING_WDT is not set +CONFIG_RT_USING_WDT=y # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set # CONFIG_RT_USING_TOUCH is not set @@ -587,6 +589,10 @@ CONFIG_BSP_USING_I2C=y CONFIG_BSP_USING_I2C1=y CONFIG_BSP_I2C1_SCL_PIN=0x0512 CONFIG_BSP_I2C1_SDA_PIN=0x0511 +CONFIG_BSP_USING_WDT=y +CONFIG_BSP_USING_ONCHIP_RTC=y +CONFIG_BSP_RTC_USING_LSE=y +# CONFIG_BSP_RTC_USING_LSI is not set # # Board extended module Drivers diff --git a/bsp/ra6m4-cpk/.settings/standalone.prefs b/bsp/ra6m4-cpk/.settings/standalone.prefs index 63a8ce8f27..b65d7b3d00 100644 --- a/bsp/ra6m4-cpk/.settings/standalone.prefs +++ b/bsp/ra6m4-cpk/.settings/standalone.prefs @@ -1,4 +1,4 @@ -#Mon Oct 18 14:30:28 CST 2021 +#Mon Oct 18 18:20:25 CST 2021 com.renesas.cdt.ddsc.content/com.renesas.cdt.ddsc.content.defaultlinkerscript=script/fsp.scat com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#BSP\#\#ra6m4\#\#device\#\#\#\#3.1.0/libraries= com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#HAL\ Drivers\#\#all\#\#r_ioport\#\#\#\#3.1.0/all=1957950123,ra/fsp/inc/api/r_ioport_api.h|1390983687,ra/fsp/inc/instances/r_ioport.h|3204787724,ra/fsp/src/r_ioport/r_ioport.c @@ -7,12 +7,16 @@ com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#BSP\#\#Board\#\#ra6m4_cpk\# com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#BSP\#\#ra6m4\#\#device\#\#\#\#3.1.0/all=2308894280,ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/system.h com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#Common\#\#all\#\#fsp_common\#\#\#\#3.1.0/all=3581546608,ra/fsp/inc/fsp_common_api.h|2247478812,ra/fsp/src/bsp/mcu/all/bsp_module_stop.h|3983299396,ra/fsp/src/bsp/mcu/all/bsp_delay.h|2308894280,ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/system.h|1222394411,ra/fsp/src/bsp/mcu/all/bsp_io.c|731782070,ra/fsp/src/bsp/mcu/all/bsp_irq.h|568600546,ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/startup.c|1390983687,ra/fsp/inc/instances/r_ioport.h|496115995,ra/fsp/src/bsp/mcu/all/bsp_register_protection.c|1552630912,ra/fsp/src/bsp/mcu/all/bsp_guard.h|3590501432,ra/fsp/src/bsp/mcu/all/bsp_io.h|521902797,ra/fsp/src/bsp/mcu/all/bsp_security.h|1630997354,ra/fsp/src/bsp/mcu/all/bsp_irq.c|2920829723,ra/fsp/src/bsp/mcu/all/bsp_guard.c|400573940,ra/fsp/src/bsp/mcu/all/bsp_register_protection.h|905231975,ra/fsp/src/bsp/mcu/all/bsp_clocks.c|1992062042,ra/fsp/src/bsp/mcu/all/bsp_compiler_support.h|1868795951,ra/fsp/inc/fsp_features.h|3984836408,ra/fsp/src/bsp/mcu/all/bsp_group_irq.h|2966752275,ra/fsp/src/bsp/mcu/all/bsp_delay.c|3098075304,ra/fsp/src/bsp/mcu/all/bsp_clocks.h|2556589544,ra/fsp/src/bsp/mcu/all/bsp_group_irq.c|2812024316,ra/fsp/src/bsp/mcu/all/bsp_common.h|1957950123,ra/fsp/inc/api/r_ioport_api.h|2906400,ra/fsp/src/bsp/mcu/all/bsp_common.c|3520119047,ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/base_addresses.h|2977689308,ra/fsp/src/bsp/mcu/all/bsp_mcu_api.h|2006974055,ra/fsp/inc/api/bsp_api.h|3819230577,ra/fsp/src/bsp/cmsis/Device/RENESAS/Source/system.c|3131094294,ra/fsp/src/bsp/mcu/all/bsp_rom_registers.c|1982083345,ra/fsp/src/bsp/mcu/all/bsp_security.c|1615019982,ra/fsp/src/bsp/mcu/all/bsp_sbrk.c|3366593968,ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/renesas.h|4191472725,ra/fsp/inc/fsp_version.h com.renesas.cdt.ddsc.packs.componentfiles/Arm\#\#CMSIS\#\#CMSIS5\#\#CoreM\#\#\#\#5.7.0+fsp.3.1.0/libraries= -com.renesas.cdt.ddsc.settingseditor/com.renesas.cdt.ddsc.settingseditor.active_page=PinConfiguration +com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#HAL\ Drivers\#\#all\#\#r_wdt\#\#\#\#3.1.0/all=1585385371,ra/fsp/inc/instances/r_wdt.h|3589877379,ra/fsp/inc/api/r_wdt_api.h|1520208614,ra/fsp/src/r_wdt/r_wdt.c +com.renesas.cdt.ddsc.settingseditor/com.renesas.cdt.ddsc.settingseditor.active_page=SWPConfigurator com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#HAL\ Drivers\#\#all\#\#r_ioport\#\#\#\#3.1.0/libraries= com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#BSP\#\#ra6m4\#\#device\#\#R7FA6M4AF3CFB\#\#3.1.0/libraries= +com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#HAL\ Drivers\#\#all\#\#r_wdt\#\#\#\#3.1.0/libraries= +com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#HAL\ Drivers\#\#all\#\#r_rtc\#\#\#\#3.1.0/all=348129344,ra/fsp/inc/api/r_cgc_api.h|3267174292,ra/fsp/src/r_rtc/r_rtc.c|1942362170,ra/fsp/inc/api/r_rtc_api.h|2525454394,ra/fsp/inc/instances/r_rtc.h com.renesas.cdt.ddsc.packs.componentfiles/Arm\#\#CMSIS\#\#CMSIS5\#\#CoreM\#\#\#\#5.7.0+fsp.3.1.0/all=546157604,ra/arm/CMSIS_5/CMSIS/Core/Include/core_armv8mml.h|1372010515,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm23.h|1078551279,ra/arm/CMSIS_5/CMSIS/Core/Include/core_sc300.h|2333906976,ra/arm/CMSIS_5/CMSIS/Core/Include/cmsis_version.h|1536854638,ra/arm/CMSIS_5/CMSIS/Core/Include/mpu_armv8.h|206980015,ra/arm/CMSIS_5/CMSIS/Core/Include/mpu_armv7.h|3007265674,ra/arm/CMSIS_5/CMSIS/Core/Include/core_armv8mbl.h|2024281644,ra/arm/CMSIS_5/CMSIS/Core/Include/cmsis_armclang_ltm.h|1017116116,ra/arm/CMSIS_5/CMSIS/Core/Include/cmsis_compiler.h|4231934849,ra/arm/CMSIS_5/CMSIS/Core/Include/cmsis_iccarm.h|2748964184,ra/arm/CMSIS_5/CMSIS/Core/Include/cachel1_armv7.h|377628369,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm55.h|637879414,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm33.h|4005730526,ra/arm/CMSIS_5/CMSIS/Core/Include/pmu_armv8.h|2327633156,ra/arm/CMSIS_5/CMSIS/Core/Include/core_sc000.h|2635219934,ra/arm/CMSIS_5/CMSIS/Core/Include/tz_context.h|3589068132,ra/arm/CMSIS_5/CMSIS/Core/Include/cmsis_armcc.h|2851112248,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm1.h|3021372151,ra/arm/CMSIS_5/CMSIS/Core/Include/cmsis_gcc.h|1562896660,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm35p.h|1745843273,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm0.h|2491522803,ra/arm/CMSIS_5/CMSIS/Core/Include/cmsis_armclang.h|1441545198,ra/arm/CMSIS_5/LICENSE.txt|3602366610,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm3.h|3779323067,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm4.h|3442821435,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm7.h|4290386133,ra/arm/CMSIS_5/CMSIS/Core/Include/core_cm0plus.h|2686445441,ra/arm/CMSIS_5/CMSIS/Core/Include/core_armv81mml.h com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#HAL\ Drivers\#\#all\#\#r_sci_uart\#\#\#\#3.1.0/all=2349328507,ra/fsp/src/r_sci_uart/r_sci_uart.c|853178775,ra/fsp/inc/api/r_uart_api.h|1610456547,ra/fsp/inc/api/r_transfer_api.h|1672784957,ra/fsp/inc/instances/r_sci_uart.h com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#BSP\#\#ra6m4\#\#fsp\#\#\#\#3.1.0/all=3571093944,ra/fsp/src/bsp/mcu/ra6m4/bsp_elc.h|2347061782,ra/fsp/src/bsp/mcu/ra6m4/bsp_mcu_info.h|3852442662,ra/fsp/src/bsp/mcu/ra6m4/bsp_feature.h +com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#HAL\ Drivers\#\#all\#\#r_rtc\#\#\#\#3.1.0/libraries= com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#Common\#\#all\#\#fsp_common\#\#\#\#3.1.0/libraries= com.renesas.cdt.ddsc.threads.configurator/collapse/module.driver.uart_on_sci_uart.813326093=false com.renesas.cdt.ddsc.packs.componentfiles/Renesas\#\#BSP\#\#Board\#\#ra6m4_cpk\#\#\#\#3.1.0/all=3938710240,ra/board/ra6m4_cpk/board_leds.c|3343992478,ra/board/ra6m4_cpk/board.h|2525887392,ra/board/ra6m4_cpk/board_ethernet_phy.h|3559227370,ra/board/ra6m4_cpk/board_init.c|3843040667,ra/board/ra6m4_cpk/board_leds.h|2967196421,ra/board/ra6m4_cpk/board_init.h diff --git a/bsp/ra6m4-cpk/README.md b/bsp/ra6m4-cpk/README.md index 8d1efb31d5..fdb3a742b8 100644 --- a/bsp/ra6m4-cpk/README.md +++ b/bsp/ra6m4-cpk/README.md @@ -33,7 +33,11 @@ | **片上外设** | **支持情况** | **备注** | | :----------- | :---------- | :------------------------ | | UART | 支持 | UART7 | -| 持续更新中... | | | +| GPIO | 支持 | | +| IIC | 支持 | 软件 | +| WDT | 支持 | | +| RTC | 支持 | | +| 持续更新中... | | | ## 使用说明 @@ -111,7 +115,7 @@ msh > **应用入口函数** -应用层的入口函数在 **bsp\ra6m4-cpk\src\hal_emtry.c** 中 的 `void hal_entry(void)` 。用户编写的 .c 文件和直接放在 src 目录下 +应用层的入口函数在 **bsp\ra6m4-cpk\src\hal_emtry.c** 中 的 `void hal_entry(void)` 。用户编写的源文件可直接放在 src 目录下。 ```c void hal_entry(void) @@ -120,7 +124,10 @@ void hal_entry(void) while (1) { - rt_thread_mdelay(1000); + rt_pin_write(LED3_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED3_PIN, PIN_LOW); + rt_thread_mdelay(500); } } ``` diff --git a/bsp/ra6m4-cpk/buildinfo.gpdsc b/bsp/ra6m4-cpk/buildinfo.gpdsc index 24f3ff4bda..89d7defa58 100644 --- a/bsp/ra6m4-cpk/buildinfo.gpdsc +++ b/bsp/ra6m4-cpk/buildinfo.gpdsc @@ -11,8 +11,12 @@ + + + + @@ -58,14 +62,19 @@ + + + + + @@ -112,8 +121,10 @@ + + @@ -128,7 +139,9 @@ + + diff --git a/bsp/ra6m4-cpk/configuration.xml b/bsp/ra6m4-cpk/configuration.xml index 4a7bf0ee4d..27189e3840 100644 --- a/bsp/ra6m4-cpk/configuration.xml +++ b/bsp/ra6m4-cpk/configuration.xml @@ -163,6 +163,14 @@ SCI UART Renesas.RA.3.1.0.pack + + Real Time Clock + Renesas.RA.3.1.0.pack + + + Watchdog Timer + Renesas.RA.3.1.0.pack + @@ -196,10 +204,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -209,6 +246,9 @@ + + + diff --git a/bsp/ra6m4-cpk/docs/picture/rascuart.png b/bsp/ra6m4-cpk/docs/picture/rascuart.png index 41dbf93f00b92b9a19f3981622281e7d96e4b2ce..a4a7d54ee85d09b95cbb12f55cf7c37b9a15b143 100644 GIT binary patch literal 47912 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 axWRoMq_6dk6WAIUq;yM7G5@CV^Zy5Ymmg06 diff --git a/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md b/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md index 1518ce5809..7d3f2a07cb 100644 --- a/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md +++ b/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md @@ -15,8 +15,81 @@ ## UART -- 添加一个 UART 端口外设配置 +如何添加一个 UART 端口外设配置? + +1. 选择 Stacks 配置页,点击 New Stack 找到 UART。 ![image.png](picture/rascuart.png) -![image.png](picture/rascuart1.png) \ No newline at end of file +2. 配置 UART 参数,因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置 **name** 、**channel** 、**callback** 是一致的标号。 +![image.png](picture/rascuart1.png) + + + +## GPIO 中断 + +如何添加一个 IO 中断? + +1. 选择引脚编号,进入配置,比如选择 P402 做为中断引脚。 + +![image-20211019142514276](picture/gpio.png) + 2. 打开 ICU 中断通道 IRQ4 + +![image-20211019142801323](picture/gpio_irq.png) + 3. 创建 stack 并进入配置。因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置 **name** 、**channel** 、**callback** 是一致的标号。选择你希望的触发方式。最后保存配置,生成配置代码。 + +![image-20211019142910292](picture/icu_stack.png) + +![image-20211019143151891](picture/config_irq4.png) + +4. 测试中断是否能够成功开启 + + ```c + + void irq_callback_test(void *args) + { + rt_kprintf("\n Irq4 triggered \n"); + } + + void icu_sample(void) + { + /* 初始化P*/ + rt_uint32_t pin = rt_pin_get("P402"); + rt_kprintf("\n pin number : 0x%04X \n", pin); + rt_err_t err = rt_pin_attach_irq(pin, PIN_IRQ_MODE_RISING, irq_callback_test, RT_NULL); + if(RT_EOK != err) + { + rt_kprintf("\n attach irq failed. \n"); + } + err = rt_pin_irq_enable(pin, PIN_IRQ_ENABLE); + if(RT_EOK != err) + { + rt_kprintf("\n enable irq failed. \n"); + } + } + MSH_CMD_EXPORT(icu_sample, icu sample); + ``` + +## WDT + +1. 创建 WDT + +![image-20211019152302939](picture/wdt.png) + +2. 配置 WDT,需要注意在 RT-Thread 中只是用了一个 WDT 设备,所以没有对其进行编号,如果是新创建的 WDT 设备需要注意 name 字段,在驱动中默认使用的是 `g_wdt` 。 + +![image-20211019152407572](picture/wdt_config.png) + +3. [如何在 ENV 中打开 WDT](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog) + +## RTC + +1. 添加 RTC 设备 + +![image-20211019152536749](picture/rtc.png) + +2. 配置 RTC,需要注意在 RT-Thread 中只是用了一个 RTC 设备,所以没有对其进行编号,如果是新创建的 RTC 设备需要注意 name 字段,在驱动中默认使用的是 `g_rtc` 。 + +![image-20211019152627412](picture/rtc_config.png) + +3. [如何在 ENV 中打开 RTC](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc) \ No newline at end of file diff --git a/bsp/ra6m4-cpk/drivers/Kconfig b/bsp/ra6m4-cpk/drivers/Kconfig index 17e127473d..a5ead99ad5 100644 --- a/bsp/ra6m4-cpk/drivers/Kconfig +++ b/bsp/ra6m4-cpk/drivers/Kconfig @@ -73,6 +73,28 @@ menu "Hardware Drivers Config" endif endif + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + endmenu menu "Board extended module Drivers" diff --git a/bsp/ra6m4-cpk/drivers/SConscript b/bsp/ra6m4-cpk/drivers/SConscript index 1548e88ee0..2cbe93510a 100644 --- a/bsp/ra6m4-cpk/drivers/SConscript +++ b/bsp/ra6m4-cpk/drivers/SConscript @@ -22,6 +22,9 @@ if GetDepend(['RT_USING_PIN']): if GetDepend(['RT_USING_WDT']): src += ['drv_wdt.c'] +if GetDepend(['BSP_USING_ONCHIP_RTC']): + src += ['drv_rtc.c'] + if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']): if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1'): src += ['drv_soft_i2c.c'] diff --git a/bsp/ra6m4-cpk/drivers/drv_gpio.c b/bsp/ra6m4-cpk/drivers/drv_gpio.c index aa4a769ff1..fa2a2f2151 100644 --- a/bsp/ra6m4-cpk/drivers/drv_gpio.c +++ b/bsp/ra6m4-cpk/drivers/drv_gpio.c @@ -14,94 +14,94 @@ #define DBG_TAG "drv.gpio" #ifdef DRV_DEBUG -#define DBG_LVL DBG_LOG + #define DBG_LVL DBG_LOG #else -#define DBG_LVL DBG_INFO + #define DBG_LVL DBG_INFO #endif /* DRV_DEBUG */ #ifdef R_ICU_H static rt_base_t ra_pin_get_irqx(rt_uint32_t pin) { - switch(pin) + switch (pin) { - case BSP_IO_PORT_04_PIN_00: - case BSP_IO_PORT_02_PIN_06: - case BSP_IO_PORT_01_PIN_05: - return 0; + case BSP_IO_PORT_04_PIN_00: + case BSP_IO_PORT_02_PIN_06: + case BSP_IO_PORT_01_PIN_05: + return 0; - case BSP_IO_PORT_02_PIN_05: - case BSP_IO_PORT_01_PIN_01: - case BSP_IO_PORT_01_PIN_04: - return 1; + case BSP_IO_PORT_02_PIN_05: + case BSP_IO_PORT_01_PIN_01: + case BSP_IO_PORT_01_PIN_04: + return 1; - case BSP_IO_PORT_02_PIN_03: - case BSP_IO_PORT_01_PIN_00: - case BSP_IO_PORT_02_PIN_13: - return 2; + case BSP_IO_PORT_02_PIN_03: + case BSP_IO_PORT_01_PIN_00: + case BSP_IO_PORT_02_PIN_13: + return 2; - case BSP_IO_PORT_02_PIN_02: - case BSP_IO_PORT_01_PIN_10: - case BSP_IO_PORT_02_PIN_12: - return 3; + case BSP_IO_PORT_02_PIN_02: + case BSP_IO_PORT_01_PIN_10: + case BSP_IO_PORT_02_PIN_12: + return 3; - case BSP_IO_PORT_04_PIN_02: - case BSP_IO_PORT_01_PIN_11: - case BSP_IO_PORT_04_PIN_11: - return 4; + case BSP_IO_PORT_04_PIN_02: + case BSP_IO_PORT_01_PIN_11: + case BSP_IO_PORT_04_PIN_11: + return 4; - case BSP_IO_PORT_04_PIN_01: - case BSP_IO_PORT_03_PIN_02: - case BSP_IO_PORT_04_PIN_10: - return 5; + case BSP_IO_PORT_04_PIN_01: + case BSP_IO_PORT_03_PIN_02: + case BSP_IO_PORT_04_PIN_10: + return 5; - case BSP_IO_PORT_03_PIN_01: - case BSP_IO_PORT_00_PIN_00: - case BSP_IO_PORT_04_PIN_09: - return 6; + case BSP_IO_PORT_03_PIN_01: + case BSP_IO_PORT_00_PIN_00: + case BSP_IO_PORT_04_PIN_09: + return 6; - case BSP_IO_PORT_00_PIN_01: - case BSP_IO_PORT_04_PIN_08: - return 7; + case BSP_IO_PORT_00_PIN_01: + case BSP_IO_PORT_04_PIN_08: + return 7; - case BSP_IO_PORT_00_PIN_02: - case BSP_IO_PORT_03_PIN_05: - case BSP_IO_PORT_04_PIN_15: - return 8; + case BSP_IO_PORT_00_PIN_02: + case BSP_IO_PORT_03_PIN_05: + case BSP_IO_PORT_04_PIN_15: + return 8; - case BSP_IO_PORT_00_PIN_04: - case BSP_IO_PORT_03_PIN_04: - case BSP_IO_PORT_04_PIN_14: - return 9; + case BSP_IO_PORT_00_PIN_04: + case BSP_IO_PORT_03_PIN_04: + case BSP_IO_PORT_04_PIN_14: + return 9; - case BSP_IO_PORT_00_PIN_05: - case BSP_IO_PORT_07_PIN_09: - return 10; + case BSP_IO_PORT_00_PIN_05: + case BSP_IO_PORT_07_PIN_09: + return 10; - case BSP_IO_PORT_05_PIN_01: - case BSP_IO_PORT_00_PIN_06: - case BSP_IO_PORT_07_PIN_08: - return 11; + case BSP_IO_PORT_05_PIN_01: + case BSP_IO_PORT_00_PIN_06: + case BSP_IO_PORT_07_PIN_08: + return 11; - case BSP_IO_PORT_05_PIN_02: - case BSP_IO_PORT_00_PIN_08: - return 12; + case BSP_IO_PORT_05_PIN_02: + case BSP_IO_PORT_00_PIN_08: + return 12; - case BSP_IO_PORT_00_PIN_15: - case BSP_IO_PORT_00_PIN_09: - return 13; + case BSP_IO_PORT_00_PIN_15: + case BSP_IO_PORT_00_PIN_09: + return 13; - case BSP_IO_PORT_04_PIN_03: - case BSP_IO_PORT_05_PIN_12: - case BSP_IO_PORT_05_PIN_05: - return 14; + case BSP_IO_PORT_04_PIN_03: + case BSP_IO_PORT_05_PIN_12: + case BSP_IO_PORT_05_PIN_05: + return 14; - case BSP_IO_PORT_04_PIN_04: - case BSP_IO_PORT_05_PIN_11: - case BSP_IO_PORT_05_PIN_06: - return 15; + case BSP_IO_PORT_04_PIN_04: + case BSP_IO_PORT_05_PIN_11: + case BSP_IO_PORT_05_PIN_06: + return 15; - default : - return -1; + default : + return -1; } } @@ -209,34 +209,34 @@ static void ra_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode) return; } - switch(mode) + switch (mode) { - case PIN_MODE_OUTPUT: - err = R_IOPORT_PinCfg(&g_ioport_ctrl, pin, BSP_IO_DIRECTION_OUTPUT); - if (err != FSP_SUCCESS) - { - LOG_E("PIN_MODE_OUTPUT configuration failed"); - return; - } - break; + case PIN_MODE_OUTPUT: + err = R_IOPORT_PinCfg(&g_ioport_ctrl, pin, BSP_IO_DIRECTION_OUTPUT); + if (err != FSP_SUCCESS) + { + LOG_E("PIN_MODE_OUTPUT configuration failed"); + return; + } + break; - case PIN_MODE_INPUT: - err = R_IOPORT_PinCfg(&g_ioport_ctrl, pin, BSP_IO_DIRECTION_INPUT); - if (err != FSP_SUCCESS) - { - LOG_E("PIN_MODE_INPUT configuration failed"); - return; - } - break; + case PIN_MODE_INPUT: + err = R_IOPORT_PinCfg(&g_ioport_ctrl, pin, BSP_IO_DIRECTION_INPUT); + if (err != FSP_SUCCESS) + { + LOG_E("PIN_MODE_INPUT configuration failed"); + return; + } + break; - case PIN_MODE_OUTPUT_OD: - err = R_IOPORT_PinCfg(&g_ioport_ctrl, pin, IOPORT_CFG_NMOS_ENABLE); - if (err != FSP_SUCCESS) - { - LOG_E("PIN_MODE_OUTPUT_OD configuration failed"); - return; - } - break; + case PIN_MODE_OUTPUT_OD: + err = R_IOPORT_PinCfg(&g_ioport_ctrl, pin, IOPORT_CFG_NMOS_ENABLE); + if (err != FSP_SUCCESS) + { + LOG_E("PIN_MODE_OUTPUT_OD configuration failed"); + return; + } + break; } } @@ -269,12 +269,12 @@ static rt_err_t ra_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_ui #ifdef R_ICU_H rt_err_t err; rt_int32_t irqx = ra_pin_get_irqx(pin); - if(PIN_IRQ_ENABLE == enabled) + if (PIN_IRQ_ENABLE == enabled) { - if(0 <= irqx && irqx < sizeof(pin_irq_map) / sizeof(pin_irq_map[0])) + if (0 <= irqx && irqx < sizeof(pin_irq_map) / sizeof(pin_irq_map[0])) { - err = R_ICU_ExternalIrqOpen((external_irq_ctrl_t * const)pin_irq_map[irqx].irq_ctrl, - (external_irq_cfg_t const * const)pin_irq_map[irqx].irq_cfg); + err = R_ICU_ExternalIrqOpen((external_irq_ctrl_t *const)pin_irq_map[irqx].irq_ctrl, + (external_irq_cfg_t const * const)pin_irq_map[irqx].irq_cfg); /* Handle error */ if (FSP_SUCCESS != err) { @@ -282,8 +282,8 @@ static rt_err_t ra_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_ui LOG_E("\r\n**R_ICU_ExternalIrqOpen API FAILED**\r\n"); return -RT_ERROR; } - - err = R_ICU_ExternalIrqEnable((external_irq_ctrl_t * const)pin_irq_map[irqx].irq_ctrl); + + err = R_ICU_ExternalIrqEnable((external_irq_ctrl_t *const)pin_irq_map[irqx].irq_ctrl); /* Handle error */ if (FSP_SUCCESS != err) { @@ -293,16 +293,16 @@ static rt_err_t ra_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_ui } } } - else if(PIN_IRQ_DISABLE == enabled) + else if (PIN_IRQ_DISABLE == enabled) { - err = R_ICU_ExternalIrqDisable((external_irq_ctrl_t * const)pin_irq_map[irqx].irq_ctrl); + err = R_ICU_ExternalIrqDisable((external_irq_ctrl_t *const)pin_irq_map[irqx].irq_ctrl); if (FSP_SUCCESS != err) { /* ICU Disable failure message */ LOG_E("\r\n**R_ICU_ExternalIrqDisable API FAILED**\r\n"); return -RT_ERROR; } - err = R_ICU_ExternalIrqClose((external_irq_ctrl_t * const)pin_irq_map[irqx].irq_ctrl); + err = R_ICU_ExternalIrqClose((external_irq_ctrl_t *const)pin_irq_map[irqx].irq_ctrl); if (FSP_SUCCESS != err) { /* ICU Close failure message */ @@ -317,31 +317,31 @@ static rt_err_t ra_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_ui } static rt_err_t ra_pin_attach_irq(struct rt_device *device, rt_int32_t pin, - rt_uint32_t mode, void (*hdr)(void *args), void *args) + rt_uint32_t mode, void (*hdr)(void *args), void *args) { #ifdef R_ICU_H rt_int32_t irqx = ra_pin_get_irqx(pin); - if(0 <= irqx && irqx < (sizeof(pin_irq_map) / sizeof(pin_irq_map[0]))) - { - int level = rt_hw_interrupt_disable(); - if (pin_irq_hdr_tab[irqx].pin == irqx && - pin_irq_hdr_tab[irqx].hdr == hdr && - pin_irq_hdr_tab[irqx].mode == mode && - pin_irq_hdr_tab[irqx].args == args) + if (0 <= irqx && irqx < (sizeof(pin_irq_map) / sizeof(pin_irq_map[0]))) { + int level = rt_hw_interrupt_disable(); + if (pin_irq_hdr_tab[irqx].pin == irqx && + pin_irq_hdr_tab[irqx].hdr == hdr && + pin_irq_hdr_tab[irqx].mode == mode && + pin_irq_hdr_tab[irqx].args == args) + { + rt_hw_interrupt_enable(level); + return RT_EOK; + } + if (pin_irq_hdr_tab[irqx].pin != -1) + { + rt_hw_interrupt_enable(level); + return RT_EBUSY; + } + pin_irq_hdr_tab[irqx].pin = irqx; + pin_irq_hdr_tab[irqx].hdr = hdr; + pin_irq_hdr_tab[irqx].mode = mode; + pin_irq_hdr_tab[irqx].args = args; rt_hw_interrupt_enable(level); - return RT_EOK; - } - if(pin_irq_hdr_tab[irqx].pin != -1) - { - rt_hw_interrupt_enable(level); - return RT_EBUSY; - } - pin_irq_hdr_tab[irqx].pin = irqx; - pin_irq_hdr_tab[irqx].hdr = hdr; - pin_irq_hdr_tab[irqx].mode = mode; - pin_irq_hdr_tab[irqx].args = args; - rt_hw_interrupt_enable(level); } else return -RT_ERROR; return RT_EOK; @@ -354,7 +354,7 @@ static rt_err_t ra_pin_dettach_irq(struct rt_device *device, rt_int32_t pin) { #ifdef R_ICU_H rt_int32_t irqx = ra_pin_get_irqx(pin); - if(0 <= irqx && irqx < sizeof(pin_irq_map) / sizeof(pin_irq_map[0])) + if (0 <= irqx && irqx < sizeof(pin_irq_map) / sizeof(pin_irq_map[0])) { int level = rt_hw_interrupt_disable(); if (pin_irq_hdr_tab[irqx].pin == -1) @@ -381,16 +381,16 @@ static rt_err_t ra_pin_dettach_irq(struct rt_device *device, rt_int32_t pin) static rt_base_t ra_pin_get(const char *name) { int pin_number = -1, port = -1, pin = -1; - if(rt_strlen(name) != 4) + if (rt_strlen(name) != 4) return -1; - if(name[0] == 'P') + if (name[0] == 'P') { - if('0' <= (int)name[1] && (int)name[1] <= '9') + if ('0' <= (int)name[1] && (int)name[1] <= '9') { port = ((int)name[1] - 48) * 16 * 16; - if('0' <= (int)name[2] && (int)name[2] <= '9') + if ('0' <= (int)name[2] && (int)name[2] <= '9') { - if('0' <= (int)name[3] && (int)name[3] <= '9') + if ('0' <= (int)name[3] && (int)name[3] <= '9') { pin = ((int)name[2] - 48) * 10; pin += (int)name[3] - 48; @@ -428,7 +428,7 @@ int rt_hw_pin_init(void) void irq0_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(0 == pin_irq_hdr_tab[0].pin) + if (0 == pin_irq_hdr_tab[0].pin) { pin_irq_hdr_tab[0].hdr(pin_irq_hdr_tab[0].args); } @@ -438,7 +438,7 @@ void irq0_callback(external_irq_callback_args_t *p_args) void irq1_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(1 == pin_irq_hdr_tab[1].pin) + if (1 == pin_irq_hdr_tab[1].pin) { pin_irq_hdr_tab[1].hdr(pin_irq_hdr_tab[1].args); } @@ -448,7 +448,7 @@ void irq1_callback(external_irq_callback_args_t *p_args) void irq2_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(2 == pin_irq_hdr_tab[2].pin) + if (2 == pin_irq_hdr_tab[2].pin) { pin_irq_hdr_tab[2].hdr(pin_irq_hdr_tab[2].args); } @@ -458,7 +458,7 @@ void irq2_callback(external_irq_callback_args_t *p_args) void irq3_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(3 == pin_irq_hdr_tab[3].pin) + if (3 == pin_irq_hdr_tab[3].pin) { pin_irq_hdr_tab[3].hdr(pin_irq_hdr_tab[3].args); } @@ -468,7 +468,7 @@ void irq3_callback(external_irq_callback_args_t *p_args) void irq4_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(4 == pin_irq_hdr_tab[4].pin) + if (4 == pin_irq_hdr_tab[4].pin) { pin_irq_hdr_tab[4].hdr(pin_irq_hdr_tab[4].args); } @@ -478,7 +478,7 @@ void irq4_callback(external_irq_callback_args_t *p_args) void irq5_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(5 == pin_irq_hdr_tab[5].pin) + if (5 == pin_irq_hdr_tab[5].pin) { pin_irq_hdr_tab[5].hdr(pin_irq_hdr_tab[5].args); } @@ -488,7 +488,7 @@ void irq5_callback(external_irq_callback_args_t *p_args) void irq6_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(6 == pin_irq_hdr_tab[6].pin) + if (6 == pin_irq_hdr_tab[6].pin) { pin_irq_hdr_tab[6].hdr(pin_irq_hdr_tab[6].args); } @@ -498,7 +498,7 @@ void irq6_callback(external_irq_callback_args_t *p_args) void irq7_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(7 == pin_irq_hdr_tab[7].pin) + if (7 == pin_irq_hdr_tab[7].pin) { pin_irq_hdr_tab[7].hdr(pin_irq_hdr_tab[7].args); } @@ -508,7 +508,7 @@ void irq7_callback(external_irq_callback_args_t *p_args) void irq8_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(8 == pin_irq_hdr_tab[8].pin) + if (8 == pin_irq_hdr_tab[8].pin) { pin_irq_hdr_tab[8].hdr(pin_irq_hdr_tab[8].args); } @@ -518,7 +518,7 @@ void irq8_callback(external_irq_callback_args_t *p_args) void irq9_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(9 == pin_irq_hdr_tab[9].pin) + if (9 == pin_irq_hdr_tab[9].pin) { pin_irq_hdr_tab[9].hdr(pin_irq_hdr_tab[9].args); } @@ -528,7 +528,7 @@ void irq9_callback(external_irq_callback_args_t *p_args) void irq10_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(10 == pin_irq_hdr_tab[10].pin) + if (10 == pin_irq_hdr_tab[10].pin) { pin_irq_hdr_tab[10].hdr(pin_irq_hdr_tab[10].args); } @@ -538,7 +538,7 @@ void irq10_callback(external_irq_callback_args_t *p_args) void irq11_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(11 == pin_irq_hdr_tab[11].pin) + if (11 == pin_irq_hdr_tab[11].pin) { pin_irq_hdr_tab[11].hdr(pin_irq_hdr_tab[11].args); } @@ -548,7 +548,7 @@ void irq11_callback(external_irq_callback_args_t *p_args) void irq12_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(12 == pin_irq_hdr_tab[12].pin) + if (12 == pin_irq_hdr_tab[12].pin) { pin_irq_hdr_tab[12].hdr(pin_irq_hdr_tab[12].args); } @@ -558,7 +558,7 @@ void irq12_callback(external_irq_callback_args_t *p_args) void irq13_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(13 == pin_irq_hdr_tab[13].pin) + if (13 == pin_irq_hdr_tab[13].pin) { pin_irq_hdr_tab[13].hdr(pin_irq_hdr_tab[13].args); } @@ -568,7 +568,7 @@ void irq13_callback(external_irq_callback_args_t *p_args) void irq14_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(14 == pin_irq_hdr_tab[14].pin) + if (14 == pin_irq_hdr_tab[14].pin) { pin_irq_hdr_tab[14].hdr(pin_irq_hdr_tab[14].args); } @@ -578,7 +578,7 @@ void irq14_callback(external_irq_callback_args_t *p_args) void irq15_callback(external_irq_callback_args_t *p_args) { rt_interrupt_enter(); - if(15 == pin_irq_hdr_tab[15].pin) + if (15 == pin_irq_hdr_tab[15].pin) { pin_irq_hdr_tab[15].hdr(pin_irq_hdr_tab[15].args); } diff --git a/bsp/ra6m4-cpk/drivers/drv_rtc.c b/bsp/ra6m4-cpk/drivers/drv_rtc.c new file mode 100644 index 0000000000..342d598587 --- /dev/null +++ b/bsp/ra6m4-cpk/drivers/drv_rtc.c @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-14 Mr.Tiger first version + */ + +#include +#include +#include "board.h" +#include +#include "hal_data.h" + +#ifdef BSP_USING_ONCHIP_RTC + +#define DBG_TAG "drv.rtc" +#ifdef DRV_DEBUG + #define DBG_LVL DBG_LOG +#else + #define DBG_LVL DBG_INFO +#endif /* DRV_DEBUG */ +#include + +static rt_err_t ra_rtc_init(void) +{ + rt_err_t result = RT_EOK; + + if (R_RTC_Open(&g_rtc_ctrl, &g_rtc_cfg) != RT_EOK) + { + LOG_E("rtc init failed."); + result = -RT_ERROR; + } + + return result; +} + +static time_t get_rtc_timestamp(void) +{ + struct tm tm_new = {0}; + rtc_time_t g_current_time = {0}; + + R_RTC_CalendarTimeGet(&g_rtc_ctrl, &g_current_time); + + tm_new.tm_year = g_current_time.tm_year; + tm_new.tm_mon = g_current_time.tm_mon; + tm_new.tm_mday = g_current_time.tm_mday; + + tm_new.tm_hour = g_current_time.tm_hour; + tm_new.tm_min = g_current_time.tm_min; + tm_new.tm_sec = g_current_time.tm_sec; + + tm_new.tm_wday = g_current_time.tm_wday; + tm_new.tm_yday = g_current_time.tm_yday; + tm_new.tm_isdst = g_current_time.tm_isdst; + + return timegm(&tm_new); +} + +static rt_err_t ra_get_secs(void *args) +{ + *(rt_uint32_t *)args = get_rtc_timestamp(); + LOG_D("RTC: get rtc_time %x\n", *(rt_uint32_t *)args); + + return RT_EOK; +} + +static rt_err_t set_rtc_time_stamp(time_t time_stamp) +{ + struct tm *p_tm; + rtc_time_t g_current_time = {0}; + p_tm = gmtime(&time_stamp); + if (p_tm->tm_year < 100) + { + return -RT_ERROR; + } + + g_current_time.tm_sec = p_tm->tm_sec ; + g_current_time.tm_min = p_tm->tm_min ; + g_current_time.tm_hour = p_tm->tm_hour; + + g_current_time.tm_mday = p_tm->tm_mday; + g_current_time.tm_mon = p_tm->tm_mon; + g_current_time.tm_year = p_tm->tm_year; + + g_current_time.tm_wday = p_tm->tm_wday; + g_current_time.tm_yday = p_tm->tm_yday; + + if (R_RTC_CalendarTimeSet(&g_rtc_ctrl, &g_current_time) != FSP_SUCCESS) + { + LOG_E("set rtc time failed."); + return -RT_ERROR; + } + + return RT_EOK; +} + +static rt_err_t ra_set_secs(void *args) +{ + + rt_err_t result = RT_EOK; + + if (set_rtc_time_stamp(*(rt_uint32_t *)args)) + { + result = -RT_ERROR; + } + LOG_D("RTC: set rtc_time %x\n", *(rt_uint32_t *)args); + + return result; +} + +static rt_err_t ra_get_alarm(void *arg) +{ + rt_err_t result = RT_EOK; + struct rt_rtc_wkalarm *wkalarm = (struct rt_rtc_wkalarm *)arg; + rtc_alarm_time_t alarm_time_get = + { + .sec_match = RT_FALSE, + .min_match = RT_FALSE, + .hour_match = RT_FALSE, + .mday_match = RT_FALSE, + .mon_match = RT_FALSE, + .year_match = RT_FALSE, + .dayofweek_match = RT_FALSE, + }; + + if (RT_EOK == R_RTC_CalendarAlarmGet(&g_rtc_ctrl, &alarm_time_get)) + { + wkalarm->tm_hour = alarm_time_get.time.tm_hour; + wkalarm->tm_min = alarm_time_get.time.tm_min; + wkalarm->tm_sec = alarm_time_get.time.tm_sec; + } + else + { + LOG_E("Calendar alarm Get failed."); + } + + return result; +} + +static rt_err_t ra_set_alarm(void *arg) +{ + rt_err_t result = RT_EOK; + struct rt_rtc_wkalarm *wkalarm = (struct rt_rtc_wkalarm *)arg; + rtc_alarm_time_t alarm_time_set = + { + .sec_match = RT_TRUE, + .min_match = RT_TRUE, + .hour_match = RT_TRUE, + .mday_match = RT_FALSE, + .mon_match = RT_FALSE, + .year_match = RT_FALSE, + .dayofweek_match = RT_FALSE, + }; + + alarm_time_set.time.tm_hour = wkalarm->tm_hour; + alarm_time_set.time.tm_min = wkalarm->tm_min; + alarm_time_set.time.tm_sec = wkalarm->tm_sec; + if (1 == wkalarm->enable) + { + if (RT_EOK != R_RTC_CalendarAlarmSet(&g_rtc_ctrl, &alarm_time_set)) + { + LOG_E("Calendar alarm Set failed."); + result = -RT_ERROR; + } + } + else + { + alarm_time_set.sec_match = RT_FALSE; + alarm_time_set.min_match = RT_FALSE; + alarm_time_set.hour_match = RT_FALSE; + if (RT_EOK != R_RTC_CalendarAlarmSet(&g_rtc_ctrl, &alarm_time_set)) + { + LOG_E("Calendar alarm Stop failed."); + result = -RT_ERROR; + } + } + return result; +} + +static rt_device_t ra_device; + +void rtc_callback(rtc_callback_args_t *p_args) +{ + if (RTC_EVENT_ALARM_IRQ == p_args->event) + { + rt_alarm_update(ra_device, 1); + } +} + +static const struct rt_rtc_ops ra_rtc_ops = +{ + .init = ra_rtc_init, + .get_secs = ra_get_secs, + .set_secs = ra_set_secs, + .set_alarm = ra_set_alarm, + .get_alarm = ra_get_alarm, +}; + +static rt_rtc_dev_t ra_rtc_dev; + +static int rt_hw_rtc_init(void) +{ + rt_err_t result; + + ra_rtc_dev.ops = &ra_rtc_ops; + + result = rt_hw_rtc_register(&ra_rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR, RT_NULL); + if (result != RT_EOK) + { + LOG_E("rtc register err code: %d", result); + return result; + } + LOG_D("rtc init success"); + + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_rtc_init); +#endif \ No newline at end of file diff --git a/bsp/ra6m4-cpk/drivers/drv_wdt.c b/bsp/ra6m4-cpk/drivers/drv_wdt.c new file mode 100644 index 0000000000..280c1444bf --- /dev/null +++ b/bsp/ra6m4-cpk/drivers/drv_wdt.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-08-20 Mr.Tiger first version + */ + +#include +#include +#include +#include +#include +#include + +#ifdef RT_USING_WDT + +//#define DRV_DEBUG +#define LOG_TAG "drv.wdt" +#include + +static struct rt_watchdog_device ra_wdt_dev; +static struct rt_watchdog_ops ops; + +static rt_err_t wdt_init(rt_watchdog_t *wdt) +{ + return RT_EOK; +} + +static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg) +{ + struct st_wdt_timeout_values *wdt_value = {0}; + switch (cmd) + { + /* feed the watchdog */ + case RT_DEVICE_CTRL_WDT_KEEPALIVE: + if(R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS) + { + LOG_E("watch dog keepalive fail."); + } + break; + /* set watchdog timeout */ + case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: + /**< set*/ +// g_wdt_cfg.timeout = *(rt_uint32_t *)arg; + break; + case RT_DEVICE_CTRL_WDT_GET_TIMEOUT: + wdt_value = (struct st_wdt_timeout_values *)arg; + if(R_WDT_TimeoutGet(&g_wdt_ctrl,wdt_value) != FSP_SUCCESS) + { + LOG_E("wdt get timeout failed."); + return -RT_ERROR; + } + break; + case RT_DEVICE_CTRL_WDT_START: + if(R_WDT_Open(&g_wdt_ctrl, &g_wdt_cfg) == FSP_SUCCESS) + { + if(R_WDT_Refresh(&g_wdt_ctrl) != FSP_SUCCESS) + { + LOG_E("wdt start failed."); + return -RT_ERROR; + } + } + else + { + LOG_E("wdt start failed."); + return -RT_ERROR; + } + break; + default: + LOG_W("This command is not supported."); + return -RT_ERROR; + } + return RT_EOK; +} + +int rt_wdt_init(void) +{ + ops.init = &wdt_init; + ops.control = &wdt_control; + ra_wdt_dev.ops = &ops; + /* register watchdog device */ + if (rt_hw_watchdog_register(&ra_wdt_dev, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK) + { + LOG_E("wdt device register failed."); + return -RT_ERROR; + } + LOG_D("wdt device register success."); + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_wdt_init); + +#endif /* RT_USING_WDT */