《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 嵌入式Linux系統設備驅動程序的開發
嵌入式Linux系統設備驅動程序的開發
摘要: Linux是一個遵循POSIX標準的免費操作系統。具有BSD和SYSV的擴展特性。與其他操作系統相比,嵌入式Linux系統以其可應用于多種硬件平臺、內核高效穩定、源碼開放、軟件豐富、網絡通信和文件管理機制完善等優良特性而正被作為研究熱點,越來越多的研究人員采用Linux平臺來開發自己的產品。
Abstract:
Key words :

 

引言

Linux是一個遵循POSIX標準的免費操作系統。具有BSD和SYSV的擴展特性。與其他操作系統相比,嵌入式Linux系統以其可應用于多種硬件平臺、內核高效穩定、源碼開放、軟件豐富、網絡通信和文件管理機制完善等優良特性而正被作為研究熱點,越來越多的研究人員采用Linux平臺來開發自己的產品。Linux設備驅動程序在Linux內核源代碼中占有很大比例,從2.0、2.2到 2.4版本的內核,源代碼的長度日益增加,其實主要是設備驅動程序在增加。

設備驅動程序的編寫

設備驅動程序是linux內核的一部分,是操作系統內核和機器硬件之間的接口,它由一組函數和一些私有數據組成,是連接應用程序與具體硬件的橋梁。Linux的一個基本特點是它對硬件設備的管理抽象化,系統中的每一個設備都用一個特殊的文件來表示。所有的硬件設備都像普通的文件一樣看待,使用與操作系統相同的標準系統來進行打開、讀寫和關閉。

在Linux 操作系統下有3類主要的設備文件類型:塊設備、字符設備、網絡設備。字符設備是指存取時沒有緩存的設備??上裎募粯釉L問字符設備,字符設備驅動程序負責實現這些行為。系統的控制臺和并口就是字符設備的例子,它們可以很好地用“流”來描述。塊設備是文件系統的宿主,如磁盤。 Linux允許像字符設備那樣讀取塊設備——允許一次傳輸任意數目的字節。結果是,字符設備和塊設備讀取數方式一致。而網絡設備不同于字符設備和塊設備, 它面向的上一層不是文件系統而是網絡協議層,是通過BSD套接口訪問數據。與設備相對應的是三類設備驅動程序,字符設備驅動程序、塊設備驅動程序、網絡設備驅動程序。

字符設備驅動程序、塊設備驅動程序與網絡設備驅動程序的結構體是不同的。

在linux 源代碼linux/ include / linux/ fs. h中定義了字符設備和塊設備驅動程序中必須使用的file_operations結構,每個設備驅動都實現這個接口所定義的部分或全部函數。隨著內核的不斷升級, file_operations結構也越來越大,不同的版本的內核會稍有不同。file_operations定義如下:

struct file_operations{

int( * lseek) ( struct inode * , struct file * , off_t , int) ;          int( *release) ( struct inode * , struct file * ) ;

int( * read) ( struct inode * , struct file * , char * , int) ;        int( * fsync) ( struct inode *, struct file * ) ;

int( *write) ( struct inode * , struct file * , const char *, int) ;        int( * fasync) ( struct inode * , struct file *, int) ;

int( * readdir) ( struct inode  , struct file  , void * , dilldir) ;   int( *check_media_change) ( kdev_t dev) ;

int(*select) ( struct inode *, struct file * , int, select_table * ) ;   int( * revalidate) ( kdev_t dev) ; };

int ( * ioctl) ( struct inode * , struct file *, unsigned int, unsigned long) ;

int( *mmap) ( struct inode * , struct file * , struct vm_area_struct * ) ;

int( * open) ( struct inode *, struct file *) ;

應用程序只有通過對設備文件的open、release、read、write、ioctl等才能訪問字符設備和塊設備。用戶自己定義好 file_operations結構后,編寫出設備實際所需要的各操作函數,對于不需要的操作函數用NULL初始化,這些操作函數將被注冊到內核,當應用程序對設備相應的設備文件進行文件操作時,內核會找到相應的操作函數,并進行調用。如果操作函數使用NULL,操作函數就進行默認處理。

