目录
应用程序使用到的函数在具体驱动程序中都有与之对应的函数
比如应用层open\read对应驱动open\read等
一、编写测试文件
1、创建测试APP文件
创建一个chrdevbaseAPP.c文件
2、头文件查询
添加头文件,头文件可以通过man手册来查询,比如查询使用open函数需要用到那些头文件
在终端输入命令“ man 2 open”,就出现如下图
可以看到有三个头文件,这就是会涉及的,复制到 chrdevbaseAPP.c文件中即可,按“q”退出页面
man 1 是查询标准命令,man 2 是查询系统调用, man 3 是查询库函数
下面是编写chrdevbaseAPP.c文件代码
/*这是会用到的头文件*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
3 、main函数
main函数代码
/*
argc:应用程序参数个数(argv数组元素个数)
argv:具体参数,也可以写作char **argv
*/
int main(int argc, char *argv[])
{
int ret = 0; /*通过ret接收缓冲区数据和返回值*/
int fd = 0; /*用于接受返回的文件描述符*/
char readbuf[100]; /*读缓冲区*/
char writebuf[100]; /*写缓冲区*/
char *filename; /*用于接受文件名*/
filename = argv[1]; /*把文件名存放在数组中调用*/
/*
描述: open
fd: 文件名(包括路径)
O_RDWR: 为可读可写权限
*/
fd = open(filename, O_RDWR);
if (fd < 0)
{
printf("can't open file %s\r\n", filename);
return -1;
}
/*
描述: read
fd: 文件描述符
readbuf: 缓冲区
50: 读取50个数据
*/
ret = ssize_t read(fd, readbuf, 50);
if (ret < 0)
{
printf("read file %s failed\r\n", filename);
}
/*
描述: write
fd: 文件描述符
writebuf: 缓冲区
50: 读取50个数据
*/
ret = write(fd, writebuf, 50);
if (ret < 0)
{
printf("write file %s failed\r\n", filename);
}
/*
描述: close
fd: 文件描述符
*/
ret = close(fd);
if (ret < 0)
{
printf("close file %s failed\r\n", filename);
}
return 0;
}
二、驱动测试
1、编译、复制
输入下面命令编译
arm-linux-gnueabihf-gcc chrdevbaseAPP.c -o chrdevbaseAPP
复制到开发板源码目录下
sudo cp ./chrdevbaseAPP /home/ubantu22/nfs/rootfs/lib/modules/4.1.15/
2、驱动加载
打开开发板,先加载驱动
查看一下设备号
cat /proc/devices
有“200”设备号,说明已经加载驱动了
3、创建设备节点
驱动加载成功需要在/dev 目录下创建一个与之对应的设备节点文件,应用程序就是通过操作这个设备节点文件来完成对具体设备的操作。输入如下命令创建/dev/chrdevbase 这个设备节点文件
mknod /dev/chrdevbase c 200 0
“mknod”是创建节点命令,“/dev/chrdevbase”是要创建的节点文件
“c”表示这是个字符设备,“ 200”是设备的主设备号,“ 0”是设备的次设备号
chrdevbaseAPP 想要读写 chrdevbase 设备,直接对/dev/chrdevbase 进行读写操作即可
相当于/dev/chrdevbase 这个文件是 chrdevbase 设备在用户空间中的实现
4、运行 chrdevbaseAPP测试
./chrdevbaseAPP /dev/chrdevbase
/dev/chrdevbase为操作的设备驱动文件
可以看到APP里面的函数都已经执行 ,说明驱动是没问题的