Linux 字符设备驱动程序示例:cdd_demo
#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");
// 代码实现了一个简单的字符设备驱动程序,包括设备号申请、设备结构初始化、设备添加到内核、设备类创建、设备文件创建等步骤。其中包括设备打开、读写操作和ioctl接口的实现。模块的初始化函数为myinit,退出函数为myExit。模块的许可证为GPL,作者为xxxxx,版本号为1.0,描述为'A symbol TEST'。
原文地址: https://www.cveoy.top/t/topic/oUwH 著作权归作者所有。请勿转载和采集!