S3C2440上看門狗驅動開發(fā)實例講解_第1頁
S3C2440上看門狗驅動開發(fā)實例講解_第2頁
S3C2440上看門狗驅動開發(fā)實例講解_第3頁
S3C2440上看門狗驅動開發(fā)實例講解_第4頁
S3C2440上看門狗驅動開發(fā)實例講解_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、S3C2440上門狗理七由如9)驅動開發(fā)實例講解S3C2440上看門狗(Watchdog)驅動開發(fā)實例講解嵌入式Linux之我行,主要講述和總結了本人在學習嵌入式linux中的每個步驟。一為總結經驗,二希望能給想入門 嵌入式Linux的朋友提供方便。如有錯誤之處,謝請指正。共享資源,歡迎轉載:一、開發(fā)環(huán)境主機:VMWare-Fedora 9開發(fā)板:Mini2440-64MB Nand, Kernel:編譯器:arm-linux-gcc-4.3.2二、相關概念1、平臺設備及平臺設備驅動:這個在前面篇幅:S3C2440上RTC時鐘驅動開發(fā)實例講解中已經講過了。這里只需了解一下系統(tǒng)為我們定義的看門狗

2、(Watchdog)平臺設備及資源情況,在arch/arm/plat-s3c24xx/devs.c中,如下:/* Watchdog */*定義了 Watchdog平臺設備使用的資源,這些資源在驅動程序中都會用到*/static struct resource s3c_wdt_resource = 0 = /*Watchdog所使用IO端口資源范圍*/.start = S3C24XX_PA_WATCHDOG,.end = S3C24XX_PA_WATCHDOG + S3C24XX_SZ_WATCHDOG - 1,.flags = IORESOURCE_MEM,,1 = /*Watchdog 中斷

3、資源*/.start = IRQ_WDT,.end = IRQ_WDT,.flags = IORESOURCE_IRQ,;/*定義了 Watchdog平臺設備*/struct platform_device s3c_device_wdt = .name = s3c2410-wdt, /*設備名稱*/.id = -1,.num_resources = ARRAY_SIZE(s3c_wdt_resource), /資源數量 */.resource = s3c_wdt_resource, /* 引用上面定義的資源 */;EXPORT_SYMBOL(s3c_device_wdt);2、混雜設備(mis

4、c設備)misc設備是Linux定義的主設備號為10的特殊字符設備,因為不符合字符設備的范疇,所以被歸納為misc設備, 在Linux中有很多這種設備,例如:LED設備、Watchdog設備等等,系統(tǒng)會根據設備的次設備號來區(qū)分具體是哪個設備, 通常這些次設備號被定義在include/linux/miscdevice.h中。在Linux中用miscdevice結構體來描述一個misc設備,這就 意味著被定義為misc設備的驅動中就要實現(xiàn)該結構體中的接口函數。該結構體也定義在miscdevice.h中,如下:struct miscdevice int minor;const char *name;

5、const struct file_operations *fops;struct list_head list;struct device *parent;struct device *this_device;;三、實例講解1、Watchdog硬件結構圖分析:我們從結構圖和數據手冊得知,看門狗Watchdog主要是實現(xiàn)系統(tǒng)自動復位的功能,他是利用芯片內部的定時器,定時輸出連接到電路的復位端,程序在一定時間范圍內對定時器清零(俗稱“喂狗”),所以程序在正常工作時,定時器總是 不能溢出,也就不能產生復位信號;如果程序出現(xiàn)錯誤,不在定時周期內復位看門狗,那么定時器就會溢出而產生復位信號使系統(tǒng)復位。

6、S3C2440的Watchdog模塊提供了三個寄存器來對Watchdog進行操作,他們分別是:定時器控制寄存器WTCON、 定時器數據寄存器WTDAT和定時器計數寄存器WTCNT。注意:在對定時器數據寄存器WTDAT進行操作時必須在定時 器控制寄存器WTCON使能之前寫入一個計數目標值,當Watchdog使能開啟后,WTDAT中的值會自動被加載到計數寄 存器WTCNT中,然后Watchdog從CPU內部的時鐘分頻和時鐘除數因子得到一個工作周期,當每個周期結束時計數寄 存器WTCNT中的值會1,直到遞減為0時,如果還不重新往WTCNT中寫入新的計數目標值(即“喂狗”),則Watchdog就 產生

