字符設備驅動有關(一)

一直在看,但是很是晦澀難懂啊。從網上查了很多。現在寫下幫自己理清思路。


一、先理解一些關係

1、如果應用程序想控制硬件,是要通過庫函數、內核、和驅動才能達到目的。

                                 |---------------------------------------|

        應用------------|庫函數---------內核---------------驅動|-------------硬件

                               |---------------------------------------|

2、應用程序怎麼來控制硬件呢?

     是通過控制設備文件,設備文件就是將硬件等效爲文件,從而將對硬件的操作當做對文件的操作,用open,fopen等


       應用---------------------------------------設備文件


       怎麼創建設備文件呢?以便於應用來訪問。(這裏雖然創建了,但這個設備文件還沒有和硬件關聯起來,還需要驅動來實現,這步一般放到最後做)

       方法就是:

       a、手動創建mknod命令,也可以寫腳本。  

       b、動態創建:在驅動編程時創建

           首先創建一個類:class_create()

              然後根據這個類創建節點:device_create()

3、那驅動作用是將設備文件和硬件關聯起來。

         |----------------------------------------|      <------------>

       | 內核------------驅動 --------------硬件|      <------------>        設備文件

       |----------------------------------------|      <------------>

      關聯的方法:

      a、分配設備號:

          *自動:int alloc_chrdev_region()

             *手動:register_chrdev_region()

      b、將字符設備註冊到內核中:

             *動態內存初始化:cdev_alloc(),cdev.ops = &fops;cdev.owner =THIS_MODULE

             *靜態初始化cdev:cdev_init() ,  cdev.owner = THIS_MODULE

              然後添加到內核中:cdev_add()

-------------------------------------------------------------------------------------------------

以上框架就做好了。當然功能open,read等還沒實現。

而且更重要的是理論知道了,但是程序該怎麼寫啊。

先說上述的該怎麼轉換成程序


二、將上述所說轉化爲程序

1、驅動程序加載

int __init testchar_init(void)(參考helloworld模塊)
{

        a、alloc_chrdev_region() //動態分配主次設備號

        b、cdev_alloc()               //cdev分配空間              

        c、cdev_init()                 //cdev初始化

        d、cdev.owner = THIS_MODULE

        e、cdev_add()               //添加到內核

        f、class_create()          //動態設備文件的創建

        g、device_create()

}
module_init(testchar_init);

2、驅動程序卸載

void __exit testchar _cleanup(void)
{
        a、unregister_chrdev_region();//取消設備號
        b、class_device_destroy();      //取消動態設備文件的創建
        c、class_destroy();
        d、cdev_del();                        //從內核中取消註冊
}
module_exit(testchar_cleanup);

------------------------------------------------------------------------------------------

以上程序就是主要的模塊添加與卸載的程序,和helloword模塊是一樣的,不過還程序還不完善,下面來完善open,read等功能


三、一些數據結構

主要這三種:file_operations數據結構,file數據結構 和 inode數據結構.

1、file_operations數據結構:(其實內容還有很多,但基本只用到了下面幾個)

structfile_operations test_fops = 

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