#include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/device.h>

#define CDD_MAJOR 200 #define CDD_MINOR 0 #define CDD_COUNT 1 dev_t dev; struct cdev cdev; struct class *cdd_class;//设备类指针 struct device *cdd_device;//设备文件指针

int cdd_open(struct inode *inode,struct file *filp) { printk("enter cdd_open\n"); }

ssize_t cdd_read(struct file *filp,char __user *buf,size_t size ,loff_t loff) { printk("cdd_read\n"); }

ssize_t cdd_write(struct file *filp,const char __user *buf,size_t size ,loff_t loff) { printk("cdd_write\n"); }

long cdd_ioctl (struct file *filp,unsigned int cmd,unsigned long data) { printk("cdd_ioctrl\n"); }

struct file_operations cdd_fops={ .owner=THIS_MODULE, .open=cdd_open, .read=cdd_read, .write=cdd_write, unlocked_ioctl=cdd_ioctl,//oictl接口 .release=cdd_release,}

int myinit(void) { // 1 申请设备号 int ret; ret=alloc_chrdev_region(&dev,CDD_MINOR,CDD_COUNT,"cdd_demo"); if(ret<0) {printk("device init error.\n");return ret;} //初始化设备结构 cdev_init(&cdd_cdev,&cdd_fops); // 2 添加设备到内核 ret=cdev_add(&cdd_cdev,dev,CDD_COUNT); if(ret<0) {printk("device init error.\n");unregister_chrdev_region(dev,CDD_COUNT);return ret;} printk("succeed.\n"); // 3 创建设备类 cdd_class=class_create(THIS_MODULE,"cdd_class"); if(IS_ERR(cdd_class)){ cdev_del(&cdd_cdev); unregister_chrdev_region(dev,CDD_COUNT); printk("class_create failed.\n"); ret=PTR_ERR(cdd_class); return ret;} // 4创建设备文件 cdd_device=device_create(cdd_class,NULL,dev,NULL,"cdd"); if(IS_ERR(cdd_device)){ class_destroy(cdd_class,dev); cdev_del(&cdd_cdev); unregister_chrdev_region(dev,CDD_COUNT); printk("class_create faile.\n"); ret=PTR_ERR(cdd_device); return ret;} return 0; } void myExit(void) { device_destroy(cdd_device);// 4 class_destroy(cdd_class,dev);// 3 cdev_del(&cdd_cdev);// 2 unregister_chrdev_region(dev,CDD_COUNT);// 1 } module_init(myinit); module_exit(myExit);

MODULE_LICENSE("GPL"); MODULE_AUTHOR("xxxxx"); MODULE_VERSION("1.0"); MODULE_DESCRIPTION("A symbol TEST");

Linux 字符设备驱动开发入门:C语言实现示例

原文地址: https://www.cveoy.top/t/topic/oUwN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录