對于字符設備而言,llseek( ),read( ),write(),ioctl( ),open( ),release( )這些函數是不可缺的;對于塊設備,open( ),release( ),ioctl(),check_media_change( ),revalidate( )是不可缺少的。

網絡設備結構體 net_device 定義在 includelinuxnetdevice.h 里,如下所示:

struct net_device

{

char   name ;                 int (*init)(struct

net_device *dev);

unsigned short  flags ;           int (*open)

(struct net_device *dev);

unsigned long   base_addr;      int

(*stop)(struct net_device *dev)

unsigned int    irq ;            int

(*hard_start_xmit)(struct sk_buff *skb,

unsigned char   dev_addr;       struct

net_device *dev);

unsigned char   addr_len;        int

(*set_mac_address)( struct net_device

unsigned long   trans_start;      *dev,void* addr);

……

}

定義好net_device結構體后,根據實際情況編寫操作函數,其中hard_start_xmit()函數是用來發送數據的,set_mac_address()是進行網絡參數設置的。

當linux初始化時將調用初始化函數int device_init( ),該函數包括以下內容:

注冊所用設備。linux用設備號來標識字符設備和塊設備。設備號分為主設備號和從設備號,最終形成設備接點。設備節點在訪問字符設備和塊設備的設備驅動程序時將使用。通常主設備號標識設備對應的驅動程序,大多數設備是“一個主設備號對應一個驅動程序”,如:虛擬控制臺和串口終端由驅動程序4管理。次設備號由內核使用,用于確定設備文件所指的設備。字符設備和塊設備注冊時必須先定義好設備號。

字符設備注冊函數如下:

int register_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

其中 major是主設備號。

由于對網絡設備驅動程序的訪問不需要設備節點,它的注冊函數如下:

int register_netdev(struct net_device *dev)

注冊設備所用的中斷。中斷在現代計算機結構中有重要的地位,操作系統必須提供程序響應中斷的能力。一般是把一個中斷處理程序注冊到系統中去。操作系統在硬件中斷發生后調用驅動程序的處理程序。

注冊中斷所用的函數如下:

int request_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

其中,irq是中斷向量;handler是中斷處理函數;flags是中斷處理中的掩碼;devices是設備名;dev_id是在中斷共享使用的id。

當linux不使用該設備時,就要調用清除函數void_devicie_exit ( ),它同初始化函數相對應的,主要是:

注銷設備,字符設備注銷函數如下:

int unregister_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

注銷中斷,注銷中斷所用的函數如下:

int free_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

釋放資源,模塊初始化和清除函數采用module_init(device_init),module_exit(device_exit) 形式

編寫服務子程序

服務于I/O請求的子程序,又稱為驅動程序的上半部分。調用這部分是由于系統調用的結果。這部分程序在執行的時候.系統仍認為是和進行調用的進程屬于同一個進程. 只是用戶態變成了核心態,具有進行此系統調用的用戶程序的運行環境.因此可以在其中調用sleep等與進程運行環境有關的函數。

中斷服務子程序,又稱為驅動程序的下半部分。在Linux系統中.并不是直接從中斷向量表中調用設備驅動程序的中斷服務子程序,而是由Linux系統來接收硬件中斷,再由系統調用中斷服務子程序。中斷可以產生在任何一個進程運行的時候,因此在中斷服務程序被調用的時候.不能依賴于仟何進程的狀態,也就不能調用任何與進程運行環境相關的函數。因為設備驅動程序一般支持同一類型的若干設備,所以一般在系統調用中斷服務程序的時候,都帶有一個或多個參數,以唯一標識請求服務的設備。

設備驅動程序的使用

直接將驅動程序編譯進linux內核

將設備驅動程序復制到 linux/drivers相關的子目錄下,比如字符設備驅動程序 就放在linux/drivers/char下。

修改linux/drivers相關的子目錄的Makefile,

如obj-$(config_dev_driver) +=dev_driver.o,這樣在編譯內核時將會編譯dev_driver.c,生成 dev_driver.o.

