summaryrefslogtreecommitdiff
path: root/bsp/cvitek/drivers/drv_rtc.c
diff options
context:
space:
mode:
authorflyingcys <[email protected]>2024-11-13 23:23:38 +0800
committerRbb666 <[email protected]>2024-11-25 10:48:36 +0800
commit8ed4ae144fda951d7a3f5ffbfbf810b1ce1bf2c8 (patch)
treec7507ee25195eddb9763e422dd7f2956045229f1 /bsp/cvitek/drivers/drv_rtc.c
parentc2545cdd7bbfb1797aeacf3f7f74420bf7716877 (diff)
support milkv-duo rt-smart
1. switches memory management to SLA 2. use ioremap modification driver Signed-off-by: flyingcys [email protected]
Diffstat (limited to 'bsp/cvitek/drivers/drv_rtc.c')
-rw-r--r--bsp/cvitek/drivers/drv_rtc.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/bsp/cvitek/drivers/drv_rtc.c b/bsp/cvitek/drivers/drv_rtc.c
index a3388afc55..93f2b07082 100644
--- a/bsp/cvitek/drivers/drv_rtc.c
+++ b/bsp/cvitek/drivers/drv_rtc.c
@@ -17,12 +17,13 @@
#include "pinctrl.h"
#include "mmio.h"
+#include "drv_ioremap.h"
-#define CVI_RTC_BASE 0x05026000U
-#define RTC_ALARM_O 17
-#define CVI_RTC_CTRL_BASE 0x05025000U
-#define CLK_EN_0 0x03002000U
-#define CLK_RTC_25M_BIT (1 << 8)
+#define CVI_RTC_BASE 0x05026000U
+#define RTC_ALARM_O 17
+#define CVI_RTC_CTRL_BASE 0x05025000U
+#define CLK_EN_0 0x03002000U
+#define CLK_RTC_25M_BIT (1 << 8)
/* CVITEK RTC registers */
#define CVI_RTC_ANA_CALIB 0x0
@@ -57,6 +58,7 @@
struct rtc_device_object
{
rt_rtc_dev_t rtc_dev;
+ rt_ubase_t base;
};
static struct rtc_device_object rtc_device;
@@ -91,25 +93,26 @@ static int rtc_month_days(unsigned int month, unsigned int year)
static void hal_cvi_rtc_clk_set(int enable)
{
uint32_t clk_state;
+ rt_ubase_t clk = (rt_ubase_t)DRV_IOREMAP((void *)CLK_EN_0, 0x1000);
- clk_state = mmio_read_32((long unsigned int)CLK_EN_0);
+ clk_state = mmio_read_32(clk);
if(enable)
clk_state |= CLK_RTC_25M_BIT;
else
clk_state &= ~(CLK_RTC_25M_BIT);
- mmio_write_32((long unsigned int)CLK_EN_0, clk_state);
+ mmio_write_32(clk, clk_state);
}
static void hal_cvi_rtc_enable_sec_counter(uintptr_t rtc_base)
{
uint32_t value = 0;
- value = mmio_read_32(rtc_base + CVI_RTC_SEC_PULSE_GEN) & ~(1 << 31);
+ value = mmio_read_32(rtc_base + CVI_RTC_SEC_PULSE_GEN) & 0x7FFFFFFF;
mmio_write_32(rtc_base + CVI_RTC_SEC_PULSE_GEN, value);
- value = mmio_read_32(rtc_base + CVI_RTC_ANA_CALIB) & ~(1 << 31);
+ value = mmio_read_32(rtc_base + CVI_RTC_ANA_CALIB) & 0x7FFFFFFF;
mmio_write_32(rtc_base + CVI_RTC_ANA_CALIB, value);
mmio_read_32(rtc_base + CVI_RTC_SEC_CNTR_VALUE);
@@ -239,7 +242,7 @@ static rt_err_t _rtc_get_timeval(struct timeval *tv)
cvi_rtc_time_t t = {0};
struct tm tm_new = {0};
- hal_cvi_rtc_get_time_sec(CVI_RTC_BASE, &sec);
+ hal_cvi_rtc_get_time_sec(rtc_device.base, &sec);
rtc_time64_to_tm(sec, &t);
tm_new.tm_sec = t.tm_sec;
@@ -258,7 +261,7 @@ static rt_err_t _rtc_get_timeval(struct timeval *tv)
static rt_err_t _rtc_init(void)
{
hal_cvi_rtc_clk_set(1);
- hal_cvi_rtc_enable_sec_counter(CVI_RTC_BASE);
+ hal_cvi_rtc_enable_sec_counter(rtc_device.base);
return RT_EOK;
}
@@ -292,7 +295,7 @@ static rt_err_t _rtc_set_secs(time_t *sec)
t.tm_wday = tm.tm_wday;
set_sec = rtc_tm_to_time64(&t);
- hal_cvi_rtc_set_time(CVI_RTC_BASE, set_sec);
+ hal_cvi_rtc_set_time(rtc_device.base, set_sec);
return result;
}
@@ -300,7 +303,7 @@ static rt_err_t _rtc_set_secs(time_t *sec)
#ifdef RT_USING_ALARM
static void rtc_alarm_enable(rt_bool_t enable)
{
- mmio_write_32(CVI_RTC_BASE + CVI_RTC_ALARM_ENABLE, enable);
+ mmio_write_32(rtc_device.base + CVI_RTC_ALARM_ENABLE, enable);
}
static void rt_hw_rtc_isr(int irqno, void *param)
@@ -324,7 +327,7 @@ static rt_err_t _rtc_get_alarm(struct rt_rtc_wkalarm *alarm)
unsigned long int sec;
cvi_rtc_time_t t = {0};
- sec = mmio_read_32(CVI_RTC_BASE + CVI_RTC_ALARM_TIME);
+ sec = mmio_read_32(rtc_device.base + CVI_RTC_ALARM_TIME);
rtc_time64_to_tm(sec, &t);
alarm->tm_sec = t.tm_sec;
@@ -355,7 +358,7 @@ static rt_err_t _rtc_set_alarm(struct rt_rtc_wkalarm *alarm)
t.tm_year = alarm->tm_year;
set_sec = rtc_tm_to_time64(&t);
- mmio_write_32(CVI_RTC_BASE + CVI_RTC_ALARM_TIME, set_sec);
+ mmio_write_32(rtc_device.base + CVI_RTC_ALARM_TIME, set_sec);
LOG_D("GET_ALARM %d:%d:%d", alarm->tm_hour, alarm->tm_min, alarm->tm_sec);
}
@@ -386,6 +389,10 @@ static int rt_hw_rtc_init(void)
rt_err_t result;
rtc_device.rtc_dev.ops = &_rtc_ops;
+
+ rtc_device.base = CVI_RTC_BASE;
+ rtc_device.base = (rt_ubase_t)DRV_IOREMAP((void *)rtc_device.base, 0x1000);
+
result = rt_hw_rtc_register(&rtc_device.rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR, RT_NULL);
if (result != RT_EOK)
{