在 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<stdio.h> ”中。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<unistd.h>中。
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 <stdlib.h>。
接着由于小灯的数量和命令都是 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 靠近按键的小灯亮。用户可以自行测试一下。

迅为4412开发板Linux字符设备控制相关推荐

  1. linux 4412 adc字符设备,迅为4412开发板Linux字符设备控制(二)

    17.3  字符类 Buzzer  蜂鸣器 和 led 灯类似,蜂鸣器的设备节点也是在/dev 目录下,如下图所示. 蜂鸣器的硬件和 led 灯类似,如下图所示. 如上图所示. 原理图很容易理解,如果 ...

  2. 迅为4412开发板Linux驱动教程之GPIO的初始化

    视频下载地址:http://pan.baidu.com/s/1c06oiti GPIO的初始化 • 在内核源码目录下使用命令"ls drivers/gpio/*.o",可以看到&q ...

  3. 迅为4412开发板-步进电机-驱动和测试例程

    迅为4412开发板-步进电机-驱动和测试例程 和本文档配套的资料有: 1 内核配置和步进电机驱动补丁包: topeet_modules_20190319.tar.gz 2 linux-C 的测试例程: ...

  4. 迅为4412开发板物联网项目实战手机远程控制(广域网)

    用手机远程控制开发板,远程控制不是通过WIFI局域网控制,而是通过广域网来实现,真正的远程控制.实现万物互连. 下面先介绍一下云计算 云计算是分布式计算的一种,指的是通过网络"云" ...

  5. 迅为4412开发板驱动-linux 开机 logo 的修改方法

    文档主要介绍 4412 开发板的内核启动 LOGO,请注意如果要修改的屏幕分辨率小于480x640,请参考另外的独立文档"iTOP-4412-内核-4.3 寸屏幕-logo 修改_V1.0& ...

  6. 迅为IMX6ULL开发板Linux学习教程

    1800+页使用手册(持续更新)+入门视频教程+实战视频教程 关注VX公众号:迅为电子 ,  回复 :终结者,免费获取产品资料  让教程更细致,终结入门难! 所有教程由迅为原创,是迅为工作多年的工程师 ...

  7. 迅为3588开发板Linux编译Buildroot

    Buildroot 是一款集成的编译集合包,解决了以前交叉编译麻烦的问题,本小节将介绍 buildroot 镜像的编译流程,分为单独编译和完整全自动编译. 首先输入以下命令,选择 buildroot ...

  8. 迅为3588开发板Linux源码包编译Buildroot

    Buildroot 是一款集成的编译集合包,解决了以前交叉编译麻烦的问题,本小节将介绍 buildroot 镜像的编译流程,分为单独编译和完整全自动编译. 首先输入以下命令,选择 buildroot ...

  9. 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板

    网站:http://www.topeetboard.com 光盘资料+网盘资料+配套视频+售后支持,助您加速学习研发的进程 产品介绍 iTOP-Exynos4412开发板采用 Exynos4412的主 ...

最新文章

  1. MFC按钮CXPButton类,代码阅读起来还是挺不错的
  2. H5中JavaScript常用代码片段
  3. linux写入二进制文件内容,linux – 从管道读取数据并写入标准输出,中间延迟.必须处理二进制文件...
  4. 美团点评容器平台HULK的调度系统
  5. 现代软件工程系列 学生和老师都不容易
  6. 百度App上线“发现”频道 增加电商和本地服务入口
  7. mysql启动提示 access denied for user root@localhost(using password:YES) 解决办法总结
  8. Android之多种Bitmap效果
  9. linux下录制视频流,Ubuntu Linux 下的PSP视频输出以及录制
  10. 简单明了的告诉你什么是CPUID
  11. ls算法java实现_Java API之算法 | 学步园
  12. sasl java_java SASL_SSL 帐号密码 方式访问 kafka
  13. 平行四边形的效果实现
  14. 30个响应式大背景网页设计欣赏
  15. 用c语言编写匀速直线运动,匀速直线运动知识点总结
  16. android rfid 定位,基于Android手机的室内定位技术研究与实现
  17. Android 引入高德地图 SDK
  18. 小花经过春雨的一番滋润
  19. 机器学习-神经网络(Neural Network)算法
  20. Jmeter接口测试-if控制器

热门文章

  1. 常量池与运行时常量池
  2. P1496 火烧赤壁(离散化)
  3. 微信小程序 商城实例
  4. 公式3.0 常用字体设置
  5. 部门精细化管理流程优化记(一)
  6. 创弘星鹏电商:设计抖音小店主图的方法和技巧
  7. 除“硬技能”外,“软技能”的面试技巧
  8. Scala中的apply方法
  9. 《看漫画学python》超轻松
  10. Grid++Report数据/日期格式设置