簡(jiǎn)介
CMOS原來(lái)指的是一種生產(chǎn)電子電路的工藝,在PC上一般指的是RTC電路單元,因?yàn)樵缙谒怯蛇@種工藝生產(chǎn)出來(lái)的,所以又把RTC稱作了CMOS。
RTC(Real Time Clock)即實(shí)時(shí)時(shí)鐘,用于保存記錄時(shí)間和日期,也可以用來(lái)做定時(shí)開(kāi)機(jī)功能。 RTC靠一組獨(dú)立的電源給它供電,這樣設(shè)計(jì)的目的就是為了不受系統(tǒng)電源的影響,可以保持一直有電,哪怕是在關(guān)機(jī)狀態(tài)下。 當(dāng)然這是理想狀態(tài)下的,因?yàn)闀?huì)有一些不可抗拒的原因,可能會(huì)導(dǎo)致斷電,比如電池電量消耗完。
RTC的供電設(shè)計(jì)有兩種:臺(tái)式機(jī)上使用常見(jiàn)的RTC電池,筆記本上也有使用RTC電池的,但有些為了節(jié)省空間和減低成本,直接共用筆記本電池的電源。 RTC功耗極低,根本不需要憂慮它會(huì)對(duì)對(duì)電池造成大的負(fù)擔(dān)。
要使RTC正常工作,除了電源,還需要一個(gè)32.768KHZ的晶振。 RTC通過(guò)對(duì)晶振所產(chǎn)生的振蕩頻率分頻和累加,得到年、月、日、時(shí)、分、秒等時(shí)間信息,并將其保存在一段RAM中。
實(shí)時(shí)傳輸單元內(nèi)存
在UEFI問(wèn)世之前,BIOS存儲(chǔ)一些變量(如BIOS SETUP設(shè)置)的方法就是放在RTC RAM中的,只要RTC有電,數(shù)據(jù)就可以一直保存。 如果要恢復(fù)默認(rèn)設(shè)置,或忘記密碼等,便可以通過(guò)拆卸 RTC 電池的辦法來(lái)達(dá)到目的。
至今,“清CMOS”這個(gè)詞還在沿用,雖然目的都是為了恢復(fù)BIOS SETUP初始值,但原理已經(jīng)變了,UEFI中“清CMOS”并不能達(dá)到恢復(fù)默認(rèn)設(shè)置的目的,因?yàn)閿?shù)據(jù)不是存放在CMOS中了,而是BIOS ROM。 那現(xiàn)在的“清CMOS”是怎么實(shí)現(xiàn)的呢? 原理就是BIOS啟動(dòng)的時(shí)候去判斷RTC是否掉過(guò)電(如Intel中的RTC_PWR_STS),是的話代碼就執(zhí)行恢復(fù)動(dòng)作。 注意,這里的恢復(fù)是代碼實(shí)現(xiàn)的,而原來(lái)利用的是RTC掉電,數(shù)據(jù)會(huì)清除的原理!
RTC RAM 共有128字節(jié),前14字節(jié)是有標(biāo)準(zhǔn)定義的,可以用來(lái)控制實(shí)時(shí)時(shí)鐘,而其它字節(jié)對(duì)現(xiàn)在來(lái)說(shuō)都已經(jīng)過(guò)時(shí)了,基本沒(méi)什么用,最多拿來(lái)臨時(shí)存一些數(shù)據(jù)作標(biāo)記。
前14字節(jié)定義(具體需要參照各平臺(tái)芯片設(shè)計(jì)廠商相關(guān)的手冊(cè))
前面所寫(xiě)的指的是傳統(tǒng)的RTC RAM,后面又有了一個(gè)擴(kuò)展的RTC RAM,它相比傳統(tǒng)的RTC RAM,可使用的寄存器增加到了256個(gè),不過(guò)也很少用到。。
訪問(wèn)
RTC RAM分為兩部分,第一部分傳統(tǒng)CMOS,只有128字節(jié),第二部分為擴(kuò)展CMOS,有256字節(jié),需要分開(kāi)使用70/71或72/73端口訪問(wèn),每次讀寫(xiě)只支持單字節(jié)操作。 通過(guò)RW查看,如下:
RW中直接可以看到在跳動(dòng)的秒數(shù),操作系統(tǒng)下的時(shí)間和日期都是從RTC讀出來(lái)的。 如果在OS下更改時(shí)間或日期,RTC中相關(guān)寄存器也會(huì)被變更。
代碼訪問(wèn)CMOS直接使用 IoRead8() 和 IoWrite8() 就可以了,比較簡(jiǎn)單,EDK2中有相關(guān)函數(shù),如下:
UINT8
EFIAPI
CmosRead8 (
IN UINTN Index
)
{
IoWrite8(0x70, (UINT8) Index);
return IoRead8 (0x71);
}
UINT8
EFIAPI
CmosWrite8 (
IN UINTN Index,
IN UINT8 Value
)
{
IoWrite8 (0x70, (UINT8) Index);
IoWrite8 (0x71, Value);
return Value;
}
定時(shí)開(kāi)機(jī)
定時(shí)開(kāi)機(jī)的叫法有幾種,如RTC Wake Up、RTC Alarm、Wake Up From S5 等,原理就是設(shè)置RTC中幾個(gè)Alarm寄存器,當(dāng)Alarm寄存器的值跟當(dāng)前時(shí)間一樣時(shí),RTC就會(huì)產(chǎn)生一個(gè)Alarm,如果此時(shí)RTC Alarm Enable有被設(shè)置啟用的話,則會(huì)產(chǎn)生一個(gè)喚醒事件(wake event)喚醒計(jì)算機(jī),達(dá)到一個(gè)定時(shí)開(kāi)機(jī)的作用。
定時(shí)開(kāi)機(jī)常見(jiàn)的應(yīng)用場(chǎng)景有兩種,一種是在BIOS SETUP做的定時(shí)開(kāi)機(jī)功能,另一種則是由APP設(shè)置的定時(shí)開(kāi)機(jī),如常用于測(cè)試跑自動(dòng)開(kāi)關(guān)機(jī)的工具Pwrtest.exe(它是微軟提供的,在SDK中可找到它,由于EWDK包含SDK,所以EWDK也有,用everything搜一下很快可以找到),原理也是在關(guān)機(jī)的時(shí)候設(shè)置了RTC Alarm, 然后不斷重復(fù)這個(gè)動(dòng)作,便實(shí)現(xiàn)了自動(dòng)開(kāi)關(guān)機(jī)的功能。
-
CMOS
+關(guān)注
關(guān)注
58文章
5724瀏覽量
235700 -
晶振
+關(guān)注
關(guān)注
34文章
2880瀏覽量
68117 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3037瀏覽量
74144 -
BIOS
+關(guān)注
關(guān)注
5文章
469瀏覽量
45753 -
RTC
+關(guān)注
關(guān)注
2文章
541瀏覽量
66715
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論