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