字符設備驅動編寫步驟

1.標準字符設備驅動
  a.註冊設備號 如   
if(key_major) /*靜態註冊*/
        err = register_chrdev_region(devno, 1, DEVICE_NAME);
    else
    {    /*動態註冊*/
        err = alloc_chrdev_region(&devno, 0, 1, DEVICE_NAME);
        key_major = MAJOR(devno);
    }
 

 b.內存申請給cdev(當cdev定義爲指針時)然後調用以下函數進行設備初始化並添加該設備

void cdev_init(struct cdev *cdev, const struct file_operations *fops)
int cdev_add(struct cdev *p, dev_t dev, unsigned count)

 

c.如需在/dev下自動創建設備,需調用如下函數

struct class *key_class = class_create(THIS_MODULE, name);
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
 

*classs 就是class_create返回的key_class;parent如沒有就設爲NULL;devt設備號;drvdata 如無就爲NULL,後面的就是設備名稱。也可調用mknod 手動創建設備節點。

自此設備已經成功添加,一下的工作就時完成file_operations中相應函數就好了。

2.混雜模式設備驅動

只需在模塊初始化和退出時調用以下函數即可完成設備的註冊,設備節點創建等一系列工作,此模式下的主設備號爲10

int misc_register(struct miscdevice * misc)
int misc_deregister(struct miscdevice *misc)
struct miscdevice {
 int minor;   /*次設備號*/
 const char *name; /*設備名稱 */
 const struct file_operations *fops;
 struct list_head list;
 struct device *parent;
 struct device *this_device;
};
 

剩下的工作就是完成file_operations中的相應函數功能。

3.plat_form平臺下的驅動
  利用platform機制開發設備驅動的流程 :定義platform_device--註冊platform_device--定義platform_driver--註冊platform_device。對於系統已經註冊過的設備就只需實現後兩步就可以了,但是在註冊的設備名字 和註冊的驅動名字一定要相同,否則不會註冊成功。當platform總線匹配到總線上註冊的設備和驅動後,就會調用platform_driver 上的probe函數(此時總線的probe函數爲NULL)。在probe中可以獲取設備的內存資源和中斷資源。所有這些操作完成後 就是完成其一些file_operations的操作,然後將其定義爲字符設備或混在設備等,在/dev創建其對應的設備文件。(爲什麼這麼做還沒有搞懂)應用程序就可以通過open對其操作了。

對應的驅動和測試程序可以查看blog中的 資源 3種模式的按鍵驅動(cdev misc platform).rar

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/funy_liu/archive/2010/02/24/5324079.aspx

發佈了48 篇原創文章 · 獲贊 15 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章