用户态gpio操作(带gpio 编号)

GPIO编号在mygpio.h中

GPIO文件句柄只在末尾多了个f

在同一个目录下

建一个头文件
vi mygpio.h 内容如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>


//GPIO编号
#define GPIO18 "370"
#define GPIO19 "371"
#define GPIO20 "372"
#define GPIO21 "373"
#define GPIO22 "374"
#define GPIO23 "375"
#define GPIO25 "377"
#define GPIO26 "378"

#define GPIOA14 "494"
#define GPIOA15 "495"
#define GPIOA16 "496"
#define GPIOA17 "497"
#define GPIOA22 "502"
#define GPIOA23 "503"
#define GPIOA24 "504"
#define GPIOA25 "505"
#define GPIOA26 "506"
#define GPIOA27 "507"
#define GPIOA28 "508"
#define GPIOA29 "509"

#define GPIOC9 "425"
#define GPIOC10 "426"
//GPIO编号

#define out "out"
#define in "in"

//a为GPIO文件句柄,b为临时存储数组
#define gpio_writeh(a) write(a, "1", 2)
#define gpio_writel(a) write(a, "0", 2)
#define gpio_read(a,b) read(a,b,2)

//GPIO文件句柄 
int GPIO18f,GPIO19f,GPIO20f,GPIO21f,GPIO22f,GPIO23f,GPIO25f,GPIO26f;
int GPIOA14f,GPIOA15f,GPIOA16f,GPIOA17f,GPIOA22f,GPIOA23f,GPIOA24f,GPIOA25f,GPIOA26f,GPIOA27f,GPIOA28f,GPIOA29f;
int GPIOC9f,GPIOC10f;
//GPIO文件句柄



int gpio_init(char * mystr)//参数一:GPIO编号   例如GPIOC9
{
    int fd;
    fd = open("/sys/class/gpio/export", O_WRONLY);

    write(fd, mystr, sizeof(mystr));
    close(fd);
    return 0;
}

int gpio_close(char * mystr,int gpiof)//参数一:例如GPIOC9   参数二:例如GPIOC9f    卸载gpio和关闭gpio文件句柄
{
    int fd;
    fd = open("/sys/class/gpio/unexport", O_WRONLY);

    write(fd, mystr, sizeof(mystr));
    close(fd);

    close(gpiof);
    return 0;
}


int gpio_setd(char * mystr,int * gpiof,char * myset)//1:GPIO编号  2.GPIO文件句柄  例如GPIOC9f   3.为输入或输出   例如out或in 
{
    int fd;
    char str1[]="/sys/class/gpio/gpio";
    char str2[]="/direction";
    char str4[]="/value";
    char str3[50];
    str3[0]='\0';
    strcat(str3,str1);
    strcat(str3,mystr);
    strcat(str3,str2);


    fd = open(str3, O_WRONLY);
    write(fd, myset, sizeof(myset));
    close(fd);



    str3[0]='\0';
    strcat(str3,str1);
    strcat(str3,mystr);
    strcat(str3,str4);


    if(sizeof(gpiof)  == 4)
    {
        *gpiof = open(str3, O_WRONLY);
    }
    else
    {
        *gpiof = open(str3, O_RDWR);
    }
    

    
    return 0;
}

建一个头文件
vi main.c 内容如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h> 
#include "mygpio.h"

int main()
{
    char lishi[2];
    gpio_init(GPIOA28);//初始GPIOA28
    gpio_setd(GPIOA28,&GPIOA28f,out);//1:GPIO编号  2.GPIO文件句柄  例如GPIOC9f   3.为输入或输出   例如out或in 

    while(1)
    {
        gpio_writeh(GPIOA28f);//将GPIOA28设为高
        usleep(100000);
        gpio_writel(GPIOA28f);//将GPIOA28设为低
        usleep(100000);
    }

    gpio_read(GPIOA28f,lishi);//在gpio_setd设置为in 输入时    lishi存储gpio的值    lishi[0]-30 为 0 或 1

    gpio_close(GPIOA28,GPIOA28f);//卸载gpio和关闭gpio文件句柄
    return 0;
}

编译为:
[root@milkv]~# riscv64-unknown-linux-gnu-gcc -static -o main main.c

然后将main上传milkv
我这里是在电脑上建立Nginx服务器 把文件放到服务器上
运行 wget 192.168.42.159/main 下载到milkv ip为电脑ip

运行 chmod +x main

运行 ./main 就正常运行了

下面是linux组号计算:

     GPIOA linux组号值为480     +   	偏移   为GPIO编号        
     GPIOC linux组号值为416
     GPIO  linux组号值为352

     例如GPIOA15   GPIO编号为  480+15=495
     例如GPIOC9   GPIO编号为  416+9=425
     例如GPIO23   GPIO编号为  352+23=375
2 Likes