IMX6ULL|libgpiod控制IO

这篇具有很好参考价值的文章主要介绍了IMX6ULL|libgpiod控制IO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.为何使用libgpiod控制IO

在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。

二.如何安装libgpiod控制IO

libgpiod是一种字符设备接口,GPIO访问控制是通过操作字符设备文件(比如 /dev/gpiodchip0 )实现的, 并通过libgpiod提供一些命令工具、c库以及python封装。

想要使用libgpiod,需要在开发板上安装libgpiod库。

 #安装libgpiod库及头文件
 sudo apt install  libgpiod-dev vim

 #安装gpiod 命令行工具
 sudo apt install gpiod

三.命令行控制

常用的命令行如下,可使用 -h 查看命令相对应的使用说明

命令 作用 使用举例
gpiodetect 列出所有的 GPIO 控制器 gpiodetect
gpioinfo 列出 GPIO 控制器的引脚情况 gpioinfo 4
gpioset 设置 GPIO 引脚的状态 gpioset 4 19=0
gpioget 获取 GPIO 引脚状态 gpioget 4 1
gpiomon 监控 GPIO 引脚状态并整理成表格 gpiomon 4 1

查看数据手册可知在imx6ull中GPIO组的编号从1开始,而libgpiod引脚组从0开始, 因此 gpioset 4 19=0
,则表示的是GPIO5组编号为19的引脚。 并不是所有的引脚都能够使用libgpiod控制,例如led之类的一些已经被使用的引脚。

四.使用libgpiod编程

若想要在PC上交叉编译出能运行在板子的应用程序,交叉链接时使用的libgpiod库要与开发板的匹配, 可以直接把开发板的库拷贝到PC上链接使用。

开发板安装好ligpiod-dev后,可以通过以下命令找到具体的头文件和库文件:

 # 在开发板上查找libgpiod库
 dpkg -L libgpiod-dev
 # 以下是输出
 /usr/include/gpiod.h
 /usr/lib/arm-linux-gnueabihf/libgpiod.a
 /usr/lib/arm-linux-gnueabihf/libgpiod.so

查找结果中的gpiod.h、libgpiod.so和libgpiod.a就是开发板使用的头文件、动态和静态链接库, 它是debian 10 buster默认apt安装的版本。

常用的libgpiod API(C库)如下所示:

//成员变量
 struct gpiod_chip;      //GPIO组句柄
 struct gpiod_line;      //GPIO引脚句柄

 //获取GPIO控制器(GPIO组)
 struct gpiod_chip *gpiod_chip_open(const char *path);

 //获取GPIO引脚
 struct gpiod_line * gpiod_chip_get_line(struct gpiod_chip *chip, unsigned int offset);

 //设置引脚方向为输入模式
 int gpiod_line_request_input(struct gpiod_line *line,const char *consumer);

 //设置引脚为输出模式
 int gpiod_line_request_output(struct gpiod_line *line,const char *consumer, int default_val)

 //设置引脚的高低电平
 int gpiod_line_set_value(struct gpiod_line *line, int value);

 //读取引脚状态
 int gpiod_line_get_value(struct gpiod_line *line);

 //释放GPIO引脚
 void gpiod_line_release(struct gpiod_line *line);

 //关闭GPIO组句柄并释放所有分配的资源。
 void gpiod_chip_close(struct gpiod_chip *chip);

#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

/*
 //获取GPIO控制器(GPIO组)
 struct gpiod_chip *gpiod_chip_open(const char *path);

 //获取GPIO引脚
 struct gpiod_line * gpiod_chip_get_line(struct gpiod_chip *chip, unsigned int offset);

 //设置引脚方向为输入模式
 int gpiod_line_request_input(struct gpiod_line *line,const char *consumer);

 int= gpiod_line_request_output(line,"beep",0);   //设置为输出模式,且为低电平,
 //读取引脚状态
 int gpiod_line_get_value(struct gpiod_line *line);



 //释放GPIO引脚
 void gpiod_line_release(struct gpiod_line *line);

 //关闭GPIO组句柄并释放所有分配的资源。
 void gpiod_chip_close(struct gpiod_chip *chip);



 */

int main(int argc, char **argv)
{
    int i;
    int ret;

    struct gpiod_chip * chip;      //GPIO控制器句柄
    struct gpiod_line * line;      //GPIO引脚句柄


    /*获取GPIO控制器*/
    chip = gpiod_chip_open("/dev/gpiochip0");  //第一组
    if(chip == NULL)
    {
        printf("gpiod_chip_open error\n");
        return -1;
    }

    /*获取GPIO引脚*/
    line = gpiod_chip_get_line(chip, 19);  //第一组的19号引脚
    if(line == NULL)
    {
        printf("gpiod_chip_get_line error\n");
        goto release_line; 
    }

    /*设置GPIO为输出模式*/
    ret = gpiod_line_request_output(line,"beep",0);   //设置为输出模式,且为低电平,
    if(ret < 0)
    {
        printf("gpiod_line_request_output error\n");
        goto release_chip; 
    }

    for(i = 0;i<10;i++)
    {
        gpiod_line_set_value(line,1);
        usleep(500000);  //延时0.5s
        gpiod_line_set_value(line,0);
        usleep(500000);
    }

    
release_line:  
    /*释放GPIO引脚*/
    gpiod_line_release(line);

release_chip:
    /*释放GPIO控制器*/
    gpiod_chip_close(chip);


    return 0;
}


