广轻电气091 发表于 2019-4-4 13:53:41

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

本帖最后由 广轻电气091 于 2019-4-4 14:45 编辑

i.MX6UL GPIO控制程序

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

TQ-i.MX6UL的板载LED的硬件原理图如下所示:

从原理图可以看出,TQ-i.MX6UL使用了GPIO5_IO2和GPIO5_IO7这两个IO口进行LED的驱动,LED为高电平点亮。

一般情况下,如果使用通用的方法,进行嵌入式Linux的GPIO控制,可以通过访问/sys/class/gpio路径下的文件,控制GPIO的方向(输入还是输出),状态(高电平还是低电平)。
以控制GPIO5_IO2为例:
1. 计算对应sys/class/gpio的值GPIOn_IOx = (n-1)*32 + x
GPIO5_IO2=(5 -1)*32 + 2 = 130

2. 将GPIO5_IO2设置为输出。
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             #通知系统取消导出

3. 将GPIO5_IO2设置为输入。
echo  130  >/sys/class/gpio/export       #用于通知系统需要导出控制的GPIO引脚编号
echo"in">/sys/class/gpio/gpio130/direction    #控制为输入
这时给该引脚接高电平,输入即为高电平,反之为低电平
echo 130  >/sys/class/gpio/unexport       #通知系统取消导出

我们不使用以上的方式进行控制,因为内核驱动里面,已经把这两个GPIO的资源用作LED控制,如果强行使用以上方式进行GPIO控制,则系统会提示Device or resource busy


对于TQ-i.MX6UL平台,由于内核已经封装好LED的驱动程序,并且向应用层提供了LED的控制接口(在 /sys/devices/platform/leds/leds/ 目录下的LED1和LED2),因此,应用程序可以基于这个接口,对相应的LED进行控制,下面以LED1为例:
/sys/devices/platform/leds/leds/LED1目录下的文件节点如下图所示:

这里关注两个节点:brightness 和 trigger 。
brightness节点用来控制LED的亮灭,通过对brightness节点写入0或1,可以控制LED的亮灭状态。由于TQ-i.MX6UL的LED接口不是使用PWM方式驱动,因此,brightness节点不支持亮度调节,只支持亮灭控制。
trigger节点用来控制LED不同的触发方式,通过对trigger节点写入不同的状态值,LED可以在不同的状态下进行亮灭显示。trigger支持的状态值有:rc-feedback, nand-disk, mmc0, timer, oneshot, heartbeat, backlight, gpio.

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

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


3、关于LED的具体操作,在编写代码的时候,使用面向对象的思想,我们使用一个类进行封装,这个类封装了各种关于LED控制的方法。(具体细节请下载源码),如下图所示:
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:
};


4、在Linux系统中一切皆文件,所以,我们可以用普通访问文件的方法来进行LED的控制,在Qt中,可以使用QFile类进行文件访问控制。
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();
}


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

点击这里,下载工程源码

SUPER_CRJ 发表于 2019-4-4 13:58:58

表示打不开.swf格式。几个播放器一闪而过,不知道是什么。

广轻电气091 发表于 2019-4-4 14:07:55

SUPER_CRJ 发表于 2019-4-4 13:58
表示打不开.swf格式。几个播放器一闪而过,不知道是什么。

我直接换成youku的链接吧,不过要忍受几十秒的广告,比较难受。请问有什么方法可以把视频内嵌到网页中吗?

887799 发表于 2019-4-4 14:19:23

广轻电气091 发表于 2019-4-4 14:07
我直接换成youku的链接吧,不过要忍受几十秒的广告,比较难受。请问有什么方法可以把视频内嵌到网页中吗 ...

用gif的方式。

xiangbin099 发表于 2019-4-4 14:26:31

持续关注,谢谢分享!

广轻电气091 发表于 2019-4-4 14:29:10

887799 发表于 2019-4-4 14:19
用gif的方式。

视频20秒以上的时间,转换成gif ,文件比较大,而且显示会失真

