1.Linux三大设备驱动:
字符设备:IO的传输过程是以字符为单位的,没有缓冲。比如I2C,SPI都是字符设备。
块设备:IO的传输过程是以块为单位的。跟存储相关的都属于块设备,比如TF卡。
网络设备:与前两个不一样,是以socket套接字来进行访问的。
2.杂项设备是字符设备的一种。可以自动生成设备节点。
我们的系统里有很多杂项设备,可以输入 cat /proc/misc 命令来查看。
3.杂项设备的主设备号是相同的,次设备号是不同的。主设备号相同可以节省内核资源。
4.设备号包含主设备号和次设备号,主设备号在Linux系统里面是唯一的,次设备号不一定。
主设备号相同的被视为同一类设备。查看:cat /proc/devices
杂项设备的主设备号是10,也就是说我们设计的驱动都是misc下面的子设备。
5.杂项设备的描述,定义在内核源码路径: include/linux/miscdevice.h
struct miscdevice { int minor; //次设备号 const char *name; //设备节点的名字 const struct file_operations *fops; //文件 *** 作集 struct list_head list; struct device *parent; struct device *this_device; const char *nodename; umode_t mode; }; //注册杂项设备 extern int misc_register(struct miscdevice * misc); //注销杂项设备 extern int misc_deregister(struct miscdevice *misc);
6.file_operations文件 *** 作集定义在 include/linux/fs.h
有很多成员,里面的一个结构体成员都对应一个调用。
7.注册杂项设备的流程。
(1)填充 miscdevice 这个结构体
(2)填充 file_operations 这个结构体
(3)注册杂项设备并生成设备节点
8.上代码!
//包含宏定义的头文件 #include//包含初始化加载模块的头文件 #include //杂项设备头文件 #include //文件 *** 作符头文件 #include //定义文件 *** 作符 struct file_operations misc_fops = { .owner = THIS_MODULE }; //杂项设备结构体 struct miscdevice misc_dev = { //次设备号动态分配 .minor = MISC_DYNAMIC_MINOR, //设备节点的名字 .name = "hello_misc", //文件 *** 作符 .fops = &misc_fops }; //装载卸载函数实体 static int __init misc_init(void) { int ret; //注册杂项设备 ret = misc_register(&misc_dev); if(ret < 0) { printk("misc register is errorn"); return -1; } printk("misc_initn"); return 0; } static void __exit misc_exit(void) { //卸载杂项设备 misc_deregister(&misc_dev); printk("misc_exitn"); } //装载卸载函数声明 module_init(misc_init); module_exit(misc_exit); //开源许可证GPL声明 MODULE_LICENSE("GPL");
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)