编译程序时需指定libgpiod库及路径头文件路径(不使用交叉编译时并不需要指定路径)。

然后我们在开发板上执行方式一文章来源地址https://www.toymoban.com/news/detail-823928.html


 sudo arm-linux-gnueabihf-gcc  beep.c  -lgpiod -L./libgpiod/ -I./libgpiod/ -o beep
 sudo chmod 777 beep
 ./beep

到了这里,关于IMX6ULL|libgpiod控制IO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

    IMX6ULL一共有两个ADC,每个ADC都有八个通道,但他们共用一个ADC控制器 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 注意 num-channels = 2; ,这个表示指定使用ADC1的两个通道,即通道1和通道2 如果你要使用多个ADC通道,修改这个值即可 配置ADC引脚的 pinctrl ,在自己的

    2024年02月12日
    浏览(39)
  • 【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

    经过以下四个步骤,终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 一、获取内核、编译内核 二、创建vscode工作区,添加内核目录和个人目录 三、了解驱动程序编写

    2024年02月06日
    浏览(37)
  • 基于IMX6ULL的智能车载终端项目(代码开源)_imx6ull 开源 linux 项目 车载终端

    1.4 车载终端:杂项功能 车载终端是一个非常复杂且常用的装置,随着电车与自动驾驶技术的不断升级迭代,需求也与日俱增!我们往往需要在终端上附加许许多多其他的功能,比如:智能家居联动、车内环境监测、天气预报与网上浏览等! 作者强调:考虑到篇幅有限,作者

    2024年04月08日
    浏览(38)
  • 【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

    发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的 sleep 被驱动层的 kill_fasync 打断,所以sleep没有执行完就重新进入下一次循环了 修改代码后解决该问题 解决逻辑就

    2024年02月13日
    浏览(36)
  • IMX6ull SPI 协议

    1.1 SPI SPI 全称是 Serial Perripheral Interface,也就是 串行外围设备接口 。 SPI 是 Motorola 公司推出的一种同步串行接口 技术,是一种高速、 全双工的同步通信总线 , SPI 时钟频率相比 I2C 要高很多,最高可以工作 在 上百 MH z。 SPI 以主从方式工作,通常是有一个主设备和一个或多

    2024年02月12日
    浏览(31)
  • 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)

    为什么要设置IMX6ULL与虚拟机通信? 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段,可以互ping后,可以参考这篇博客,实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 一、设置windows有线网卡 二、配置虚拟机双网卡(原本有一个NAT网卡

    2024年02月07日
    浏览(37)
  • [imx6ull]SPI接口编程-回环测试

    SPI 是串行外设接口( Serial Peripheral Interface )的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。SPI通常由一个主设备和一个或多个从设备组成。主设备选择一个从设备进行同步通信,以完成数据的交换。SPI通信采用环形结构,至少

    2024年02月12日
    浏览(25)
  • [imx6ull]开发板多种连网方式精讲

    在使用IGKBoard开发板时,因为没有网络,所以交叉编译遇到了困难,于是我研究了两种IGKBoard的连网方式,因为我们的IGKBoard有两个以太网接口,并且有一个板载RealTek WiFi模块,分别可以通过网线让IGKBoard开发板连上网,也可以通过WiFi让开发板连接上网,下面就让我来对这两种

    2024年02月16日
    浏览(31)
  • IMX6ULL 自学笔记(Makefile 以及 系统移植)

    1、语法 目标…… : 依赖文件集合…… 命令 1 命令 2 …… 例子: 生成main可执行文件需要main.o input.o calcu.o,命令是gcc -o main main.o input.o calcu.o 2、变量 Makefile中的变量只能是字符串 例 :将object赋值 main.o input.o calcu.o,变量引用的时候要加$() 3、几种赋值运算符 “=” :不一定要

    2024年02月11日
    浏览(44)
  • [imx6ull]Linux下TTY-串口编程

    TTY 是Teletype或Teletypewriter的缩写,原来是指电传打字机,在以前计算机体积很大,所以用teletype这个设备来连接到计算机,后来这种设备键盘显示器取代,但是他们都作为计算机的终端设备所存在,所以TTY沿用至今,用来泛指计算机的终端设备,它作为一个子系统既支持串口,

    2023年04月08日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包