導(dǎo)讀
嵌入式系統(tǒng)中,設(shè)備時(shí)間是一個(gè)重要的參數(shù)。一般情況下,為了讓設(shè)備在斷電情況下,系統(tǒng)能正常走時(shí),會(huì)采用外部RTC芯片為系統(tǒng)提供斷電后的系統(tǒng)走時(shí)。
在linux內(nèi)核中,內(nèi)核對(duì)RTC的支持分成了兩層:
(1)與硬件無(wú)關(guān)的頂層字符驅(qū)動(dòng)程序:用于實(shí)現(xiàn)內(nèi)核的RTC相關(guān)的API。
(2)與硬件相關(guān)的底層驅(qū)動(dòng)程序:用于和底層總線進(jìn)行通信。
RTC API保證了用戶空間的程序(工具)獨(dú)立于底層平臺(tái)和特定的RTC芯片,例如:hwclock則遵循這些API 接口對(duì)/dev/rtc進(jìn)行操作。這些API也定義了sys(/sys/class/rtc)和proc(/proc/driver/rtc)文件系統(tǒng)中的屬性。
linux內(nèi)核的RTC框架支持各種各樣的RTC:集成到SOC中的RTC,支持I2C、SPI或者其他總線通信的單獨(dú)RTC芯片等。對(duì)于用戶空間來(lái)說(shuō),RTC框架會(huì)提供三種接口:
(1)/dev/rtcN。N表示RTC在系統(tǒng)上的序號(hào)。
(2)/sys/class/rtc/rtcN
(3)/proc/driver/rtc
本文不去具體描述RTC的框架細(xì)節(jié)和如何設(shè)計(jì)RTC驅(qū)動(dòng)程序,而是描述:在RTC驅(qū)動(dòng)程序正常工作的前提下,對(duì)于多個(gè)rtc,在用戶空間中如何配置時(shí)間參數(shù)。
背景描述
在一塊搭載rk3568處理器的硬件板卡上,需要使用RTC為系統(tǒng)提供斷電后的時(shí)間走時(shí),在對(duì)應(yīng)硬件板卡的Linux內(nèi)核中,針對(duì)rk3568開發(fā)了兩款rtc驅(qū)動(dòng):rtc0和rtc1:
在Linux啟動(dòng)過(guò)程中,內(nèi)核會(huì)自動(dòng)使用rtc0設(shè)置系統(tǒng)時(shí)間,該時(shí)間是一個(gè)默認(rèn)狀態(tài)時(shí)間參數(shù),當(dāng)系統(tǒng)斷電后,發(fā)現(xiàn)時(shí)間不會(huì)自動(dòng)走時(shí),因此在每次系統(tǒng)啟動(dòng)后,使用date命令查看系統(tǒng)時(shí)間,時(shí)間都是最初的默認(rèn)參數(shù)。實(shí)際上rtc1才代表外部的RTC芯片,所以此處可以在linux內(nèi)核啟動(dòng)后,進(jìn)入根文件系統(tǒng)服務(wù)啟動(dòng)過(guò)程中,在配置腳本中將rtc1的時(shí)間參數(shù)同步到系統(tǒng)。
解決方法
具體操作如下:
在命令行使用以下命令設(shè)置rtc1的時(shí)間:
date-s"具體時(shí)間參數(shù)"
時(shí)間參數(shù)格式為:“年-月-日 時(shí):分:秒”
在設(shè)置系統(tǒng)時(shí)間的時(shí)候,可以手動(dòng)設(shè)置,這樣在秒上可能存在誤差。如果系統(tǒng)板卡在開發(fā)階段可以連接網(wǎng)絡(luò),通過(guò)網(wǎng)絡(luò)更新系統(tǒng)時(shí)間也是一種較好的方式,哈哈。
接著使用以下命令將時(shí)間參數(shù)同步到rtc1:
hwclock -w -f /dev/rtc1
在/etc/profile文件末尾添加如下代碼,用于當(dāng)Linux啟動(dòng)后自動(dòng)從rtc1同步時(shí)間到系統(tǒng):
hwclock-s-f/dev/rtc1
完成后如下所示:
#/etc/profile:system-wide.profilefilefortheBourneshell(sh(1)) #andBournecompatibleshells(bash(1),ksh(1),ash(1),...). if["${PS1-}"];then if["${BASH-}"]&&["$BASH"!="/bin/sh"];then #Thefilebash.bashrcalreadysetsthedefaultPS1. #PS1='h:w$' if[-f/etc/bash.bashrc];then ./etc/bash.bashrc fi else if["`id-u`"-eq0];then PS1='#' else PS1='$' fi fi fi if[-d/etc/profile.d];then foriin/etc/profile.d/*.sh;do if[-r$i];then .$i fi done unseti fi #用于將外部RTC時(shí)間同步到linux系統(tǒng)。 hwclock-s-f/dev/rtc1 &
總結(jié)
本文是一例在實(shí)際工作中所遇到的RTC問(wèn)題的解決方法總結(jié),沒(méi)有其他的了。
補(bǔ)充:『date命令幫助』
Usage:date[OPTION]...[+FORMAT] or:date[-u|--utc|--universal][MMDDhhmm[[CC]YY][.ss]] DisplaythecurrenttimeinthegivenFORMAT,orsetthesystemdate. Mandatoryargumentstolongoptionsaremandatoryforshortoptionstoo. -d,--date=STRINGdisplaytimedescribedbySTRING,not'now' --debugannotatetheparseddate, andwarnaboutquestionableusagetostderr -f,--file=DATEFILElike--date;onceforeachlineofDATEFILE -I[FMT],--iso-8601[=FMT]outputdate/timeinISO8601format. FMT='date'fordateonly(thedefault), 'hours','minutes','seconds',or'ns' fordateandtimetotheindicatedprecision. Example:2006-08-14T0256-06:00 -R,--rfc-emailoutputdateandtimeinRFC5322format. Example:Mon,14Aug20060256-0600 --rfc-3339=FMToutputdate/timeinRFC3339format. FMT='date','seconds',or'ns' fordateandtimetotheindicatedprecision. Example:2006-08-140256-06:00 -r,--reference=FILEdisplaythelastmodificationtimeofFILE -s,--set=STRINGsettimedescribedbySTRING -u,--utc,--universalprintorsetCoordinatedUniversalTime(UTC) --helpdisplaythishelpandexit --versionoutputversioninformationandexit
補(bǔ)充:『hwclock命令幫助』
BusyBoxv1.34.1(2022-08-121432CST)multi-callbinary. Usage:hwclock[-swul][--systz][-fDEV] Showorsethardwareclock(RTC) -sSetsystemtimefromRTC -wSetRTCfromsystemtime --systzSetin-kerneltimezone,correctsystemtime ifRTCiskeptinlocaltime -fDEVUsespecifieddevice(e.g./dev/rtc2) -uAssumeRTCiskeptinUTC -lAssumeRTCiskeptinlocaltime (ifneitherisgiven,readfrom/var/lib/hwclock/adjtime)
審核編輯:劉清
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3535瀏覽量
129003 -
RTC
+關(guān)注
關(guān)注
2文章
519瀏覽量
66151 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21588
原文標(biāo)題:嵌入式linux的RTC可以這樣“玩”
文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論