7、復位信號使系統(tǒng)復位。關于這些寄存器的功能和寄存器的各個位的操作值請參考數據手冊。2、Watchdog驅動程序具體實現(xiàn)步驟(建立驅動文件my2440_watchdog.c):注意:在每步中,為了讓代碼邏輯更加有條理和容易理解,就沒有考慮代碼的順序,比如函數要先定義后調用。如 果要編譯此代碼,請嚴格按照C語言的規(guī)范來調整代碼的順序。依然是驅動程序的最基本結構:Watchdog驅動的初始化和卸載部分及其他,如下:#include #include #include #include /*Watchdog平臺驅動結構體,平臺驅動結構體定義在platform_device.h中,該結構體內的接口函數在第

8、 步中實現(xiàn)*/static struct platform_driver watchdog_driver =.probe = watchdog_probe, /*Watchdog 探測函數,在第步中實現(xiàn) */.remove = _devexit_p(watchdog_remove),/*Watchdog 移除函數,在第步中實現(xiàn)*/.shutdown = watchdog_shutdown, /*Watchdog 關閉函數,在第步中實現(xiàn) */.suspend = watchdog_suspend, /*Watchdog 掛起函數,在第步中實現(xiàn) */.resume = watchdog_resum

9、e, /*Watchdog 恢復函數,在第步中實現(xiàn) */.driver =/*注意這里的名稱一定要和系統(tǒng)中定義平臺設備的地方一致,這樣才能把平臺設備與該平臺設備的驅動關聯(lián)起 來*/.name = s3c2410-wdt,.owner = THIS_MODULE,;static int _init watchdog_init(void)/*將Watchdog注冊成平臺設備驅動*/return platform_driver_register(&watchdog_driver);static void _exit watchdog_exit(void)/*注銷Watchdog平臺設備驅動*/pla

10、tform_driver_unregister(&watchdog_driver);module_init(watchdog_init);module_exit(watchdog_exit);/*驅動程序模塊參數,如果在加載驅動模塊時沒有設定這些參數,則這些參數將采用默認值,這些參數在接下來的步驟中將被一一用到,參數具體作用也將在各步驟中來說明7module_param(tmr_margin, int, 0);module_param(tmr_atboot, int, 0);module_param(nowayout, int, 0);module_param(soft_noboot,int,

11、 0);MODULE_LICENSE(GPL);MODULE_AUTHOR(Huang Gang);MODULE_DESCRIPTION(My2440 Watchdog Driver);、Watchdog平臺驅動結構中探測函數watchdog_probe的實現(xiàn)。探測就意味著在系統(tǒng)總線中去檢測設備的存在, 然后獲取設備有用的相關資源信息,以便我們使用這些信息。代碼如下:#include #include #include #include #include #include /*定義了一個用來保存watchdog的IO端口占用的IO空間和經過虛擬映射后的內存地址*/static struct r

12、esource *wdt_mem;static void _iomem *wdt_base;/*保存watchdog中斷號,NORQ宏定義在irq.h中*/static int wdt_irqno = NO_IRQ;/*保存從平臺時鐘隊列中獲取watchdog的時鐘*/static struct clk *wdt_clock;#define CONFIG_WATCHDOG_ATBOOT (0)#define CONFIG_WATCHDOG_DEFAULT_TIME (15)static int tmr_atboot = CONFIG_WATCHDOG_ATBOOT;static int tmr

13、_margin = CONFIG_WATCHDOG_DEFAULT_TIME;static int soft_noboot;static unsigned int wdt_count;/*用于保存經計算后得到的計數寄存器WTCNT的計數值*/*申明并初始化一個自旋鎖wdt_pie_lock,對Watchdog資源進行互斥訪問*/static DEFINE_SPINLOCK(wdt_pie_lock);static int _devinit watchdog_probe(struct platform_device *pdev)int ret;int started = 0;struct res

14、ource *res;/*定義一個資源,用來保存獲取的watchdog的IO資源*/*在系統(tǒng)定義的watchdog平臺設備中獲取watchdog中斷號platform_get_irq 定義在 platform_device.h 中*/wdt_irqno = platform_get_irq(pdev, 0);if(wdt_irqno dev, no irq for watchdogn);return -ENOENT;/*申請Watchdog中斷服務,這里使用的是快速中斷:IRQF_DISABLED。中斷服務程序為:wdt_irq,將Watchdog平臺設備pdev做參數傳遞過去了*/ret =

