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的主要内容,如果未能解决你的问题,请参考以下文章

linux驱动开发之misc类设备介绍

linux驱动开发之misc设备与蜂鸣器驱动

手把手教你从零实现Linux misc设备驱动一(基于友善之臂4412开发板)

Linux misc设备misc驱动框架

linux驱动分析misc设备驱动

linux设备驱动之misc驱动框架源码分析