一、读操作实现
ssize_t xxx_read(struct file *filp, char __user *pbuf, size_t count, loff_t *ppos);
完成功能:读取设备产生的数据
参数:
filp:指向open产生的struct file类型的对象,表示本次read对应的那次open
pbuf:指向用户空间一块内存,用来保存读到的数据
count:用户期望读取的字节数
ppos:对于需要位置指示器控制的设备操作有用,用来指示读取的起始位置,读完后也需要变更位置指示器的指示位置
返回值:
本次成功读取的字节数,失败返回-1
put_user(x,ptr)
x:char、int类型的简单变量名
unsigned long copy_to_user (void __user * to, const void * from, unsigned long n)
成功为返回0,失败非0
ssize_t mychar_read(struct file *pfile, char __user *puser, size_t count, loff_t *ppos)
{
struct mychar_dev *pmydev=(struct mychar_dev *)pfile->private_data;
int size=0;//实际读的长度
int ret=0;
if(count>pmydev->curlen)
{
size=pmydev->curlen;
}
else
{
size=count;
}
ret=copy_to_user(puser,pmydev->mydev_buf,size);
if(ret)
{
printk("copy_to_user is failed\n");
return -1;
}
memcpy(pmydev->mydev_buf,pmydev->mydev_buf+size,pmydev->curlen-size);
pmydev->curlen-=size;
return size;
}
二、写操作实现
ssize_t xxx_write (struct file *filp, const char __user *pbuf, size_t count, loff_t *ppos);
完成功能:向设备写入数据
参数:
filp:指向open产生的struct file类型的对象,表示本次write对应的那次open
pbuf:指向用户空间一块内存,用来保存被写的数据
count:用户期望写入的字节数
ppos:对于需要位置指示器控制的设备操作有用,用来指示写入的起始位置,写完后也需要变更位置指示器的指示位置
返回值:
本次成功写入的字节数,失败返回-1
get_user(x,ptr)
x:char、int类型的简单变量名
unsigned long copy_from_user (void * to, const void __user * from, unsigned long n)
成功为返回0,失败非0
ssize_t mychar_write (struct file *pfile, const char __user *puser, size_t count, loff_t *ppos)
{
struct mychar_dev *pmydev=(struct mychar_dev *)pfile->private_data;
int size=0;
int ret=0;
if(count>BUFSIZE-pmydev->curlen)
{
size=BUFSIZE-pmydev->curlen;
}
else
{
size=count;
}
ret=copy_from_user(pmydev->mydev_buf,puser,size);
if(ret)
{
printk("copy_from_user is failed\n");
return -1;
}
pmydev->curlen+=size;
return size;
}
在通过应用层app调用
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include "mychar.h"
int main(int argc,char *argv[])
{
int fd = -1;
char buf[8] = "";
int max = 0;
int cur = 0;
if(argc < 2)
{
printf("The argument is too few\n");
return 1;
}
fd = open(argv[1],O_RDWR);
if(fd < 0)
{
printf("open %s failed\n",argv[1]);
return 2;
}
write(fd,"hello",6);
read(fd,buf,8);
printf("buf=%s\n",buf);
close(fd);
fd = -1;
return 0;
}