自己整理的一个常用的字符设备驱动模板,原创,转载请注明出处。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/of_device.h>
int device_driver_major_number; /* 设备的主设备号 */
static struct class *user_drv_class; /* 创建类,系统自动生成设备节点 */
static struct class_device *user_drv_class_dev; /* 类下创建设备 */
static int user_drv_open(struct inode *inode, struct file *file)
{
}
static ssize_t user_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
}
static ssize_t user_drv_read(struct file *file, char __user *user, size_t size,loff_t*o)
{
}
loff_t user_drv_llseek(struct file *file, loff_t offset, int origin)
{
}
static unsigned user_drv_poll(struct file *file, poll_table *wait)
{
}
/* 创建设备结构 file_operations*/
static struct file_operations user_drv_fops = {
.owner = THIS_MODULE,
.open = user_drv_open,
.write = user_drv_write,
.read = user_drv_read,
.ioctl = user_drv_ioctl,
.release = user_drv_release,
.llseek = user_drv_llseek,
.poll = user_drv_poll,
};
/* 注册模块 */
static int user_drv_init(void)
{
/* 注册设备 */
device_driver_major_number = register_chrdev(0, "user_drv_name", &user_drv_fops);
/* 注册类class_drv_name */
user_drv_class = class_create(THIS_MODULE, "class_drv_name");
/* 注册类下设备device_inode_name,/dev/device_inode_name */
user_drv_class_dev = device_create(user_drv_class, NULL, MKDEV(device_driver_major_number, 0), NULL, "device_inode_name");
return 0;
}
/* 卸载模块*/
static void user_drv_exit(void)
{
/* 注销设备 */
unregister_chrdev(major, "first_drv");
/* 注销类下的设备device_inode_name */
device_destroy(user_drv_class_dev, MKDEV(major, 0));
/* 注销类class_drv_name */
class_destroy(user_drv_class);
}
module_init(user_drv_init);
module_exit(user_drv_exit);
MODULE_LICENSE("GPL");
拿来往里面填充就可以用了,挺方便的,希望可以对大家有帮助。