Linux设备驱动实现自动创建设备节点
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/device.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/ioctl.h> #define DRIVERNAME "xxx" #define DEV_MINOR 0 static dev_t xxx_devno = 0; static struct class * xxx_class; struct xxx_dev { struct cdev cdev; }xxxdev; /*-----------------------------------------------------------------------------------*/ static int xxx_open(struct inode *inode, struct file *filp) { return 0; } static ssize_t xxx_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos) { return 0; } static ssize_t xxx_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos) { return 0; } static int xxx_release(struct inode *inode, struct file *filp) { return 0; } static int xxx_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { int ret = 0; switch (cmd) { case CPLD_VERSION: break; case CPLD_RESET: break; case CPLD_RELAY: break; case CPLD_RJ45: break; case CPLD_INTERUPT: break; case CPLD_FAN: break; default: printk("Error xxx cmd\n"); break; } return 0; } /*-----------------------------------------------------------------------------------*/ static struct file_operations xxx_fops = { .owner = THIS_MODULE, .open = xxx_open, .read = xxx_read, .write = xxx_write, .ioctl = xxx_ioctl, .close = xxx_release, }; static int xxx_init(void) { int ret = 0; /*动态申请设备号*/ ret = alloc_chrdev_region(&xxx_devno, DEV_MINOR, 1, DRIVERNAME); if (ret < 0) { printk("xxx register char dev failed\n"); goto out; } /*初始化cdev结构,注册cdev*/ cdev_init(&(xxxdev.cdev), &xxx_fops); xxxdev.cdev.owner = THIS_MODULE; ret = cdev_add(&(xxxdev.cdev), xxx_devno, 1); if (ret) { printk("Error adding xxx device\n"); goto add_err; } /*创建设备节点/sys/class/xxx和/dev/xxx*/ xxx_class = class_create(THIS_MODULE, DRIVERNAME); if (IS_ERR(xxx_class)) { ret = PTR_ERR(xxx_class); goto class_err; } device_create(xxx_class, NULL, xxx_devno, NULL, DRIVERNAME); printk("xxx init\n"); return 0; class_err: cdev_del(&(xxxdev.cdev)); add_err: unregister_chrdev_region(xxx_devno, 1); out: return ret; } static void xxx_exit(void) { device_destroy(xxx_class, xxx_devno); class_destroy(xxx_class); cdev_del(&(xxxdev.cdev)); unregister_chrdev_region(xxx_devno, 1); printk("module xxx exit\n"); } module_init(xxx_init); module_exit(xxx_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("liuwei"); MODULE_DESCRIPTION("char driver");
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。