【linux】gpio子系统
前言
- 目前不涉及驱动源码
- 参考链接
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,则不仅设置为输出,还同时设置了输出电平(本小点要了解当前内核是否支持)
- gpio端口的方向,内容可以是 in 或者 out
- value
- gpio引脚的电平
- 0:低电平
- 非0:高电平(高电平建议使用 1)
- 如果配置为输入,则该文件可写
- 如果配置为中断,则可以调用poll(2)函数监听该中断,中断触发后poll(2)函数就会返回。
- gpio引脚的电平
- edge
- 中断的触发方式,该文件有4个值
- none:输入,非中断
- rising:中断输入,上升沿触发
- falling:中断输入,下降沿触发
- both:中断输入,边沿触发
- 中断的触发方式,该文件有4个值
- active_low
- direction
- 例子:N = index = GPIO1_19 = (1-1)*32 +19 = 19
GPIO控制器(“gpio_chip”instances)(此处没有体现)。
- gpio子系统与led子系统是不同,但是类似
- led只能输出,gpio能输出也能输入
- gpio输入还支持中断功能
- 使用gpio前,需要从内核空间暴露到用户空间
- led只能输出,gpio能输出也能输入
- 注意
- 在用户空间控制使用gpio时,注意不要滥用和内核一些绑定好、已经有合适内核启动的引脚冲突。
- 参考 Documentation/driver-api/gpio/drivers-on-gpio.rst
- 在用户空间控制使用gpio时,注意不要滥用和内核一些绑定好、已经有合适内核启动的引脚冲突。
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子系统的更多相关文章
- Linux GPIO子系统
一 概述 Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0-MAX_INT之间的整数 ...
- Linux内核驱动之GPIO子系统API接口概述
1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...
- linux输入子系统(input subsystem)之evdev.c事件处理过程
1.代码 input_subsys.drv.c 在linux输入子系统(input subsystem)之按键输入和LED控制的基础上有小改动,input_subsys_test.c不变. input ...
- 【转】 linux iio子系统
原文网址:http://blog.csdn.net/tsy20100200/article/details/47101661 最近由于工作的需要,接触了Linux iio子系统,对于这个目录其实以前是 ...
- Linux中断子系统:级联中断控制器驱动
Linux中断子系统 Linux中断子系统是个很大的话题,如下面的思维导图所示,包含硬件.驱动.中断上半部.中断下半部等等.本文着眼于中断控制器(PIC),特别是级联中断控制器驱动部分,对驱动的设计和 ...
- linux iio子系统
//============================================================================\\ || 系 统:W ...
- Linux 输入子系统驱动程序范例
<按键驱动程序> #include <stdio.h> #include <fcntl.h> #include <linux/input.h> #inc ...
- linux输入子系统
linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(InputCore)和输入子系统设备驱 ...
- Linux 输入子系统 input
一.输入子系统 针对输入设备设计:触摸屏.键盘.按键.传感器.鼠标...... 二.每种设备都属于字符设备驱动,程序的写法步骤也相同 1.实现入口函数 xxx_init() 和卸载函数 xxx_exi ...
随机推荐
- xuexi
1.内存的编址方法就是内存地址与内存单元格一一对应且永久绑定.计算机的cpu只认识内存地址,不关心内存单元格的位置和内容.通过硬件的设计来达到通过内存地址找到内存单元格. 2.内存的编址是以字节为单位 ...
- Martyr2项目实现——Number部分的问题求解 (1) Find Pi to Nth Digit
Martyr2项目实现--Number部分的问题求解 (1) Find Pi to Nth Digit Find Pi to Nth Digit 问题描述: Find PI to the Nth Di ...
- post 和php://input 转
$_POST['paramName'] 获取通过表单(multipart/form-data)提交的数据.但有时客户端会直接将请求数据以字符串的形式都放到 body 里传递过来,那么服务端就需要使用 ...
- spring boot:使用spring cache+caffeine做进程内缓存(本地缓存)(spring boot 2.3.1)
一,为什么要使用caffeine做本地缓存? 1,spring boot默认集成的进程内缓存在1.x时代是guava cache 在2.x时代更新成了caffeine, 功能上差别不大,但后者在性能上 ...
- spring boot:redis+lua实现生产环境中可用的秒杀功能(spring boot 2.2.0)
一,秒杀需要具备的功能: 秒杀通常是电商中用到的吸引流量的促销活动方式 搭建秒杀系统,需要具备以下几点: 1,限制每个用户购买的商品数量,(秒杀价格为吸引流量一般会订的很低,不能让一个用户全部抢购到手 ...
- jmeter环境变量配置
参考博客:超全 https://blog.csdn.net/qq_39720249/article/details/80721777
- App在后台运行时如何保存数据到sqlite数据库
iOS程序进入后台后,是不允许读写任何文件和数据库(sqlite),但是允许读写NSUserDefault中的数据. 因此在后台时如果想存储数据,则可使用NSUserDefault(偏好设置)临时保存 ...
- 树和堆(julyedu网课整理)
date: 2018-12-05 16:59:15 updated: 2018-12-05 16:59:15 树和堆(julyedu网课整理) 1 定义 1.1 树的定义 它是由n(n>=1)个 ...
- D. Regular Bridge 解析(思維、圖論)
Codeforce 550 D. Regular Bridge 解析(思維.圖論) 今天我們來看看CF550D 題目連結 題目 給你一個\(k\le100\),請構造出一個至少有一個Bridge的,每 ...
- PHP定界符的用法
当面临大段的负责的文本输入的时候,建议使用定界符. 例如: $age = 28; $str = <<<cont 第一行数据 第二行数据 特殊字符 ' " asdf abc ...