接口设计
15 Jul 2024
Read time: 5 minute(s)
以下接口是 Linux RTC 子系统需要的标准接口。
外部接口
Linux
对用户态提供了一组 RTC 的 ioctl 接口,用户态可以通过设备节点/dev/rtc0 来访问:(详见 include/upai/linux/rtc.h)
#define RTC_AIE_ON _IO('p', 0x01) /* Alarm int. enable on */
#define RTC_AIE_OFF _IO('p', 0x02) /* ... off */
#define RTC_UIE_ON _IO('p', 0x03) /* Update int. enable on */
#define RTC_UIE_OFF _IO('p', 0x04) /* ... off */
#define RTC_PIE_ON _IO('p', 0x05) /* Periodic int. enable on */
#define RTC_PIE_OFF _IO('p', 0x06) /* ... off */
#define RTC_WIE_ON _IO('p', 0x0f) /* Watchdog int. enable on */
#define RTC_WIE_OFF _IO('p', 0x10) /* ... off */
#define RTC_ALM_SET _IOW('p', 0x07, struct rtc_time) /* Set alarm time */
#define RTC_ALM_READ _IOR('p', 0x08, struct rtc_time) /* Read alarm time */
#define RTC_RD_TIME _IOR('p', 0x09, struct rtc_time) /* Read RTC time */
#define RTC_SET_TIME _IOW('p', 0x0a, struct rtc_time) /* Set RTC time */
#define RTC_IRQP_READ _IOR('p', 0x0b, unsigned long) /* Read IRQ rate */
#define RTC_IRQP_SET _IOW('p', 0x0c, unsigned long) /* Set IRQ rate */
#define RTC_EPOCH_READ _IOR('p', 0x0d, unsigned long) /* Read epoch */
#define RTC_EPOCH_SET _IOW('p', 0x0e, unsigned long) /* Set epoch */
#define RTC_WKALM_SET _IOW('p', 0x0f, struct rtc_wkalrm)/* Set wakeup alarm*/
#define RTC_WKALM_RD _IOR('p', 0x10, struct rtc_wkalrm)/* Get wakeup alarm*/
#define RTC_PLL_GET _IOR('p', 0x11, struct rtc_pll_info) /* Get PLL correction */
#define RTC_PLL_SET _IOW('p', 0x12, struct rtc_pll_info) /* Set PLL correction */
Demo 就是调用的这些接口完成 alarm 配置,以及 hwclock 工具也是调用上述接口。
RTC 相关的内部接口
函数原型 | static int aic_rtc_read_time(struct device *dev, struct rtc_time *tm) |
---|---|
功能说明 | 读取当前的 RTC 时间 |
参数定义 |
|
返回值 | 0,成功 |
注意事项 | - |
函数原型 | static int aic_rtc_set_time(struct device *dev, struct rtc_time *tm) |
---|---|
功能说明 | 设置 RTC 时间 |
参数定义 |
|
返回值 | 0,成功 |
注意事项 | 更新 RTC 控制器的秒数,需要先暂停 RTC 计数,设置完秒数,再使能 RTC。 |
函数原型 | static int aic_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) |
---|---|
功能说明 | 读取当前的 Alarm 状态信息 |
参数定义 |
|
返回值 | 0,成功 |
注意事项 | - |
函数原型 | static int aic_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) |
---|---|
功能说明 | 设置一个 Alarm,并使能 Alarm 中断 |
参数定义 |
|
返回值 | 0,成功 |
注意事项 | - |
函数原型 | static int aic_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
---|---|
功能说明 | 开关 Alarm 中断 |
参数定义 |
|
返回值 | 0,成功 |
注意事项 | - |
系统状态备份相关的内部接口
函数原型 | void aic_rtc_set_bak(u32 offset, u32 mask, u32 shift, u32 val) |
---|---|
功能说明 | 设置 BAK 寄存器中某几个(连续的)bit |
参数定义 |
|
返回值 | 无 |
注意事项 | 设置过程:先将 val 左移,然后再做掩码处理 |
函数原型 | u32 aic_rtc_get_bak(u32 offset, u32 mask, u32 shift) |
---|---|
功能说明 | 读取 BAK 寄存器中某几个(连续的)bit |
参数定义 |
|
返回值 | 实际读取到的寄存器值 |
注意事项 | 读取过程:先将读取到的寄存器当前值做掩码处理,然后再右移 |
函数原型 | void aic_set_software_reboot_reason(enum aic_reboot_reason reason) |
---|---|
功能说明 | 设置 reason 到 SYS_BAK 寄存器 |
参数定义 | reason - aic_reboot_reason 类型的启动原因 |
返回值 | 无 |
注意事项 | aic_reboot_reason 详见 Reboot Reason 的设计 |
函数原型 | enum aic_reboot_reason aic_get_software_reboot_reason(void) |
---|---|
功能说明 | 从 BAK 寄存器中读取上一次系统的 Reboot reason 类型 |
参数定义 | 无 |
返回值 | aic_reboot_reason 类型的启动原因 |
注意事项 | aic_reboot_reason 详见 Reboot Reason 的设计 |