打印
[ARM入门]

【转载】迅为4412开发板实验LEDS驱动一

[复制链接]
1346|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jugaga|  楼主 | 2015-9-18 15:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


Led硬件原理简单介绍
Led 的电路比较简单,一般是使用三极管搭建一个控制电路。
如下图所示,是原理图中两个 Led 的控制电路。KP_COL0 VDD50_EN 网络控制 Led
的通断。
    当 KP_COL0 VDD50_EN 网络时高电平的时候,三极管 L9014 BE 导通,CE导通,相当于 5V VSYS 电压加到 1K Led 小灯上,小灯就会亮。
KP_COL0 VDD50_EN 网络时低电平的时候,三极管 L9014 BE会截止,CE 截止,相当于 5V VSYS 电压加到 1KLed 小灯和一个无限大的电阻上,电流为零,小灯就会灭。
Led管脚的调用、赋值以及配置
本节介绍一部分涉及 GPIO 调用、赋值以及配置的函数。
GPIO申请和释放函数
想用使用任何一个 GPIO 都必须先申请。
在头文件“include/linux/gpio.h”中有 Linux 默认的 GPIO 申请函数,这个头文件是属于
嵌入式 Linux 平台,任何一个嵌入式 Linux 内核都可以这么使用。
如下图所示,在源码目录中使用命令“vim include/linux/gpio.h”打开该文件。
如下图所示,就是本节实验中需要用到的函数 gpio_request
如上图所示,简单介绍一下 gpio_request 函数。
首先这个函数有一个重要的“检测”功能,就是如果其它地方申请了这个 IO,那么这里就
会返回错误,提示已经被占用了,这是 Linux 中的一个标准用法。
gpio_request 函数有两个参数
unsigned gpio,申请的那个 GPIO,一般是 GPIO 对应的宏定义
const char *label,为 GPIO 取个名字,便于阅读
如下图所示,和 gpio_request 函数对应的是 gpio_free 函数。
在调用 gpio_request 函数之后,向系统表明这个 IO 已经被占用了,在卸载驱动的时候一
般需要调用 gpio_free 函数将其释放。
gpio_free 函数的参数比较简单,只有一个 GPIO 参数,使用 GPIO 对应的宏定义即可。
如下图所示,还有一个赋值函数 gpio_set_value
在将 GPIO 配置为输出模式之后,还需要给 GPIO 赋值,一般就是高电平和低电平两种。
两个参数分别为
unsigned gpioGPIO
int value,高电平 1 和低电平 0
GPIO配置参数宏定义
GPIO Linux 初始化, 进行映射之后调用 GPIO 操作函数对 GPIO 宏定义进行操作就是对
GPIO 的操作。
这个 GPIO 宏定义文件都是由原厂提供,肯定是已经做好的,属于 BSP板级开发包。
如下图所示,在源码目录中使用命令
vim arch/arm/mach-exynos/include/mach/gpio-exynos4.h”打开该文件。
如下图所示,可以看到所有的 GPIO 都已经定义了。
在原理图中查找 KP_COL0VDD50_EN 网络,最终连接到 4412 上的部分如下图所示。
如上图所示,则两个 Led 的宏定义为 EXYNOS4_GPL2(0)EXYNOS4_GPK1(1)
GPIO配置函数和参数
Linux 中,对 GPIO 的配置函数以及参数都已经集成到三星板级开发包中。
先来看一下配置函数,如下图所示,在源码目录中使用命令
vim arch/arm/plat-samsung/include/plat/gpio-cfg.h”打开该文件。
如下图所示,s3c_gpio_cfgpin 函数就是本节实验需要的。
如上图所示,函数 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”打开该文件,配置参数和函
数是在同一个函数中。
如下图所示,对于 GPIO 需要将其配置为输出模式,对应 S3C_GPIO_OUTPUT 宏定义。
编写简单应用调用LED管脚,并测试
我们在前面的 devicenode_linux_module.c 文件上添加代码,首先将文件名
devicenode_linux_module.c 改为 leds.c
先处理一下编译文件 Makefile,如下图所示,将 devicenode_linux_module 改为 leds
接着修改 leds.c 文件。
首先添加需要的头文件,如下图所示,分别是申请 GPIO、配置函数、配置参数、GPIO
定义等的头文件。然后将设备节点名称由 hello_ctl123 修改为 hello_ctl
然后需要修改的就是 probe 函数, 一般说来 GPIO 的初始化都是在 probe 中。 如下图所示,
调用配置函数以及配置函数。
然后就是修改一下 ioctl 函数,在 Linux 中对 GPIO 的控制一般是使用 ioctl,虽然 write
函数也可以实现类似的功能,但是 ioctl 函数的效率高一些。如下图所示,根据应用传入的参数
GPIO 赋值。
如上图所示,先对于参数做一个简单的判断,然后给 led赋值。
接着再来看一下应用,如下图所示,应用比较简单,调用延时函数,首先将 Led 点亮三秒,
然后再灭掉三秒,再点亮。
Ubuntu 系统下新建 leds文件夹,将写好的 leds 和编译脚本拷贝到 leds文件夹下,使
Makefile 命令编译驱动,使用
arm-none-linux-gnueabi-gcc -o invoke_leds invoke_leds.c -static”命令编译应用。
如下图所示。
将上图中的文件 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,如下图所示。
经过上面的操作可观察到 led小灯会一亮一灭一亮,中间大概间隔三秒钟。

相关帖子

沙发
云山道长| | 2015-9-28 12:44 | 只看该作者
写的不错,很详细

使用特权

评论回复
板凳
大光89| | 2017-2-6 15:09 | 只看该作者
收藏先~

使用特权

评论回复
地板
MENGYUE1| | 2017-2-16 09:19 | 只看该作者
留个位置,收藏

使用特权

评论回复
5
落幕以前| | 2017-3-10 09:23 | 只看该作者
帖子很好,写的不错

使用特权

评论回复
6
静的像空气| | 2017-3-14 09:11 | 只看该作者
很好的帖子,赞

使用特权

评论回复
7
冥月33| | 2017-3-15 09:13 | 只看该作者
讲的特别好,加油

使用特权

评论回复
8
静的像空气| | 2017-3-16 09:32 | 只看该作者
学习了,很好的帖子

使用特权

评论回复
9
看起来太独特| | 2017-3-23 09:30 | 只看该作者
静的像空气 发表于 2017-3-16 09:32
学习了,很好的帖子

收藏了,赞赞赞赞

使用特权

评论回复
10
孤久厌闹| | 2017-3-28 09:59 | 只看该作者

写的很好阿,

使用特权

评论回复
11
霓虹灯下的少年| | 2017-3-30 10:26 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

118

帖子

1

粉丝