You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2022/02/26 14:47:34 UTC

[incubator-nuttx] branch master updated: Add EPSON RX8010SJ I2C RTC timer support

This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new fb6f058  Add EPSON RX8010SJ I2C RTC timer support
fb6f058 is described below

commit fb6f0583955c89726307ca43e8af01ed0e24d3f9
Author: liuzhao <ha...@yeah.net>
AuthorDate: Thu Feb 24 14:43:33 2022 +0800

    Add EPSON RX8010SJ I2C RTC timer support
---
 drivers/timers/Kconfig        |  18 ++
 drivers/timers/Make.defs      |   6 +
 drivers/timers/rx8010.c       | 585 ++++++++++++++++++++++++++++++++++++++++++
 drivers/timers/rx8010.h       |  76 ++++++
 include/nuttx/timers/rx8010.h |  77 ++++++
 5 files changed, 762 insertions(+)

diff --git a/drivers/timers/Kconfig b/drivers/timers/Kconfig
index 62d2ce1..e5bab3d 100644
--- a/drivers/timers/Kconfig
+++ b/drivers/timers/Kconfig
@@ -291,6 +291,24 @@ config MCP794XX_I2C_FREQUENCY
 
 endif # RTC_MCP794XX
 
+config RTC_RX8010SJ
+	bool "RX8010SJ RTC Driver"
+	default n
+	select I2C
+	select RTC_DATETIME
+	depends on RTC_EXTERNAL
+	---help---
+		Enables support for the EPSON RX-8010SJ I2C RTC timer.
+
+if RTC_RX8010SJ
+
+config RX8010SJ_I2C_FREQUENCY
+	int "RX8010SJ I2C frequency"
+	default 400000
+	range 1 400000
+
+endif # RTC_RX8010SJ
+
 config RTC_RPMSG
 	bool "Rpmsg RTC Driver"
 	default n
diff --git a/drivers/timers/Make.defs b/drivers/timers/Make.defs
index b4b5118..902391a 100644
--- a/drivers/timers/Make.defs
+++ b/drivers/timers/Make.defs
@@ -68,6 +68,12 @@ ifeq ($(CONFIG_RTC_MCP794XX),y)
   TMRVPATH = :timers
 endif
 
+ifeq ($(CONFIG_RTC_RX8010SJ),y)
+  CSRCS += rx8010.c
+  TMRDEPPATH = --dep-path timers
+  TMRVPATH = :timers
+endif
+
 ifeq ($(CONFIG_RTC_RPMSG),y)
   CSRCS += rpmsg_rtc.c
   TMRDEPPATH = --dep-path timers
