二、QT和驱动模块实现智能家居-----5、通过QT控制LED

发布于:2025-03-06 ⋅ 阅读:(141) ⋅ 点赞:(0)

在QT界面,我们要实现点击“LED”按钮就可以控制板子上的LED。LED接线图如下:

在Linux 系统里,我们可以使用2种方法去操作上面的LED:

① 使用GPIO SYSFS系统:这需要一定的硬件知识,需要设置引脚的方向、数值。

② 使用驱动程序:无需硬件知识,使用open/read/write接口调用驱动即可。

1、GPIO SYSFS 系统

一个芯片内部,有多个 GPIO 控制器,每个 GPIO 控制器有多个引脚。在 /sys/bus/gpio/devices 目录下,列出了所有的 GPIO 控制器,如下表示有 6 个 GPIO 控制器:

# ls /sys/bus/gpio/devices 
gpiochip0  gpiochip1  gpiochip2  gpiochip3  gpiochip4  gpiochip5 

怎么查看每个GPIO 控制器的详细信息?/sys/class/gpio/gpiochipXXX 下,有这些信息:

ls /sys/class/gpio/gpiochip* -d1  //列出GPIOx的信息

/sys/class/gpio/gpiochip0 
/sys/class/gpio/gpiochip128 
/sys/class/gpio/gpiochip32 
/sys/class/gpio/gpiochip504 
/sys/class/gpio/gpiochip64 
/sys/class/gpio/gpiochip96 
ls /sys/class/gpio/gpiochip0 -1 //列出GPIO0的信息
base      // 这个GPIO控制器的GPIO编号基值 
device 
label     // 名字 
ngpio     // 引脚个数 
power 
subsystem 
uevent 
cat /sys/class/gpio/gpiochip0/label //GPIO0的标签

209c000.gpio 

查看GPIO使用情况,执行如下命令即可:

cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/209c000.gpio, 209c000.gpio: 
 gpio-5   (                    |goodix_ts_int       ) in  hi IRQ 
 gpio-19  (                    |cd                  ) in  hi IRQ 
 gpio-20  (                    |spi_imx             ) out hi 
 
gpiochip1: GPIOs 32-63, parent: platform/20a0000.gpio, 20a0000.gpio: 
 
gpiochip2: GPIOs 64-95, parent: platform/20a4000.gpio, 20a4000.gpio: 
 gpio-68  (                    |lcdif_rst           ) out hi 
 
gpiochip3: GPIOs 96-127, parent: platform/20a8000.gpio, 20a8000.gpio: 
 gpio-110 (                    |User2 Button        ) in  hi IRQ 
 gpio-120 (                    |spi_imx             ) in  lo 
 gpio-122 (                    |spi_imx             ) in  lo 
 
gpiochip4: GPIOs 128-159, parent: platform/20ac000.gpio, 20ac000.gpio: 
 gpio-129 (                    |User1 Button        ) in  hi IRQ 
 gpio-130 (                    |goodix_ts_rst       ) out hi 
 gpio-133 (                    |sysfs               ) out hi 
 gpio-134 (                    |phy-reset           ) out hi 
 gpio-135 (                    |spi32766.0          ) out hi 
 gpio-136 (                    |?                   ) out lo 
 gpio-137 (                    |phy-reset           ) out hi 
 gpio-138 (                    |spi4                ) out hi 
 gpio-139 (                    |spi4                ) out lo 

2、通过SYSFS使用GPIO

1.)确定GPIO编号

查看每个/sys/class/gpio/gpiochipXXX目录下的label,确定是你要用的GPIO控制器,也称为GPIO Bank。 根据它名字gpiochipXXX,就可以知道基值是XXX基值加上引脚offset,就是这个引脚的编号。

注:对于GPIOx_y,一般有一个公式:编号=(x-1)*32+y。x从1开始。 在IMX6ULL的原理图里,LED使用的引脚是GPIO5_3,它的编号为:(5-1)*32+3=131。

2) 导出/设置方向/读写值

举例:IMX6ULL使用的GPIO5_3引脚编号是131,可以如下操作:

echo 131 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio131/direction 
echo 1 > /sys/class/gpio/gpio131/value 
echo 131 > /sys/class/gpio/unexport 

如果GPIO5_3是按键,可以如下读取它的值:

echo 131 > /sys/class/gpio/export 
echo in > /sys/class/gpio/gpio131/direction 
cat /sys/class/gpio/gpio131/value 
echo 131 > /sys/class/gpio/unexport 

3)编写应用程序

打开QT在原文件Sources内新建一个led.cpp

①按键初始化程序

void LED_Init(void)
{
    static int fd;
        fd = open("/sys/class/gpio/export", WRONLY);
        if(fd < 0)
{
        qDebug() << "open /sys/class/gpio/export error";
        return;
}
        write(fd, "131\n", 4);
        close(fd);
        fd = open("/sys/class/gpio/export", WRONLY);
        if(fd < 0)
{
        qDebug() << "open /sys/class/gpio/gpio131/direction error";
        return;
}
        write(fd, "out\n", 4);
        close(fd);
}

②:按键控制程序

void LED_Control(int on)
{
    static fd = -1;
    if(fd == -1)
{
       fd = open("/sys/class/gpio/gpio131/value", O_RDWR);
        return;
}
    if(fd < 0)
{
        qDebug() << "open /sys/class/gpio/gpio131/valuen error";
        return;
}
    if(on)
{
        write(fd, "0\n", 2);
}
else
{
        write(fd, "1\n", 2);
}
}

然后在Header文件下编写led.h文件

最后主函数调用初始化程序,主窗函数调用控制函数。


网站公告

今日签到

点亮在社区的每一天
去签到