linux应用层操作gpio

1、查看linux系统下gpio是否存在,计算gpio号

cat /sys/kernel/debug/gpio
如果存在,需查一下这个gpio口是否能用(可以和硬件工程师沟通,也可以看datesheet),能用就排查设备树,将其屏蔽掉。
一般gpio是32个为组例如

  • 1、imx6ull板子
    GPIOx_y的编号 = 控制引脚的寄存器基数(32 * (x-1))+ 控制引脚寄存器位数(y)。比如: GPIO4_26的GPIO号=32 * (4 -1) + 26=122; GPIO4_24的GPIO号=32 * (4 -1) + 24=120。
  • 2、rk的板子
    关于芯片RK3399的io控制中一个重要参数GPIO_number的计算方法为例;
    A对应的是0 B对应的是1 C对应的是2以此类推
    GPIOx_Ky x * 32 + (K -A) * 8 + y
    GPIO1_B1 = 1 * 32 + (B-A) * 8 + 1 = 32 + 8 + 1 = 41;
    GPIO2_B2 = 2 * 32 + (B-A) * 8 + 2 = 32 + 8 + 1 = 74。

2、如何设置gpio

以imx6ull板子GPIO4_26为例:
32 * 3 + 26 = 122;

  • 1、创建gpio
    echo 122 > /sys/class/gpio/export
    如果成功了可以在/sys/class/gpio的目录下看见 gpio122
  • 2、设置gpio为输入还是输出,如果为输入使用权就不在我们这边,不能手动拉高拉低
    out —> 输出
    in -----> 输入 (这个状态一般是板子自己拉高拉低,我们只去读他的状态就可以了,不能去设置高低电平)
    echo out > /sys/class/gpio/gpio122/direction //输出
    echo in > /sys/class/gpio/gpio122/direction //输出
  • 3、设置gpio的高低电平
    0 —> 低电平
    1 —> 高电平
    echo 0 > /sys/class/gpio/gpio122/value //设置为低电平
    echo 1 > /sys/class/gpio/gpio122/value //设置为高电平
  • 4、如何看gpio状态是高电平还是低电平
    cat /sys/class/gpio/gpio122/value
  • 5、如何设置中断方式
    none表示引脚为输入,不是中断引脚
    rising —>上升沿触发
    falling —>下降沿触发
    both —> 边沿触发
    echo none > /sys/class/gpio/gpio122/edge //不是中断引脚
    echo rising > /sys/class/gpio/gpio122/edge //上升沿触发
    echo falling > /sys/class/gpio/gpio122/edge //下降沿触发
    echo both > /sys/class/gpio/gpio122/edge //边沿触发

3、linux应用程序控制gpio示例代码

注意用system的方式比较消耗资源,linux下一切皆文件,也可以用读写文件的方式,后面补充上来

//初始化gpio函数
void Init_Gpio(void)
{
    system("echo 1021 > /sys/class/gpio/export");  //创建gpio
    system("echo out > /sys/class/gpio/gpio1021/direction"); //设置gpio为输出 如果是in就是输入
    system("echo 0 > /sys/class/gpio/gio1021/value"); //设置gpio为低电平
 }
 
 //设置某一个gpio的状态函数
 int Set_Gpio_Value(int value, int gpio_num)
 {
    if(gpio_num < 0){
        return -1;
    }
    char buf[30] = {0};
    int ret = 0;
    FILE * fd;
    sprintf(buf, "/sys/class/gpio/gio%d/value",  gpio_num);
    fd = fopen(buf, "r+");
    if(fd < 0){
        return -1;
    }
    if(fwrite(&value, 1, 1, fd)< 0){
        return -1;
    }
    fclose(fd);
    return 0;
 }
 
 //读取gpio的值
 int Get_Gpio_Value(int gpio_num)
 {
    if(gpio_num < 0){
        return -1;
    }
    FILE *fd;
    int value = 0;
    char buf1[50] = {0};
    sprintf(buf1, "/sys/class/gpio/gpio%d/value", gpio_num);
    fd = fopen(buf1, "r");
    if(fd < 0){
        return -1;
    }
    char buf[10] = {0};
    if(fread(buf, 10, 1, fd) < 0){
        return -1;
    }
    value = atoi(buf);
    fclose(fd);
    return value;
 }
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值