野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14193|回复: 5

嵌入式Linux应用程序开发-(2)i.MX6UL GPIO控制程序

[复制链接]
发表于 2019-4-28 15:01:08 | 显示全部楼层 |阅读模式
本帖最后由 embediot 于 2019-4-28 15:02 编辑

i.MX6UL GPIO控制程序

TQ-i.MX6UL的底板带有两个LED,可以用来进行GPIO的输出测试实验。
目标:了解Qt应用程序如何控制GPIO,实现通用的输出控制。
功能:通过点击触摸屏上的按钮,实现LED不同的效果(开/关、心跳灯、硬盘灯)。
我们把GPIO控制程序放在ubuntu系统的 /opt/work/qt-application/002_gpio_ctrl 目录下。

TQ-i.MX6UL的板载LED的硬件原理图如下所示:
图片1.png
从原理图可以看出,TQ-i.MX6UL使用了GPIO5_IO2GPIO5_IO7这两个IO口进行LED的驱动,LED为高电平点亮。
一般情况下,如果使用通用的方法,进行嵌入式LinuxGPIO控制,可以通过访问/sys/class/gpio路径下的文件,控制GPIO的方向(输入还是输出),状态(高电平还是低电平)。
以控制GPIO5_IO2为例:
1. 计算对应sys/class/gpio的值GPIOn_IOx = (n-1)*32 + x
[mw_shl_code=cpp,false]GPIO5_IO2=(5 -1)*32 + 2 = 130[/mw_shl_code]
2. GPIO5_IO2设置为输出。
[mw_shl_code=cpp,false]echo  130  >  /sys/class/gpio/export      #用于通知系统需要导出控制的GPIO引脚编号
echo  "out"  >  /sys/class/gpio/gpio130/direction       #控制为输出
echo  "1"  >  /sys/class/gpio/gpio130/value           #输出为高电平
或者echo  "0"  >  /sys/class/gpio/gpio130/value      #输出为低电平
echo  130  >  /sys/class/gpio/unexport               #通知系统取消导出[/mw_shl_code]
3. GPIO5_IO2设置为输入。
[mw_shl_code=cpp,false]echo  130  >  /sys/class/gpio/export       #用于通知系统需要导出控制的GPIO引脚编号
echo  "in"  >  /sys/class/gpio/gpio130/direction      #控制为输入[/mw_shl_code]
这时给该引脚接高电平,输入即为高电平,反之为低电平
[mw_shl_code=cpp,false]echo 130  >  /sys/class/gpio/unexport       #通知系统取消导出[/mw_shl_code]
我们不使用以上的方式进行控制,因为内核驱动里面,已经把这两个GPIO的资源用作LED控制,如果强行使用以上方式进行GPIO控制,则系统会提示Device or resource busy
图片2.png

对于TQ-i.MX6UL平台,由于内核已经封装好LED的驱动程序,并且向应用层提供了LED的控制接口(在 /sys/devices/platform/leds/leds/ 目录下的LED1LED2)。
因此,应用程序可以基于这个接口,对相应的LED进行控制,下面以LED1为例:
/sys/devices/platform/leds/leds/LED1目录下的文件节点如下图所示:
图片3.png
这里关注两个节点:brightness trigger
brightness节点用来控制LED的亮灭,通过对brightness节点写入01,可以控制LED的亮灭状态。由于TQ-i.MX6ULLED接口不是使用PWM方式驱动,因此,brightness节点不支持亮度调节,只支持亮灭控制。
trigger节点用来控制LED不同的触发方式,通过对trigger节点写入不同的状态值,LED可以在不同的状态下进行亮灭显示。trigger支持的状态值有:rc-feedback, nand-disk, mmc0, timer, oneshot, heartbeat, backlight, gpio.

1、先用Qt Creator构建一个工程,命名为:002_gpio_ctrl,关于如何构建工程,请参考“第一个嵌入式QT应用程序”的具体内容。

2、双击打开widget.ui”文件,构建界面,构建后的界面如下图所示:
图片4.png

3、关于LED的具体操作,在编写代码的时候,使用面向对象的思想,我们使用一个类进行封装,这个类封装了各种关于LED控制的方法。(具体细节请下载源码),如下图所示:
[mw_shl_code=cpp,true]class Led_Ctrl : public QWidget
{
    Q_OBJECT

public:
    Led_Ctrl();
    ~Led_Ctrl();

    void led1_ctrl(unsigned char state);
    void led2_ctrl(unsigned char state);
    void led_trigger(const char *p_trigger);
private slots:
private:
};
[/mw_shl_code]

4、Linux系统中一切皆文件,所以,我们可以用普通访问文件的方法来进行LED的控制,在Qt中,可以使用QFile类进行文件访问控制。
[mw_shl_code=cpp,true]void Led_Ctrl::led1_ctrl(unsigned char state)
{
    QFile led1_file(LED1_BRIGHTNESS);

    led1_file.open(QIODevice::ReadWrite);

    if(led1_file.isOpen())
    {
        if(state == LED_ON)
        {
            led1_file.write("0");
        }
        else if(state == LED_OFF)
        {
            led1_file.write("1");
        }
        else
        {

        }
    }
    led1_file.close();
}
[/mw_shl_code]

5、代码编写完成后,编译,并下载到开发板运行,可以实现如下效果。


嵌入式Linux应用程序开发-(2)i.MX6UL GPIO控制程序.pdf (416.08 KB, 下载次数: 92)


回复

使用道具 举报

发表于 2019-4-29 08:38:04 | 显示全部楼层
后面我们也会出imx 6ul,为避免广告,到时可能就把你的帖子删除了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-29 09:30:46 | 显示全部楼层
flyleaf 发表于 2019-4-29 08:38
后面我们也会出imx 6ul,为避免广告,到时可能就把你的帖子删除了

把涉及到广告的信息删掉就可以了,技术相关的内容,没必要删掉吧
回复 支持 反对

使用道具 举报

发表于 2019-6-5 16:12:41 | 显示全部楼层
程序不能下载了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 14:19:12 | 显示全部楼层

程序可以下载啊,https://shop247000010.taobao.com/,联系客服
回复 支持 反对

使用道具 举报

发表于 2019-6-24 11:40:14 | 显示全部楼层
什么时候出个按键驱动的教程呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-13 01:16 , Processed in 0.041696 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表