Linux 设备驱动框架和测试程序示例:字符设备驱动实现
这是一个 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");
代码功能:
- 申请设备号: 使用
alloc_chrdev_region函数申请设备号,并将其存储在dev中。 - 初始化设备结构: 使用
cdev_init函数初始化设备结构,并将文件操作函数指针指向cdd_fops结构体。 - 添加设备到内核: 使用
cdev_add函数将设备添加到内核,使其能够被访问。 - 创建设备类: 使用
class_create函数创建一个设备类,用于管理设备文件。 - 创建设备文件: 使用
device_create函数创建一个设备文件,并将其添加到设备类中。
关键函数:
cdd_open:设备打开操作函数,用于初始化设备资源。cdd_read:设备读取操作函数,用于从设备读取数据。cdd_write:设备写入操作函数,用于向设备写入数据。cdd_ioctl:设备控制操作函数,用于执行设备特定的控制命令。
程序作用:
该程序用于测试字符设备驱动程序是否正常工作。通过编译和加载该模块,可以在 /dev 目录下创建名为 cdd 的设备文件,并进行读写、ioctl 等操作。
注意事项:
- 该代码仅供参考,实际应用中需要根据具体需求进行修改和完善。
- 确保代码中的设备号、设备名称等信息与实际情况一致。
- 在使用该代码之前,请先学习 Linux 设备驱动开发的相关知识。
学习资源:
原文地址: https://www.cveoy.top/t/topic/oUwF 著作权归作者所有。请勿转载和采集!