【迅为iTop4412学习笔记】9.编写简单应用调用驱动

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39057987/article/details/84556312

声明

以下都是我刚开始看驱动视频的个人强行解读,如果有误请指出,共同进步。

本节目标

编写简单应用调用驱动


编写应用就和我们平时写c文件差不多了。
首先要包含一些头文件

// 这不解释
#include <stdio.h>
// 拓展了数据类型(uint32_t之类的)
#include <sys/types.h>
// 系统调用函数头文件,可以获取各种东西的属性
#include <sys/stat.h>
// 文件操作函数(包含了open()等函数)
#include <fcntl.h>
// unix标准函数库(包含了close()等函数)
#include <unistd.h>
// IO控制函数(包含了ioctl()函数)
#include <sys/ioctl.h>

因为我们编译了是要在板子上跑的,所以编译器不是gcc而是使用迅为提供的arm交叉编译器 arm2009q3,编译命令不是gcc而是arm-none-linux-gnueabi-gcc。

我们本次用到的函数其实和学习C语言文件操作的时候差不多,虽然编译器不同,但是函数几乎一样,所以我就不看arm的编译器内的头文件里的函数长啥样了。

联系上一节,其实很多函数都是有关联的。

比如我们在应用里是open()函数,在上节我们也编译过mryang_open()函数。
应用里是close(),我们上节也编译过mryang_release()函数。
应用里是ioctl(),我们上节也编译过mryang_unlocked_ioctl()函数。

隐隐觉得背后果然是有一些py交易的…

至于应用代码就很简单了,直接上代码吧,内容基本和学C的文件操作是一样的

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>

int main(int argc, char* argv[])
{
	char *mryang_node = "/dev/mryang_misc_ctl";
	int fd = open(mryang_node, O_RDWR|O_NDELAY);
	if(fd < 0)
	{
		printf("open failed!\n");
	}
	else
	{
		printf("open success! fd=%d\n", fd);
		ioctl(fd, 1, 2);
	}
	close(fd);
	return 0;
}

我们用arm的编译器编译(我的程序叫app.c)

arm-none-linux-gnueabi-gcc -o app app.c

现在我们直接在板子上启动,会发现

[root@iTOP-4412]# ./app
open failed!

这是为什么呢?因为我们还没插入上一节写的驱动。(稍后回忆整个流程)
在插入模块后我们再启动

[root@iTOP-4412]# ./app
[  101.692030] mryang_open!
[  101.693772] cmd is 1
[  101.695357] arg is 2
[  101.697478] mryang_release
open success! fd=3

显然调用成功了

收尾

这一节的内容看似很简单,其实东西还是有点东西的。

  1. 我们打开的文件,是一个设备节点,这个设备节点,是我们上一节编写的注册杂项设备生成的设备节点。所以我们若是不注册,直接启动应用,会打开失败
  2. 注册了杂项设备之后,我们再启动就能成功打开设备节点进行操作了
  3. 以我目前的见识,你打开这个设备节点的时候,就会调用上节我们编写的mryang_open()函数,所以打开就会输出mryang_open!。
  4. 打开之后,我们用了ioctl()函数来向底层传值。ioctl()会调用我们定义的mryang_unlocked_ioctl(),并把ioctl()第二、三个参数传递给mryang_unlocked_ioctl()。而上节我们编写的函数就是打印第二、三个参数,所以输出了cmd is 1和arg is 2。
  5. 操作完之后我们关闭了文件,调用了mryang_release()函数输出了mryang_release!

以上就是整个流程

其实这里应该是比较完整的一个东西了。

我们在刚学习C语言的时候,就学过这些文件操作函数。而此刻,我们只不过是让文件操作函数操作的是我们的驱动而已。通过ioctl()函数,可以像底层传值。这样我们就可以做到输入1开LED,输入0关LED了。

猜你喜欢

转载自blog.csdn.net/qq_39057987/article/details/84556312