RTCドライバデバッグ
4797 ワード
この文書では、以前に駆動移植作業を行ったときのRTCのデバッグの概要を記録します.Platform:RK 3368 OS:Android 7.1 RTC:hym 8563
RTCコアファイル
/drivers/rtc/class.c
このファイルはlinuxデバイスモデルコアにクラスRTCを登録し、ドライバに登録/ログアウトインタフェースを提供します.
/drivers/rtc/rtc-dev.c
オープン、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に関するデータ構造の定義
設備の住所と配置:
モジュールhym 8563、バスアドレス:1010 001 R/W
右シフト1位得:0101 0001—>reg=<0 x 51>
dts構成
ボード上のデバイスパス/sys/bus/i 2 c/devices/3-0051
classデバイスノード/sys/class/rtc/rtc 0
駆動経路/sys/bus/i 2 c/drivers/rtc-hym 8563/3-0051
登録に成功しました.
rtcモジュールのi 2 cバスクロックをテストし、hwclock-wリターンを入力してクロックピンの波形変化を検出する
RTC駆動コード分析:
停電後の電源投入時のRTCのシステム時間設定関数はdrivers/rtc/hctosysにある.c
上記の関数を実行してカーネルに印刷する情報は次のとおりです.
i 2 cバス初期化装置関数はdrivers/rtc/rtc-hym 8563にある.c
上位レベルへのインタフェース:/dev/rtc 0
参考記事:
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
RTCコアファイル
/drivers/rtc/class.c
このファイルはlinuxデバイスモデルコアにクラスRTCを登録し、ドライバに登録/ログアウトインタフェースを提供します.
/drivers/rtc/rtc-dev.c
オープン、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に関するデータ構造の定義
設備の住所と配置:
モジュールhym 8563、バスアドレス:1010 001 R/W
右シフト1位得:0101 0001—>reg=<0 x 51>
dts構成
hym8563@51 {
compatible = "haoyu,hym8563";
reg = <0x51>;
#clock-cells = <0>;
};
ボード上のデバイスパス/sys/bus/i 2 c/devices/3-0051
classデバイスノード/sys/class/rtc/rtc 0
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/i 2 c/drivers/rtc-hym 8563/3-0051
登録に成功しました.
rtcモジュールのi 2 cバスクロックをテストし、hwclock-wリターンを入力してクロックピンの波形変化を検出する
RTC駆動コード分析:
停電後の電源投入時のRTCのシステム時間設定関数はdrivers/rtc/hctosysにある.c
/*
* RTC subsystem, initialize system time on startup
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include
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)
",
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
");
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)
",
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
i 2 cバス初期化装置関数はdrivers/rtc/rtc-hym 8563にある.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/rtc 0
参考記事:
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