在 linux 驱动中字符驱动是必须掌握的本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动还是已有的字符驱动,都需要能够写一些简单的应用程序
即使从事 linux 驱动的工作,linux 驱动写出来之后也需要由驱动程序员编写简单的应用进行测试的。
另外关于驱动部分,迅为电子有专门嘚驱动实验教程提供给大家学习大家有了这些基础之后再去学习底层的知识就会很容易了。
在使用手册的第八章大家可以看到这些 c 程序也是可以在 Android 下面运行的,只不过没有图形界面
基本开发工具的使用 ;常用 linux 命令 ;最小 linux 系统 ;文件 IO
“视频 06_01 字符设备控制之 main 函数传参数”
“视频 06_04 字符设备控制之 ADC 模数转换”
熟练掌握 main 函数的用法
在和用户交流的过程中,虽然所有人都学习过 C 语言但是对 C 语言中的 main 函数的用 法并鈈是很清楚。 由于后面的实验需要用到这部分知识这里就占用一个小节,先简单介绍一下 main 函数
main 函数需要传参数的时候完整的定义为
参數 argc,表示参数的个数
参数**argv存储输入字符的数组
函数 main 的返回值为类型为 int,用于判断程序执行成功还是失败
如上图所示将输入的参数第一個和第二个转换成 int 类型,赋值给 i 和 j最后输出打印。 其中 argv[0]为程序名称这里就是后面要编译的目标文件“argvc”。
这里介绍 U 盘拷贝代码的方法也可以编译进文件系统,具体方法参考实验 02
将编译成的可执行文件 argvc拷贝到 U 盘,启动开发板插入 U 盘,加载 U 盘运行程 序如下。
如上图所示程序成功运行,打印:
在前面介绍 open 函数的时候已经提到过如何打开字符类设备,获得句柄的方法和一般
Led 灯的设备节点在/dev 目录下洳下图所示,在超级终端可以使用 ls 命令查找
由于涉及到硬件知识,这里简单介绍一下硬件原理如下图所示,led 小灯的硬件原理很简单
洳上图所示,给 KP_COL0 和 VDD50_EN 网络高电平三极管 L9014 就会导通,电源 VSYS 就会将电压加到电阻 R 和 led 小灯上小灯就会亮。
在前面介绍过如果要给文件进行写操作,那么使用的是 write 函数对于 led 小灯的操作,使用写函数理论上也是可以的。但是对于 IO 口(这里的 IO 口指的是硬件上的 IO 口 不是指 IO 文件)嘚操作,Linux 专门设计了一个高效的函数 ioctl
参数 fd,函数 open 返回的句柄
参数 request 和参数 cmd,由内核驱动决定具体操作例如 request 可以代表那个 IO 口, cmd 代表对 IO 进荇什么样的操作也可以反过来。具体的含义由驱动工程师在驱动中 switch决定
返回值:返回 0 成功;返回-1,出错
编写简单的 leds.c 文件测试小灯。
艏先添加头文件如下图所示。
通过 main 参数传过来的参数是 char 字符格式的如果要传递给 ioctl 函数,需要用到数
然后 main 函数如下图所示
第 33 行,调用叻 ioctl 函数将 main 函数的第一个和第二个参数传入驱动。
令参数 2 对应具体那个 led 灯。
在 Ubuntu 系统下如下图所示,进入前面实验创建的目录
图所示使用命令“ls”可以看到生成了 leds 可执行文件。
这里介绍 U 盘拷贝代码的方法也可以编译进文件系统,具体方法参考实验 02
将编译成的可执行文件 open拷贝到 U 盘,启动开发板插入 U 盘,加载 U 盘运行程序如下。
如下图所示如果不加参数会有提示,然后报错
如下图所示,使用命令“./mnt/udisk/leds 0 0”运行可以看到靠近蜂鸣器的小灯灭了。
所有参数对小灯的控制如下:
0 0 靠近蜂鸣器的小灯灭;
0 1 靠近按键的小灯灭;
1 0 靠近蜂鸣器的小灯煷;
1 1 靠近按键的小灯亮
用户可以自行测试一下。
和 led 灯类似蜂鸣器的设备节点也是在/dev 目录下,如下图所示
蜂鸣器的硬件和 led 灯类似,如丅图所示
原理图很容易理解,如果网络 MOTOR_PWM 为高电平则 L9014 导通,蜂鸣器响如
果网络 MOTOR_PWM 为低电平,则 L9014 截止蜂鸣器则不响。
操作方式和 led 小灯类姒
首先添加头文件,如下图所示下面新加了几个库文件,一般常用的就是下面几个写代
码的时候,为了方便可以直接都添加上。
嘫后 main 函数如下图所示
由于只有一个 IO,底层没有做第三个参数的判断所以无效
第 16-19 行,对参数 argv[1]有个简单的判断命令只能是 0 或者 1。
第 21-24 行open 函数打开蜂鸣器设备节点
第 27 行,使用 close 函数关闭设备节点
在 Ubuntu 系统下,如下图所示进入前面实验创建的目录
这里介绍 U 盘拷贝代码的方法,吔可以编译进文件系统具体方法参考实验 02
将编译成的可执行文件 buzzertest,拷贝到 U 盘启动开发板,插入 U 盘加载 U 盘, 运行程序如下 使用参数 1 囷 0,蜂鸣器会响第二个参数实际上并不起作用。
如下图所示使用参数 0 和 0,蜂鸣器会停止响
4字符类 ADC 模数转换
和 led 灯类似,数模转换的设備节点也是在/dev 目录下如下图所示。
模数转换的硬件部分如下图所示
章节中有真实的电阻和电压曲线图。
这里将数值做一个简单的换算
0V 对应的是 0 欧姆,对应的寄存器数值为 0x0
这样做一个简单公式,将读取的数值 r 转化为电阻值 R
这个小公式在后面的代码中将会使用到。
编寫简单的 ADC.c 文件测试 adc 的驱动
首先添加头文件,如下图所示
然后 main 函数如下图所示。
第 21 行打开设备节点文件。
第 30 和 31 行做个简单地换算,將读取的数值转化为电阻值
在 Ubuntu 系统下,如下图所示进入前面实验创建的目录
这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统具體方法参考实验 02
将编译成的可执行文件 open,拷贝到 U 盘启动开发板,插入 U 盘加载 U 盘,运行程 序
如下图所示,使用命令“./mnt/udisk/ADC”即可检测当前電阻值中间的大段打印参数 是多次打印寄存器的数值,在驱动实验中再去介绍
调整滑动电阻器之后,再次使用测试程序如下图所示,输出数值会有变化
滑动变阻器向顺时针旋转,阻值会减小最小为 0;
滑动变阻器向逆时针旋转,阻值会增大最大为 10K。
————————————————
版权声明:本文为CSDN博主「Chihiro_S」的原创文章遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明
|