4412开发板Linux系统编程实战-字符设备控制

发布者:Xingfu6666最新更新时间:2022-01-20 来源: eefocus关键字:4412开发板  Linux系统 手机看文章 扫描二维码
随时随地手机看文章

在 linux 驱动中字符驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序。


即使从事 linux 驱动的工作,linux 驱动写出来之后,也需要由驱动程序员编写简单的应用进行测试的。


另外,关于驱动部分,迅为电子有专门的驱动实验教程提供给大家学习,大家有了这些基础之后再去学习底层的知识就会很容易了。


在使用手册的第八章,大家可以看到这些 c 程序也是可以在 Android 下面运行的,只不过没有图形界面。


硬件工具

4412开发板PC 机;U 盘或者 TF 卡


软件工具

Ubuntu12.04.2 以及虚拟机;Arm-2009q3 编译器 ;Notepad++编辑器 ;超级终端 ;Vim 编辑器 ;最小 linux 系统


 预备课程

基本开发工具的使用 ;常用 linux 命令 ;最小 linux 系统 ;文件 IO


视频资源

本章配套视频为:

“视频 06_01 字符设备控制之 main 函数传参数”

“视频 06_02 字符设备控制之 led 灯”

“视频 06_03 字符设备控制之 buzzer 蜂鸣器”

“视频 06_04 字符设备控制之 ADC 模数转换


学习目标

熟练掌握 main 函数的用法

掌握字符设备 led 灯、buzzer 蜂鸣器、ADC 模数转换

1入口 main 函数的参数

在和用户交流的过程中,虽然所有人都学习过 C 语言,但是对 C 语言中的 main 函数的用 法并不是很清楚。 由于后面的实验需要用到这部分知识,这里就占用一个小节,先简单介绍一下 main 函数。


1.1 main 函数简介

main 函数作为应用程序的入口,在头文件“#include ”中。

main 函数需要传参数的时候完整的定义为

int main(int argc,char **argv)

参数 argc,表示参数的个数

参数**argv,存储输入字符的数组

argv[0]表示程序名称

argv[1]——argv[n]输入的参数

不传参数的时候定义为

int main(void)

函数 main 的返回值为类型为 int,用于判断程序执行成功还是失败


1.2main 函数例程

编写简单的 argvc.c 文件测试 main 函数。

 

如上图所示,将输入的参数第一个和第二个转换成 int 类型,赋值给 i 和 j,最后输出打印。 其中 argv[0]为程序名称,这里就是后面要编译的目标文件“argvc”。


1.3 编译运行测试

在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/”,

使用命令“mkdir charcontrol”新建 charcontrol 文件夹,将源码 argvc.c 拷贝进去,进入新 建的文件夹 charcontrol,如下图所示。

 

 


使用命令“arm-none-linux-gnueabi-gcc -o argvc argvc.c -static”编译 argvc 文件, 如下图所示,使用命令“ls”可以看到生成了 argvc 可执行文件。

 

这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考实验 02

将编译成的可执行文件 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]。

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,出错。


2.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"关闭。

2.2 编译运行测试

在 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 靠近按键的小灯亮。

用户可以自行测试一下。

3 字符类 Buzzer 蜂鸣器

和 led 灯类似,蜂鸣器的设备节点也是在/dev 目录下,如下图所示。

 

 

 

 

 

 

蜂鸣器的硬件和 led 灯类似,如下图所示。

 

 

 

 

 

 

如上图所示。

原理图很容易理解,如果网络 MOTOR_PWM 为高电平,则 L9014 导通,蜂鸣器响,如

果网络 MOTOR_PWM 为低电平,则 L9014 截止,蜂鸣器则不响。

操作方式和 led 小灯类似。

3.1蜂鸣器测试例程

编写简单的 buzzertest.c 文件测试蜂鸣器。

首先添加头文件,如下图所示,下面新加了几个库文件,一般常用的就是下面几个,写代

码的时候,为了方便,可以直接都添加上。

 

 

 

 

 

 

 

然后 main 函数如下图所示。

 

 

 

 

 

 

如上图代码所示。

由于只有一个 IO,底层没有做第三个参数的判断,所以无效

第 16-19 行,对参数 argv[1]有个简单的判断,命令只能是 0 或者 1。

第 21-24 行,open 函数打开蜂鸣器设备节点

第 26 行,使用 ioctl 函数操作蜂鸣器。

第 27 行,使用 close 函数关闭设备节点。

3.2 编译运行测试

在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录

“/home/linuxsystemcode/charcontrol”,将源码 buzzertest.c 拷贝进去,如下图所示。

 

 

 

 

 

 

使用命令“arm-none-linux-gnueabi-gcc -o buzzertest buzzertest.c -static”编译 buzzertest 文件,如下图所示,使用命令“ls”可以看到生成了 buzzertest 可执行文件。

 

 

 

 

 

