博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
misc_register和register_ch…
阅读量:4052 次
发布时间:2019-05-25

本文共 2061 字,大约阅读时间需要 6 分钟。

原文地址:
作者:

注册杂项字符设备,该类设备使用同一个主设备号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 内核的includelinuxmiscdevice.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, %dn", __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 %dn",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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是一样的,相当于读写同一个设备

转载地址:http://fqsci.baihongyu.com/

你可能感兴趣的文章
浏览器页面之间推送消息 A窗口给B窗口推送消息 用于cef多个browser之间通信
查看>>
冒泡排序的2种写法
查看>>
java 使用html写UI 做winform win桌面客户端程序(一)
查看>>
jxbrowser 教程 1 使用jxbrowser 创建简单的浏览器 使用html5+java写cs客户端
查看>>
jxbrowser 监听所有网络请求 jxbrowser 系列教程2
查看>>
jxbrowser 实现java 和 js互相调用(破解版请联系作者)
查看>>
jxbrowser java代码直接调用js代码 (破解版请联系作者)免license
查看>>
jxbrowser 实现自定义右键菜单 jxbrowser破解版请联系作者
查看>>
快速开发框架设计
查看>>
需要统计的数据
查看>>
eclipse js jsp 卡怎么办,解决办法
查看>>
高性能J2EE接口平台设计
查看>>
spring mvc tomcat 线程池的坑
查看>>
JAVA 生成不重复订单号 优化版本 订单号格式为yyyymmdd后面自增
查看>>
mybatis-jpa插件使用教程
查看>>
cas 4.2.7 和 Nginx 整合遇到的问题 登录一会可以一会不可以
查看>>
CAS 单点登出 loginout 解决方案 -- 最靠谱的方案,不是抄的--还是不靠谱大家不要抄了
查看>>
springboot 支持jsp 直接访问jsp办法无需通过controller转发
查看>>
后续框架可以优化的点
查看>>
SpringBoot Logback 配置参数迁移到配置中心 Apollo
查看>>