简单字符设备的驱动源码讲解

本文详细解析了一个简单的Linux字符设备驱动程序的源码,包括cdev的初始化、设备注册、文件操作函数、ioctl函数等。通过示例展示了如何在内核中创建、操作字符设备,并提供了测试程序来验证驱动功能,涵盖了读、写和ioctl操作。
摘要由CSDN通过智能技术生成
#include <linux/module.h>
#include<linux/types.h>
#include<linux/fs.h>
#include<linux/errno.h>
#include<linux/sched.h>
#include<linux/init.h>
#include<linux/cdev.h>
#include<asm/io.h>
#include<asm/uaccess.h>
#include<linux/timer.h>
#include<asm/atomic.h>
#include<linux/slab.h>
#include<linux/device.h>
#include<asm/ioctl.h>
#define CDEVDEMO_MAJOR 255 //一个宏定义 主设备号

static int cdevdemo_major = CDEVDEMO_MAJOR;
static struct class *cdevdemo_class; //为了在release中都destory,所以这里将其定义为一个全局变量
int private_data = 0;
struct cdevdemo_dev //这里将structr cdev放在了另外的一个结构体中,是为了迎合最新写法。也可以不这样做,直接定义为structcdev
{
struct cdev cdev;
};
struct cdevdemo_dev *cdevdemo_devp; //定义了一个指针变量,后面要用kmalloc动态分配内存

int cdevdemo_open(struct inode *inode,struct file *filp) //打开一个字符设备,并传入参数inode和filp;在/dev下每个节点都有一个inode,file在
系统空间调用open时就自动创建,并且传递给每一个操作函数;
{
filp->private_data=&private_data; //通过filp中的private_data来保存自己的data;

printk(KERN_NOTICE "cdevdemo_open");
return 0;
}

int cdevdemo_release(struct inode *inode,struct file *filp) //release函数
{


printk(KERN_NOTICE "cdevdemo_release");
return 0;
}
static ssize_t cdevdemo_read(struct file *filp,char *buf,size_t count,loff_t *ppos) //传入filp ,用户控件的buf地址,读数据的长度
{
int *data = filp->private_data;
if(copy_to_user(buf,data,sizeof(int))) //用户空间从内核空间读数据通过这个函数,从内核空间读一个int长度的data存入到用户空间的buf中
{
return -EFAULT;
}
printk(KERN_NOTICE"cdevdemo_read");
return sizeof(int); //返回读取的字节个数


}
static ssize_t cdevdemo_write(struct file *filp,char *buf,size_t count,loff_t *ppos) //传入filp,用户空间的buf以及写的字节数
{
        int *data = filp->private_data;
        if(copy_from_user(data,buf,sizeof(int))) //向内核空间写数据只能通过这个函数,从用户空间的buf中向内核空间写一个int长度的data
        {
                return -EFAULT;
        }
        printk(KERN_NOTICE"cdevdemo_write");
        return sizeof(int);//返回写的字节数
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值