#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);//返回写的字节数
}
#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);//返回写的字节数
}