驱动设备的读写操作

发布时间:2024年01月12日

int read(int fd, char *buf,int n);+

从设备fd读取n个字节到空间buf中

一、读操作实现------>读数据为内核空间向 用户空间? copy

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:对于需要位置指示器控制的设备操作有用,用来指示读取的起始位置,读完后也需要变更位置指示器的指示位置
ssize_t      ---实际读取的字节数
size_t count--- 期望读取的字节数
 返回值:
 ? ?本次成功读取的字节数,失败返回-1

put_user(x,ptr)

x:char、int类型的简单变量名

unsigned long copy_to_user (void __user * to, const void * from, unsigned long n)

void __user * to? ? ? ?用户空间

?const void * from? ? 内核空间

内核空间拷贝到用户空间中去

成功为返回0,失败非0

二、写操作实现--->用户空间数据拷贝到 内核空间?

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

验证操作步骤:

编写驱动代码mychar.c

vi mychar.c

make生成ko文件

make

insmod内核模块??

sudo insmod ./mychar.ko

查阅字符设备用到的设备号(主设备号):

cat /proc/devices | grep 申请设备号时用的名字

cat /proc/devices | grep mychar

创建设备文件(设备节点) :

mknod /dev/??? c 上一步查询到的主设备号 代码中指定初始次设备号

sudo mknod /dev/mydev c 11 0

编写app验证驱动(testmychar_app.c)

将mydev赋予读写权限

sudo chmod a+w /dev/mydev
?

编译运行app,dmesg命令查看内核打印信息
?

文章来源:https://blog.csdn.net/2302_76785838/article/details/135538255
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。