这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考实验 02

将编译成的可执行文件 buzzertest,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘, 运行程序如下。 使用参数 1 和 0,蜂鸣器会响。第二个参数实际上并不起作用。

 

 

 

 

 

如下图所示,使用参数 0 和 0,蜂鸣器会停止响。

 

 

 

 

 

4字符类 ADC 模数转换

和 led 灯类似,数模转换的设备节点也是在/dev 目录下,如下图所示。

 

 

 

 

 

模数转换的硬件部分如下图所示。

 

 

 

 

 

 

 

如上图所示。

XadcAIN0 网络可以读取到当前输入电压,滑动变阻器 R 移动的时候,1 和 2 之间的电阻 R12 改变,滑动变阻器最大电阻为 R13,然后电压 Vadc=R12*VDD1V8_EXT/R13 上面公式中 Vadc 可以通过 4412 读取出来,VDD1V8 和 R13 已知,那么就很容易求出 R12 的电阻。如下图所示,在 4412datasheet 中 ADC 章节中有真实的电阻和电压曲线图。

 

 

 

 

这里将数值做一个简单的换算,

1.8V 对应的是 10K 欧姆,对应的寄存器数值为 0xfff;

0V 对应的是 0 欧姆,对应的寄存器数值为 0x0。

这样做一个简单公式,将读取的数值 r 转化为电阻值 R。

R = r*10000/0xfff,即 R = r*10000/4095。

这个小公式在后面的代码中将会使用到。

4.1模数转换例程

编写简单的 ADC.c 文件测试 adc 的驱动。

首先添加头文件,如下图所示。

 

 

 

 

然后 main 函数如下图所示。

 

 

 

 

如上图代码所示。

第 14 行,设备节点为 char *adc = "/dev/adc"。

第 21 行,打开设备节点文件。

第 26 行,使用 read 函数,将读取数字赋予 buffer。

第 30 和 31 行,做个简单地换算,将读取的数值转化为电阻值。

4.2编译运行测试

在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录

“/home/linuxsystemcode/charcontrol/”将源码 ADC.c 拷贝进去,如下图所示。

 

 

 

 

使用命令“arm-none-linux-gnueabi-gcc -o ADC ADC.c -static”编译 ADC 文件,如 下图所示,使用命令“ls”可以看到生成了 ADC 可执行文件。

 

 

这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考实验 02

将编译成的可执行文件 open,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程 序。


如下图所示,使用命令“./mnt/udisk/ADC”即可检测当前电阻值,中间的大段打印参数 是多次打印寄存器的数值,在驱动实验中再去介绍。

 

调整滑动电阻器之后,再次使用测试程序,如下图所示,输出数值会有变化。

 

滑动变阻器向顺时针旋转,阻值会减小,最小为 0;

滑动变阻器向逆时针旋转,阻值会增大,最大为 10K。

关键字:4412开发板  Linux系统 引用地址:4412开发板Linux系统编程实战-字符设备控制

上一篇:移植linux4.14内核到4412开发板
下一篇:4412开发板上的步进电机小知识

推荐阅读最新更新时间:2024-10-18 10:12

