杂项设备
规定主设备号固定是10; 次设备号从0~255,表示杂项设备中的哪一个具体的设备;
#include <linux/major.h>
#define MISC_MAJOR 10
miscdevice结构体
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;
};
注册与注销函数
int misc_register(struct miscdevice *misc); //注册函数
void misc_deregister(struct miscdevice *misc);//注销函数
程序框架
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
int demo_open(struct inode *inode, struct file *ilep)
{
return 0;
}
int demo_close(struct inode *inode, struct file *filep)
{
return 0;
}
ssize_t demo_read(struct file *filep, char __user *buf, size_t s, loff_t *offset)
{
return 100;
}
ssize_t demo_write(struct file *filep, const char __user *buf, size_t s, loff_t *offset)
{
return 0;
}
struct file_operations demo_fops = {
.owner = THIS_MODULE,
.open = demo_open,
.release = demo_close,
.read = demo_read,
.write = demo_write,
};
struct miscdevice misc_demo = {
.minor = MISC_DYNAMIC_MINOR,
.name = "misc_demo",
.fops = &demo_fops,
};
static int __init misc_demo_init(void)
{
int ret = 0;
ret = misc_register(&misc_demo);
return ret;
}
static void __exit misc_demo_exit(void)
{
misc_deregister(&misc_demo);
}
module_init(misc_demo_init);
module_exit(misc_demo_exit);
MODULE_LICENSE("GPL");