完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在 linux 驱动中字符设备驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序。即使从事 Linux 驱动方面的工作,Linux 驱动写出来之后,也需要由驱动程序员编写简单的应用程序来进行测试的。
另外,关于驱动部分,迅为电子有专门的驱动实验教程提供给大家学习,大家有了这些基础之后再去学习底层的知识就会很容易了。 在本手册的 10.22 章节,大家可以看到这些 C 程序也是可以在 Android 下面运行的,只不过没有图形界面。 本章配套视频为: “视频 06_01 字符设备控制之 main 函数传参数” “视频 06_02 字符设备控制之 led 灯” “视频 06_03 字符设备控制之 buzzer 蜂鸣器” “视频 06_04 字符设备控制之 ADC 模数转换” 17.1 入口 main 函数的参数 在和用户交流的过程中,虽然所有人都学习过 C 语言,但是对 C 语言中的 main 函数的用法并不是很清楚。由于后面的实验需要用到这部分知识,这里就占用一个小节,先简单介绍一下 main 函数。 main 函数简介 main 函数作为应用程序的入口,在头文件“#include ”中。main 函数需要传参数的时候完整的定义为 int main(int argc,char **argv) 参数 argc,表示参数的个数 参数**argv,存储输入字符的数组,argv[0]表示程序名称,argv[1]——argv[n]输入的参数 不传参数的时候定义为 int main(void) 函数 main 的返回值为类型为 int,用于判断程序执行成功还是失败 main 函数例程 编写简单的 argvc.c 文件测试 main 函数。 如上图所示,将输入的参数第一个和第二个转换成 int 类型,赋值给 i 和 j,最后输出打印。 其中 argv[0]为程序名称,这里就是后面要编译的目标文件“argvc”。 编译运行测试 在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/”,使用命令“mkdircharcontrol”新建 charcontrol 文件夹,将源码 argvc.c 拷贝进去,进入新建的文件夹 charcontrol,如下图所示。 使用命令“arm-none-linux-gnueabi-gcc -o argvc argvc.c -static”编译 argvc 文件, 如下图所示,使用命令“ls”可以看到生成了 argvc 可执行文件。 这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考 10.3.5 小节。 将编译成的可执行文件 argvc,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序如下。 如上图所示,程序成功运行,打印: the Program name is 。/mnt/udisk/argvc。 因为运行的程序就是“。/mnt/udisk/argvc”,这是第一个参数 The command line has 2 argument: 10,11。 输入的参数是 10 和 11,对应 argv[2]和 argv[2]。 17.2 字符类 led 灯 在前面介绍 open 函数的时候,已经提到过如何打开字符类设备,获得句柄的方法和一般文件都是一样。 Led 灯的设备节点在/dev 目录下,如下图所示,在超级终端可以使用 ls 命令查找。 由于涉及到硬件知识,这里简单介绍一下硬件原理,如下图所示,led 小灯的硬件原理很简单。 如上图所示,给 KP_COL0 和 VDD50_EN 网络高电平,三极管 L9014 就会导通,电源 VSYS 就会将电压加到电阻 R 和 led 小灯上,小灯就会亮。 给 KP_COL0 和 VDD50_EN 网络低电平,三极管 L9014 就会截止,形成断路,小灯灭。 在前面介绍过,如果要给文件进行写操作,那么使用的是 write 函数。对于 led 小灯的操作,使用写函数,理论上也是可以的。但是对于 IO 口(这里的 IO 口指的是硬件上的 IO 口, 不是指 IO 文件)的 操作,Linux 专门设计了一个高效的函数 ioctl。 这个函数在头文件#include中。 int ioctl( int fd, int request, int cmd); 参数 fd,函数 open 返回的句柄。 参数 request 和参数 cmd,由内核驱动决定具体操作,例如 request 可以代表那个 IO 口,cmd 代表对 IO 进行什么样的操作,也可以反过来。具体的含义由驱动工程师在驱动中 switch 决定。 返回值:返回 0 成功;返回-1,出错。 小灯测试例程 编写简单的 leds.c 文件测试小灯。首先添加头文件,如下图所示。 通过 main 参数传过来的参数是 char 字符格式的,如果要传递给 ioctl 函数,需要用到数值转化函数atoi,添加了头文件#include 。 接着由于小灯的数量和命令都是 2,所以对小灯数量和操作数进行宏定义 #define LED_NUM 2 #define LED_C 2。 然后 main 函数如下图所示。 如上图所示。 第 33 行,调用了 ioctl 函数,将 main 函数的第一个和第二个参数传入驱动。 第 19 行,解释那个参数具体代表什么含义,“argv1 is cmd;argv2 is io”,参数 1 对应命令,参数 2 对应具体那个 led 灯。 第 36 行,将打开的设备节点”/dev/leds“关闭。 编译运行测试 在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/charcontrol”,将源码 leds.c 拷贝进去,如下图所示。 使用命令“arm-none-linux-gnueabi-gcc -o leds leds.c -static”编译 leds 文件,如下图所示,使用命令“ls”可以看到生成了 leds 可执行文件。 这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考实验 02 将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序如下。 如下图所示,如果不加参数会有提示,然后报错。 如下图所示,使用命令“。/mnt/udisk/leds 0 0”运行,可以看到靠近蜂鸣器的小灯灭了。 所有参数对小灯的控制如下: 0 0 靠近蜂鸣器的小灯灭; 0 1 靠近按键的小灯灭; 1 0 靠近蜂鸣器的小灯亮; 1 1 靠近按键的小灯亮。用户可以自行测试一下。 |
|
|
|
只有小组成员才能发言,加入小组>>
772 浏览 0 评论
1148 浏览 1 评论
2527 浏览 5 评论
2858 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1065浏览 3评论
190浏览 2评论
453浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 04:11 , Processed in 1.087454 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号