#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
//arm-linux-gnueabihf-gcc gpio_test_output.c -o gpio_test_output
#define ERROR 0x01
#define IN 0x01
#define OUT 0x02
#define TEST_1_PIN_NUM 434// FMQL45T900 EMIO8 -> gpiochip434
#define TEST_2_PIN_NUM 916// ZYNQ-7000 MIO10 -> gpio916
#define GPIO_DEBUG
#ifdef GPIO_DEBUG
#define dbg_info(format, args...) printf("%d:"format, __LINE__, ##args)
#else
#define dbg_info(format, args...)
#endif
#define dbg_err(format, args...) printf("%d:"format, __LINE__, ##args)
struct pin_mesg{
int pin;
unsigned char inout_flags;
};
static int gpio_unexport(struct pin_mesg* mesg);
static int gpio_direction(struct pin_mesg* mesg);
static int gpio_export(struct pin_mesg* mesg);
static int gpio_write(struct pin_mesg* mesg, char value);
int main(int argc, char *argv[]){
struct pin_mesg test_pin_mesg;
test_pin_mesg.pin = TEST_1_PIN_NUM;
test_pin_mesg.inout_flags = OUT;
gpio_export(&test_pin_mesg);//生成gpio节点
gpio_direction(&test_pin_mesg);//设置方向
while(1)
{
gpio_write(&test_pin_mesg, 1);
sleep(1);
gpio_write(&test_pin_mesg, 0);
sleep(1);
}
return 0;
}
static int gpio_export(struct pin_mesg* mesg){
char name[4];
int fd,len;
fd = open("/sys/class/gpio/export", O_WRONLY);
if (fd < 0) {
perror("open export");
return(-1);
}
len = sprintf(name, "%d", mesg->pin);
dbg_info("gpiopin = gpio%s\n",name);
if (write(fd, name, sizeof(name)) < 0) {
perror("write export");
return -1;
}
close(fd);
return 0;
}
static int gpio_direction(struct pin_mesg* mesg){
char path[64];
int fd,res;
char *dir;
if(mesg->inout_flags & IN)
dir = "in";
if(mesg->inout_flags & OUT)
dir = "out";
sprintf(path,"/sys/class/gpio/gpio%d/direction", mesg->pin);
dbg_info("direction path: %s,direction = %s\n", path, dir);
fd = open(path, O_WRONLY);
if (fd < 0) {
perror("open direction");
return -1;
}
res = write(fd, dir, sizeof(dir));
if (res <= 0) {
perror("write direction");
return -1;
}
close(fd);
return 0;
}
static int gpio_write(struct pin_mesg* mesg, char value){
char path[64];
int fd;
char *value_str;
if(value == 1)
value_str = "1";
if(value == 0)
value_str = "0";
sprintf(path, "/sys/class/gpio/gpio%d/value", mesg->pin);
dbg_info("value path: %s, value = %s\n", path,value_str);
fd = open(path, O_RDWR);
if (fd < 0) {
perror("open value");
return -1;
}
int res = write(fd, value_str, sizeof(value_str));
if (res <= 0) {
perror("write value");
return -1;
}
close(fd);
return 0;
}
static int gpio_unexport(struct pin_mesg* mesg)
{
char name[4];
int len;
int fd;
fd = open("/sys/class/gpio/unexport", O_WRONLY);
if (fd < 0) {
perror("open unexport");
return -1;
}
len = sprintf(name, "%d", mesg->pin);
dbg_info("name = gpio%s\n",name);
if (write(fd, name, len) < 0) {
perror("write unexport");
return -1;
}
close(fd);
return 0;
}
大牛攻城狮
- 粉丝: 1w+
- 资源: 146
最新资源
- 使用 Graphic, DirectX, OpenGL 进行全屏拍摄.zip
- 基于Flask的农产品价格数据可视化及预测系统设计与实现
- 微信点餐系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 图书馆座位再利用系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 测试系统,用于平时练习使用
- 童心党史小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 使用 GSD (DirectX Hook Library) 绘制十字线.zip
- 微信阅读小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 使用 Hieroglyph3 框架的 DirectX 11 教程.zip
- 微信小程序租房平台 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 鲜花销售微信小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 使用 ImGui 和 DirectX12 展示独立窗口.zip
- 无人机和行人的yolo数据集
- 项目申报小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 校园订餐小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
- 校园二手交易平台小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