chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺析Linux RTC實(shí)時時鐘

嵌入式攻城獅 ? 來源:嵌入式攻城獅 ? 作者:嵌入式攻城獅 ? 2022-11-25 15:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

實(shí)時時鐘是個常用的外設(shè),可以用來獲取年、月、日和時間等信息。目前大多數(shù)的芯片內(nèi)部都自帶了實(shí)時時鐘外設(shè)模塊。例如本實(shí)驗(yàn)所使用的I.MX6ULL芯片內(nèi)部SNVS就提供了RTC(實(shí)時計(jì)數(shù)器)功能。SNVS(安全的非易性存儲)里面主要是一些低功耗的外設(shè),其可以在芯片掉電后由電池供電繼續(xù)運(yùn)行。RTC需要外接晶振來提供時鐘,本實(shí)驗(yàn)中I.MX6ULL芯片外接了一個32.768KHz的晶振,原理圖如下

ccc42222-6c8d-11ed-8abf-dac502259ad0.png

1. Linux內(nèi)核RTC驅(qū)動簡介

RTC 設(shè)備驅(qū)動是一個標(biāo)準(zhǔn)的字符設(shè)備驅(qū)動,應(yīng)用程序通過open、release、read、write和ioctl等函數(shù)完成對 RTC 設(shè)備的操作

內(nèi)核將 RTC 設(shè)備抽象為rtc_device結(jié)構(gòu)體,RTC設(shè)備驅(qū)動就是申請并初始化rtc_device,最后將 rtc_device 注冊到Linux內(nèi)核里面,此結(jié)構(gòu)體定義在include/linux/rtc.h文件中

structrtc_device
{
structdevicedev;/*設(shè)備*/
structmodule*owner;

intid;/*ID*/
charname[RTC_DEVICE_NAME_SIZE];/*名字*/

conststructrtc_class_ops*ops;/*RTC設(shè)備底層操作函數(shù)*/
structmutexops_lock;

structcdevchar_dev;/*字符設(shè)備*/
unsignedlongflags;
......
......
};

結(jié)構(gòu)體中的ops成員變量是RTC設(shè)備的底層操作函數(shù)集合,是一個 rtc_class_ops 類型的指針變量,需要用戶根據(jù)所使用的RTC設(shè)備編寫的,此結(jié)構(gòu)體定義在include/linux/rtc.h 文件中,內(nèi)容如下

structrtc_class_ops{
int(*open)(structdevice*);
void(*release)(structdevice*);
int(*ioctl)(structdevice*,unsignedint,unsignedlong);
int(*read_time)(structdevice*,structrtc_time*);
int(*set_time)(structdevice*,structrtc_time*);
int(*read_alarm)(structdevice*,structrtc_wkalrm*);
int(*set_alarm)(structdevice*,structrtc_wkalrm*);
int(*proc)(structdevice*,structseq_file*);
int(*set_mmss64)(structdevice*,time64_tsecs);
int(*set_mmss)(structdevice*,unsignedlongsecs);
int(*read_callback)(structdevice*,intdata);
int(*alarm_irq_enable)(structdevice*,unsignedintenabled);
};

rtc_class_ops 是最底層的 RTC 設(shè)備操作函數(shù),并不是提供給應(yīng)用層的。內(nèi)核提供了一個 RTC 通用字符設(shè)備驅(qū)動文件,文件名為 drivers/rtc/rtc-dev.c, 理論提供了所有 RTC 設(shè)備共用的 file_operations 函數(shù)操作集,如下所示:

staticconststructfile_operationsrtc_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,
};
應(yīng)用程序可以通過 ioctl 函數(shù)來設(shè)置/讀取時間、設(shè)置/讀取鬧鐘的操作,那么對應(yīng)的 rtc_dev_ioctl 函數(shù)就會執(zhí)行,rtc_dev_ioctl 最終會通過操作 rtc_class_ops 中的 read_time、 set_time 等函數(shù)來對具體 RTC 設(shè)備的讀寫操作。內(nèi)核中 RTC 驅(qū)動調(diào)用流程圖如下示

cce959f2-6c8d-11ed-8abf-dac502259ad0.png

2.Linux內(nèi)核RTC驅(qū)動分析

一般情況下,半導(dǎo)體廠商都會編寫好內(nèi)部RTC驅(qū)動,無需我們自已動手編寫。但是有必要了解一下是如何編寫的