diff --git a/drivers/timers/rx8010.c b/drivers/timers/rx8010.c
new file mode 100644
index 0000000..c7a9382
--- /dev/null
+++ b/drivers/timers/rx8010.c
@@ -0,0 +1,585 @@
+/****************************************************************************
+ * drivers/timers/rx8010.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <time.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/i2c/i2c_master.h>
+#include <nuttx/timers/rx8010.h>
+
+#include "rx8010.h"
+
+#ifdef CONFIG_RTC_RX8010SJ
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Configuration ************************************************************/
+
+/* This RTC implementation supports only date/time RTC hardware */
+
+#ifndef CONFIG_RTC_DATETIME
+#  error CONFIG_RTC_DATETIME must be set to use this driver
+#endif
+
+#ifdef CONFIG_RTC_HIRES
+#  error CONFIG_RTC_HIRES must NOT be set with this driver
+#endif
+
+#ifndef CONFIG_RX8010SJ_I2C_FREQUENCY
+#  error CONFIG_RX8010SJ_I2C_FREQUENCY is not configured
+#  define CONFIG_RX8010SJ_I2C_FREQUENCY 400000
+#endif
+
+#if CONFIG_RX8010SJ_I2C_FREQUENCY > 400000
+#  error CONFIG_RX8010SJ_I2C_FREQUENCY is out of range
+#endif
+
+#define RX8010_I2C_ADDRESS 0x32
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/* This structure describes the state of the RX8010SJ chip.
+ * Only a single RTC is supported.
+ */
+
+struct rx8010_dev_s
+{
+  FAR struct i2c_master_s *i2c;  /* Contained reference to the I2C bus driver */
+};
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* g_rtc_enabled is set true after the RTC has successfully initialized */
+
+volatile bool g_rtc_enabled = false;
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/* The state of the RX8010 chip.  Only a single RTC is supported */
+
+static struct rx8010_dev_s g_rx8010;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static int rx8010_init(void);
+
+/****************************************************************************
+ * Name: rtc_dumptime
+ *
+ * Description:
+ *   Show the broken out time.
+ *
+ * Input Parameters:
+ *   None
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_DEBUG_RTC_INFO
+static void rtc_dumptime(FAR struct tm *tp, FAR const char *msg)
+{
+  rtcinfo("%s:\n", msg);
+  rtcinfo("   tm_sec: %08x\n", tp->tm_sec);
+  rtcinfo("   tm_min: %08x\n", tp->tm_min);
+  rtcinfo("  tm_hour: %08x\n", tp->tm_hour);
+  rtcinfo("  tm_mday: %08x\n", tp->tm_mday);
+  rtcinfo("   tm_mon: %08x\n", tp->tm_mon);
+  rtcinfo("  tm_year: %08x\n", tp->tm_year);
+  rtcinfo("  tm_wday: %08x\n", tp->tm_wday);
+  rtcinfo("  tm_yday: %08x\n", tp->tm_yday);
+  rtcinfo(" tm_isdst: %08x\n", tp->tm_isdst);
+}
+#else
+#  define rtc_dumptime(tp, msg)
+#endif
+
+/****************************************************************************
+ * Name: rtc_bin2bcd
+ *
+ * Description:
+ *   Converts a 2 digit binary to BCD format
+ *
+ * Input Parameters:
+ *   value - The byte to be converted.
+ *
+ * Returned Value:
+ *   The value in BCD representation
+ *
+ ****************************************************************************/
+
+static uint8_t rtc_bin2bcd(int value)
+{
+  uint8_t msbcd = 0;
+
+  while (value >= 10)
+    {
+      msbcd++;
+      value -= 10;
+    }
+
+  return (msbcd << 4) | value;
+}
+
+/****************************************************************************
+ * Name: rtc_bcd2bin
+ *
+ * Description:
+ *   Convert from 2 digit BCD to binary.
+ *
+ * Input Parameters:
+ *   value - The BCD value to be converted.
+ *
+ * Returned Value:
+ *   The value in binary representation
+ *
+ ****************************************************************************/
+
+static int rtc_bcd2bin(uint8_t value)
+{
+  int tens = ((int)value >> 4) * 10;
+  return tens + (value & 0x0f);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: dsxxxx_rtc_initialize
+ *
+ * Description:
+ *   Initialize the hardware RTC per the selected configuration.
+ *   This function is called once during the OS initialization sequence by
+ *   board-specific logic.
+ *
+ *   After dsxxxx_rtc_initialize() is called, the OS function
+ *   clock_synchronize() should also be called to synchronize the system
+ *   timer to a hardware RTC.  That operation is normally performed
+ *   automatically by the system during clock initialization.  However, when
+ *   an external RTC is used, the board logic will need to explicitly
+ *   re-synchronize the system timer to the RTC when the RTC becomes
+ *   available.
+ *
+ * Input Parameters:
+ *   None
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno on failure
+ *
+ ****************************************************************************/
+
+int rx8010_rtc_initialize(FAR struct i2c_master_s *i2c)
+{
+  int ret;
+
+  /* Remember the i2c device and claim that the RTC is enabled */
+
+  g_rx8010.i2c  = i2c;
+  g_rtc_enabled = true;
+
+  ret = rx8010_init();
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+  return OK;
+}
+
+/****************************************************************************
+ * Name: up_rtc_getdatetime
+ *
+ * Description:
+ *   Get the current date and time from the date/time RTC.  This interface
+ *   is only supported by the date/time RTC hardware implementation.
+ *   It is used to replace the system timer.  It is only used by the RTOS
+ *   during initialization to set up the system time when CONFIG_RTC and
+ *   CONFIG_RTC_DATETIME are selected (and CONFIG_RTC_HIRES is not).
+ *
+ *   NOTE:
+ *   Some date/time RTC hardware is capability of sub-second accuracy.
+ *   That sub-second accuracy is lost in this interface.  However, since the
+ *   system time is reinitialized on each power-up/reset, there will be no
+ *   timing inaccuracy in the long run.
+ *
+ * Input Parameters:
+ *   tp - The location to return the high resolution time value.
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno on failure
+ *
+ ****************************************************************************/
+
+int up_rtc_getdatetime(FAR struct tm *tp)
+{
+  struct i2c_msg_s msg[4];
+  uint8_t secaddr;
+  uint8_t buffer[7];
+  uint8_t seconds;
+  int ret;
+
+  /* If this function is called before the RTC has been initialized
+   * (and it will be), then just return the data/time of the epoch,
+   * 12:00 am, Jan 1, 1970.
+   */
+
+  tp->tm_sec  = 0;
+  tp->tm_min  = 0;
+  tp->tm_hour = 0;
+
+  /* Jan 1, 1970 was a Thursday */
+
+  tp->tm_wday = 4;
+  tp->tm_mday = 1;
+  tp->tm_mon  = 0;
+  tp->tm_year = 70;
+
+  if (!g_rtc_enabled)
+    {
+      return -EAGAIN;
+    }
+
+  /* Select to begin reading at the seconds register */
+
+  /* Set up to read 7 registers: secondss, minutes, hour, day-of-week, date,
+   * month, year
+   */
+
+  secaddr          = RX8010_TIME_SECR;
+
+  msg[0].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[0].addr      = RX8010_I2C_ADDRESS;
+  msg[0].flags     = 0;
+  msg[0].buffer    = &secaddr;
+  msg[0].length    = 1;
+
+  msg[1].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[1].addr      = RX8010_I2C_ADDRESS;
+  msg[1].flags     = I2C_M_READ;
+  msg[1].buffer    = buffer;
+  msg[1].length    = 7;
+
+  /* Read the seconds register again */
+
+  msg[2].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[2].addr      = RX8010_I2C_ADDRESS;
+  msg[2].flags     = 0;
+  msg[2].buffer    = &secaddr;
+  msg[2].length    = 1;
+
+  msg[3].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[3].addr      = RX8010_I2C_ADDRESS;
+  msg[3].flags     = I2C_M_READ;
+  msg[3].buffer    = &seconds;
+  msg[3].length    = 1;
+
+  /* Perform the transfer.  The transfer may be performed repeatedly of the
+   * seconds values decreases, meaning that that was a rollover in the
+   * seconds.
+   */
+
+  ret = I2C_TRANSFER(g_rx8010.i2c, msg, 2);
+  if (ret < 0)
+    {
+      rtcerr("ERROR: I2C_TRANSFER failed: %d\n", ret);
+      return ret;
+    }
+
+  /* Format the return time */
+
+  /* Return seconds (0-61) */
+
+  tp->tm_sec = rtc_bcd2bin(buffer[0] & RX8010_TIME_SEC_BCDMASK);
+
+  /* Return minutes (0-59) */
+
+  tp->tm_min = rtc_bcd2bin(buffer[1] & RX8010_TIME_MIN_BCDMASK);
+
+  /* Return hour (0-23).  This assumes 24-hour time was set. */
+
+  tp->tm_hour = rtc_bcd2bin(buffer[2] & RX8010_TIME_HOUR24_BCDMASK);
+
+  /* Return the day of the week (0-6) */
+
+  tp->tm_wday = (rtc_bcd2bin(buffer[3]) & RX8010_TIME_DAY_MASK) - 1;
+
+  /* Return the day of the month (1-31) */
+
+  tp->tm_mday = rtc_bcd2bin(buffer[4] & RX8010_TIME_DATE_BCDMASK);
+
+  /* Return the month (0-11) */
+
+  tp->tm_mon = rtc_bcd2bin(buffer[5] & RX8010_TIME_MONTH_BCDMASK) - 1;
+
+  /* Return the years since 1900 */
+
+  tp->tm_year = rtc_bcd2bin(buffer[6] & RX8010_TIME_YEAR_BCDMASK) + 100;
+
+  rtc_dumptime(tp, "Returning");
+  return OK;
+}
+
+/****************************************************************************
+ * Name: up_rtc_settime
+ *
+ * Description:
+ *   Set the RTC to the provided time.  All RTC implementations must be able
+ *   to set their time based on a standard timespec.
+ *
+ * Input Parameters:
+ *   tp - the time to use
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno on failure
+ *
+ ****************************************************************************/
+
+int up_rtc_settime(FAR const struct timespec *tp)
+{
+  struct i2c_msg_s msg[3];
+  struct tm newtm;
+  time_t newtime;
+  uint8_t buffer[8];
+  uint8_t seconds;
+  uint8_t cmd;
+  int ret;
+
+  /* If this function is called before the RTC has been initialized then just
+   * return an error.
+   */
+
+  if (!g_rtc_enabled)
+    {
+      return -EAGAIN;
+    }
+
+  rtcinfo("Setting time tp=(%d,%d)\n", (int)tp->tv_sec, (int)tp->tv_nsec);
+
+  /* Get the broken out time */
+
+  newtime = (time_t)tp->tv_sec;
+  if (tp->tv_nsec >= 500000000)
+    {
+      /* Round up */
+
+      newtime++;
+    }
+
+  if (localtime_r(&newtime, &newtm) == NULL)
+    {
+      rtcerr("ERROR: localtime_r failed\n");
+      return -EINVAL;
+    }
+
+  rtc_dumptime(&newtm, "New time");
+
+  /* Construct the message */
+
+  /* Write starting with the seconds register */
+
+  buffer[0] = RX8010_TIME_SECR;
+
+  /* Save seconds (0-59) converted to BCD */
+
+  buffer[1] = rtc_bin2bcd(newtm.tm_sec);
+
+  /* Save minutes (0-59) converted to BCD */
+
+  buffer[2] = rtc_bin2bcd(newtm.tm_min);
+
+  /* Save hour (0-23) with 24-hour time indication */
+
+  buffer[3] = rtc_bin2bcd(newtm.tm_hour);
+
+  /* Save the day of the week (1-7) */
+
+  buffer[4] = rtc_bin2bcd(newtm.tm_wday + 1);
+
+  /* Save the day of the month (1-31) */
+
+  buffer[5] = rtc_bin2bcd(newtm.tm_mday);
+
+  /* Save the month (1-12) with century */
+
+  buffer[6] = rtc_bin2bcd(newtm.tm_mon + 1);
+
+  /* Save the year */
+
+  buffer[7] = rtc_bin2bcd(newtm.tm_year - 100);
+
+  /* Setup the I2C message */
+
+  msg[0].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[0].addr      = RX8010_I2C_ADDRESS;
+  msg[0].flags     = 0;
+  msg[0].buffer    = buffer;
+  msg[0].length    = 8;
+
+  /* Read back the seconds register */
+
+  cmd              = RX8010_TIME_SECR;
+
+  msg[1].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[1].addr      = RX8010_I2C_ADDRESS;
+  msg[1].flags     = 0;
+  msg[1].buffer    = &cmd;
+  msg[1].length    = 1;
+
+  msg[2].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[2].addr      = RX8010_I2C_ADDRESS;
+  msg[2].flags     = I2C_M_READ;
+  msg[2].buffer    = &seconds;
+  msg[2].length    = 1;
+
+  /* Perform the transfer.  This transfer will be repeated if the seconds
+   * count rolls over to a smaller value while writing.
+   */
+
+  do
+    {
+      ret = I2C_TRANSFER(g_rx8010.i2c, msg, 3);
+      if (ret < 0)
+        {
+          rtcerr("ERROR: I2C_TRANSFER failed: %d\n", ret);
+          return ret;
+        }
+    }
+  while ((buffer[1] & RX8010_TIME_SEC_BCDMASK) >
+            (seconds & RX8010_TIME_SEC_BCDMASK));
+
+  return OK;
+}
+
+static int rx8010_init(void)
+{
+  struct i2c_msg_s msg[6];
+  uint8_t buffer[5][2];
+  int ret;
+
+  /* set reserved register 0x17 with specified value of 0xd8 */
+
+  buffer[0][0] = RX8010_RESV17;
+  buffer[0][1] = 0xd8;
+  msg[0].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[0].addr      = RX8010_I2C_ADDRESS;
+  msg[0].flags     = 0;
+  msg[0].buffer    = buffer[0];
+  msg[0].length    = 2;
+
+  /* set reserved register 0x30 with specified value of 0x00 */
+
+  buffer[1][0] = RX8010_RESV30;
+  buffer[1][1] = 0x00;
+  msg[1].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[1].addr      = RX8010_I2C_ADDRESS;
+  msg[1].flags     = 0;
+  msg[1].buffer    = buffer[1];
+  msg[1].length    = 2;
+
+  /* set reserved register 0x31 with specified value of 0x08 */
+
+  buffer[2][0] = RX8010_RESV31;
+  buffer[2][1] = 0x08;
+  msg[2].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[2].addr      = RX8010_I2C_ADDRESS;
+  msg[2].flags     = 0;
+  msg[2].buffer    = buffer[2];
+  msg[2].length    = 2;
+
+  /* set reserved register 0x32 with default value */
+
+  buffer[3][0] = RX8010_IRQ;
+  buffer[3][1] = 0x00;
+  msg[3].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[3].addr      = RX8010_I2C_ADDRESS;
+  msg[3].flags     = 0;
+  msg[3].buffer    = buffer[3];
+  msg[3].length    = 2;
+
+  /* read rx8010 flag */
+
+  buffer[4][1] = RX8010_FLAG;
+  uint8_t flag = 0;
+
+  msg[4].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[4].addr      = RX8010_I2C_ADDRESS;
+  msg[4].flags     = 0;
+  msg[4].buffer    = buffer[4];
+  msg[4].length    = 1;
+
+  msg[5].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+  msg[5].addr      = RX8010_I2C_ADDRESS;
+  msg[5].flags     = I2C_M_READ;
+  msg[5].buffer    = &flag;
+  msg[5].length    = 1;
+
+  ret = I2C_TRANSFER(g_rx8010.i2c, msg, 6);
+  if (ret < 0)
+    {
+      rtcerr("ERROR: I2C_TRANSFER failed: %d\n", ret);
+      return ret;
+    }
+
+  if ((flag & RX8010_FLAG_VLF) != 0)
+    {
+      rtcwarn("WARN: RX8010 Frequency stop was detected\n");
+      uint8_t rtc_buffer[4] = {
+        RX8010_EXT, 0x00, 0x00, 0x00
+      };
+
+      msg[0].frequency = CONFIG_RX8010SJ_I2C_FREQUENCY;
+      msg[0].addr      = RX8010_I2C_ADDRESS;
+      msg[0].flags     = 0;
+      msg[0].buffer    = rtc_buffer;
+      msg[0].length    = 4;
+
+      ret = I2C_TRANSFER(g_rx8010.i2c, msg, 1);
+      if (ret < 0)
+        {
+          rtcerr("ERROR: I2C_TRANSFER failed: %d\n", ret);
+          return ret;
+        }
+    }
+
+  return 0;
+}
+
+#endif /* CONFIG_RTC_RX8010SJ */
diff --git a/drivers/timers/rx8010.h b/drivers/timers/rx8010.h
new file mode 100644
index 0000000..9979857
--- /dev/null
+++ b/drivers/timers/rx8010.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * drivers/timers/rx8010.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __DRIVERS_TIMERS_RX8010_H
+#define __DRIVERS_TIMERS_RX8010_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/compiler.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+#define RX8010_TIME_SECR            0x10
+#define RX8010_MIN                  0x11
+#define RX8010_HOUR                 0x12
+#define RX8010_WDAY                 0x13
+#define RX8010_MDAY                 0x14
+#define RX8010_MONTH                0x15
+#define RX8010_YEAR                 0x16
+#define RX8010_RESV17               0x17
+#define RX8010_ALMIN                0x18
+#define RX8010_ALHOUR               0x19
+#define RX8010_ALWDAY               0x1A
+#define RX8010_TCOUNT0              0x1B
+#define RX8010_TCOUNT1              0x1C
+#define RX8010_EXT                  0x1D
+#define RX8010_FLAG                 0x1E
+#define RX8010_CTRL                 0x1F
+/* 0x20 to 0x2F are user registers */
+#define RX8010_RESV30               0x30
+#define RX8010_RESV31               0x31
+#define RX8010_IRQ                  0x32
+
+#define RX8010_TIME_SEC_BCDMASK     0x7f
+#define RX8010_TIME_MIN_BCDMASK     0x7f
+#define RX8010_TIME_HOUR24_BCDMASK  0x3f
+#define RX8010_TIME_DAY_MASK        0x07
+#define RX8010_TIME_DATE_BCDMASK    0x3f
+#define RX8010_TIME_MONTH_BCDMASK   0x1f
+#define RX8010_TIME_YEAR_BCDMASK    0xff
+
+#define RX8010_EXT_WADA             BIT(3)
+
+#define RX8010_FLAG_VLF             (1 << 1)
+#define RX8010_FLAG_AF              (1 << 3)
+#define RX8010_FLAG_TF              (1 << 4)
+#define RX8010_FLAG_UF              (1 << 5)
+
+#define RX8010_CTRL_AIE             BIT(3)
+#define RX8010_CTRL_UIE             BIT(5)
+#define RX8010_CTRL_STOP            BIT(6)
+#define RX8010_CTRL_TEST            BIT(7)
+
+#define RX8010_ALARM_AE             IT(7)
+
+#endif
diff --git a/include/nuttx/timers/rx8010.h b/include/nuttx/timers/rx8010.h
new file mode 100644
index 0000000..ba7e8f0
--- /dev/null
+++ b/include/nuttx/timers/rx8010.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * include/nuttx/timers/rx8010.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __INCLUDE_NUTTX_TIMERS_RX8010_H
+#define __INCLUDE_NUTTX_TIMERS_RX8010_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#ifdef CONFIG_RTC_RX8010SJ
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Name: rx8010_rtc_initialize
+ *
+ * Description:
+ *   Initialize the hardware RTC per the selected configuration.
+ *   This function is called once during the OS initialization sequence by
+ *   board-specific logic.
+ *
+ *   After rx8010_rtc_initialize() is called, the OS function
+ *   clock_synchronize() should also be called to synchronize the system
+ *   timer to the hardware RTC.  That operation is normally performed
+ *   automatically by the system during clock initialization.
+ *   However, when an external RTC is used, the board logic will need to
+ *   explicitly re-synchronize the system timer to the RTC when the RTC
+ *   becomes available.
+ *
+ * Input Parameters:
+ *   None
+ *
+ * Returned Value:
+ *   Zero (OK) on success; a negated errno on failure
+ *
+ ****************************************************************************/
+
+struct i2c_master_s; /* Forward reference */
+int rx8010_rtc_initialize(FAR struct i2c_master_s *i2c);
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_RTC_DSXXXX */
+#endif /* __INCLUDE_NUTTX_TIMERS_RX8010_H */