對內核進行重新編譯時,進行相關的配置,比如要使用AT91RM9200的UART,就要如下配置:

Character devices -> Serial drivers ->AT91RM9200 serial port support

將驅動程序編譯成驅動模塊

在設備驅動程序中要有兩個重要函數:

module_init(dev_init),module_exit(dev_exit)

利用相應的交叉編譯器以及編譯命令將驅動程序dev_driver.c編譯成dev_driver.o 這樣的動態驅動模塊。利用insmod命令給系統安裝驅動模塊,如果在/dev目錄下沒有相應的設備文件,就可以使用mknod創建一個設備文件。利用 rmmod命令卸載驅動模塊,設備文件的刪除可以用rm命令。

結語

設備驅動程序的開發是在Linux環境中最復雜的編程任務之一 。它需要和硬件打交道,容易引起系統崩潰,而且很難調試。掌握設備驅動程序的開發技術,將使得開發嵌入式Linux的系統更為迅速和有效。

參考文獻:

1.  AlessandroRubmi,JonathanCorbet.Linux設備驅動程序,第3版,中國電力出版社,2006.2

2.  毛德操、胡希明,Linux內核源代碼情景分析,浙江大學出版社,2001

3.  周立功、陳明記、陳渝,ARM嵌入式linux系統構建與驅動開發,北京航空航天大學出版社,2006年1月第1版

4.  李祥兵、鄭扣根,Linux中I2C總線驅動程序的開發,計算機工程與設計,2005;26(1)

