MX6LL|GPIO子系统实战

143 阅读3分钟

一.什么是GPIO子系统

GPIO(General Purpose Input/Output)子系统是嵌入式系统中的一个重要组件。它是操作系统内核提供的一个软件接口,用于控制和管理硬件上的通用输入输出引脚。

GPIO子系统允许开发人员通过软件控制和配置硬件的输入和输出引脚。每个GPIO引脚可以用作输入或输出,可以用于读取外部设备的输入信号(例如按钮、传感器等)或控制外部设备的输出信号(例如LED、继电器等)。

GPIO子系统通常提供以下功能:

  1. 配置引脚的工作模式:将引脚设置为输入模式或输出模式。
  2. 读取输入引脚状态:读取输入引脚的电平状态,以检测按钮按下或传感器信号。
  3. 控制输出引脚状态:设置输出引脚的电平状态,以控制LED亮灭或控制外部设备。
  4. 中断处理:可以使用中断来监听引脚状态的变化,当引脚状态发生变化时触发相应的中断处理函数。

不同的操作系统和开发环境可能会提供不同的GPIO子系统接口和函数库。例如,在Linux系统中,可以使用sysfs文件系统或GPIO字符设备接口来访问和控制GPIO引脚。而在嵌入式开发中,可能需要使用特定的硬件抽象层(HAL)或驱动程序来操作GPIO引脚。 通过GPIO子系统,开发人员可以在嵌入式系统中灵活地使用和控制硬件上的通用输入输出引脚,实现各种应用和功能。

二.demo

beep.c

#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include </home/hq/demo/max6ll/beep/include/include.h>

int beep_init(void)
{
    //1.产生19引脚文件
    int fd;
    fd = open("/sys/class/gpio/export", O_WRONLY);
    if (fd < 0)
        return 1;
    write(fd, BEEP_CPIO_INDX, strlen(BEEP_CPIO_INDX));
    close(fd);

    //2.设置为输出模式
    char buf[128]={0};
    sprintf(buf,"/sys/class/gpio/gpio%s/direction", BEEP_CPIO_INDX);
    fd = open(buf, O_WRONLY);
    if (fd < 0)
        return 2;
    write(fd, "out", strlen("out"));
    close(fd);
    return 0;
}

int beep_deinit(void)
{
    int fd;
    fd = open("/sys/class/gpio/unexport", O_WRONLY);
    if (fd < 0)
        return 1;
    write(fd, BEEP_CPIO_INDX, strlen(BEEP_CPIO_INDX));
    close(fd);
    return 0;
}

int beep_on(void)
{
    int fd;
    char buf[128]={0};
    sprintf(buf,"/sys/class/gpio/gpio%s/value", BEEP_CPIO_INDX);
    fd = open(buf, O_WRONLY);
    if (fd < 0)
        return 1;
    write(fd, "1", 1);
    close(fd);
    return 0;
}

int beep_off(void)
{
    int fd;
    char buf[128]={0};
    sprintf(buf,"/sys/class/gpio/gpio%s/value", BEEP_CPIO_INDX);
    fd = open(buf, O_WRONLY);
    if (fd < 0)
        return 1;
    write(fd, "0", 1);
    close(fd);
    return 0;
}

main.c

#include </home/hq/demo/max6ll/beep/include/include.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
 
    char buf[10] = {0};
    int res;
    printf("This is the beep demo\n");
    res = beep_init();
    if (res)
    {
        printf("beet init error,code = %d\n", res);
        return 0;
    }

    while (1)
    {
        printf("Please input the value :0--off 1--on q--exir\n");
        scanf("%10s", buf);
        switch (buf[0])
        {
        case '0':
            beep_off();
            break;
        case '1':
            beep_on();
            break;
        case 'q':
            beep_deinit();
            break;
        default:
            break;
        }
    }

    return 0;
}

include.h

#ifndef _BSP_BEEP_H
#define _BSP_BEEP_H
#include <stdio.h>
//DPIO引脚号
//imx6ll计算方式,GPIOn_IOx
//(n-1)*32+x

#define BEEP_CPIO_INDX "19"
extern int beep_init(void);
extern int beep_deinit(void);
extern int beep_on(void);
extern int beep_off(void);


#endif

Makefile

ARCH ?= x86

ifneq ($(ARCH),x86)
        CC=gcc
else
        CC=arm-linux-gnueabihf-gcc
endif



#TARGET 目标生成文件
TARGET=beep


#生成目录
BUILD_DIR=build

#存放.c的目录
SRC_DIR=beepc


#存放所有的.c文件,包含路径
SOURCES=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))


#存放所有的.o文件
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCES)))


#定义额外的搜索路径
VPATH=$(SRC_DIR)

$(BUILD_DIR)/$(TARGET):$(OBJS)
        $(CC) $^ -o $@

$(BUILD_DIR)/%.o:%.c | create_build
        $(CC) -c $< -o $@


.PHONY:clear earth create_build

clear:
        rm -rf $(BUILD_DIR)

earth:
        . /etc/profile

create_build:
        mkdir -p $(BUILD_DIR)