RTC的英文全稱是Real-Time Clock,翻譯過來是實時時鐘芯片. RTC是PC主板上的晶振及相關電路組成的時鐘電路的生成脈衝,RTC經過8254電路的變頻產生一個頻率較低一點的OS(系統)時鐘TSC,系統時鐘每一個cpu週期加一,每次系統時鐘在系統初起時通過RTC初始化。8254本身工作也需要有自己的驅動時鐘(PIT)。
1.2.1 在初始化文件中加入 RTC 設備結構
Linux-2.6.32.2 內核對 2440 的 RTC 驅動已經十分完善了,但並未在 mach-mini2440.c 中的設備集中加入它,因此並沒有被激活,加入 RTC 結構體如下紅色字體:
;在 mini2440 設備集中加入 RTC 結構體
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_rtc,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&mini2440_device_eth,
&s3c_device_nand,
};
1.2.2 在內核中配置 RTC
接下來重新配置內核,以加入 RTC 的驅動支持,依次選擇如下菜單項:
Device Drivers --->
<*> Real Time Clock --->
可以看到這裏缺省配置已經選擇了 RTC 相關的選項,這裏特別要注意的是該配置菜單最下方的<*> Samsung S3C series SoC RTC 選項支持,因爲這裏纔是內核中真正的 2440 之RTC 驅動配置項。
1.2.3 測試 RTC
[root@localhost linux-2.6.32.2]# make zImage
編譯生成zImage之後,將其燒寫到開發板上。
[root@mini2440 /]#ls -l dev/rtc*
crw-rw---- 1 root root 254, 0 Jan 1 00:00 dev/rtc0
[root@mini2440 /]#
在Linux中有硬件時鐘與系統時鐘兩種時鐘。硬件時鐘是指主機板上的時鐘設備,也就是通常可在 BIOS畫面設定的時鐘。系統時鐘則是指kernel中的 時鐘。當Linux啓動時,系統時鐘會去讀取硬件時鐘的設定,之後系統時鐘即獨立運作。所有Linux相關指令與函數都是讀取系統時鐘的設定。 hwclock實現了BIOS和linux的時間同步
既然Linux有兩個時鐘系統,那麼大家所使用的Linux默認使用哪種時鐘系統呢?會不回出現兩種系統時鐘衝突的情況呢?這些疑問和擔心不無道理。首先,Linux並沒有默認哪個時鐘系統。當Linux啓動時,硬件時鐘會去讀取系統時鐘的設置,然後系統時鐘就會獨立於硬件運作。
從Linux啓動過程來看,系統時鐘和硬件時鐘不會發生衝突,但Linux中的所有命令(包括函數) 都是採用的系統時鐘設置。不僅如此,系統時鐘和硬件時鐘還可以採用異步方式,即系統時間和硬件時間可以不同。這樣做的好處對於普通用戶意義不大,但對於 Linux網絡管理員卻有很大的用處。例如,要將一個很大的網絡中(跨越若干時區)的服務器同步,假如位於美國紐約的Linux服務器和北京的Linux 服務器,其中一臺服務器無須改變硬件時鐘而只需臨時設置一個系統時間,如要將北京服務器上的時間設置爲紐約時間,兩臺服務器完成文件的同步後,再與原來的時鐘同步一下即可。這樣系統和硬件時鐘就提供了更爲靈活的操作。
Linux 中更改時間的方法一般使用date 命令,爲了把S3C2440 內部帶的時鐘與linux 系統時鐘同步,一般使用hwclock 命令,下面是它們的使用方法:
(1) date -s 062016192011 #設置時間爲 2011-06-20 16:19
[root@mini2440 /]#date -s 062016202011
Mon Jun 20 16:20:00 UTC 2011
[root@mini2440 /]#
(2) hwclock -w #把剛剛設置的時間存入S3C2440 內部的RTC
[root@mini2440 /]#hwclock -w
[root@mini2440 /]#
(3).開機時使用hwclock -s 命令可以恢復 linux 系統時鐘爲RTC, 一般把該語句放入/etc/init.d/rcS 文件自動執行。
[root@mini2440 /]#vi etc/init.d/rcS
在打開的編輯界面中加入下面內容
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
echo "----------munt all----------------"
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
echo "*************************************************"
echo "************booting to mini2440 *****************"
echo "Kernel version:linux-2.6.32.2"
echo "the fans:singleboy"
echo "Date:2011.5.30"
echo "*************************************************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
echo "update the time from RTC"
hwclock -s
#show the current system time
date
~
~
~
I etc/init.d/rcS [Modified] 18/19 94%
然後保存退出。
下面是啓動信息
----------munt all----------------
*************************************************
************booting to mini2440 *****************
Kernel version:linux-2.6.32.2
the fans:singleboy
Date:2011.5.30
*************************************************
update the time from RTC
Mon Jun 20 21:19:49 UTC 2011
Please press Enter to activate this console.
然而,在有時啓動時發現:
... ...
mice: PS/2 mouse device common for all mice
S3C24XX RTC, (c) 2004,2006 Simtec Electronics
s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling
s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0
i2c /dev entries driver
... ...
NET: Registered protocol family 17
s3c2410-rtc s3c2410-rtc: hctosys: invalid date/time
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
... ...
----------munt all----------------
*************************************************
************booting to mini2440 *****************
Kernel version:linux-2.6.32.2
the fans:singleboy
Date:2011.5.30
*************************************************
update the time from RTC
hwclock: settimeofday() failed: Invalid argument
Thu Jan 1 00:00:08 UTC 1970
Please press Enter to activate this console.
Tue Jun 21 10:09:00 UTC 2011
[root@mini2440 /]#hwclock -w
[root@mini2440 /]#date
Tue Jun 21 10:09:36 UTC 2011
[root@mini2440 /]#