Linux下的RTC子系統

2021-06-12 05:11:51 字數 4502 閱讀 8210

實時時鐘的作用主要是為作業系統提供乙個可靠的時間,並在斷電下,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三個檔案,...

Windows下的Linux子系統

windows subsystem for linux簡稱wsl,是乙個在windows 10上能夠執行原生linux二進位制可執行檔案 elf格式 的相容層。windows設定 更新和安全 開發者選項 啟用開發人員模式 控制面板 程式 啟用或關閉windows功能 適用於linux的windows...

Linux下 INPUT子系統

1.申請input dev結構體變數 在編寫 input 裝置驅動的時候我們需要先申請乙個 input dev 結構體變數,使用input allocate device 函式來申請乙個 input dev 函式原型 struct input dev input allocate device vo...