Linux驱动开发MISC
Posted XXX_UUU_XXX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux驱动开发MISC相关的知识,希望对你有一定的参考价值。
MISC驱动是杂项驱动,是使用platform的字符设备驱动。MISC设备驱动的主设备号都为10,不同设备使用不同次设备号。MISC设备自动创建cdev、class、device,简化了字符设备驱动的编写。
Linux定义miscdevice结构体表示MISC设备驱动,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 struct attribute_group **groups;
const char *nodename;
umode_t mode;
;
- minor:次设备号,主设备号固定为10。Linux在include/linux/miscdevice.h定义了一些次设备号,使用时可以从预定义的次设备号中挑选,也可以自己定义。注意:次设备号不能被其它设备使用。
- name:设备名,设备注册成功后在生成名为/dev/name的设备。
- fops:字符设备设备操作集。
使用misc_register向系统注册一个MISC设备。
int misc_register(struct miscdevice *misc);
- misc:要注册的MISC设备。
- 返回值:0,成功;负值,失败。
使用misc_deregister注销MISC设备。
int misc_deregister(struct miscdevice *misc);
- misc:要注销的MISC设备。
- 返回值:0,成功;负值,失败。
#define MISC_XXX_NAME "misc_xxx" /* MISC设备名 */
#define MISC_XXX_MINOR 144 /* 次设备号 */
static int xxx_open(struct inode *inode, struct file *filp)
return 0;
static int xxx_release(struct inode *inode, struct file *filp)
return 0;
/* 设备操作集 */
static struct file_operations xxx_fops =
.owner = THIS_MODULE,
.open = xxx_open,
.release = xxx_release,
/* ... */
;
/* MISC设备结构体 */
static struct miscdevice xxx_miscdev =
.minor = MISC_XXX_MINOR,
.name = MISC_XXX_NAME,
.fops = &xxx_fops,
;
/* flatform驱动的probe函数,当驱动与设备匹配以后此函数就会执行 */
static int xxx_probe(struct platform_device *dev)
int ret = 0;
/* ... */
ret = misc_register(&xxx_miscdev);
if(ret < 0)
return -EFAULT;
return 0;
/* platform驱动的remove函数,移除platform驱动的时候此函数会执行 */
static int xxx_remove(struct platform_device *dev)
/* ... */
/* 注销misc设备 */
misc_deregister(&xxx_miscdev);
return 0;
/* 匹配列表 */
static const struct of_device_id xxx_of_match[] =
.compatible = "misc-xxx" ,
/* Sentinel */
;
/* platform驱动结构体 */
static struct platform_driver beep_driver =
.driver =
.name = "misc-xxx-name", /* 驱动名字,用于和设备匹配 */
.of_match_table = xxx_of_match, /* 设备树匹配表 */
,
.probe = xxx_probe,
.remove = xxx_remove,
;
/* 驱动入口函数 */
static int __init xxx_init(void)
return platform_driver_register(&xxx_driver);
/* 驱动出口函数*/
static void __exit xxx_exit(void)
platform_driver_unregister(&xxx_driver);
module_init(xxx_init);
module_exit(xxx_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("XXXUUUXXX");
以上是关于Linux驱动开发MISC的主要内容,如果未能解决你的问题,请参考以下文章