色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > linux下的rtc機制

linux下的rtc機制 時間:2014-10-18      來源:未知

Linux的RTC驅動相對還是比較簡單的,可以將它作為一個普通的字符型設備,或者一個misc設備,也可以是一個平臺設備,這都沒有關系,主要還是對rtc_ops這個文件操作結構體中的成員填充,這里主要涉及到兩個方面比較重要:

1. 在Linux中有硬件時鐘與系統時鐘等兩種時鐘。硬件時鐘是指主機板上的時鐘設備,也就是通?稍贐IOS畫面設定的時鐘。系統時鐘則是指kernel中的時鐘。當Linux啟動時,系統時鐘會去讀取硬件時鐘的設定,之后系統時鐘即獨立運作。所有Linux相關指令與函數都是讀取系統時鐘的設定。

系統時鐘的設定就是我們常用的date命令,而我們寫的RTC驅動就是為硬件時鐘服務的,它有屬于自己的命令hwclock,因此使用date命令是不可能調用到我們的驅動的(在這點上開始把我郁悶到了,寫完驅動之后,傻傻的用date指令來測試,當然結果是什么都沒有),我們可以通過hwclock的一些指令來實現更新rtc時鐘——也就是系統時鐘和硬件時鐘的交互。

hwclock –r顯示硬件時鐘與日期

hwclock –s將系統時鐘調整為與目前的硬件時鐘一致。

hwclock –w將硬件時鐘調整為與目前的系統時鐘一致。

用戶輸入 hwclck -s // 這個命令是 把硬件的時鐘更新到系統中去

這個命令會調用busybox源碼中的hwclock.c,在目錄util-linux/hwclock.c 中的 ->int hwclock_main(int argc UNUSED_PARAM, char **argv)

后面的參數會以argv形式接收

opt = getopt32(argv, "lurswtf:", &rtcname);
        會把argv的參數進行轉換 l -> 0x01
        u -> 0x02
        r -> 0x04
        s -> 0x08
        w -> 0x10
        t -> 0x20
        f -> 0x40 
        : -> 0x80
        #define HWCLOCK_OPT_LOCALTIME 0x01 
        #define HWCLOCK_OPT_UTC 0x02
        #define HWCLOCK_OPT_SHOW 0x04 // 等價 hwclock –r 顯示硬件的時間
        #define HWCLOCK_OPT_HCTOSYS 0x08 // 等價 hwclock –s 硬件時間更新到系統時間
        #define HWCLOCK_OPT_SYSTOHC 0x10 // 等價 hwclock –w 系統時間更新到硬件時間 
        #define HWCLOCK_OPT_SYSTZ 0x20
        #define HWCLOCK_OPT_RTCFILE 0x40
         if (opt & (HWCLOCK_OPT_UTC | HWCLOCK_OPT_LOCALTIME)) // 判斷是是否是 hwclock –l -u
         utc = (opt & HWCLOCK_OPT_UTC); 
         if (opt & HWCLOCK_OPT_HCTOSYS) // 判斷是是否是 hwclock –s
        to_sys_clock(&rtcname, utc);
        else if (opt & HWCLOCK_OPT_SYSTOHC) // 判斷是是否是 hwclock –w
        from_sys_clock(&rtcname, utc);
        else
        /* default HWCLOCK_OPT_SHOW */ // 默認是 hwclock –r 
        show_clock(&rtcname, utc);
        hwclock –s ->to_sys_clock-> read_rtc(pp_rtcname, NULL, utc); // 讀rtc的時間
        -> fd = rtc_xopen(pp_rtcname, O_RDONLY)
        *default_rtc = "/dev/rtc";
        rtc = open(*default_rtc, flags);
        *default_rtc = "/dev/rtc0";
        rtc = open(*default_rtc, flags);
        *default_rtc = "/dev/misc/rtc";
        // 會打開這幾個默認的文件
        -> rtc_read_tm(&tm_time, fd);
        -> xioctl(fd, RTC_RD_TIME, ptm);
        // 讀系統的時間
        -> settimeofday(&tv, &tz)) // 設置系統的時間
        hwclock –w ->from_sys_clock(&rtcname, utc); -> rtc = rtc_xopen(pp_rtcname, O_WRONLY);
        *default_rtc = "/dev/rtc";
        rtc = open(*default_rtc, flags);
        *default_rtc = "/dev/rtc0";
        rtc = open(*default_rtc, flags);
        *default_rtc = "/dev/misc/rtc";
        // 會打開這幾個默認的文件
        -> gettimeofday(&tv, NULL); // 獲得系統時間
        -> xioctl(rtc, RTC_SET_TIME, &tm_time); // 設置系統時間
        -> close(rtc) // 
        hwclock –r -> show_clock(const char **pp_rtcname, int utc) 
        -> time_t t = read_rtc(pp_rtcname, &sys_tv, utc);
        ->*default_rtc = "/dev/rtc";
        rtc = open(*default_rtc, flags);
        *default_rtc = "/dev/rtc0";
        rtc = open(*default_rtc, flags);
        *default_rtc = "/dev/misc/rtc";
        // 會打開這幾個默認的文件
        -> fd = rtc_xopen(pp_rtcname, O_RDONLY);
        -> rtc_read_tm(&tm_time, fd); 
        -> xioctl(fd, RTC_RD_TIME, ptm);

以上可以知道, 讀時間使用ioctl進行的,使用兩個命令

RTC_RD_TIME // 讀時間
        RTC_SET_TIME // 設置時間

