"); //-->
在 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 靠近按键的小灯亮。用户可以自行测试一下。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
第四代示波器创新、卓越与价值 (中)
第四代示波器创新、卓越与价值 (下)
伟福调试软件E2000w 3.2版
我国测试仪器产业发展战略探讨
嵌入式技术及学习方法 (中)
RC振荡发生器电路
振荡器通过数字技术生成时钟
无绳自动答录电话机的系统设计
低频振荡嚣
通过选择合适的磁芯材料来提高功率密度
台湾地区的 DRAM 供应商南亚科技据报道暂停 DDR4 现货价格报价,库存紧张
闪存的自由发展之路
今天在网吧上网。
双极振荡器电路电路
温度控制系统的设计
温度系统中的智能PID控制
工程师应该了解哪些符合线束到PCB接口的重要标准?
正弦波振荡器电路
中国的移动市场潜力
Cadence 和三星将人工智能应用于 SoC、3D-IC 和芯片设计
呵,大家觉得如何看待“阿甘正传”里边的阿甘和珍妮呀
新型轻触开关支持其设计导入的复兴
Nordic Semi 收购 TinyML 资产以推动嵌入式人工智能路线图
机器人革命:全球应用进展洞察
采用晶间管的多谐振荡器电路
無線遙控日光燈
FOPLP 热潮加剧:ASE、Powertech 扩张;台积电据报筹备 2026 CoPoS 试验线
嵌入式技术及学习方法 (上)
嵌入式技术及学习方法 (下)
光子量子芯片正使人工智能更智能、更环保