Jmhh247 发表于 2019-4-4 14:35:29

支持楼主,讲的很详细!


一个led用三极管驱动,有点奢侈吧。。。


建议这些也用代码格式排版:

echo130>/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      #输出为低电平
echo130>/sys/class/gpio/unexport               #通知系统取消导出

广轻电气091 发表于 2019-4-4 14:38:16

Jmhh247 发表于 2019-4-4 14:35
支持楼主,讲的很详细!




感谢支持,谢谢您的建议。

zyqcome 发表于 2019-4-4 14:50:22

我想知道,imx6ul控制gpio中速度最快的方式是什么,现在我用内存直接访问,还是感觉不够快

luohui5003 发表于 2019-4-4 14:58:26

顶一个!{:victory:}

887799 发表于 2019-4-4 15:01:41

广轻电气091 发表于 2019-4-4 14:29
视频20秒以上的时间,转换成gif ,文件比较大,而且显示会失真

视频打包,以附件形式上传,这样最清晰。

广轻电气091 发表于 2019-4-4 15:12:45

887799 发表于 2019-4-4 15:01
视频打包,以附件形式上传,这样最清晰。

好的,下个例程以这种方式上传

广轻电气091 发表于 2019-4-4 15:13:14

luohui5003 发表于 2019-4-4 14:58
顶一个!

感谢关注!

Excellence 发表于 2019-4-4 15:55:04

谢谢分享。。。。

SUPER_CRJ 发表于 2019-4-4 18:23:40

广轻电气091 发表于 2019-4-4 14:07
我直接换成youku的链接吧,不过要忍受几十秒的广告,比较难受。请问有什么方法可以把视频内嵌到网页中吗 ...

看到了,优秀,最近正在学习qt

广轻电气091 发表于 2019-4-4 18:58:22

SUPER_CRJ 发表于 2019-4-4 18:23
看到了,优秀,最近正在学习qt

感谢支持!

广轻电气091 发表于 2019-4-4 19:01:19

zyqcome 发表于 2019-4-4 14:50
我想知道,imx6ul控制gpio中速度最快的方式是什么,现在我用内存直接访问,还是感觉不够快
...

如果对IO的实时性要求比较高,建议使用单片机处理的方式。因为Linux是非实时操作系统,IO操作会有一定的延时

eliterxzgxu 发表于 2019-4-4 19:23:18

感谢楼主分享

广轻电气091 发表于 2019-4-9 11:50:34

eliterxzgxu 发表于 2019-4-4 19:23
感谢楼主分享

感谢关注

广轻电气091 发表于 2019-4-9 13:53:06

本章节pdf下载:

ding731868572 发表于 2019-4-10 09:20:34

楼主更新挺快的

广轻电气091 发表于 2019-4-10 09:30:11

ding731868572 发表于 2019-4-10 09:20
楼主更新挺快的

其实是以前一直有记录,不过没好好整理和发布出来{:titter:}

zzh4933 发表于 2019-4-28 07:38:43


感谢楼主分享{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}

广轻电气091 发表于 2019-4-28 08:27:52

zzh4933 发表于 2019-4-28 07:38
感谢楼主分享

感谢关注

CHEN1986 发表于 2019-4-28 08:45:43

感谢楼主分享,搞个板子给在伙玩玩...

广轻电气091 发表于 2019-4-28 08:55:28

CHEN1986 发表于 2019-4-28 08:45
感谢楼主分享,搞个板子给在伙玩玩...

感谢关注和支持

广轻电气091 发表于 2019-4-29 13:56:31

源码下载路径已更改:点击这里

meirenai 发表于 2019-8-17 18:38:29

视频还是传到哔哩哔哩吧,没广告。

广轻电气091 发表于 2019-8-18 18:26:33

meirenai 发表于 2019-8-17 18:38
视频还是传到哔哩哔哩吧,没广告。

好的,感谢建议!
页: [1]
查看完整版本: 嵌入式Linux应用程序开发-(2)i.MX6UL GPIO控制程序