打開imx6ull.dtsi,然后找到 snvs_rtc 節(jié)點(diǎn)內(nèi)容,如下所示:

snvs_rtc:snvs-rtc-lp{
compatible="fsl,sec-v4.0-mon-rtc-lp";
regmap=<&snvs>;
offset=<0x34>;
interrupts=19IRQ_TYPE_LEVEL_HIGH>,
20IRQ_TYPE_LEVEL_HIGH>;
};

根據(jù)compatible屬性值,在Linux源碼中搜索"fsl,sec-v4.0-mon-rtc-lp"符串,即可找到對應(yīng)的驅(qū)動文件drivers//rtc/rtc-snvs.c

staticconststructof_device_idsnvs_dt_ids[]={
{.compatible="fsl,sec-v4.0-mon-rtc-lp",},
{/*sentinel*/}
};
MODULE_DEVICE_TABLE(of,snvs_dt_ids);
staticstructplatform_driversnvs_rtc_driver={
.driver={
.name="snvs_rtc",
.pm=SNVS_RTC_PM_OPS,
.of_match_table=snvs_dt_ids,
},
.probe=snvs_rtc_probe,
};
module_platform_driver(snvs_rtc_driver);

可見這是一個標(biāo)準(zhǔn)的platform驅(qū)動,當(dāng)驅(qū)動和設(shè)備匹配以后snvs_rtc_probe函數(shù)就會執(zhí)行

