一直在看,但是很是晦澀難懂啊。從網上查了很多。現在寫下幫自己理清思路。
一、先理解一些關係
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 =