註冊雜項字符設備,該類設備使用同一個主設備號10
雜項字符設備使用的數據結構
struct miscdevice {
int minor;
const char *name;
struct file_operations *fops;
struct list_head list;
struct device *dev;
struct class_device *class;
char devfs_name[64];
};
雜項設備(misc device)
雜項設備也是在嵌入式系統中用得比較多的一種設備驅動。在 Linux 內核的include/linux/miscdevice.h文件,要把自己定義的misc device從設備定義在這裏。其實是因爲這些字符設備不符合預先確定的字符設備範疇,所有這些設備採用主設備號10 ,一起歸於misc device,其實misc_register就是用主設備號10調用register_chrdev()的。也就是說,misc設備其實也就是特殊的字符設備。
misc_device是特殊的字符設備。註冊驅動程序時採用misc_register函數註冊,此函數中會自動創建設備節點,即設備文件。無需mknod指令創建設備文件。因爲misc_register()會調用class_device_create()或者device_create()。
字符設備(char device)
使用 register_chrdev(LED_MAJOR,DEVICE_NAME,&dev_fops)註冊字符設備驅動程序時,如果有多個設備使用該函數註冊驅動程序,LED_MAJOR不能相同,否則幾個設備都無法註冊(我已驗證)。如果模塊使用該方式註冊並且LED_MAJOR爲0(自動分配主設備號),使用insmod命令加載模塊時會在終端顯示分配的主設備號和次設備號,在/dev目錄下建立該節點,比如設備leds,如果加載該模塊時分配的主設備號和次設備號爲253和0,則建立節點:mknod leds c 253 0。使用register_chrdev (LED_MAJOR,DEVICE_NAME,&dev_fops)註冊字符設備驅動程序時都要手動建立節點,否則在應用程序無法打開該設備。
------------------------------------------------------
#include <linux/miscdevice.h> //struct miscdevice
#include <linux/fs.h> //struct file_operations
#define KDA_MINOR 44
static int kda_open(struct inode *inode, struct file *file)
{
printk("%s, %d/n", __FUNCTION__, __LINE__);;
return 0;
}
static struct file_operations kda_fops = {
.owner = THIS_MODULE,
.open = kda_open,
};
static struct miscdevice kda_dev = {
KDA_MINOR,
"kda",
&kda_fops
};
static int __init hello_init(void)
{
int err;
printk("<1>Hello world 1./n");
err = misc_register(&kda_dev);
if (err) {
printk("envctrl: Unable to get misc minor %d/n",
kda_dev.minor);
}
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye world 1./n");
misc_deregister(&kda_dev);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zengxiaolong ");
MODULE_DESCRIPTION("A sample driver");
MODULE_SUPPORTED_DEVICE("testdevice");
注:
1. 上面的代碼可以自動生成設備節點,但是該節點在/dev目錄下,而不在/dev/misc目錄下
2.
mkdir /dev/misc
mknod /dev/misc/kda c 10 44
ls /dev/kda
用戶態程序,讀寫/dev/kda和/dev/misc/kda是一樣的,相當於讀寫同一個設備