RTC驅動調試

本文記錄之前做驅動移植工作時調試RTC的一些總結,Platform: RK3368    OS: Android 7.1  RTC:hym8563

 

RTC核心文件
/drivers/rtc/class.c 該文件向linux設備模型核心註冊了一個類RTC,然後向驅動程序提供了註冊/註銷接口
/drivers/rtc/rtc-dev.c 定義了基本的設備文件操作函數,如:open, read 等
/drivers/rtc/interface.c 主要提供了用戶程序與RTC驅動的接口函數,用戶程序一般通過ioctl與RTC 驅動交互,這裏定義了每個ioctl命令需要調用的函數
/drivers/rtc/rtc-sysfs.c 與sysfs有關
/drivers/rtc/rtc-proc.c 與proc文件系統有關
/include/linux/rtc.h

定義了與RTC有關的數據結構

 

 

 

 

 

 

設備地址及配置:

模塊 hym8563,總線地址: 1010 001 R/W

右移一位得:0101 0001 —> reg = <0x51>

dts 配置

hym8563@51 {
        compatible = "haoyu,hym8563";
        reg = <0x51>;
        #clock-cells = <0>;
};

板子上的設備路徑 /sys/bus/i2c/devices/3-0051

class 設備節點 /sys/class/rtc/rtc0

rockchip:/sys/class/rtc/rtc0 $ ls
date device  max_user_freq power       subsystem uevent    
dev  hctosys name          since_epoch time      wakealarm

rockchip:/sys/class/rtc/rtc0 $ cat time
11:33:54
rockchip:/sys/class/rtc/rtc0 $ cat date
2019-01-16
rockchip:/sys/class/rtc/rtc0 $ cat name
hym8563
rockchip:/sys/class/rtc/rtc0 $ cat max_user_freq                              
64
rockchip:/sys/class/rtc/rtc0 $ cat uevent                                     
MAJOR=253
MINOR=0
DEVNAME=rtc0

驅動路徑 /sys/bus/i2c/drivers/rtc-hym8563/3-0051

註冊成功;

測試rtc模塊的 i2c總線時鐘, 輸入 hwclock -w 回車檢測時鐘引腳的波形變化

 RTC驅動代碼分析:

 斷電之後上電時RTC的系統時間設置函數位於 drivers/rtc/hctosys.c

/*                                                                                                                                             
 * RTC subsystem, initialize system time on startup
*/

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/rtc.h>
static int __init rtc_hctosys(void)
{
    int err = -ENODEV;
    struct rtc_time tm;
    struct timespec64 tv64 = {
        .tv_nsec = NSEC_PER_SEC >> 1,
    };
    struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);

    if (rtc == NULL) {
        pr_info("unable to open rtc device (%s)\n",
            CONFIG_RTC_HCTOSYS_DEVICE);
        goto err_open;
    }
    err = rtc_read_time(rtc, &tm);
    if (err) {
        dev_err(rtc->dev.parent,
            "hctosys: unable to read the hardware clock\n");
        goto err_read;
    }

    tv64.tv_sec = rtc_tm_to_time64(&tm);
    err = do_settimeofday64(&tv64);
/*
 *  上電啓動內核時打印 RTC 系統時間設置情況
*/
    dev_info(rtc->dev.parent,
        "setting system clock to "
        "%d-%02d-%02d %02d:%02d:%02d UTC (%lld)\n",
        tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
        tm.tm_hour, tm.tm_min, tm.tm_sec,
        (long long) tv64.tv_sec);

err_read:
    rtc_class_close(rtc);
err_open:
    rtc_hctosys_ret = err;

    return err;
}
late_initcall(rtc_hctosys);                             

執行上面函數在內核中打印的信息如下:

rockchip:/ $ dmesg | grep rtc                                                 
[    1.086439] rtc-hym8563 3-0051: rtc core: registered hym8563 as rtc0
[    2.150024] rtc-hym8563 3-0051: setting system clock to 2019-01-16 11:18:42 UTC (1547637522)
// 在給設備上電時,首先將系統時間設定爲 2019-01-16 11:18:42 UTC
// 然後由系統運行 RTC
rockchip:/ $ date
Wed Jan 16 11:19:13 GMT 2019

i2c 總線初始化設備函數位於  drivers/rtc/rtc-hym8563.c

static int hym8563_init_device(struct i2c_client *client)
{
    int ret;

    /* Clear stop flag if present */
    ret = i2c_smbus_write_byte_data(client, HYM8563_CTL1, 0);  // 寫入控制寄存器 0
    if (ret < 0)
        return ret;

    ret = i2c_smbus_read_byte_data(client, HYM8563_CTL2);   //讀取狀態寄存器,返回0初始化成功
    if (ret < 0)
        return ret;

    /* Disable alarm and timer interrupts */
    ret &= ~HYM8563_CTL2_AIE;
    ret &= ~HYM8563_CTL2_TIE;

    /* Clear any pending alarm and timer flags */
    if (ret & HYM8563_CTL2_AF)
        ret &= ~HYM8563_CTL2_AF;

    if (ret & HYM8563_CTL2_TF)
        ret &= ~HYM8563_CTL2_TF;

    ret &= ~HYM8563_CTL2_TI_TP;
    return i2c_smbus_write_byte_data(client, HYM8563_CTL2, ret);
} 

對上層提供接口: /dev/rtc0

 

參考文章:

rtc 晶振不起振問題:

https://www.cnblogs.com/Pual623548198/p/6683934.html

https://blog.csdn.net/u010278579/article/details/47303297?utm_source=blogxgwz1

https://blog.csdn.net/weiwei_xiaoyu/article/details/82819864

RTC時鐘驅動:https://www.cnblogs.com/wanghuaijun/p/7189733.html

RTC相關寄存器: http://tech.hqew.com/fangan_1852073

設備樹配置:https://www.cnblogs.com/fah936861121/articles/6908230.html 

 https://www.cnblogs.com/lifexy/p/7839625.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章