混杂设备驱动模型
混杂设备,它们拥有相同的主设备号(数字10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。然后调用其file_operations结构中注册的文件操作接口进行操作。对比普通字符设备操作比较简单
一、初始化miscdevice
1 struct miscdevice {
2 int minor; /* 次设备号*/
3 const char *name; /* 设备名*/
4 const struct file_operations *fops; /*文件操作*/
5 struct list_head list;
6 struct device *parent;
7 struct device *this_device;
8 };
例:
static struct miscdevice gpio_miscdev = {
.minor = MISC_DYNAMIC_MINOR, //次设备
.name = DEVICE_NAME, //设备名 open调用时的名称
.fops = &gpio_fops, //操作结构体实现功能
};
二、注册miscdevice
int misc_register(struct miscdevice * misc)
参数:设备描述结构体指针
例:
misc_register(&gpio_miscdev);
三、实现操作结构体
static struct file_operations gpio_fops={
.owner = THIS_MODULE,
.open = gpio_open,
.write = gpio_write,
.read = gpio_read,
.release = gpio_release,
.ioctl = gpio_ioctl,
};
各函数指针具体原型见字符设备模型:https://blog.csdn.net/xiupong/article/details/110261854
四、注销miscdevice
int demisc_register(struct miscdevice * misc)
参数:设备描述结构体指针
例:
misc_deregister(&gpio_miscdev);
模板:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <linux/delay.h>
#include <linux/bcd.h>
#include <linux/capability.h>
#include <linux/rtc.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <../arch/arm/mach-mx28/mx28_pins.h>
#define DEVICE_NAME "imx28x_led"
static int gpio_open(struct inode *inode, struct file *filp);
static int gpio_release(struct inode *inode, struct file *filp);
ssize_t gpio_write(struct file *filp, const char __user *buf, size_t count,loff_t *f_pos);
static int gpio_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg);
static int gpio_init(void);
static void gpio_exit(void);
static int gpio_open(struct inode *inode, struct file *filp)
{
return 0;
}
static int gpio_release(struct inode *inode, struct file *filp)
{
return 0;
}
ssize_t gpio_write(struct file *filp, const char __user *buf, size_t count,
loff_t *f_pos)
{
return count;
}
static int gpio_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg)
{
return 0;
}
static struct file_operations gpio_fops={
.owner = THIS_MODULE,
.open = gpio_open,
.release = gpio_release,
.ioctl = gpio_ioctl,
};
static struct miscdevice gpio_miscdev = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &gpio_fops,
};
static int __init gpio_init(void)
{
misc_register(&gpio_miscdev);
printk(DEVICE_NAME" up. \n");
return 0;
}
static void __exit gpio_exit(void)
{
misc_deregister(&gpio_miscdev);
printk(DEVICE_NAME " down.\n");
}
module_init(gpio_init);
module_exit(gpio_exit);
参考:https://www.cnblogs.com/wmx-learn/p/5359838.html