drivers: counter: add driver for Microchip MCP7940N RTCC
Microchip MCP7940N is a Real-Time Clock/Calendar. It operates on a I2C bus. It can be used to set a calendar time and has two alarm channels. When an alarm is asserted the state of the MPF pin of the MCP7940N will change (depending on gpio active high/active low setting) to trigger an interrupt. Signed-off-by: Kieran Mackey <kieran.mackey@lairdconnect.com>
This commit is contained in:
parent
dfa660de8f
commit
94e006f0fc
6 changed files with 1012 additions and 0 deletions
197
include/drivers/rtc/mcp7940n.h
Normal file
197
include/drivers/rtc/mcp7940n.h
Normal file
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* Copyright (c) 2021 Laird Connectivity
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef ZEPHYR_INCLUDE_DRIVERS_RTC_MCP7940N_H_
|
||||
#define ZEPHYR_INCLUDE_DRIVERS_RTC_MCP7940N_H_
|
||||
|
||||
#include <sys/timeutil.h>
|
||||
#include <time.h>
|
||||
|
||||
struct mcp7940n_rtc_sec {
|
||||
uint8_t sec_one : 4;
|
||||
uint8_t sec_ten : 3;
|
||||
uint8_t start_osc : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_min {
|
||||
uint8_t min_one : 4;
|
||||
uint8_t min_ten : 3;
|
||||
uint8_t nimp : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_hours {
|
||||
uint8_t hr_one : 4;
|
||||
uint8_t hr_ten : 2;
|
||||
uint8_t twelve_hr : 1;
|
||||
uint8_t nimp : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_weekday {
|
||||
uint8_t weekday : 3;
|
||||
uint8_t vbaten : 1;
|
||||
uint8_t pwrfail : 1;
|
||||
uint8_t oscrun : 1;
|
||||
uint8_t nimp : 2;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_date {
|
||||
uint8_t date_one : 4;
|
||||
uint8_t date_ten : 2;
|
||||
uint8_t nimp : 2;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_month {
|
||||
uint8_t month_one : 4;
|
||||
uint8_t month_ten : 1;
|
||||
uint8_t lpyr : 1;
|
||||
uint8_t nimp : 2;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_year {
|
||||
uint8_t year_one : 4;
|
||||
uint8_t year_ten : 4;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_control {
|
||||
uint8_t sqwfs : 2;
|
||||
uint8_t crs_trim : 1;
|
||||
uint8_t ext_osc : 1;
|
||||
uint8_t alm0_en : 1;
|
||||
uint8_t alm1_en : 1;
|
||||
uint8_t sqw_en : 1;
|
||||
uint8_t out : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_rtc_osctrim {
|
||||
uint8_t trim_val : 7;
|
||||
uint8_t sign : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_alm_sec {
|
||||
uint8_t sec_one : 4;
|
||||
uint8_t sec_ten : 3;
|
||||
uint8_t nimp : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_alm_min {
|
||||
uint8_t min_one : 4;
|
||||
uint8_t min_ten : 3;
|
||||
uint8_t nimp : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_alm_hours {
|
||||
uint8_t hr_one : 4;
|
||||
uint8_t hr_ten : 2;
|
||||
uint8_t twelve_hr : 1;
|
||||
uint8_t nimp : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_alm_weekday {
|
||||
uint8_t weekday : 3;
|
||||
uint8_t alm_if : 1;
|
||||
uint8_t alm_msk : 3;
|
||||
uint8_t alm_pol : 1;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_alm_date {
|
||||
uint8_t date_one : 4;
|
||||
uint8_t date_ten : 2;
|
||||
uint8_t nimp : 2;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_alm_month {
|
||||
uint8_t month_one : 4;
|
||||
uint8_t month_ten : 1;
|
||||
uint8_t nimp : 3;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_time_registers {
|
||||
struct mcp7940n_rtc_sec rtc_sec;
|
||||
struct mcp7940n_rtc_min rtc_min;
|
||||
struct mcp7940n_rtc_hours rtc_hours;
|
||||
struct mcp7940n_rtc_weekday rtc_weekday;
|
||||
struct mcp7940n_rtc_date rtc_date;
|
||||
struct mcp7940n_rtc_month rtc_month;
|
||||
struct mcp7940n_rtc_year rtc_year;
|
||||
struct mcp7940n_rtc_control rtc_control;
|
||||
struct mcp7940n_rtc_osctrim rtc_osctrim;
|
||||
} __packed;
|
||||
|
||||
struct mcp7940n_alarm_registers {
|
||||
struct mcp7940n_alm_sec alm_sec;
|
||||
struct mcp7940n_alm_min alm_min;
|
||||
struct mcp7940n_alm_hours alm_hours;
|
||||
struct mcp7940n_alm_weekday alm_weekday;
|
||||
struct mcp7940n_alm_date alm_date;
|
||||
struct mcp7940n_alm_month alm_month;
|
||||
} __packed;
|
||||
|
||||
enum mcp7940n_register {
|
||||
REG_RTC_SEC = 0x0,
|
||||
REG_RTC_MIN = 0x1,
|
||||
REG_RTC_HOUR = 0x2,
|
||||
REG_RTC_WDAY = 0x3,
|
||||
REG_RTC_DATE = 0x4,
|
||||
REG_RTC_MONTH = 0x5,
|
||||
REG_RTC_YEAR = 0x6,
|
||||
REG_RTC_CONTROL = 0x7,
|
||||
REG_RTC_OSCTRIM = 0x8,
|
||||
/* 0x9 not implemented */
|
||||
REG_ALM0_SEC = 0xA,
|
||||
REG_ALM0_MIN = 0xB,
|
||||
REG_ALM0_HOUR = 0xC,
|
||||
REG_ALM0_WDAY = 0xD,
|
||||
REG_ALM0_DATE = 0xE,
|
||||
REG_ALM0_MONTH = 0xF,
|
||||
/* 0x10 not implemented */
|
||||
REG_ALM1_SEC = 0x11,
|
||||
REG_ALM1_MIN = 0x12,
|
||||
REG_ALM1_HOUR = 0x13,
|
||||
REG_ALM1_WDAY = 0x14,
|
||||
REG_ALM1_DATE = 0x15,
|
||||
REG_ALM1_MONTH = 0x16,
|
||||
/* 0x17 not implemented */
|
||||
REG_PWR_DWN_MIN = 0x18,
|
||||
REG_PWR_DWN_HOUR = 0x19,
|
||||
REG_PWR_DWN_DATE = 0x1A,
|
||||
REG_PWR_DWN_MONTH = 0x1B,
|
||||
REG_PWR_UP_MIN = 0x1C,
|
||||
REG_PWR_UP_HOUR = 0x1D,
|
||||
REG_PWR_UP_DATE = 0x1E,
|
||||
REG_PWR_UP_MONTH = 0x1F,
|
||||
SRAM_MIN = 0x20,
|
||||
SRAM_MAX = 0x5F,
|
||||
REG_INVAL = 0x60,
|
||||
};
|
||||
|
||||
/* Mutually exclusive alarm trigger settings */
|
||||
enum mcp7940n_alarm_trigger {
|
||||
MCP7940N_ALARM_TRIGGER_SECONDS = 0x0,
|
||||
MCP7940N_ALARM_TRIGGER_MINUTES = 0x1,
|
||||
MCP7940N_ALARM_TRIGGER_HOURS = 0x2,
|
||||
MCP7940N_ALARM_TRIGGER_WDAY = 0x3,
|
||||
MCP7940N_ALARM_TRIGGER_DATE = 0x4,
|
||||
/* TRIGGER_ALL matches seconds, minutes, hours, weekday, date and month */
|
||||
MCP7940N_ALARM_TRIGGER_ALL = 0x7,
|
||||
};
|
||||
|
||||
/** @brief Set the RTC to a given Unix time
|
||||
*
|
||||
* The RTC advances one tick per second with no access to sub-second
|
||||
* precision. This function will convert the given unix_time into seconds,
|
||||
* minutes, hours, day of the week, day of the month, month and year.
|
||||
* A Unix time of '0' means a timestamp of 00:00:00 UTC on Thursday 1st January
|
||||
* 1970.
|
||||
*
|
||||
* @param dev the MCP7940N device pointer.
|
||||
* @param unix_time Unix time to set the rtc to.
|
||||
*
|
||||
* @retval return 0 on success, or a negative error code from an I2C
|
||||
* transaction or invalid parameter.
|
||||
*/
|
||||
int mcp7940n_rtc_set_time(const struct device *dev, time_t unix_time);
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_DRIVERS_RTC_MCP7940N_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue