一.什么是GPIO子系统
GPIO(General Purpose Input/Output)子系统是嵌入式系统中的一个重要组件。它是操作系统内核提供的一个软件接口,用于控制和管理硬件上的通用输入输出引脚。
GPIO子系统允许开发人员通过软件控制和配置硬件的输入和输出引脚。每个GPIO引脚可以用作输入或输出,可以用于读取外部设备的输入信号(例如按钮、传感器等)或控制外部设备的输出信号(例如LED、继电器等)。
GPIO子系统通常提供以下功能:
不同的操作系统和开发环境可能会提供不同的GPIO子系统接口和函数库。例如,在Linux系统中,可以使用sysfs文件系统或GPIO字符设备接口来访问和控制GPIO引脚。而在嵌入式开发中,可能需要使用特定的硬件抽象层(HAL)或驱动程序来操作GPIO引脚。
通过GPIO子系统,开发人员可以在嵌入式系统中灵活地使用和控制硬件上的通用输入输出引脚,实现各种应用和功能。
二.demo
beep.c
#include
#include
#include
#include
#include
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
#include
#include
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
//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 $