迅为4412开发板-实验LEDS驱动一

发布时间:2021-1-5 11:12    发布者:就是塔塔
14.1 本章导读
本节实验介绍一个完整的 GPIO 驱动,以后在 Linux 中需要处理 GPIO 驱动都可以仿照或
者移植这个驱动。
14.1.1 工具
14.1.1.1 硬件工具
1)iTOP4412 开发板
2)U 盘或者 TF 卡
3)PC 机
4)串口
14.1.1.2 软件工具
1)虚拟机 Vmware
2)Ubuntu12.04.2
3)超级终端(串口助手)
4)源码文件夹“leds”
14.1.2 预备课程
实验 12_物理地址虚拟地址
实验 13_GPIO 初始化
14.1.3 视频资源
本节配套视频为“视频 14 LEDS 驱动一”
14.2 学习目标
本章需要学习以下内容:
Led 硬件原理简单介绍
Led 管脚的调用、赋值以及配置
编写简单应用调用 LED 管脚,并测试
14.3 Led 硬件原理简单介绍
Led 的电路比较简单,一般是使用三极管搭建一个控制电路。
如下图所示,是原理图中两个 Led 的控制电路。KP_COL0 和 VDD50_EN 网络控制 Led的通断。
1.jpg
如上图所示。
当 KP_COL0 和 VDD50_EN 网络时高电平的时候,三极管 L9014 的 BE 导通,CE 导通,相当于 5V 的 VSYS 电压加到 1K 和 Led 小灯上,小灯就会亮。
当 KP_COL0 和 VDD50_EN 网络时低电平的时候,三极管 L9014 的 BE 会截止,CE 截止,相当于 5V 的 VSYS 电压加到 1K、Led 小灯和一个无限大的电阻上,电流为零,小灯就会灭。
14.4 Led 管脚的调用、赋值以及配置
本节给大家介绍一部分涉及 GPIO 调用、赋值以及配置的函数。
14.4.1 GPIO 申请和释放函数
想用使用任何一个 GPIO 都必须先申请。
在头文件“include/linux/gpio.h”中有 Linux 默认的 GPIO 申请函数,这个头文件是属于嵌入式 Linux 平台,任何一个嵌入式 Linux 内核都可以这么使用。
如下图所示,在源码目录中使用命令“vim include/linux/gpio.h”打开该文件。
2.jpg
如下图所示,就是本节实验中需要用到的函数 gpio_request。
3.jpg
如上图所示,简单介绍一下 gpio_request 函数。
首先这个函数有一个重要的“检测”功能,就是如果其它地方申请了这个 IO,那么这里就会返回错误,提示已经被占用了,这是 Linux 中的一个标准用法。
gpio_request 函数有两个参数
unsigned gpio,申请的那个 GPIO,一般是 GPIO 对应的宏定义
const char *label,为 GPIO 取个名字,便于阅读
如下图所示,和 gpio_request 函数对应的是 gpio_free 函数。
4.jpg
在调用 gpio_request 函数之后,向系统表明这个 IO 已经被占用了,在卸载驱动的时候一般需要调用 gpio_free 函数将其释放。
gpio_free 函数的参数比较简单,只有一个 GPIO 参数,使用 GPIO 对应的宏定义即可。
如下图所示,还有一个赋值函数 gpio_set_value。
5.jpg
在将 GPIO 配置为输出模式之后,还需要给 GPIO 赋值,一般就是高电平和低电平两种。
两个参数分别为
unsigned gpio,GPIO
int value,高电平 1 和低电平 0。
14.4.2 GPIO 配置参数宏定义
GPIO 在 Linux 初始化,进行映射之后调用 GPIO 操作函数对 GPIO 宏定义进行操作就是对 GPIO 的操作。
这个 GPIO 宏定义文件都是由原厂提供,肯定是已经做好的,属于 BSP 板级开发包。
如下图所示,在源码目录中使用命令
“vim arch/arm/mach-exynos/include/mach/gpio-exynos4.h”打开该文件。
6.jpg
如下图所示,可以看到所有的 GPIO 都已经定义了。
7.jpg
在原理图中查找 KP_COL0、VDD50_EN 网络,最终连接到 4412 上的部分如下图所示。
8.jpg
如上图所示,则两个 Led 的宏定义为 EXYNOS4_GPL2(0),EXYNOS4_GPK1(1)。
14.4.3 GPIO 配置函数和参数
在 Linux 中,对 GPIO 的配置函数以及参数都已经集成到三星板级开发包中。
先来看一下配置函数,如下图所示,在源码目录中使用命令
“vim arch/arm/plat-samsung/include/plat/gpio-cfg.h”打开该文件。
9.jpg
如下图所示,s3c_gpio_cfgpin 函数就是本节实验需要的。
10.jpg
如上图所示,函数 extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);
一般来说带有 s3cxxx 的函数就是三星平台能够通用的函数。
s3c_gpio_cfgpin 管脚配置函数有两个参数
参数 unsigned int pin,管脚
参数 unsigned int to,配置参数。
再来看一下配置参数,如下图所示,在源码目录中使用命令
“vim arch/arm/plat-samsung/include/plat/gpio-cfg.h”打开该文件,配置参数和函数是在同一个函数中。
11.jpg
如下图所示,对于 GPIO 需要将其配置为输出模式,对应 S3C_GPIO_OUTPUT 宏定义。
12.jpg
14.5 编写简单应用调用 LED 管脚,并测试
在前面的 devicenode_linux_module.c 文件上添加代码,首先将文件名devicenode_linux_module.c 改为 leds.c。
先处理一下编译文件 Makefile,如下图所示,将 devicenode_linux_module 改为leds。
13.jpg
接着修改 leds.c 文件。
首先添加需要的头文件,如下图所示,分别是申请 GPIO、配置函数、配置参数、GPIO宏定义等的头文件。然后将设备节点名称由 hello_ctl123 修改为 hello_ctl
14.jpg
然后需要修改的就是 probe 函数,一般说来 GPIO 的初始化都是在 probe 中。如下图所示,调用配置函数以及配置函数。
15.jpg
然后就是修改一下 ioctl 函数,在 Linux 中对 GPIO 的控制一般是使用 ioctl,虽然 write函数也可以实现类似的功能,但是 ioctl 函数的效率高一些。如下图所示,根据应用传入的参数给 GPIO 赋值。
16.jpg
如上图所示,先对于参数做一个简单的判断,然后给 led 赋值。
接着再来看一下应用,如下图所示,应用比较简单,调用延时函数,首先将 Led 点亮三秒,然后再灭掉三秒,再点亮。
17.jpg
在 Ubuntu 系统下新建 leds 文件夹,将写好的 leds 和编译脚本拷贝到 leds 文件夹下,使用 Makefile 命令编译驱动,使用
“arm-none-linux-gnueabi-gcc -o invoke_leds invoke_leds.c -static”命令编译应用。如下图所示
18.jpg
将上图中的文件 invoke_leds 和 leds.ko 拷贝到 U 盘。
启动开发板,将 U 盘插入开发板,使用命令“ mount /dev/sda1 /mnt/udisk/”加载 U盘符,
使用命令“ insmod /mnt/udisk/leds.ko ”加载驱动 leds.ko,
使用命令“./mnt/udisk/invoke_leds”运行小应用 invoke_leds,如下图所示。
19.jpg
经过上面的操作可观察到 led 小灯会一亮一灭一亮,中间大概间隔三秒钟。
20.jpg
21.jpg

本文地址:https://www.eechina.com/thread-753127-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

  • Microchip视频专区
  • 更佳设计的解决方案——Microchip模拟开发生态系统
  • 我们是Microchip
  • Cortex-M4外设 —— TC&TCC结合事件系统&DMA优化任务培训教程
  • 想要避免发生灾难,就用MPLAB SiC电源仿真器!
  • 贸泽电子(Mouser)专区
关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表