第二部分: rtc驅動架構分析

rtc的驅動架構是基于platform機制實現的,platform_device是由設備樹生成

rtc的設備樹如下:

rtc@10070000 
        {
                compatible = "samsung,s3c6410-rtc";
                reg = < 0x10070000 0x100>;
                interrupts = < 0 44 0>, <0 45 0>;
                clocks = < &clock 346>;
                clock-names = "rtc";
                status = "disabled";
        };

這個設備樹會生成platform_device

驅動在driver /rtc/rtc-s3c.c 文件中定義

static struct platform_driver s3c_rtc_driver = {
        .probe = s3c_rtc_probe,
        .remove = s3c_rtc_remove,
        .id_table = s3c_rtc_driver_ids,
        .driver = {
        .name = "s3c-rtc",
        .owner = THIS_MODULE,
        .pm = &s3c_rtc_pm_ops,
        .of_match_table = of_match_ptr(s3c_rtc_dt_match),
        },
        };
        module_platform_driver(s3c_rtc_driver);

實現了platform_driver s3c_rtc_driver的注冊

設備樹中的compatible = "samsung,s3c6410-rtc";和驅動中的 .compatible = "samsung,s3c6410-rtc",名稱一直時,會執行驅動的probe函數-> s3c_rtc_probe

在probe函數中注冊一個字符設備驅動

rtc = devm_rtc_device_register(&pdev->dev, "s3c", &s3c_rtcops, 
        -> rtc = rtc_device_register(name, dev, ops, owner);
        -> of_id = of_alias_get_id(dev->of_node, "rtc"); // 注冊一個rtc的類
        -> rtc_dev_prepare(rtc);
        -> cdev_init(&rtc->char_dev, &rtc_dev_fops);
        -> rtc_dev_add_device(rtc);
        -> if (cdev_add(&rtc->char_dev, rtc->dev.devt, 1))
        -> rtc_sysfs_add_device(rtc); // 等價于 mknod /dev/rtc c 254 0
        -> s3c_rtc_gettime(NULL, &rtc_tm); // 獲得系統的時間

以上是一個字符設備的創建。

注冊了一個cdev結構體和file_operations結構體rtc_dev_fops

rtc_dev_fops實現如下:
        static const struct file_operations rtc_dev_fops = {
        .owner = THIS_MODULE,
        .llseek = no_llseek,
        .read = rtc_dev_read,
        .poll = rtc_dev_poll,
        .unlocked_ioctl = rtc_dev_ioctl,
        .open = rtc_dev_open,
        .release = rtc_dev_release,
        .fasync = rtc_dev_fasync,
        };

由以上可知 : 應用程序調用ioctl 驅動也調用ioctl

hwclock –w -> xioctl(fd, RTC_RD_TIME, ptm); -> rtc_dev_ioctl(命令) (用戶空間) (內核空間)
        -> case RTC_RD_TIME:rtc_read_time(rtc, &tm);
        if (copy_to_user(uarg, &tm, sizeof(tm)))

由以上可知 : 應用程序調用ioctl 驅動也調用ioctl

hwclock –s -> xioctl(fd, RTC_SET_TIME, ptm); -> rtc_dev_ioctl(命令) (用戶空間) (內核空間) 
        -> case RTC_SET_TIME: 
        if (copy_from_user(&tm, uarg, sizeof(tm)))
        return rtc_set_time(rtc, &tm);
        hwclock –r -> xioctl(fd, RTC_RD_TIME , ptm); -> rtc_dev_ioctl(命令) (用戶空間) (內核空間) 
        -> case RTC_RD_TIME: rtc_read_time(rtc, &tm);
        if (copy_to_user(uarg, &tm, sizeof(tm)))

上一篇:Linux網絡編程之套接字

下一篇:基于FS4412內核移植之USB驅動的移植

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5,京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 亚洲欧美在线观看, | 国语对白做受xxxxx在线 | 丝袜美腿一区二区三区 | japanese55丰满熟妇 | 亚洲国产欧美日韩在线精品一区 | 免费现黄频在线观看国产 | 西西人体午夜大胆无码视频 | 国产精品久久久久久人妻无 | 国产精品99精品一区二区三区 | free性欧美人与dog | 美女脱了内裤张开腿让男人桶网站 | 亚洲国产成人久久一区WWW | 娇喘潮喷抽搐高潮视频 | 日本高清免费在线观看 | A国产一区二区免费入口 | 图片区小说区激情区偷拍区 | 亚洲国模私拍人体gogo | 国内美女人妻一级毛片免费看 | 久久国产午夜精品理论片 | 国产在线精品无码AV不卡顿 | 麻豆人妻少妇精品无码专区 | 少妇午夜性影院私人影院成都 | 嫩草影视传媒公司 | 久久人人爽人人爽人人片DVD | 国产丝袜无码一区二区三区视频 | 亚洲AV片无码久久五月 | 中文字幕久久精品波多野结百度 | 日韩a无v码在线播放 | 欧美贵妇videos办公室 | 亚洲视频aaa| 香港三日本8A三级少妇三级99 | 成年男女免费视频网站很黄的 | 免费不卡无码AV在线观看 | 免费无码又色又爽的视频软件 | 岛国aa | 成人乱码一区二区三区四区 | 亚洲一区久欠无码A片 | 亚洲AV无码乱码在线观看野外 | 人妻阿敏被老外玩弄系列 | 日欧一片内射VA在线影院 | 德国一级毛片 |