Linux驅動基本框架簡介

        Linux驅動必須先由module_init ( function_name)函數載入驅動,由module_exit (function_name )函數卸載驅動,其中function_name分別爲初始化函數和清除設備的函數。

        要創建一個設備,得使用dev_t devno = MKDEV(DL402_MAJOR, 0)獲取設備號,其中DL402_MAJOR是接口板的主設備號,再使用函數register_chrdev_region向系統註冊字符驅動,register_chrdev_region函數定義爲:

                         int register_chrdev_region(dev_tfirst, unsigned int count, char *name);

        其中第一個參數是要註冊的設備號,第二個參數是要註冊設備的個數,第三個是要註冊設備的設備名。

        註冊字符設備後,用request_region(unsigned longfirst, unsigned long n, const char *name) 函數向內核申請n個I/O端口,這些端口從first開始,name參數爲設備的名稱,成功返回非NULL。申請了個I/O端口後,便該申請一箇中斷接口。

         使用request_irq(unsigned int irq, irqreturn_t(*handler), unsigned long flags, const char *dev_name, void *dev_id)函數向內核申請中斷接口,其中參數irq表示所要申請的硬件中斷號;handler爲向系統登記的中斷處理子程序名;flags是申請時的選項,它決定中斷處理程序的一些特性dev_name爲設備名,將會出現在/proc/interrupts文件裏。如果中斷由某個處理程序獨佔,則dev_id可以爲NULL。request_irq返回0表示成功,返回-INVAL表示irq>15或handler==NULL,返回-EBUSY表示中斷已經被佔用且不能共享。若申請失敗同樣取消之前的步驟。在卸載模塊時需釋放中斷使用void free_irq(unsigned int irq,void *dev_id)。

         

         初始化字符設備和加載字符設備,使用設備需要一系列函數,這些函數需要包含到結構體file_operations中,其中包含讀、打開以及中斷處理的函數,定義函數void read(void)、void open(void)、voidioctl(void),以及結構體:

static const struct     file_operations fops = {

        .owner          = THIS_MODULE,

        .read           = read,

        .open           = open,

        .unlocked_ioctl = ioctl,

};

     之後,方可初始化、加載字符設備:

cdev_init(dev, &fops);

        ret     =  cdev_add(dev, devno, 1);

        cdev_add函數返回0則成功,檢測其是否成功只需要檢測ret是否爲0,失敗需要釋放端口設備號、申請的內存以及申請的I/O端口號:

            free_irq(0,dev);

                 unregister_chrdev_region(devno, 1);

                release_region(0, 1);

                kfree(dev);

                return ret;

        至此,初始化的程序以及完成,還需要卸載驅動的程序,建立函數void exit(void)爲卸載驅動的函數,其中應包含釋放設備號、申請的I/O端口、釋放中斷接口:

              free_irq(0, dev);

        free_irq(0, NULL);

        release_region(0, 1);

        kfree(dev);

      最後需要動態加載初始化驅動的函數以及卸載驅動的函數:

      module_init(init);

      module_exit(exit);

     編譯、執行後,在shell界面上執行命令”lsmod”,在Module欄下看到你的設備名稱則成功,安裝以上來寫的程序,應該看到“Test”。若要卸載設備,只需要在shell界面上執行命令”remod  設備名稱”即可。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章