diff --git a/bsp/es32f0654/.config b/bsp/es32f0654/.config index f0af98f0ac..fefdebff2d 100644 --- a/bsp/es32f0654/.config +++ b/bsp/es32f0654/.config @@ -354,6 +354,16 @@ CONFIG_BSP_USING_UART2=y # CONFIG_BSP_USING_HWTIMER2 is not set # CONFIG_BSP_USING_HWTIMER3 is not set +# +# RTC Drivers +# +# CONFIG_BSP_USING_RTC is not set + +# +# PM Drivers +# +# CONFIG_BSP_USING_PM is not set + # # Onboard Peripheral Drivers # diff --git a/bsp/es32f0654/README.md b/bsp/es32f0654/README.md index 87eb82c118..7199fca7b4 100644 --- a/bsp/es32f0654/README.md +++ b/bsp/es32f0654/README.md @@ -42,6 +42,8 @@ ES-PDS-ES32F0654-V1.1 | I2C | 支持 | I2C0/1 | | PWM | 支持 | PWM0/1/2/3 | | TIMER | 支持 | TIMER0/1/2/3 | +| RTC | 支持 | RTC | +| PM | 支持 | Power Management | ### 1.2 注意事项 diff --git a/bsp/es32f0654/drivers/Kconfig b/bsp/es32f0654/drivers/Kconfig index d5af1bbd95..d83a2242da 100644 --- a/bsp/es32f0654/drivers/Kconfig +++ b/bsp/es32f0654/drivers/Kconfig @@ -102,6 +102,20 @@ menu "Hardware Drivers Config" default n endmenu + menu "RTC Drivers" + config BSP_USING_RTC + bool "Using RTC" + select RT_USING_RTC + default n + endmenu + + menu "PM Drivers" + config BSP_USING_PM + bool "Using PM" + select RT_USING_PM + default n + endmenu + endmenu menu "Onboard Peripheral Drivers" diff --git a/bsp/es32f0654/drivers/SConscript b/bsp/es32f0654/drivers/SConscript index 31f75af3b3..781a92ab01 100644 --- a/bsp/es32f0654/drivers/SConscript +++ b/bsp/es32f0654/drivers/SConscript @@ -35,6 +35,14 @@ if GetDepend('BSP_USING_PWM0') or GetDepend('BSP_USING_PWM1') or GetDepend('BSP_ if GetDepend('BSP_USING_HWTIMER0') or GetDepend('BSP_USING_HWTIMER1') or GetDepend('BSP_USING_HWTIMER2') or GetDepend('BSP_USING_HWTIMER3'): src += ['drv_hwtimer.c'] +# add rtc driver code +if GetDepend(['BSP_USING_RTC']): + src += ['drv_rtc.c'] + +# add pm driver code +if GetDepend(['BSP_USING_PM']): + src += ['drv_pm.c'] + CPPPATH = [cwd] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/bsp/es32f0654/drivers/drv_pm.c b/bsp/es32f0654/drivers/drv_pm.c new file mode 100644 index 0000000000..256634b81d --- /dev/null +++ b/bsp/es32f0654/drivers/drv_pm.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-04-01 wangyq the first version + */ + +#include +#include +#include "board.h" +#include "drv_pm.h" +#include + +#ifdef RT_USING_PM + +static void _drv_pm_enter(struct rt_pm *pm) +{ + rt_uint32_t mode; + + mode = pm->current_mode; + + switch (mode) + { + case PM_RUN_MODE_NORMAL: + break; + + case PM_SLEEP_MODE_SLEEP: + __WFI(); + break; + + case PM_SLEEP_MODE_TIMER: + pmu_stop2_enter(); + break; + + case PM_SLEEP_MODE_SHUTDOWN: + pmu_standby_enter(PMU_STANDBY_PORT_NONE); + break; + + default: + RT_ASSERT(0); + break; + } +} + +static void _drv_pm_exit(struct rt_pm *pm) +{ + rt_uint32_t mode; + + RT_ASSERT(pm != RT_NULL); + + mode = pm->current_mode; + + switch (mode) + { + case PM_RUN_MODE_NORMAL: + break; + + case PM_SLEEP_MODE_SLEEP: + break; + + case PM_SLEEP_MODE_TIMER: + break; + + case PM_SLEEP_MODE_SHUTDOWN: + break; + + default: + RT_ASSERT(0); + break; + } +} + +#if PM_RUN_MODE_COUNT > 1 +static void _drv_pm_frequency_change(struct rt_pm *pm, rt_uint32_t frequency) +{ + return; +} +#endif + +static int drv_hw_pm_init(void) +{ + static const struct rt_pm_ops _ops = + { + _drv_pm_enter, + _drv_pm_exit, + +#if PM_RUN_MODE_COUNT > 1 + _drv_pm_frequency_change, +#endif + RT_NULL, + RT_NULL, + RT_NULL + }; + + rt_uint8_t timer_mask; + + /* initialize timer mask */ + timer_mask = 1UL << PM_SLEEP_MODE_TIMER; + + /* initialize system pm module */ + rt_system_pm_init(&_ops, timer_mask, RT_NULL); + + return 0; +} +INIT_BOARD_EXPORT(drv_hw_pm_init); + +#endif diff --git a/bsp/es32f0654/drivers/drv_pm.h b/bsp/es32f0654/drivers/drv_pm.h new file mode 100644 index 0000000000..a4f6cc84ee --- /dev/null +++ b/bsp/es32f0654/drivers/drv_pm.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-04-01 wangyq the first version + */ + +#ifndef DRV_PM_H__ +#define DRV_PM_H__ + +int rt_hw_pm_init(void); + +#endif diff --git a/bsp/es32f0654/drivers/drv_rtc.c b/bsp/es32f0654/drivers/drv_rtc.c new file mode 100644 index 0000000000..0c9822e4e7 --- /dev/null +++ b/bsp/es32f0654/drivers/drv_rtc.c @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-03-22 wangyq the first version + */ + +#include +#include +#include +#include +#include "board.h" +#include "drv_rtc.h" +#include +#include + +#ifdef RT_USING_RTC + +static void rtc_init(rtc_init_t *init) +{ + assert_param(IS_RTC_HOUR_FORMAT(init->hour_format)); + assert_param(IS_RTC_OUTPUT_SEL(init->output)); + assert_param(IS_RTC_OUTPUT_POLARITY(init->output_polarity)); + + rtc_reset(); + RTC_UNLOCK(); + + MODIFY_REG(RTC->CON, RTC_CON_HFM_MSK, init->hour_format << RTC_CON_HFM_POS); + MODIFY_REG(RTC->CON, RTC_CON_EOS_MSK, init->output << RTC_CON_EOS_POSS); + MODIFY_REG(RTC->CON, RTC_CON_POL_MSK, init->output_polarity << RTC_CON_POL_POS); + MODIFY_REG(RTC->PSR, RTC_PSR_SPRS_MSK, init->synch_pre_div << RTC_PSR_SPRS_POSS); + MODIFY_REG(RTC->PSR, RTC_PSR_APRS_MSK, init->asynch_pre_div << RTC_PSR_APRS_POSS); + + RTC_LOCK(); + return; +} + +static rt_err_t es32f0_rtc_control(rt_device_t dev, int cmd, void *args) +{ + rt_err_t result = RT_EOK; + + struct tm time_temp; + struct tm *pNow; + rtc_date_t date; + rtc_time_t time; + + switch (cmd) + { + case RT_DEVICE_CTRL_RTC_GET_TIME: + + rtc_get_date_time(&date, &time, RTC_FORMAT_DEC); + time_temp.tm_sec = time.second; + time_temp.tm_min = time.minute; + time_temp.tm_hour = time.hour; + time_temp.tm_mday = date.day; + time_temp.tm_mon = date.month - 1; + time_temp.tm_year = date.year - 1900 + 2000; + *((time_t *)args) = mktime(&time_temp); + break; + + case RT_DEVICE_CTRL_RTC_SET_TIME: + + rt_enter_critical(); + /* converts calendar time time into local time. */ + pNow = localtime((const time_t *)args); + /* copy the statically located variable */ + memcpy(&time_temp, pNow, sizeof(struct tm)); + /* unlock scheduler. */ + rt_exit_critical(); + + time.hour = time_temp.tm_hour; + time.minute = time_temp.tm_min; + time.second = time_temp.tm_sec; + date.year = time_temp.tm_year + 1900 - 2000; + date.month = time_temp.tm_mon + 1; + date.day = time_temp.tm_mday; + rtc_set_time(&time, RTC_FORMAT_DEC); + rtc_set_date(&date, RTC_FORMAT_DEC); + /* start RTC */ + RTC_UNLOCK(); + SET_BIT(RTC->CON, RTC_CON_GO_MSK); + RTC_LOCK(); + break; + + case RT_DEVICE_CTRL_RTC_GET_ALARM: + break; + + case RT_DEVICE_CTRL_RTC_SET_ALARM: + break; + + default: + break; + } + + return result; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops es32f0_rtc_ops = +{ + RT_NULL, + RT_NULL, + RT_NULL, + RT_NULL, + RT_NULL, + es32f0_rtc_control +}; +#endif + +int rt_hw_rtc_init(void) +{ + rt_err_t ret = RT_EOK; + static struct rt_device rtc_dev; + rtc_init_t rtc_initstruct; + + /* enable external 32.768kHz */ + CMU_LOSC_ENABLE(); + cmu_losc_safe_config(ENABLE); + /* set default time */ + RTC_UNLOCK(); + WRITE_REG(RTC->TIME, 0x134251); + WRITE_REG(RTC->DATE, 0x1190401); + RTC_LOCK(); + /* RTC function initialization */ + rtc_initstruct.hour_format = RTC_HOUR_FORMAT_24; + rtc_initstruct.asynch_pre_div = 0; + rtc_initstruct.synch_pre_div = 32767; + rtc_initstruct.output = RTC_OUTPUT_DISABLE; + rtc_init(&rtc_initstruct); + + rtc_dev.type = RT_Device_Class_RTC; + rtc_dev.rx_indicate = RT_NULL; + rtc_dev.tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + rtc_dev.ops = &es32f0_rtc_ops; +#else + rtc_dev.init = RT_NULL; + rtc_dev.open = RT_NULL; + rtc_dev.close = RT_NULL; + rtc_dev.read = RT_NULL; + rtc_dev.write = RT_NULL; + rtc_dev.control = es32f0_rtc_control; +#endif + + rtc_dev.user_data = RTC; + + ret = rt_device_register(&rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR); + + return ret; +} +INIT_DEVICE_EXPORT(rt_hw_rtc_init); + +#endif diff --git a/bsp/es32f0654/drivers/drv_rtc.h b/bsp/es32f0654/drivers/drv_rtc.h new file mode 100644 index 0000000000..fe0264fb51 --- /dev/null +++ b/bsp/es32f0654/drivers/drv_rtc.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-03-22 wangyq the first version + */ + +#ifndef DRV_RTC_H__ +#define DRV_RTC_H__ + +int rt_hw_rtc_init(void); + +#endif diff --git a/bsp/es32f0654/libraries/SConscript b/bsp/es32f0654/libraries/SConscript index bbc9d5d2e1..6da75a0262 100644 --- a/bsp/es32f0654/libraries/SConscript +++ b/bsp/es32f0654/libraries/SConscript @@ -10,18 +10,17 @@ src = [] src += Glob('ES32F065x_ALD_StdPeriph_Driver/Source/*.c') - -#add for startup script +#add for startup script if rtconfig.CROSS_TOOL == 'gcc': src = src + ['CMSIS/Device/EastSoft/ES32F065x/Startup/gcc/startup_es32f065x.s'] elif rtconfig.CROSS_TOOL == 'keil': src = src + ['CMSIS/Device/EastSoft/ES32F065x/Startup/keil/startup_es32f065x.s'] elif rtconfig.CROSS_TOOL == 'iar': - src = src + ['CMSIS/Device/EastSoft/ES32F065x/Startup/iar/startup_es32f065x.s'] + src = src + ['CMSIS/Device/EastSoft/ES32F065x/Startup/iar/startup_es32f065x.s'] -path = [cwd + '/CMSIS/Device/EastSoft/ES32F065x/Include', - cwd + '/CMSIS/Include', - cwd + '/ES32F065x_ALD_StdPeriph_Driver/Include'] +path = [cwd + '/CMSIS/Device/EastSoft/ES32F065x/Include', + cwd + '/CMSIS/Include', + cwd + '/ES32F065x_ALD_StdPeriph_Driver/Include'] group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path) diff --git a/bsp/es32f0654/rtconfig.h b/bsp/es32f0654/rtconfig.h index 52cb4930e0..b62c1ce6f5 100644 --- a/bsp/es32f0654/rtconfig.h +++ b/bsp/es32f0654/rtconfig.h @@ -175,6 +175,12 @@ /* HWtimer Drivers */ +/* RTC Drivers */ + + +/* PM Drivers */ + + /* Onboard Peripheral Drivers */ diff --git a/bsp/es32f0654/rtconfig.py b/bsp/es32f0654/rtconfig.py index 170bae8a7b..eb371bf3a7 100644 --- a/bsp/es32f0654/rtconfig.py +++ b/bsp/es32f0654/rtconfig.py @@ -46,7 +46,7 @@ if PLATFORM == 'gcc': DEVICE = ' -mcpu=' + CPU + ' -mthumb -ffunction-sections -fdata-sections' CFLAGS = DEVICE AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb' - LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T drivers/linker_scripts/link.lds' CPATH = '' LPATH = ''