staticintsnvs_rtc_probe(structplatform_device*pdev){
structsnvs_rtc_data*data;
structresource*res;
intret;
void__iomem*mmio;

data=devm_kzalloc(&pdev->dev,sizeof(*data),GFP_KERNEL);
if(!data)
return-ENOMEM;

data->regmap=syscon_regmap_lookup_by_phandle(pdev->dev.of_node,"regmap");
if(IS_ERR(data->regmap)){
dev_warn(&pdev->dev,"snvsrtc:youuseolddtsfile,pleaseupdateit
");
//從設(shè)備樹中獲取RTC外設(shè)寄存器基地址
res=platform_get_resource(pdev,IORESOURCE_MEM,0);
//內(nèi)存映射,獲得RTC外設(shè)寄存器物理基地址對應(yīng)的虛擬地址
mmio=devm_ioremap_resource(&pdev->dev,res);
if(IS_ERR(mmio))
returnPTR_ERR(mmio);
//采用regmap機(jī)制來讀寫RTC底層硬件寄存器
data->regmap=devm_regmap_init_mmio(&pdev->dev,mmio,&snvs_rtc_config);
}else{
data->offset=SNVS_LPREGISTER_OFFSET;
of_property_read_u32(pdev->dev.of_node,"offset",&data->offset);
}

if(!data->regmap){
dev_err(&pdev->dev,"Can'tfindsnvssyscon
");
return-ENODEV;
}
//從設(shè)備樹中獲取RTC的中斷號
data->irq=platform_get_irq(pdev,0);
if(data->irq0)
returndata->irq;
......

platform_set_drvdata(pdev,data);

//用regmap機(jī)制的regmap_write函數(shù)完成對寄存器進(jìn)行寫操作
regmap_write(data->regmap,data->offset+SNVS_LPPGDR,SNVS_LPPGDR_INIT);
//清除LPSR寄存器
regmap_write(data->regmap,data->offset+SNVS_LPSR,0xffffffff);
//使能RTC
snvs_rtc_enable(data,true);
device_init_wakeup(&pdev->dev,true);
//請求RTC中斷
ret=devm_request_irq(&pdev->dev,data->irq,
snvs_rtc_irq_handler,
IRQF_SHARED,"rtcalarm",&pdev->dev);
if(ret){
dev_err(&pdev->dev,"failedtorequestirq%d:%d
",data->irq,ret);
gotoerror_rtc_device_register;
}
//向系統(tǒng)注冊rtc_devcie
data->rtc=devm_rtc_device_register(&pdev->dev,pdev->name,&snvs_rtc_ops,THIS_MODULE);
if(IS_ERR(data->rtc)){
ret=PTR_ERR(data->rtc);
dev_err(&pdev->dev,"failedtoregisterrtc:%d
",ret);
gotoerror_rtc_device_register;
}

return0;

error_rtc_device_register:
if(data->clk)
clk_disable_unprepare(data->clk);
returnret;
}

RTC 底層驅(qū)動snvs_rtc_ops操作集包含了讀取/設(shè)置RTC時間,讀取/設(shè)置鬧鐘等函數(shù)。其內(nèi)容如下

staticconststructrtc_class_opssnvs_rtc_ops={
.read_time=snvs_rtc_read_time,
.set_time=snvs_rtc_set_time,
.read_alarm=snvs_rtc_read_alarm,
.set_alarm=snvs_rtc_set_alarm,
.alarm_irq_enable=snvs_rtc_alarm_irq_enable,
};

以 snvs_rtc_read_time 函數(shù)為例,介紹RTC底層操作函數(shù)該如何去編寫,該函數(shù)用于讀取RTC時間值

staticintsnvs_rtc_read_time(structdevice*dev,structrtc_time*tm){
structsnvs_rtc_data*data=dev_get_drvdata(dev);
//獲取RTC計(jì)數(shù)值,該值是秒數(shù)
unsignedlongtime=rtc_read_lp_counter(data);
//將獲取到的秒數(shù)轉(zhuǎn)換為時間值,也就是rtc_time結(jié)構(gòu)體類型
rtc_time_to_tm(time,tm);

return0;
}

rtc_time 結(jié)構(gòu)體定義如下:

structrtc_time{
inttm_sec;
inttm_min;
inttm_hour;
inttm_mday;
inttm_mon;
inttm_year;
inttm_wday;
inttm_yday;
inttm_isdst;
};

rtc_read_lp_counter 函數(shù),此函數(shù)用于讀取 RTC 計(jì)數(shù)值,函數(shù)內(nèi)容如下

staticu32rtc_read_lp_counter(structsnvs_rtc_data*data){
u64read1,read2;
u32val;
//讀取RTC_LPSRTCMR和RTC_LPSRTCLR這兩個寄存器,得到RTC的計(jì)數(shù)值
do{
regmap_read(data->regmap,data->offset+SNVS_LPSRTCMR,&val);
read1=val;
read1<<=?32;
regmap_read(data->regmap,data->offset+SNVS_LPSRTCLR,&val);
read1|=val;
regmap_read(data->regmap,data->offset+SNVS_LPSRTCMR,&val);
read2=val;
read2<<=?32;
regmap_read(data->regmap,data->offset+SNVS_LPSRTCLR,&val);
read2|=val;
}while((read1>>CNTR_TO_SECS_SH)!=(read2>>CNTR_TO_SECS_SH));

/*Convert47-bitcounterto32-bitrawsecondcount*/
return(u32)(read1>>CNTR_TO_SECS_SH);
}

3. RTC時間相關(guān)設(shè)置

RTC 是用來計(jì)時的,最基本的就是查看時間,Linux內(nèi)核啟動時可以看到系統(tǒng)時鐘設(shè)置信息

cd0f0404-6c8d-11ed-8abf-dac502259ad0.png

查看時間命令:date

設(shè)置當(dāng)前時間:date -s

date-s"2022-08-151300"
將當(dāng)前時間寫入到RTC里:hwclock -w

cd213840-6c8d-11ed-8abf-dac502259ad0.png


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11579

    瀏覽量

    217067
  • 晶振
    +關(guān)注

    關(guān)注

    35

    文章

    3390

    瀏覽量

    72119
  • 時鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1947

    瀏覽量

    134180

原文標(biāo)題:淺析 Linux RTC 實(shí)時時鐘

文章出處:【微信號:嵌入式攻城獅,微信公眾號:嵌入式攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    ?bq3285實(shí)時時鐘(RTC)芯片技術(shù)文檔總結(jié)

    bq3285 在斷電期間對時鐘、日歷和存儲寄存器進(jìn)行寫保護(hù)。然后,備用電池維護(hù)數(shù)據(jù)并作時鐘和日歷。 bq3285 是一款完全兼容的實(shí)時時鐘,適用于 IBM AT 兼容計(jì)算機(jī)和其他應(yīng)用。唯一的外部組件是一個 32.768kH
    的頭像 發(fā)表于 09-23 10:49 ?445次閱讀
    ?bq3285<b class='flag-5'>實(shí)時時鐘</b>(<b class='flag-5'>RTC</b>)芯片技術(shù)文檔總結(jié)

    實(shí)時時鐘芯片與晶振的不同之處

    實(shí)時時鐘芯片和晶振在電子設(shè)備中都扮演著提供時鐘信號的重要角色,但它們的本質(zhì)、功能和復(fù)雜程度卻大相徑庭。簡單來說,晶振是產(chǎn)生穩(wěn)定頻率的“心臟”,而實(shí)時時鐘芯片則是管理和分配這些“心跳”的“大腦”。
    的頭像 發(fā)表于 07-24 17:04 ?1138次閱讀
    <b class='flag-5'>實(shí)時時鐘</b>芯片與晶振的不同之處

    Analog Devices / Maxim Integrated MAX31329 I2C實(shí)時時鐘 (RTC)數(shù)據(jù)手冊

    Analog Devices MAX31329 I^2^C實(shí)時時鐘 (RTC) 是一 款低電流計(jì)時器件,可提供納安級 (nA) 的計(jì)時電流,從而延長電池壽命。該器件 集成了32.768kHz晶體
    的頭像 發(fā)表于 06-27 10:35 ?451次閱讀
    Analog Devices / Maxim Integrated MAX31329 I2C<b class='flag-5'>實(shí)時時鐘</b> (<b class='flag-5'>RTC</b>)數(shù)據(jù)手冊

    頻控器件企業(yè)泰晶科技車規(guī)級超高精度實(shí)時時鐘RTC賦能汽車電子

    剩余續(xù)航與充電樁位置提示…… ? 這些“便捷”與“精確”的背后都依賴于電子設(shè)備的“時序基準(zhǔn)源”——實(shí)時時鐘(Real-Time Clock, RTC)。憑借超低功耗、極高精度和斷電持續(xù)運(yùn)行等優(yōu)異產(chǎn)品特性,RTC成為汽車內(nèi)多個系統(tǒng)
    的頭像 發(fā)表于 06-25 11:50 ?1406次閱讀
    頻控器件企業(yè)泰晶科技車規(guī)級超高精度<b class='flag-5'>實(shí)時時鐘</b><b class='flag-5'>RTC</b>賦能汽車電子

    第二十八章 RTC——實(shí)時時鐘

    本文介紹了W55MH32的RTC外設(shè),其為掉電可運(yùn)行的32位計(jì)數(shù)器,常用LSE 32.768KHz時鐘源,引入U(xiǎn)NIX時間戳概念。還介紹相關(guān)庫函數(shù),及配置RTC、處理中斷、顯示時間和校準(zhǔn)LSI頻率的實(shí)驗(yàn)。
    的頭像 發(fā)表于 06-20 14:08 ?986次閱讀
    第二十八章 <b class='flag-5'>RTC</b>——<b class='flag-5'>實(shí)時時鐘</b>

    ST M41T66Q6F 低功耗串行實(shí)時時鐘RTC)內(nèi)置32.768 kHz振蕩器參數(shù)特性 EDA模型與數(shù)據(jù)手冊

    ST M41T66Q6F 低功耗串行實(shí)時時鐘RTC)內(nèi)置32.768 kHz振蕩器參數(shù)特性 EDA模型與數(shù)據(jù)手冊
    的頭像 發(fā)表于 06-16 17:39 ?821次閱讀
    ST M41T66Q6F 低功耗串行<b class='flag-5'>實(shí)時時鐘</b>(<b class='flag-5'>RTC</b>)內(nèi)置32.768 kHz振蕩器參數(shù)特性 EDA模型與數(shù)據(jù)手冊

    “耐高溫!”RTC時鐘芯片+電池的應(yīng)用案例(二)

    實(shí)時時鐘,簡稱RTC,是廣泛應(yīng)用于電子產(chǎn)品的重要元器件。愛普生RTC實(shí)時時鐘具有高精度、高穩(wěn)定性和多功能等特點(diǎn),廣泛應(yīng)用于多個行業(yè)。RTC
    的頭像 發(fā)表于 06-04 17:35 ?1052次閱讀
    “耐高溫!”<b class='flag-5'>RTC</b><b class='flag-5'>時鐘</b>芯片+電池的應(yīng)用案例(二)

    實(shí)時時鐘模塊選擇指南和比較表

    愛普生提供內(nèi)置 32.768 kHz 晶體單元的多種實(shí)時時鐘模塊。除了單純的計(jì)時功能外,還有即使在高溫環(huán)境下也能保持準(zhǔn)確計(jì)時的產(chǎn)品,以及配備其他各種功能的產(chǎn)品。您可以使用下面的流程圖和產(chǎn)品比較表來
    發(fā)表于 03-14 10:28 ?0次下載

    RA4000CE愛普生RTC實(shí)時時鐘模塊:車載BMS系統(tǒng)的理想選擇

    愛普生RTC模塊集成32.768kHz石英晶體振蕩器與實(shí)時時鐘芯片,為BMS提供精確的時間和日期信息,助力系統(tǒng)執(zhí)行時間相關(guān)操作。該模塊采用QMEMS技術(shù)和半導(dǎo)體技術(shù),具備高精度和低電流損耗特性,配備
    的頭像 發(fā)表于 03-12 17:16 ?880次閱讀

    愛普生實(shí)時時鐘與晶振技術(shù)賦能NIC網(wǎng)絡(luò)接口卡

    在網(wǎng)絡(luò)技術(shù)飛速發(fā)展的當(dāng)下,NIC網(wǎng)絡(luò)接口卡(網(wǎng)卡)作為設(shè)備與網(wǎng)絡(luò)連接的關(guān)鍵橋梁,其時間同步精度直接決定了網(wǎng)絡(luò)性能的穩(wěn)定性和效率。愛普生(EPSON)憑借其領(lǐng)先的實(shí)時時鐘RTC)與晶振技術(shù),為NIC
    的頭像 發(fā)表于 03-12 13:38 ?597次閱讀
    愛普生<b class='flag-5'>實(shí)時時鐘</b>與晶振技術(shù)賦能NIC網(wǎng)絡(luò)接口卡

    Abracon推出內(nèi)置XO實(shí)時時鐘

    Abracon近期推出內(nèi)置XO實(shí)時時鐘(RTC)是現(xiàn)代電子系統(tǒng)中的核心組件,專為追求極低功耗與高精度時間記錄的應(yīng)用而設(shè)計(jì)。 與傳統(tǒng)基于外部晶體的RTC不同,Abracon的內(nèi)置XO RTC
    的頭像 發(fā)表于 02-06 11:20 ?1138次閱讀

    RTC時鐘芯片+電池的應(yīng)用案例(一)

    實(shí)時時鐘,簡稱RTC,是廣泛應(yīng)用于電子產(chǎn)品的重要元器件。愛普生RTC實(shí)時時鐘具有高精度、高穩(wěn)定性和多功能的特點(diǎn),目前廣泛應(yīng)用于多個行業(yè)。下面通過幾個視頻來詳細(xì)了解一下愛普生
    的頭像 發(fā)表于 01-08 11:25 ?2163次閱讀
    <b class='flag-5'>RTC</b><b class='flag-5'>時鐘</b>芯片+電池的應(yīng)用案例(一)

    愛普生RTC實(shí)時時鐘模塊助力車載BMS系統(tǒng)更好運(yùn)行

    的使用壽命;此外,BMS模塊還能夠實(shí)時監(jiān)測電池狀態(tài),確保電池運(yùn)行的安全性和穩(wěn)定性。愛普生RTC實(shí)時時鐘模塊助力車載BMS系統(tǒng)更好運(yùn)行,該模塊集成了32.768kHz石
    的頭像 發(fā)表于 11-20 14:18 ?916次閱讀
    愛普生<b class='flag-5'>RTC</b><b class='flag-5'>實(shí)時時鐘</b>模塊助力車載BMS系統(tǒng)更好運(yùn)行

    TPS65950實(shí)時時鐘時序補(bǔ)償分析

    電子發(fā)燒友網(wǎng)站提供《TPS65950實(shí)時時鐘時序補(bǔ)償分析.pdf》資料免費(fèi)下載
    發(fā)表于 10-29 10:01 ?0次下載
    TPS65950<b class='flag-5'>實(shí)時時鐘</b>時序補(bǔ)償分析

    MS85163/MS85163M——實(shí)時時鐘和日歷電路

    MS85163/MS85163M是一款CMOS實(shí)時時鐘(RTC) 和日歷電路,針對低功耗進(jìn)行了優(yōu)化,內(nèi)置了可編程的時鐘輸出、中斷輸出和低電壓檢測器。帶有方案,提供FAE,歡迎了解
    的頭像 發(fā)表于 10-28 11:43 ?1286次閱讀
    MS85163/MS85163M——<b class='flag-5'>實(shí)時時鐘</b>和日歷電路