新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于嵌入式Linux系統設備驅動程序的開發

        基于嵌入式Linux系統設備驅動程序的開發

        作者: 時間:2012-04-19 來源:網絡 收藏


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

        注冊所用設備。用設備號來標識字符設備和塊設備。設備號分為主設備號和從設備號,最終形成設備接點。設備節點在訪問字符設備和塊設備的設備時將使用。通常主設備號標識設備對應的,大多數設備是“一個主設備號對應一個”,如:虛擬控制臺和串口終端由驅動程序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。

        不使用該設備時,就要調用清除函數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)

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

        linux相關文章:linux教程



        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 阜康市| 平罗县| 来安县| 常熟市| 宜良县| 济宁市| 黔江区| 平昌县| 静海县| 永川市| 岑巩县| 濉溪县| 依安县| 鞍山市| 双鸭山市| 合江县| 武穴市| 顺平县| 十堰市| 怀安县| 金门县| 丹寨县| 武强县| 于都县| 香格里拉县| 沙田区| 宜兴市| 武城县| 盐边县| 隆子县| 眉山市| 德钦县| 清水河县| 嘉定区| 凤翔县| 桑植县| 登封市| 静安区| 库尔勒市| 镇雄县| 岱山县|