<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式數據采集系統中的ADS8364驅動(dòng)程序設計

嵌入式數據采集系統中的ADS8364驅動(dòng)程序設計

作者: 時(shí)間:2012-03-23 來(lái)源:網(wǎng)絡(luò ) 收藏

4 的驅動(dòng)程序設計概述

4.1 驅動(dòng)程序的LKM實(shí)現機制

內核提供了兩種機制來(lái)開(kāi)發(fā),一種是直接把驅動(dòng)程序編譯進(jìn)內核,成為內核的一部分。另一種是通過(guò)LKM(Loadable Kernel Module,即可加載模塊化機制)來(lái)開(kāi)發(fā)可動(dòng)態(tài)加載和卸載的驅動(dòng)模塊[3]。驅動(dòng)程序如果編譯進(jìn)內核的話(huà),會(huì )增加內核的大小,還要改動(dòng)內核的源文件,而且不能動(dòng)態(tài)的卸載,不利于調試,所以本系統把的驅動(dòng)程序編寫(xiě)成了 LKM型驅動(dòng)程序(就是把的驅動(dòng)程序作為一個(gè)獨立的單元模塊,在使用時(shí)可以使用insmod命令加載到核心中,用完后使用rmmod命令卸載的那種)。

4.2 驅動(dòng)程序的注冊與注銷(xiāo)

向系統增加一個(gè)驅動(dòng)程序則意味著(zhù)要賦予它一個(gè)主設備號,這一賦值過(guò)程是在驅動(dòng)程序模塊的初始化中完成的。ADS8364的初始化入口函數定義如下:

int _init ads8364_init_module(void)全功能版J-LINK ARM仿真器V6.0

{ …..

ret = register_chrdev(11, ADS8364, ad_fops);

……}

在用insmod命令將編譯好的模塊調入內存時(shí),ads8364_init_module( )函數被調用。在這里,ads8364_init_module( )只做了一件事,它調用函數register_chrdev( )向內核注冊該。函數register_chrdev()定義在linux/fs-h> 中。register_chrdev需要三個(gè)參數,參數一是希望獲得的設備號,如果是零的話(huà),系統將自動(dòng)選擇一個(gè)沒(méi)有被占用的設備號作為該的主設備號并返回。參數二是設備文件名,這個(gè)名字必須插入到/dev目錄中,并與驅動(dòng)程序的主設備號和次設備號相連。參數三用來(lái)登記驅動(dòng)程序實(shí)際執行操作的函數的指針。如果登記成功,返回設備的主設備號,不成功,返回一個(gè)負值。在此,我們選用當前不用的設備號11作為ADS8364的主設備號,設備名為 ADS8364。

在關(guān)閉或塊設備時(shí),還需要通過(guò)unregister_chrdev( )從內核中注銷(xiāo)設備,并釋放主設備號。在用rmmod卸載該驅動(dòng)模塊時(shí),cleanup_module函數被調用,它釋放字符設備ADS8364在系統字符設備表中占有的表項。

void ads8364_cleanup_module(void)

{ unregister_chrdev(11, ADS8364); info("ADS8364 cleanup module ok!"); }

4.3 file_operations結構體的設計

中,字符設備向內核提供的接口函數集就是文件操作集file_operations結構體。在Linux系統中,打開(kāi)的設備在內核內部由設備文件file結構標識,內核使用file_operations(文件操作)結構訪(fǎng)問(wèn)驅動(dòng)程序的函數。每個(gè)文件都與自己的函數集相關(guān)聯(lián)(通過(guò)包含指向file_operations結構的f_ops指針段實(shí)現),這些操作主要負責系統調用的實(shí)現[4]。為了使驅動(dòng)程序在結構的定義發(fā)生變化時(shí)更具可移植性,并且使得代碼更加緊湊且易讀,我們首先采用標記化格式聲明ADS8364的file_operations結構:

static struct file_operations ad_fops = {全功能版J-LINK ARM仿真器V6.0

owner: THIS_MODULE,/* ad_fops所屬的設備模塊 */

read:ads8364_read,/*從設備中讀數據*/

poll:ads8364_poll, /*查詢(xún)設備狀態(tài)*/

ioctl:ads8364_ioctl,/*設備I/O控制*/全功能版J-LINK ARM仿真器V6.0

open:ads 8364_open,/*打開(kāi)設備操作*/

release:ads 8364_release,/*釋放操作*/

};

file_operations結構體把系統調用和驅動(dòng)程序關(guān)聯(lián)起來(lái)。這個(gè)結構的每一個(gè)成員的名字都對應著(zhù)一個(gè)系統調用。用戶(hù)進(jìn)程利用系統調用在對設備文件進(jìn)行諸如read、write、open等操作時(shí),系統調用通過(guò)設備文件的主設備號找到相應的,然后讀取這個(gè)數據結構相應的函數指針,接著(zhù)把控制權交給該函數。這就是ADS8364驅動(dòng)程序工作的基本原理。既然是這樣,則編寫(xiě)的主要工作就是編寫(xiě)子函數,并填充 file_operations的各個(gè)域。下面我們就把file_operations的各個(gè)域的功能和主要調用函數加以介紹。

1)設備I/O控制操作函數

與普通文件相比,設備文件的操作要復雜得多,不可能簡(jiǎn)單地通過(guò) read、write 和llseek 等來(lái)實(shí)現。所有其它類(lèi)型的操作都可以通過(guò)VFS的ioctl調用來(lái)執行,函數定義如下:

static int ads8364_ioctl(struct inode * inode, struct file *filp, unsigned int cmd, unsigned long arg)

ads8364_ioctl是ADS8364驅動(dòng)程序中對設備的I/O通道進(jìn)行管理的函數。其中參數inode就是用戶(hù)程序打開(kāi)ADS8364時(shí)使用open函數返回的文件標示符,cmd就是用戶(hù)程序對ADS8364的控制命令,它是唯一聯(lián)系用戶(hù)程序命令和驅動(dòng)程序支持的途徑,該函數通過(guò)cmd區分操作,通過(guò)arg傳遞參數和結果。在驅動(dòng)程序中實(shí)現的ads8364_ioctl函數體內,有一個(gè)switch{case}結構,每一個(gè)case對應一個(gè)命令碼,做出一些相應的操作。 ads8364_ioctl的設計的關(guān)鍵就是,如何將cmd命令碼在用戶(hù)程序里生成以及在驅動(dòng)程序里的解析,所以switch{case}結構在 ads8364_ioctl中至關(guān)重要,因為對設備的I/O控制都是通過(guò)這一部分的代碼實(shí)現的。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>