4412开发板Linux系统编程实战-字符设备控制
在 linux 驱动中字符驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序。 即使从事 linux 驱动的工作,linux 驱动写出来之后,也需要由驱动程序员编写简单的应用进行测试的。 另外,关于驱动部分,迅为电子有专门的驱动实验教程提供给大家学习,大家有了这些基础之后再去学习底层的知识就会很容易了。 在使用手册的第八章,大家可以看到这些 c 程序也是可以在 Android 下面运行的,只不过没有图形界面。 硬件工具 4412开发板PC 机;U 盘或者 TF 卡 软件工具 Ubuntu12.04.2 以及虚拟机;Arm-
[单片机]
<font color='red'>4412</font><font color='red'>开发板</font><font color='red'>Linux系统</font>编程实战-<font color='red'>字符</font><font color='red'>设备</font><font color='red'>控制</font>
讯为4412开发板运行linux系统无法挂载U盘?
基于讯为4412开发板: 插上U盘 usb 1-3.3: new high speed USB device number 7 using s5p-ehci usb 1-3.3: New USB device found, idVendor=0951, idProduct=1666, bcdDevice=0100 usb 1-3.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 1-3.3: New USB device Class: class= 0 , SubClass=0, Protocol=0 usb 1-3.3: Product: D
[单片机]
iTOP-4412开发板Linux系统下使用wifi模块配置
精英版在 linux 下使用 wifi,需要进行下面的配置: 首先用户在拿到光盘资料以后查看下光盘里面的“linux”- ”root_xxxxxxxx.tar.gz”文件,其中的“xxxxxxxx” 代表linux系统的版本日期, 迅为提供的支持linux下wifi的系统版本是 “root_20150422.tar.gz” ,也就是 2015-04-22 以后的版本(括 20150422)是支持 wifi 模块的。 插上 wifi 模块,启动开发板进到 uboot 命令行,使用 fastboot 烧写光盘提供的支持 wiif 模块的 linux镜像到开发板上,烧写完成后重启开发板进入到 linux 文件系统,如下图:
[单片机]
iTOP-<font color='red'>4412</font><font color='red'>开发板</font><font color='red'>Linux系统</font>下使用wifi模块配置
4412嵌入式开发板设备树源码的编译环境、镜像编译介绍
平台:4412开发板 1 编译环境 1.1 Ubuntu12.04.2(可参考迅为4412用户手册或者入门视频教程,关于搭建编译环境的部分) 1.2 安装设备树编译器:apt-get install device-tree-compiler 1.3 uboot和内核的源码和编译器 1.3.1 源码(视频目录下) itop4412_kernel_4_14_2_bsp-20190225.tar.gz 1.3.2 编译器(itop4412_kernel_4_14_2_bsp-20190225.tar.gz源码包中) gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12
[单片机]
<font color='red'>4412</font>嵌入式<font color='red'>开发板</font><font color='red'>设备</font>树源码的编译环境、镜像编译介绍
迅为4412开发板Linux设备树的镜像烧写和源码简单优化教程
1 烧写: 烧写和4412默认镜像的烧写类似,使用fastboot。 先更新uboot,用4412默认uboot更新支持设备树的uboot 用支持设备树的uboot烧写。 进入支持设备树的uboot控制台 支持设备树的uboot控制台,使用命令:fastboot 0 这里可能需要更新一下驱动,使用驱动精灵自动安装即可。 在cmd命令行,用fastboot烧写: fastboot.exe flash bootloader u-boot-iTOP-4412.bin fastboot.exe flash kernel uImage fastboot.exe flash dtb e
[单片机]
迅为<font color='red'>4412</font><font color='red'>开发板</font>Linux<font color='red'>设备</font>树的镜像烧写和源码简单优化教程
迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.com/s/1kTlGkcR 总线_设备_驱动注册流程详解 • 注册流程图 • 设备一般都需要先注册,才能注册驱动 – 现在越来越多的热拔插设备,反过来了。先注册驱动,设备来了再注册 设备 • 本节使用的命令 – 查看总线的命令#ls /sys/bus/ – 查看设备号的命令#cat /proc/devices • 设备都有主设备号和次设备号,否则255个设备号不够用 – 查看杂项设备号的命令#cat /proc/misc 设备注册 关于注册设备的一点说明 • 早先的Linux
[单片机]
迅为<font color='red'>4412</font><font color='red'>开发板</font>Linux驱动教程——总线_<font color='red'>设备</font>_驱动注册流程详解
iTOP-4412嵌入式开发板ioremap控制GPIO寄存器
GPIO 的寄存器通过 ioremap函数转换之后,可以通过直接控制虚拟地址来控制物理地址(寄存器的实际地址),这样就实现 GPIO的读和写以及其它任意功能。 需要的基础知识 虚拟地址和物理地址 内存管理单元概念 linux 驱动模块的加载 主要内容 GPIO 的寄存器文档详细介绍和说明 函数 ioremap的用法 使用 ioremap实现对 GPIO的控制 硬件 以 LED2(靠近蜂鸣器的 LED)为例,介绍原理图以及Datasheet 中对应的寄存器。 原理图 打开底板原理图 pdf文档,如下图所示,选取 LED2,网络标号是 KP_COL0。 通过查找网络标号 KP_COL0,发现 KP_COL0接到连接器上,如下图所示
[单片机]
iTOP-<font color='red'>4412</font>嵌入式<font color='red'>开发板</font>ioremap<font color='red'>控制</font>GPIO寄存器
tiny4412学习(一)之从零搭建linux系统(烧写uboot、内核进emmc+uboot启动内核)
硬件平台:tiny4412 系统:linux-3.5-20151029 文件系统:busybox-1.22.1.tar.bz2 编译器: arm-linux-gcc-4.5.1 目的: 使用uboot引导linux系统,并挂接根文件系统,搭建起linux开发环境。 由于友善支臂提供的minitools不是开源,使用起来很不舒服。本文将记录从零使用uboot在tiny4412上搭建linux系统的。由于之前只是学了2440,完成这个流程也遇到各种,现在总结如下。其中参考了多篇博客才得以实现,具体涉及的时候会给出链接。 一、准备系统文件 1、安装交叉编译工具链 (1)解压编译器源码 tar arm-linux-gcc-
[单片机]
tiny<font color='red'>4412</font>学习(一)之从零搭建<font color='red'>linux系统</font>(烧写uboot、内核进emmc+uboot启动内核)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved