这是一个 Linux 设备驱动框架和测试程序的代码,实现了设备的初始化、读写、ioctl、设备文件的创建和销毁等功能。

代码结构:

#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");

代码功能:

  1. 申请设备号: 使用 alloc_chrdev_region 函数申请设备号,并将其存储在 dev 中。
  2. 初始化设备结构: 使用 cdev_init 函数初始化设备结构,并将文件操作函数指针指向 cdd_fops 结构体。
  3. 添加设备到内核: 使用 cdev_add 函数将设备添加到内核,使其能够被访问。
  4. 创建设备类: 使用 class_create 函数创建一个设备类,用于管理设备文件。
  5. 创建设备文件: 使用 device_create 函数创建一个设备文件,并将其添加到设备类中。

关键函数:

  • cdd_open:设备打开操作函数,用于初始化设备资源。
  • cdd_read:设备读取操作函数,用于从设备读取数据。
  • cdd_write:设备写入操作函数,用于向设备写入数据。
  • cdd_ioctl:设备控制操作函数,用于执行设备特定的控制命令。

程序作用:

该程序用于测试字符设备驱动程序是否正常工作。通过编译和加载该模块,可以在 /dev 目录下创建名为 cdd 的设备文件,并进行读写、ioctl 等操作。

注意事项:

  • 该代码仅供参考,实际应用中需要根据具体需求进行修改和完善。
  • 确保代码中的设备号、设备名称等信息与实际情况一致。
  • 在使用该代码之前,请先学习 Linux 设备驱动开发的相关知识。

学习资源:

Linux 设备驱动框架和测试程序示例:字符设备驱动实现

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

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