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