5.  鄭偉、王欽若,Linux內核空間設備驅動程序的開發,微計算機信息,2003;19(12)

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美日韩国产一级| 国产综合欧美在线看| 美女福利精品视频| 欧美a一区二区| 免费日韩成人| 免费在线播放第一区高清av| 久久精彩视频| 欧美xx69| 欧美大香线蕉线伊人久久国产精品| 亚洲国产综合在线看不卡| 亚洲欧洲日韩在线| 欧美日韩1区2区3区| 香蕉乱码成人久久天堂爱免费| 欧美中文字幕在线视频| 亚洲图片欧美日产| 久久成人一区| 国产精品久久久久aaaa九色| 久久一区二区三区国产精品| 欧美日韩国产首页在线观看| 欧美吻胸吃奶大尺度电影| 亚洲天堂网在线观看| 麻豆精品视频在线| 最新国产成人av网站网址麻豆| 中日韩在线视频| 国产精品高清免费在线观看| 欧美三级视频在线观看| 久久av资源网站| 亚洲国产精品悠悠久久琪琪| 亚洲欧美99| 国产一区二区三区丝袜| 国产精品久久久久久久久搜平片| 国内精品美女在线观看| 亚洲欧美日韩国产成人| 亚洲大片一区二区三区| 午夜精品久久久久久| 激情欧美一区二区| 一区二区三区精品国产| 欧美—级高清免费播放| 国产亚洲精品bv在线观看| 久久这里只精品最新地址| 欧美色道久久88综合亚洲精品| 日韩视频精品| 亚洲激情在线观看| 亚洲成色最大综合在线| 亚洲国产欧美在线| 久久永久免费| 国产精品色一区二区三区| 亚洲国产精品一区二区第四页av| 国产九色精品成人porny| 美女国产精品| 亚洲性视频h| 欧美精品国产精品日韩精品| 欧美日韩国产精品成人| 久久av资源网| 亚洲欧洲日本专区| 国自产拍偷拍福利精品免费一| 在线精品亚洲| 国产一区二区三区在线免费观看| 免费短视频成人日韩| 国产欧美精品xxxx另类| 裸体一区二区| 亚洲电影天堂av| 久久夜色精品国产欧美乱| 亚洲一区二区三区视频播放| 国产精品jvid在线观看蜜臀| 黄色成人在线免费| 性一交一乱一区二区洋洋av| 欧美激情五月| 国产精品一区二区视频| 亚洲精品美女91| 精品粉嫩aⅴ一区二区三区四区| 国内精品视频666| 欧美黄色成人网| 久久精品亚洲一区二区| 国产精品久久久一区二区三区| 欧美日韩亚洲一区二区三区在线观看| 黄色精品在线看| 欧美肉体xxxx裸体137大胆| 香蕉成人啪国产精品视频综合网| 亚洲视频免费| 黄色av成人| 国产精品社区| 99热在这里有精品免费| 国产精品av一区二区| 午夜精品视频在线观看| 国内精品模特av私拍在线观看| 欧美日韩一区二区免费视频| 亚洲欧洲久久| 国产精品久久久久久久久久免费| 亚洲欧美制服中文字幕| 欧美黄色大片网站| 亚洲日本久久| 亚洲三级视频| 国产深夜精品| 亚洲欧美成人| 一本久久综合| 欧美三级资源在线| 欧美人与禽猛交乱配| 亚洲自拍偷拍网址| 日韩亚洲国产精品| 亚洲视频久久| 欧美成人性网| 99xxxx成人网| 欧美美女福利视频| 久久先锋资源| 亚洲三级性片| 久久久999精品免费| 久久国产一二区| 欧美在线看片| 国产精品日韩一区二区三区| 亚洲欧美日韩在线不卡| 美女精品视频一区| 午夜在线视频一区二区区别| 国产精品一区一区三区| 亚洲视频狠狠| 欧美成人自拍视频| 一区二区三区精品视频在线观看| 久久精品国产一区二区三区| 一区免费观看视频| 蜜桃av一区二区在线观看| 国产精品网曝门| 在线日韩视频| 欧美不卡激情三级在线观看| 欧美视频在线观看免费| 亚洲二区在线| 欧美精选午夜久久久乱码6080| 久久综合九色综合欧美狠狠| 性色av一区二区怡红| 欧美中文字幕在线播放| 亚洲午夜精品视频| 欧美日韩在线第一页| 久久久蜜桃一区二区人| 亚洲一区免费视频| 欧美成人亚洲| 亚洲午夜精品| 久久国内精品自在自线400部| 国内激情久久| 欧美高清在线观看| 国产精品videosex极品| 欧美一区二区三区视频在线观看| 亚洲裸体俱乐部裸体舞表演av| 国产精品国产三级国产普通话蜜臀| 国产自产高清不卡| 欧美专区第一页| 欧美日韩另类视频| 欧美日韩天天操| 91久久精品美女高潮| 国产精品视频在线观看| 国内精品久久久久久| 亚洲一区二区三区免费视频| 国产日韩一区| 欧美h视频在线| 国产一区二区三区精品久久久| 先锋影音一区二区三区| 亚洲美女电影在线| 欧美亚洲综合另类| 欧美国产精品劲爆| 欧美在线观看一区二区三区| 欧美日韩免费网站| 欧美激情一区二区三区| 欧美一区网站| 黄色资源网久久资源365| 中文一区二区在线观看| 亚洲国产99| 欧美另类一区二区三区| 欧美精品免费视频| 亚洲精品久久久久久下一站| 美日韩精品视频| 亚洲级视频在线观看免费1级| 欧美日韩中文字幕综合视频| 中国成人亚色综合网站| 99re成人精品视频| 另类综合日韩欧美亚洲| 国产精品入口福利| 亚洲承认在线| 欧美精品一区二区三区一线天视频| 久久精品国产第一区二区三区| 国产欧美一区二区精品忘忧草| 欧美精品激情| 亚洲手机视频| 午夜精品久久久久久99热软件| 91久久国产自产拍夜夜嗨| 99国产精品久久久久老师| 久久精品视频在线播放| 这里只有精品视频在线| 午夜在线视频观看日韩17c| 亚洲综合社区| 久久久久.com| 亚欧成人在线| a91a精品视频在线观看| 制服丝袜亚洲播放| 国产精品多人| 亚洲最新视频在线播放| 欧美手机在线| 黄网站色欧美视频| 欧美jizz19性欧美| 国产一区二区高清| 国产日韩精品电影| 欧美激情精品久久久久久| 国产精品综合色区在线观看| 国产欧美一区二区精品仙草咪| 国产在线不卡视频| 亚洲国产精品久久久久| 母乳一区在线观看| 国产精品国产三级国产专播品爱网| 一区二区三区四区国产| 国产一区二区三区久久久| 在线不卡视频| 国产精品免费在线| 国产美女在线精品免费观看| 国产综合久久久久影院| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲欧美日韩爽爽影院| 在线成人小视频| 亚洲国产精品专区久久| 国产精品欧美久久| 欧美日韩一二三四五区| 国产人成一区二区三区影院| 在线观看成人小视频| 亚洲欧美激情视频| 女女同性精品视频| 伊人夜夜躁av伊人久久| 久久精品视频在线播放| 亚洲国产欧美一区二区三区丁香婷| 欧美韩日一区二区| 国产精品综合av一区二区国产馆| 羞羞漫画18久久大片| 亚洲性视频网站| 亚洲国产成人tv| 国产自产v一区二区三区c| 欧美日韩另类国产亚洲欧美一级| 国产精品普通话对白| 欧美日韩在线一区二区| 亚洲精品黄网在线观看| 男人的天堂成人在线| 亚洲一区二区在线观看视频| 久久国产精品久久精品国产| 中文精品视频一区二区在线观看| 你懂的一区二区| 欧美日本亚洲视频| 欧美精品一区二区三区久久久竹菊| 国产精品一区免费观看| 久久精品99久久香蕉国产色戒| 欧美性视频网站| 亚洲第一成人在线| 欧美日韩精选| 亚洲第一免费播放区| 伊人久久婷婷| 国产午夜精品全部视频在线播放| 激情欧美丁香| 国产婷婷97碰碰久久人人蜜臀| 欧美电影在线观看完整版| 国产欧美日韩亚州综合| 亚洲高清不卡在线观看| 国产精品第13页| 欧美中文字幕在线播放| 亚洲专区免费| 国产精品午夜久久| 一区二区三区黄色| 国产精品试看| 免费日本视频一区| 欧美一区二区三区四区在线观看地址| 欧美日韩国产精品一区| 国产一区二区| 亚洲欧美成人| 久久久免费av| 亚洲欧美日韩综合一区| 亚洲一区二区三区在线播放| 午夜久久黄色| 久久精品视频在线免费观看| 国产精品一区二区你懂得| 亚洲视频大全| 久久精品国产免费| 亚洲国产另类久久久精品极度| 日韩视频中文| 午夜国产精品影院在线观看| 亚洲精品国产精品国自产观看浪潮| 欧美日韩在线一区二区| 亚洲欧美日韩国产综合| 久热精品在线| 国产在线乱码一区二区三区| 亚洲精品免费在线| 欧美日韩一二三四五区| 国产午夜亚洲精品理论片色戒| 久久久噜噜噜久久| 激情久久久久久久| 亚洲欧美日韩一区在线| 国产日韩高清一区二区三区在线| 韩国v欧美v日本v亚洲v| 国产亚洲人成网站在线观看| 亚洲黄色天堂| 国产精品99一区二区| 欧美日韩亚洲一区二区三区在线| 亚洲午夜黄色| 欧美一级视频| 亚洲精品视频免费观看| 午夜精品久久久久久久男人的天堂| ●精品国产综合乱码久久久久| 欧美aⅴ一区二区三区视频| 欧美一区二区三区四区在线观看地址| 久久久精品国产一区二区三区| 久久er99精品| 欧美中文在线观看| 99re视频这里只有精品| 国产精品videossex久久发布| 亚洲激情电影在线| 久久麻豆一区二区| 亚洲视频每日更新| 99国产精品国产精品毛片| 欧美日韩在线视频一区二区| 亚洲综合导航| 午夜精品福利在线| 亚洲伦理一区| 亚洲综合成人婷婷小说| 99国产精品自拍| 欧美日韩精品免费在线观看视频| 亚洲婷婷综合久久一本伊一区| 欧美一区二区三区的| 日韩视频一区| 在线观看欧美精品| 国内精品**久久毛片app| 欧美在线观看www| 欧美二区在线| 在线观看的日韩av| 亚洲黄色性网站| 激情久久久久久久久久久久久久久久| 一区二区久久久久| 精品88久久久久88久久久|