上節,我們講解了如何寫第一個linux字符設備驅動程序,這節,我們將代碼做一下修改。
如下:
#include <linux/init.h>#include <linux/module.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/cdev.h>#include <linux/kdev_t.h>#include <linux/fs.h>dev_t dev_no ;static int __init cdev_test_init(void){ int ret ; PRintk("HELLO KERNEL FOR CDEV!/n"); //1、創建設備號-->第一個是主設備號,第二個是次設備號 //dev_no = MKDEV(222,2); //2、注冊設備號 //count表示要分配多少個設備號 //ret = register_chrdev_region(dev_no,1,"my_dev"); //申請設備號 ret = alloc_chrdev_region(&dev_no,1,1,"my_dev"); if(ret < 0){ goto register_error ; } register_error: return 0 ;}static int __exit cdev_test_exit(void){ //注銷驅動-->后面寫1表示從dev_no開始連續一個 unregister_chrdev_region(dev_no,1); return 0 ;}module_init(cdev_test_init);module_exit(cdev_test_exit);MODULE_LICENSE("GPL");然后重新編譯,將內核鏡像下載到開發板:cat /proc/devices查看
我們看到了,my_dev對應的主設備號是248了,上一個驅動是222,為什么這里就是248了,而不是222了呢?

因為,在這里,我們調用了#include <linux/fs.h>這個頭文件下的這個函數:
extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
這個函數的作用就是,由內核給我們分配一個設備號,這個設備號是內核自動分配的,就不需要我們去使用MKDEV這個宏來進行手動分配了。這也可以稱作是字符設備的動態分配方式。
函數原型如下:
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name){ struct char_device_struct *cd; //調用__register_chrdev_region來注冊字符設備 cd = __register_chrdev_region(0, baseminor, count, name); //注冊失敗返回PTR_ERR(cd)錯誤碼。 if (IS_ERR(cd)) return PTR_ERR(cd); //這里一樣的是調用MKDEV分配設備號 *dev = MKDEV(cd->major, cd->baseminor); return 0;}
新聞熱點
疑難解答