源码
/*mydemodrv_misc.c*/#include <linux/module.h>#include <linux/fs.h>#include <linux/uaccess.h>#include <linux/init.h>#include <linux/miscdevice.h>#define DEMO_NAME "my_demo_dev"static struct device *mydemodrv_device;static int demodrv_open(struct inode *inode, struct file *file){int major = MAJOR(inode->i_rdev);int minor = MINOR(inode->i_rdev);printk("%s: major=%d, minor=%d\n", __func__, major, minor);return 0;}static int demodrv_release(struct inode *inode, struct file *file){return 0;}static ssize_tdemodrv_read(struct file *file, char __user *buf, size_t lbuf, loff_t *ppos){printk("%s enter\n", __func__);return 0;}static ssize_tdemodrv_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos){printk("%s enter\n", __func__);return 0;}static const struct file_operations demodrv_fops = {.owner = THIS_MODULE,.open = demodrv_open,.release = demodrv_release,.read = demodrv_read,.write = demodrv_write};static struct miscdevice mydemodrv_misc_device = {.minor = MISC_DYNAMIC_MINOR,.name = DEMO_NAME,.fops = &demodrv_fops,};static int __init simple_char_init(void){int ret;ret = misc_register(&mydemodrv_misc_device);if (ret) {printk("failed register misc device\n");return ret;}mydemodrv_device = mydemodrv_misc_device.this_device;printk("succeeded register char device: %s\n", DEMO_NAME);return 0;}static void __exit simple_char_exit(void){printk("removing device\n");misc_deregister(&mydemodrv_misc_device);}module_init(simple_char_init);module_exit(simple_char_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("zhouchengzhu <1073355312@qq.com>");MODULE_DESCRIPTION("A simple hello world driver");MODULE_VERSION("2:1.0");
测试用例
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#define DEMO_DEV_NAME "/dev/my_demo_dev"int main(){char buffer[64];int fd;fd = open(DEMO_DEV_NAME, O_RDONLY);if (fd < 0) {printf("open device %s failded\n", DEMO_DEV_NAME);return -1;}read(fd, buffer, 64);close(fd);return 0;}
使用
[root@imx6ull:~/NFS]# insmod mydemodrv_misc.kosucceeded register char device: my_demo_dev[root@imx6ull:~/NFS]# ./test.rundemodrv_open: major=10, minor=56demodrv_read enter
设备分析
misc字符设备,又称为杂项设备,内核首先把不符合预先确定得字符设备划分为杂项设备。这一类设备得主设备号就是 10。使用得结构体
misc设备
struct miscdevice {int minor;const char *name;const struct file_operations *fops;struct list_head list;struct device *parent;struct device *this_device;const struct attribute_group **groups;const char *nodename;umode_t mode;};
对应得API
这两个函数用作创建misc字符设备。
extern int misc_register(struct miscdevice *misc);extern void misc_deregister(struct miscdevice *misc);
