前言

linux子系统

  • 在 Linux 系统中

    • 绝大多数硬件设备都有非常成熟的驱动框架
    • 驱动工程师使用这些框架添加与板子相关的硬件支持
      • 建立硬件与Linux内核的联系
    • 内核再通过统一文件系统接口呈现给用户
    • 用户通过对应的设备文件控制硬件。

gpio子系统

  • gpio子系统相关描述可在内核源码 Documentation/gpio 了解。

    • 但是新版本(linux4.19左右)不再维护这个路径的ABI
    • ABI文档已经移动到 Documentation/ABI/obsolete/sysfs-gpio
  • gpio子系统 ,在目录 /sys/class/gpio 下展示该子系统设备。
    • export 和 unexport:把某个GPIO导出用户空间和取消导出用户空间

      • echo 19 > export

        • 就把gpio19导出到用户空间
    • gpioN:GPIOs 本身,N为索引号,根据不同的开发芯片而有不同的计算

      • 例子:N = index = GPIO1_19 = (1-1)*32 +19 = 19

        • 一组端口有 32 个gpio
      • 该目录下有三个属性文件
        • direction

          • gpio端口的方向,内容可以是 in 或者 out

            • 读取
            • 写入
              • 例子:echo out > /sys/class/gpio/gpio19/direction
          • 如果写入 low 或者 hight,则不仅设置为输出,还同时设置了输出电平(本小点要了解当前内核是否支持
        • value
          • gpio引脚的电平

            • 0:低电平
            • 非0:高电平(高电平建议使用 1
          • 如果配置为输入,则该文件可写
          • 如果配置为中断,则可以调用poll(2)函数监听该中断,中断触发后poll(2)函数就会返回。
        • edge
          • 中断的触发方式,该文件有4个值

            • none:输入,非中断
            • rising:中断输入,上升沿触发
            • falling:中断输入,下降沿触发
            • both:中断输入,边沿触发
        • active_low
    • GPIO控制器(“gpio_chip”instances)(此处没有体现)。

  • gpio子系统与led子系统是不同,但是类似
    • led只能输出,gpio能输出也能输入

      • gpio输入还支持中断功能
    • 使用gpio前,需要从内核空间暴露到用户空间
  • 注意
    • 在用户空间控制使用gpio时,注意不要滥用和内核一些绑定好、已经有合适内核启动的引脚冲突。

      • 参考 Documentation/driver-api/gpio/drivers-on-gpio.rst

gpio子系统实战-系统调用

  • 源码简单,下面贴出野火的源码仅做参考
  • main.c
/** @file         main.c
* @brief 简要说明
* @details 详细说明
* @author
* @date 2020-11-11 19:18:20
* @version v1.0
* @copyright Copyright By , All Rights Reserved
*
**********************************************************
* @LOG 修改日志:
**********************************************************
*/ #include <stdio.h>
#include <unistd.h>
#include "bsp_beep.h" /**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(int argc, char *argv[])
{
char buf[10];
int res;
printf("This is the beep demo\n"); res = beep_init();
if(res){
printf("beep init error,code = %d",res);
return 0;
} while(1){
printf("Please input the value : 0--off 1--on q--exit\n");
scanf("%10s", buf); switch (buf[0]){
case '0':
beep_off();
break; case '1':
beep_on();
break; case 'q':
beep_deinit();
printf("Exit\n");
return 0; default:
break;
}
}
}
  • bsp_beep.c
/** @file         bsp_beep.c
* @brief 简要说明
* @details 详细说明
* @author
* @date 2020-11-11 13:57:52
* @version v1.0
* @copyright Copyright By , All Rights Reserved
*
**********************************************************
* @LOG 修改日志:
**********************************************************
*/ #include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include "bsp_beep.h" int beep_init(void)
{
int fd;
fd = open("/sys/class/gpio/export",O_WRONLY);
if(fd < 0)
{
return 1;
}
write(fd, BEEP_GPIO_INDEX, strlen(BEEP_GPIO_INDEX));
close(fd);
//direction config
fd = open("/sys/class/gpio/gpio" BEEP_GPIO_INDEX "/direction", 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_GPIO_INDEX, strlen(BEEP_GPIO_INDEX));
close(fd); return 0;
} int beep_on(void)
{
int fd; fd = open("/sys/class/gpio/gpio" BEEP_GPIO_INDEX "/value", O_WRONLY);
if(fd < 0)
return 1; write(fd, "1", 1);
close(fd); return 0;
} int beep_off(void)
{
int fd; fd = open("/sys/class/gpio/gpio" BEEP_GPIO_INDEX "/value", O_WRONLY);
if(fd < 0)
return 1; write(fd, "0", 1);
close(fd); return 0;
}
  • bsp_beep.h
/** @file         bsp_beep.h
* @brief 简要说明
* @details 详细说明
* @author
* @date 2020-11-11 19:13:47
* @version v1.0
* @copyright Copyright By , All Rights Reserved
*
**********************************************************
* @LOG 修改日志:
**********************************************************
*/ #ifndef __bsp_beep__
#define __bsp_beep__
//蜂鸣器的GPIO引脚号
//imx6的计算方式,GPIOn_IOx = (n-1)*32 + x
//如GPIO1_IO19 = (1-1)*32 + 19 = 19
#define BEEP_GPIO_INDEX "19"
/**
* @brief 初始化蜂鸣器gpio相关
* @return
* @arg 0,正常
* @arg 1,export文件打开错误
* @arg 2,direction文件打开错误
*/
extern int beep_init(void);
/**
* @brief 关闭蜂鸣器gpio的export输出
* @return 0正常,非0,value文件打开错误
*/
extern int beep_deinit(void);
/**
* @brief 蜂鸣器响
* @return 0正常,非0,value文件打开错误
*/
extern int beep_on(void);
/**
* @brief 关闭蜂鸣器gpio的export输出
* @return 0正常,非0,unexport文件打开错误
*/
extern int beep_off(void);
#endif /* Head define end*/

【linux】gpio子系统的更多相关文章

  1. Linux GPIO子系统

    一 概述 Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0-MAX_INT之间的整数 ...

  2. Linux内核驱动之GPIO子系统API接口概述

    1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...

  3. linux输入子系统(input subsystem)之evdev.c事件处理过程

    1.代码 input_subsys.drv.c 在linux输入子系统(input subsystem)之按键输入和LED控制的基础上有小改动,input_subsys_test.c不变. input ...

  4. 【转】 linux iio子系统

    原文网址:http://blog.csdn.net/tsy20100200/article/details/47101661 最近由于工作的需要,接触了Linux iio子系统,对于这个目录其实以前是 ...

  5. Linux中断子系统:级联中断控制器驱动

    Linux中断子系统 Linux中断子系统是个很大的话题,如下面的思维导图所示,包含硬件.驱动.中断上半部.中断下半部等等.本文着眼于中断控制器(PIC),特别是级联中断控制器驱动部分,对驱动的设计和 ...

  6. linux iio子系统

    //============================================================================\\ || 系            统:W ...

  7. Linux 输入子系统驱动程序范例

    <按键驱动程序> #include <stdio.h> #include <fcntl.h> #include <linux/input.h> #inc ...

  8. linux输入子系统

    linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(InputCore)和输入子系统设备驱 ...

  9. Linux 输入子系统 input

    一.输入子系统 针对输入设备设计:触摸屏.键盘.按键.传感器.鼠标...... 二.每种设备都属于字符设备驱动,程序的写法步骤也相同 1.实现入口函数 xxx_init() 和卸载函数 xxx_exi ...

随机推荐

  1. docker启动服务---------------rabbitmq

    1.进入docker hub镜像仓库地址:https://hub.docker.com/ 2.搜索rabbitMq,进入官方的镜像,可以看到以下几种类型的镜像:我们选择带有"mangemen ...

  2. 这玩意比ThreadLocal叼多了,吓得why哥赶紧分享出来。

    这是why哥的第 70 篇原创文章 从Dubbo的一次提交开始 故事得从前段时间翻阅 Dubbo 源码时,看到的一段代码讲起. 这段代码就是这个: org.apache.dubbo.rpc.RpcCo ...

  3. Hadoop框架:DataNode工作机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.工作机制 1.基础描述 DataNode上数据块以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是数据块元数据包括长度.校验.时 ...

  4. Spring Boot与多数据源那点事儿~

    持续原创输出,点击上方蓝字关注我 目录 前言 写这篇文章的目的 什么是多数据源? 何时用到多数据源? 整合单一的数据源 整合Mybatis 多数据源如何整合? 什么是动态数据源? 数据源切换如何保证线 ...

  5. zookeeper在Dubbo中角色与作用

    作者:倪炜链接:http://www.zhihu.com/question/25070185/answer/86166486来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...

  6. 【转】Liunx常用命令详解

    Liuux命令查询入口 Linux命令 - 系统信息 命令代码 注释说明 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 ...

  7. GoSDK的安装及环境变量配置 入门详解 - 精简归纳

    GoSDK的安装及环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 29 转载请注明出处!️ 目录 GoSDK的安装及环境变量配置 入门详解 - 精简归纳 一.进入G ...

  8. 设计模式 | 职责链模式(Chain of responsibility)

    定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 结构:(书中图,侵删) 一个抽象的处理者 若干 ...

  9. ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal

    前言 首先我们来看一下在ASP.NET时代,Authentication是如何使用的.下面介绍的是System.Web.Security.FormsAuthentication: // 登录 Syst ...

  10. PLC模拟量采集模块分辨率是什么意思?

    14位分辨率的模块(mo kuai)和16位分辨率的模块有什么不同的地方? 14位的模块最高位是符号位,我们用S表示符号位,那么这个模块的数值范围(fàn wéi)就是S111 1111 1111 1 ...