Linux下的RTC子系統裝置驅動

2021-07-09 07:57:19 字數 4551 閱讀 5910

實時時鐘的作用主要是為作業系統提供乙個可靠的時間,並在斷電下,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上 為例介紹一下輸入子系統。輸入子系統將硬體相關的 與軟體相關的 分開寫,目的是為了以後編寫修改 簡便。軟體部分系統已經...