LV15 day5 字符设备驱动读写操作实现

本文详细描述了C语言中设备驱动的读写操作函数,如`mychar_read`和`mychar_write`,以及如何通过应用程序调用这些接口进行文件I/O。特别关注了`copy_to_user`和`copy_from_user`用于数据传输的部分。
摘要由CSDN通过智能技术生成

一、读操作实现

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值