實時時鐘的作用主要是為作業系統提供乙個可靠的時間,並在斷電下,rtc時鐘也可以通過電池供電一直執行下去。實時時鐘驅動也有乙個子系統,叫做rtc子系統,其源**目錄是/driver/rtc/,在這個目錄下有乙個rtc核心**區,主要是rtc-dev.c、rtc-sysfs.c和rtc-proc.c三個檔案,其中rtc-dev.c主要是增加乙個字元裝置的作用,例如使用者層的ioctl命令就是通過訪問該檔案;rtc-sysfs.c主要是建立device_attribute機制;rtc-proc.c檔案主要建立/proc屬性檔案。另外對於rtc裝置。核心中的說明文件在/document/rtc.txt中
我們這裡講的是基於mini2440的rtc驅動,其對應驅動是/driver/rtc/rtc-s3c.c
rtc驅動原始碼路徑在/driver/rtc/rtc-s3c.c
檢視/driver/rtc/makefile
rtc-core-$(config_rtc_intf_dev) += rtc-dev.o
rtc-core-$(config_rtc_intf_proc) += rtc-proc.o
rtc-core-$(config_rtc_intf_sysfs) += rtc-sysfs.o
obj-$(config_rtc_drv_s3c) += rtc-s3c.o
檢視/driver/rtc//konfig
config rtc_intf_dev
boolean "/dev/rtcn (character devices)"
default rtc_class
config rtc_intf_proc
boolean "/proc/driver/rtc (procfs for rtc0)"
depends on proc_fs
config rtc_intf_sysfs
boolean "/sys/class/rtc/rtcn (sysfs)"
depends on sysfs
default rtc_class
config rtc_drv_s3c
tristate "samsung s3c series soc rtc"
depends on arch_s3c2410
所以配置核心make menuconfig 時,需要選中這幾項。
現在先來看如何移植,下面就看移植**了,因為通過檢視"s3c2410-rtc"名知道,在核心devs.c檔案中已經定義如下**
struct platform_device s3c_device_rtc = ;
所以只要在mach-mini2440.c這個mini2440開發板的bsp中把這個s3c_device_rtc加入到mini2440_devices陣列
static
struct platform_device *mini2440_devices __initdata = ;
這樣配置完後,進行make zimage生成zimage核心映象。
下面大致說說/driver/rtc/rtc-s3c.c
static
struct platform_driver s3c2410_rtc_driver = ,
};跟蹤下探測函式probe
static
int __devinit s3c_rtc_probe(struct platform_device *pdev)
s3c_rtc_alarmno = platform_get_irq(pdev, 0); //獲取鬧鐘中斷號
if (s3c_rtc_alarmno < 0)
pr_debug("s3c2410_rtc: tick irq %d, alarm irq %d\n",
s3c_rtc_tickno, s3c_rtc_alarmno);
res = platform_get_resource(pdev, ioresource_mem, 0); //獲取資源
if (res == null)
s3c_rtc_mem = request_mem_region(res->start,
res->end-res->start+1,
pdev->name); //申請資源
if (s3c_rtc_mem == null)
s3c_rtc_base = ioremap(res->start, res->end - res->start + 1); //實體地址到虛擬位址的對映
if (s3c_rtc_base == null)
s3c_rtc_enable(pdev, 1);
pr_debug("s3c2410_rtc: rtccon=%02x\n",
readb(s3c_rtc_base + s3c2410_rtccon));
s3c_rtc_setfreq(&pdev->dev, 1); //設定頻率
device_init_wakeup(&pdev->dev, 1);
rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops,
this_module); //註冊rtc裝置
if (is_err(rtc))
rtc->max_user_freq = 128;
platform_set_drvdata(pdev, rtc);
return
0; err_nortc:
s3c_rtc_enable(pdev, 0);
iounmap(s3c_rtc_base);
err_nomap:
release_resource(s3c_rtc_mem);
err_nores:
return ret;
}我們主要關注註冊rtc裝置的時傳入引數s3c_rtcops
static
const
struct rtc_class_ops s3c_rtcops = ;
對於struct rtc_class_ops結構體中的成員,其每個函式的具體實現,都是跟自己使用的裝置相關的,比如我們這樣使用的是s3c2410,那麼在struct rtc_class_ops裡定義的函式使用的就是三星平台下的資源。如果要在其他平台下使用,那麼就是修改這裡的struct rtc_class_ops操作函式。
在rtc_device_register中,會呼叫rtc_dev_prepare函式,而rtc_dev_prepare函式會把rtc_dev_fops註冊進核心,而rtc_dev_fops就是我們在增加字元裝置的檔案rtc-dev.c中定義的file_operations操作函式,這樣註冊rtc裝置其實就表示使用者可以訪問通過訪問file_operations函式來達到訪問rtc裝置的目的。
在我們的/driver/rtc/class.c中的模組載入函式中呼叫rtc_sysfs_init來完成註冊sys檔案系統,而rtc_sysfs_init就是我們在rtc-sysyfs.c中定義的,跟蹤下rtc_sysfs_ini
void __init rtc_sysfs_init(struct class *rtc_class)
然後看看rtc_attrs屬性
static
struct device_attribute rtc_attrs = ,
};好了,這就是給使用者的第二個操作介面,我們來看看這些屬性的show和store屬性是不是真的能呼叫在rtc-s3c.c中的rtc操作函式s3c_rtcops。我們把注意力放在time的show屬性函式rtc_sysfs_show_time上
static ssize_t rtc_sysfs_show_time(struct device *dev, struct device_attribute *attr,
char *buf)
return retval;
}跟蹤rtc_read_time函式
int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm)
mutex_unlock(&rtc->ops_lock);
return err;
}好了,我已經跟蹤到我們需要找的資訊了,這樣我們就能證實在rtc-sysyfs.c中定義的裝置的show和store屬性是真的能呼叫在rtc-s3c.c中的rtc操作函式s3c_rtcops的。
rtc驅動測試
linux 中更改時間的方法一般使用date 命令,為了把s3c2440 內部帶的時鐘與linux 系統時鐘同步,
一般使用hwclock 命令,下面是它們的使用方法:
(1) date -s 042916352007
#設定時間為 2007-04-29 16:34
(2) hwclock -w #把剛剛設定的時間存入s3c2440 內部的rtc
(3).開機時使用hwclock -s 命令可以恢復 linux 系統時鐘為rtc, 一般把該語句放入
/etc/init.d/rcs 檔案自動執行。
另外需要注意的是:有時候你會發現自己的實時時鐘會在走時一段時間後不准,這注意是設計時鐘電路時匹配電容的取值不對,電容公式是c1*c2/(c1+c2)+c3,其中c1和c2是兩個併聯電容,c3是寄生電容,c3一般取3-5pf。
Linux下的RTC子系統
實時時鐘的作用主要是為作業系統提供乙個可靠的時間,並在斷電下,rtc時鐘也可以通過電池供電一直執行下去。實時時鐘驅動也有乙個子系統,叫做rtc子系統,其源 目錄是 driver rtc 在這個目錄下有乙個rtc核心 區,主要是rtc dev.c rtc sysfs.c和rtc proc.c三個檔案,...
linux驅動子系統 裝置樹
1 首先編譯階段需要編譯出 dtb 2 假設用uboot啟動,把 dtb載入到ram中,並把相應的位址傳遞給linux 3 linux啟動後依次呼叫setup machine fdt unflatten device tree和of platform populate完成裝置的註冊 此時所有的裝置都...
linux裝置驅動 輸入子系統
輸入裝置都能用輸入子系統來寫,比如說按鍵 觸控螢幕 滑鼠等,但是有的輸入裝置不止用到了輸入子系統,比如說usb輸入裝置,他們還用到了usb子系統。我們以最簡單的按鍵 直接接到cpu上 為例介紹一下輸入子系統。輸入子系統將硬體相關的 與軟體相關的 分開寫,目的是為了以後編寫修改 簡便。軟體部分系統已經...