15、 request_irq(wdt_irqno, wdt_irq, IRQF_DISABLED, pdev-name, pdev);if(ret)/*錯誤處理*/dev_err(dev, IRQ%d error %dn, wdt_irqno, ret);return ret;/*獲取watchdog平臺設備所使用的IO端口資源,注意這個IORESOURCE_MEM標志和watchdog平臺設 備定義中的一致*/res = platform_get_resource(pdev, IORESOURCE_MEM, 0);if (res = NULL)/*錯誤處理*/dev_err(&pdev-dev,

16、 failed to get memory region resourcen);return -ENOENT;/*從平臺時鐘隊列中獲取watchdog的時鐘,這里為什么要取得這個時鐘,因為看門狗定時器的工作周期是由 這個時鐘和時鐘除數因子得到的。注意這里的watchdog參數要與系統(tǒng)中定義的時鐘名稱一致才能獲取得到,也就 是說,系統(tǒng)必須先定義得有watchdogo系統(tǒng)的一些時鐘定義在arch/arm/plat-s3c24xx/s3c2410-clock.c中*/wdt_clock = clk_get(&pdev-dev, watchdog);if (IS_ERR(wdt_clock)/*錯誤處

17、理*/dev_err(&pdev-dev, failed to find watchdog clock sourcen);return PTR_ERR(wdt_clock);/*時鐘獲取后要使能后才可以使用,clk_enable定義在arch/arm/plat-s3c/clock.c中*/clk_enable(wdt_clock);/*申請watchdog的IO端口資源所占用的IO空間(要注意理解IO空間和內存空間的區(qū)別),request_mem_region 定義在 ioport.h 中*/wdt_mem = request_mem_region(res-start, res-end - r

18、es-start + 1, pdev-name);if (wdt_mem = NULL)/*錯誤處理*/dev_err(&pdev-dev, failed to reserve memory regionn);ret = -ENOENT;goto err_noclk;/*將watchdog的IO端口占用的這段IO空間映射到內存的虛擬地址,ioremap定義在io.h中。注意:IO空間要映射后才能使用,以后對虛擬地址的操作就是對IO空間的操作,*/wdt_base = ioremap(res-start, res-end - res-start + 1);if (wdt_base = NULL)

19、/*錯誤處理*/dev_err(&pdev-dev, failed ioremap()n);ret = -EINVAL;goto err_noreq;/*好了,通過上面的步驟已經將watchdog的資源都準備好了,下面就開始使用啦*/*這里是計算并設置看門狗定時器時鐘周期值,wdt_set_heartbeat定義在下面。符合數據手冊中要求的,在看門狗定時器開始工作之前,一個初始值必須先寫入看門狗定時器計數寄存器WTCNT中七其實這里就是初始化看門狗 定時器*/if (wdt_set_heartbeat(pdev, tmr_margin)/*這里調用兩次的意思是看能不能設置成期望的值,如果不能就

20、設置默認的值*/started = wdt_set_heartbeat(pdev, CONFIG_WATCHDOG_DEFAULT_TIME);/*打印設置的值信息*/if (started = 0)dev_info(&pdev-dev, tmr_margin value out of range, default %d usedn, CONFIG_WATCHDOG_DEFAULT_TIME);elsedev_info(&pdev-dev, default timer value is out of range, cannot startn);/*device_init_wakeup該函數定義

21、在pm_wakeup.h中,定義如下:static inline void device_init_wakeup(struct device *dev, int val)dev-power.can_wakeup = dev-power.should_wakeup = !val;顯然這個函數是讓驅動支持電源管理的,這里只要知道,can_wakeup為1時表明這個設備可以被喚醒,設備驅動 為了支持Linux中的電源管理,有責任調用device_init_wakeup()來初始化can_wakeup,而should_wakeup則是在設 備的電源狀態(tài)發(fā)生變化的時候被device_may_wakeup

22、()用來測試,測試它該不該變化,因此can_wakeup表明的是一種能力,而should_wakeup表明的是有了這種能力以后去不去做某件事。好了,我們沒有必要深入研究電源管理的內 容了,要不就扯遠了,電源管路以后再講*/device_init_wakeup(&pdev-dev, 1);/*把看門狗設備又注冊成為misc設備,misc_register定義在miscdevice.h中wdt_miscdev結構體定義及內部接口函數在第步中講*/ret = misc_register(&wdt_miscdev);if (ret)/*錯誤處理*/dev_err(&pdev-dev, cannot r

23、egister miscdev on minor=%d (%d)n, WATCHDOG_MINOR, ret);goto err_nomap;/*函數wdt_start_or_stop定義在下面*/if (tmr_atboot & started = 0)wdt_start_or_stop(1);/*參數1表示啟動看門狗定時器*/else if (!tmr_atboot)wdt_start_or_stop(0);/*參數0表示停止看門狗定時器*/return 0;以下是上面錯誤處理的跳轉點err_noclk:clk_disable(wdt_clock);clk_put(wdt_clock);e

24、rr_noreq:release_resource(wdt_mem);kfree(wdt_mem);err_nomap:iounmap(wdt_base);return ret;/*看門狗定時器中斷服務程序*/static irqreturn_t wdt_irq(int irq, void *argv)/*主要要做的事情是在看門狗定時器計數寄存器值遞減到0之前重新寫入新值(即:“喂狗”廣/wdt_keepalive();return IRQ_HANDLED;/*看門狗定時器“喂狗”*/static void wdt_keepalive(void)spin_lock(&wdt_lock);/*獲

25、取自旋鎖保護臨界區(qū)資源*/writel(wdt_count, wdt_base + S3C2410_WTCNT);/*往計數寄存器 WTCNT 重新寫入計數值*/spin_unlock(&wdt_lock);/* 釋放自旋鎖,即解鎖 */*計算并設置看門狗定時器時鐘周期值并初始化看門狗定時器*/static int wdt_set_heartbeat(struct platform_device *pdev, int timeout)unsigned int freq = clk_get_rate(wdt_clock);unsigned int count;unsigned int divis

26、or = 1;unsigned long wtcon;if (timeout = 0 x10000)for (divisor = 1; divisor = 0 x100; divisor+)if (count / divisor) = 0 x10000)dev_err(&pdev-dev, timeout %d too bign, timeout);return -EINVAL;tmr_margin = timeout;count /= divisor;wdt_count = count;wtcon = readl(wdt_base + S3C2410_WTCON);/* wtcon=1000

27、000000100001 這是控制寄存器的默認值,看 數據手冊得到*/wtcon &= S3C2410_WTCON_PRESCALE_MASK; /* wtcon=1000000000100001 & -1111111100000000 = 0000000000100001 */*S3C2410_WTCON_PRESCALE宏是將divisor-1的值向左位移8位,也就是說該值的右8位都為0,則計算 如下:wtcon=0000000000100001 | (xxxxxxxx)00000000 = (xxxxxxxx)00100001*/wtcon |= S3C2410_WTCON_PRESCA

28、LE(divisor-1);/*設置看門狗定時器數據寄存器WTDAT的值,然后WTDAT的值會自動加載到WTCNT中*/writel(count, wdt_base + S3C2410_WTDAT);/*根據數據手冊和上面計算的wtcon值可得,下面是設置看門狗定時控制寄存器WTCON為:看門狗定時器輸出使能有效、一個保留位默認0、中斷使能無效、時鐘除數因子為16、看門狗定時器使能有效、兩個保留位默認00、預定標器值為xxxxxxxx的內容。*/writel(wtcon, wdt_base + S3C2410_WTCON);return 0;/*根據標志flag的值來啟動或者停止看門狗定時器,

29、1表示啟動,0表示停止*/static void wdt_start_or_stop(int flag)unsigned long wtcon;spin_lock(&wdt_pie_lock);/*獲取自旋鎖保護臨界區(qū)資源*/*停止看門狗定時器,以下各寄存器的位操作請參照數據手冊*/wtcon = readl(wdt_base + S3C2410_WTCON);wtcon &= (S3C2410_WTCON_ENABLE | S3C2410_WTCON_RSTEN);writel(wtcon, wdt_base + S3C2410_WTCON);if(!flag)wtcon = readl(w

30、dt_base + S3C2410_WTCON);wtcon |= S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV128;if (soft_noboot)wtcon |= S3C2410_WTCON_INTEN;wtcon &= S3C2410_WTCON_RSTEN;elsewtcon &= S3C2410_WTCON_INTEN;wtcon |= S3C2410_WTCON_RSTEN;writel(wdt_count, wdt_base + S3C2410_WTDAT);writel(wdt_count, wdt_base + S3C2410_WTCNT

31、);writel(wtcon, wdt_base + S3C2410_WTCON);spin_unlock(&wdt_pie_lock);/* 釋放自旋鎖,即解鎖 */實現(xiàn)misc設備中對設備文件的操作,代碼如下:#include #include #include /*申明并初始化一個信號量open_clock,對Watchdog資源進行互斥訪問,注意:這里的信號量和第笏中的 自旋鎖的區(qū)別,雖然都是達到資源互斥訪問的目的,但信號量是進程級的,也就是說信號量是用在多個進程 中對同一資源的互斥訪問,下面的使用會在wdt_open和wdt_release兩個進程中對Watchdog資源進行互斥 訪

32、問。對于自旋鎖和信號量的具體區(qū)別,請在網上找,這里不再多說了 */static DECLARE_MUTEX(open_clock);/*用來表示 Linux內核配置選項中配不配置 CONFIG_WATCHDOG_NOWAYOUT項, WATCHDOG_NOWAYOUT定義在 watchdog.h 中*/static int nowayout = WATCHDOG_NOWAYOUT;typedef enum close_stateCLOSE_STATE_NOT,CLOSE_STATE_ALLOW = 0 x4021 close_state_t;static close_state_t allow

33、_close; /*用于記錄看門狗定時器的當前的操作狀態(tài)*/*misc設備結構體實現(xiàn)*/static struct miscdevice wdt_miscdev = .minor = WATCHDOG_MINOR, /*WATCHDOG_MINOR次設備號定義在 miscdevice.h 中為 130*/.name = watchdog, /* 設備名稱 */.fops = &wdt_fops, /*實現(xiàn)字符設備的相關操作*/;/*字符設備的相關操作實現(xiàn)*/static const struct file_operations wdt_fops = .owner = THIS_MODULE,.

34、open = wdt_open,.release = wdt_release,.write = wdt_write,.ioctl = wdt_ioctl,.llseek = no_llseek, /*定義為不可定位,即屏蔽seek操作,no_llseek定義在fs.h中*/;/*看門狗設備驅動的打開接口函數*/static int wdt_open(struct inode *inode, struct file *file)/*試著獲取信號量(即:加鎖),如果獲取不成功,說明其他進程此時占用了,就返回忙*/if(down_trylock(&open_clock)return -EBUSY;i

35、f(nowayout)/*如果內核配置了 CONFIG_WATCHDOG_NOWAYOUT項,則使模塊使用計數加1*/_module_get(THIS_MODULE);/*開始記錄看門狗定時器的當前操作狀態(tài)為:無狀態(tài)*/allow_close = CLOSE_STATE_NOT;/*啟動看門狗定時器*/wdt_start_or_stop(1);/*表示返回的這個設備文件是不可以被seek操作的,nonseekable_open定義在fs.h中*/return nonseekable_open(inode, file);/*看門狗設備驅動的關閉接口函數*/static int wdt_relea

36、se(struct inode *inode, struct file *file)/*如果判斷到當前操作狀態(tài)是可以關閉看門狗定時器時就關閉,否則就是喂狗”狀態(tài)*/if(allow_close = CLOSE_STATE_ALLOW)wdt_start_or_stop(0);/* 關閉 */elsewdt_keepalive();/* “喂狗 ”*/*恢復看門狗定時器的當前操作狀態(tài)為:無狀態(tài)*/allow_close = CLOSE_STATE_NOT;/*釋放獲取的信號量(即:解鎖),與wdt_open中加鎖相對應*/up(&open_lock);return 0;/*看門狗設備驅動的寫數據

37、接口函數*/static ssize_t wdt_write(struct file *file, const char _user *buff, size_t len, loff_t *ppos)if(len)/*判斷有數據寫入*/if(!nowayout)/*如果沒有配置內核 CONFIG_WATCHDOG_NOWAYOUT選項*/size_t i;/*設看門狗定時器的當前操作狀態(tài)為:無狀態(tài)*/allow_close = CLOSE_STATE_NOT;for (i = 0; i != len; i+)char c;if (get_user(c, data + i)return -EFAU

38、LT;if (c = V)/*判斷寫入的數據是V時,則設看門狗定時器的當前操作狀態(tài)為關閉*/allow_close = CLOSE_STATE_ALLOW;/*上面的意思是想要看門狗定時器可以被關閉,則內核不要配置CONFIG_WATCHDOG_NOWAYOUT選項, 對于下面這里還要“喂狗”一次,我剛開始覺得不需要,因為在看門狗定時器中斷里面不斷的在“喂狗”。后來想想,這里還必須要“喂狗”一次,因為當上面我們判斷到寫入的數據是V時,看門狗定時器的當前操作狀態(tài)馬上被設置為關閉,再當驅動去調用看門狗設備驅動的關閉接口函數時,看門狗定時器中斷被禁止,無法再實現(xiàn)“喂狗”,所以這里要手動“喂狗”一次,

39、否則定時器溢出系統(tǒng)被復位*/wdt_keepalive();return len;/*用于支持看門狗IO控制中獲取看門狗信息的命令WDIOC_GETSUPPORT,下面的宏和看門狗信息結構體定義在watchdog.h中*/#define OPTIONS WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE static const struct watchdog_info wdt_ident =.options = OPTIONS,.firmware_version = 0,.identity = S3C2440 Watchdog,

40、;/*看門狗設備驅動的IO控制接口函數*/static long wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)void _user *argp = (void _user *)arg;int _user *p = argp;int new_margin;/*以下對看門狗定時器IO控制的命令定義在watchdog.h中*/switch (cmd)case WDIOC_GETSUPPORT: /獲取看門狗的支持信息,wdt_ident定義在上面*/return copy_to_user(argp, &wdt_id

41、ent, sizeof(wdt_ident) ? -EFAULT : 0;case WDIOC_GETSTATUS:case WDIOC_GETBOOTSTATUS:/獲取看門夠狀態(tài) */return put_user(0, p);case WDIOC_KEEPALIVE:/* 喂狗命令 */wdt_keepalive();return 0;case WDIOC_SETTIMEOUT:/*設置定時器溢出時間值命令(時間單位為秒廣/if (get_user(new_margin, p)/* 獲取時間值 */return -EFAULT;if (wdt_set_heartbeat(new_marg

42、in)/*設置到計數寄存器 WTCNT 中*/return -EINVAL;wdt_keepalive();/* 喂狗 */return put_user(tmr_margin, p);case WDIOC_GETTIMEOUT:/*讀取定時器默認溢出時間值命令(時間單位為秒廣/return put_user(tmr_margin, p);default:return -ENOTTY;.Watchdog平臺驅動的設備移除、掛起和恢復接口函數的實現(xiàn),代碼如下:/*Watchdog平臺驅動的設備移除接口函數的實現(xiàn)*/static int _devexit wdt_remove(struct pla

43、tform_device *dev)/*釋放獲取的Watchdog平臺設備的IO資源*/release_resource(wdt_mem);kfree(wdt_mem);wdt_mem = NULL;/*同watchdog_probe中中斷的申請相對應,在那里申請中斷,這里就釋放中斷*/free_irq(wdt_irqno, dev);wdt_irq = NULL;/*釋放獲取的Watchdog平臺設備的時鐘*/clk_disable(wdt_clock);clk_put(wdt_clock);wdt_clock = NULL;/*釋放Watchdog設備虛擬地址映射空間*/iounmap(w

44、dt_base);/*注銷misc設備*/misc_deregister(&wdt_miscdev);return 0;/*Watchdog平臺驅動的設備關閉接口函數的實現(xiàn)*/static void wdt_shutdown(struct platform_device *dev)/*停止看門狗定時器*/wdt_start_or_stop(0);/*對Watchdog平臺設備驅動電源管理的支持。CONFIG_PM這個宏定義在內核中,當配置內核時選上電源管理,則Watchdog平臺驅動的設備掛起和恢復功能均有效,這時候你應該明白了在第步中為什么要有device_init_wakeup(&pdev-dev, 1這句吧! ! */#ifdef CONFIG_PM/*定義兩個變量來分別保存掛起時的WTCON和WTDAT值,到恢復的時候使用*/static unsigned long wtcon_save;static unsigned long wtdat_save;/*Watchdog平臺驅動的設備掛起接口函數的實現(xiàn)*/static int wdt_suspend(struct platform_device *dev, pm_message_t state)/*保

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論