Linux_kernel驱动之GPIO子系统

2023-05-16

前言:
gpio子系统的内容在drivers/gpio文件夹下,主要文件有:

  1. devres.c :devres.c是针对gpio api增加的devres机制的支持
  2. gpiolib.c :gpiolib.c是gpio子系统的核心实现
  3. gpiolib-of.c :gpiolib-of.c是对设备树的支持
  4. gpiolib-acpi.c :
  5. gpio-xxx.c :

目录:
一、驱动流程步骤+函数分析
二、驱动讲解
三、驱动伪代码实现
四、驱动思想分析
**

正文;

一、驱动流程步骤
GPIO子系统驱动流程分为以下几个步骤:
1、请求一个GPIO组
2、设置GPIO方向输出\输入
3、将GPIO通过System导出,应用层可以通过文件操作gpio
4、如果设置为输出模式(设置值),输入模式(获取值)
5、将GPIO转为对应的IRQ,然后注册改IRQ的中断handler
6、释放请求的一个或者一个组GPIO

二、函数分析;
a、申请一个GPIO组:

int gpio_request(unsigned gpio, const char *label):
参数1:gpio号
参数2:这个数据保留到pin数据结构们勇于debug
返回值:零正常,负数错误
经过拓展的函数:(gpio_request_one),(gpio_request_array)

b、释放一个GPIO组:

void gpio_free(unsigned gpio)
参数1:GPIO编号
返回值:无

c、配置GPIO对应的方向:
(设置输入方向函数)

int gpio_direction_input(unsigned gpio); 
参数1:GPIO口的编号
返回值:零正常,负数错误

(设置输出方向函数)

int gpio_direction_output(unsigned gpio, int value); 
参数1:GPIO口的编号
参数2:GPIO口默认端口输出0还是1
返回值:零正常,负数错误

d、 测试GPIO是否合法:

 int gpio_is_valid(int number)
参数;GPIO编号
返回值:零正常,负数错误

e、获取GPIO的引脚值或者设置GPIO引脚值
(输出状态)

 void gpio_set_value(unsigned gpio, int value); 
参数1:GPIO的编号
参数2:设置对应的输出值(0/1)
返回值:无

(输入状态)

  int gpio_get_value(unsigned gpio);
参数1:GPIO编号
返回值:对应的GPIO引脚状态(0/1),负数错误

f、获取对应引脚的GPIO编号

int gpio_to_irq(unsigned gpio); 
 参数1:GPIO编号
返回值:中断编号
拓展:将对应的中断编号给request_irq()函数进行注册,实现中断服务函数
释放对应的中断资源fee_irq(),两个函数的形参都必须要中断编号

g、将GPIO端口导出到用户空间、
(GPIO导入函数)

 int gpio_export(unsigned gpio, bool direction_may_change); 
参数1、GPIO编号
参数2、表示用户程序是否允许修改gpio的方向
假如可以则参数为为真:direction_may_change
拓展:分析这个函数的本身就是创建system(文件子系统),生成文件可以在以  	
            路径找到( /sys/class/gpio*  )
export/unexport文件
             gpioN指代具体的gpio引脚
             gpio_chipN指代gpio控制器

(撤销GPIO导入)

void gpio_unexport(unsigned gpio)
参数1:GPIO编号
返回值:无

驱动工程师需要实现的步骤
要注意的是对应的内核版本有没有对应的设备树。一般来说3.0一下版本的内核是没有带设备树
作为一种情况,在3.10以上的内核是带有对应的设备树所以要注意;帮助手册一般是(gpio.txt)

没有带设备树的
通过GPIO.h头文件就可以获取得到。

带设备树的
更新一下设备树:make ARCH=arm exynos4_defconfig
make ARCH=arm dtbs

一、首先需要去到对应芯片的设备树的下面添加一个设备树节点

led_noe{
gpiox_1_led = <&gpx1 0 0 >   
}
<&gpx1 0 0 >分析;
参数1:继承对应的GPIO
参数2:具体的GPIO号
参数3:默认的GPIO电平状态

首先在对应的设备树下做好一个节点:要注意的是这个节点是在设备树根目录下。

内核提供一个函数通过设备树给我们获取到对应的GPIO号:

static inline int of_get_named_gpio(struct device_node *np,
                           const char *propname, int index)
功能:解析设备树的中的GPIO
参数1:设备树节点结构体 通过of_find_node_by_path()函数获取得到
参数2:设备树的键值堆   gpiox_1_led
参数3:索引号		(led_noe第几个的GPIO   从0开始)
返回值:成功返回GPIO号   失败错误码

上面函数的参数1,作为一个结构体,是通过下面这个函数获取回来的。

struct device_node *of_find_node_by_path(const char *path)
参数1:节点路径    (  #define    "/led_node"   ) 
返回值:地址,错误为NULL

二、通过获取回来的GPIO号,然后进行一个检查是否合法

 int gpio_is_valid(int number)
三、设置GPIO的输入或者输出方向

i

nt gpio_direction_input(unsigned gpio); 或者是
       int gpio_direction_output(unsigned gpio, int value); 
四、可以获取GPIO的状态或者设置GPIO的状态
当输出的状态下可以读取或者设备GPIO的状态
 void gpio_set_value(unsigned gpio, int value); 
 int gpio_get_value(unsigned gpio);

或者当时输入方向的时候可以读取对应的GPIO引脚状态

 int gpio_get_value(unsigned gpio);

五、要在退出函数哪里将申请的这些资源都退出

void gpio_unexport(unsigned gpio)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux_kernel驱动之GPIO子系统 的相关文章

  • c++ socket简单封装

    简单封装 并不实际应用 框架图 Mysocket 主要是定义TCP和UDP的一些相同的操作 xff0c 需要的他们各自去实现 Mysocket h ifndef MYSOCKET H define MYSOCKET H class MySo
  • pixhawk2飞控接头型号

    BM04B GHS TBT BM05B GHS TBT BM06B GHS TBT
  • 多种视觉SLAM方案对比

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自 新机器视觉 在SLAM研究中 xff0c 我们通常需要在各数据集上测试各个方案的性能情况 如下主要对表1中6个视觉SLAM方
  • 激光雷达核心技术及行业格局梳理

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 引言 xff1a 车载摄像头是ADAS 的核心传感器 车载摄像头搭载颗数稳步提升 根据 Yole 数据 xff0c 2018 年全球平
  • 2 ROS1通讯编程基础(2)

    2 ROS1通讯编程基础 2 3 配置文件的解读2 3 1 CMakeList txt解读2 3 1 1 find package的配置2 3 1 2 messages services and actions的配置2 3 1 3 动态重配
  • Rviz 使用Arbotix控制机器人运动

    需求 控制机器人模型在 rviz 中做圆周运动 实现流程 安装 Arbotix创建新功能包 xff0c 准备机器人 urdf xacro 文件添加 Arbotix 配置文件编写 launch 文件配置 Arbotix启动 launch 文件
  • VINS问题整理

    VINS的初始化过程 xff1f 首先进行纯视觉SfM xff1a 把滑窗填满 xff0c 然后选择枢纽帧 xff08 和最后一帧有足够的视野重叠保证计算的位姿精度 xff0c 并且和最后一帧有足够的视差保证三角化地图点的精度 xff09
  • 两台ubuntu电脑如何搭建局域网以及通信

    两台ubuntu电脑如何搭建局域网以及通信 功能 xff1a 用自己的电脑代替设备中的电脑进行数据处理 xff0c 以及将最后的结果传给设备电脑 需要做的内容的 xff1a 首先用网线将自己的pc与设备连接起来 1 将自己的笔记本ip地址手
  • PC偏振控制器、锁模激光器技术、AOM声光调制器、相位噪声、锁相环、光耦合器类型

    1 PC 偏振控制器 xff08 1 xff09 什么叫做偏振光 xff1f polarized light 光是一种电磁波 xff0c 电磁波是横波 xff0c 它具有偏振性 xff0c 具有偏振性的光则称为偏振光 具体体现 xff1a
  • 小梅哥——38译码器

    三八译码器 xff0c 即是 3 种输入状态翻译成 8 种输出状态 真值表 代码展示 module decoder 3 8 a b c out input a 输入端口a input b 输入端口b input c 输入端口c output
  • 基本RS触发器(SR锁存器)

    一 前言 SR锁存器 Set Reset Latch 是静态存储单元当中最基本 xff0c 也是电路结构最简单的一种 xff0c 通常由两个或非门或者与非门组成 其中S表示Set xff0c R表示Reset 则S D称为置位端或置1输入端
  • 01-RTOS

    对于裸机而言 xff0c 对于RTOS而言 即 xff1a 对于裸机 xff0c 打游戏意味着不能回消息 回消息意味着不能打游戏 对于RTOS 打游戏和裸机的切换只需要一个时间片节拍 1ms 从宏观来看 就是同时进行的两件事 xff08 但
  • uORB笔记

    不同的类调用同一函数orb subscribe ORB ID vehicle gps position xff0c 来订阅GPS信息是 xff0c 该函数返回的值不同 xff0c 也就是说每个订阅者针对同一主题 xff0c 在调用函数orb
  • STM32 SystemInit()函数学习总结

    拿到程序后如何看系统时钟 xff1f User文件夹 system stm32f4xx程序 xff0c 先找systemcoreclock 系统时钟 xff09 但是这里这么多个系统时钟应该如何选择 点击魔法棒 xff0c 然后点击C C
  • FPGA IP核之PLL四种输出模式的理解

    一 源同步模式 使得进入管脚时的数据和上升沿的相位关系与到达芯片内部第一级寄存器时数据和上升沿的相位关系保持不变 xff08 通过调整内部的布局布线延时做到的 xff0c 用于数据接口 xff0c 特别是高速的情况下 xff09 详细理解
  • FPGA_边沿监测理解

    一 简易频率计设计中为什么一定要获取下降沿 gate a 实际闸门信号 gate a stand 将实际闸门信号打一拍之后的信号 gate a fall s 下降沿标志信号 cnt clk stand Y值 xff0c 即在实际闸门信号下
  • HAL库 STM32 串口通信

    一 实验条件 将STM32的PA9复用为串口1的TX xff0c PA10复用为串口1的RX STM32芯片的输出TX和接收RX与CH340的接收RX和发送TX相连 xff08 收发交叉且PCB上默认没有相连 xff0c 所以需要用P3跳线
  • 全局变量和局部变量

    一 C语言由四种地方可以定义变量 在函数外部定义的是全局变量 xff08 这里的函数包括main函数 xff09 在头文件中定义的是全局变量 在函数或语句块内部定义的是局部变量 函数的参数是该函数的局部变量 全局变量 xff0c 在定义位置
  • 单片机中断

    蓝桥杯单片机之中断 1 中断含义及过程 中断是指CPU在处理A事情时 xff0c 发现B请求CPU立刻去处理 xff08 中断发生 xff09 xff0c 于是CPU去处理B xff08 中断服务 xff09 xff0c 处理完B后又再次回
  • AprilTag的使用、相关问题及解决方法

    使用棋盘格标定相机 安装标定功能包 span class token function sudo span span class token function apt get span span class token function i

随机推荐

  • 对接海康综合安防管理平台经验总结

    前言 xff1a 因业务需要对接海康威视的综合安防管理平台获得下属所管理的摄像头 xff0c 根据摄像头code获得监控视频流信息 1 详情可以浏览海康开放平台 xff0c 在官网上有对应的接入指南以及开放的API接口 前提是本地已部署了海
  • 【环境配置】Visual Studio opencv配置

    需求 在Visual Studio环境中编写C 43 43 代码 xff0c 同时可以调用OpenCV的相关代码 1 安装OpenCV 访问 opencv 官网下载对应平台的库文件 注意 xff1a Visual Studio和OpenCV
  • MySQL常见用法

    文章目录 一 时间类1 1 DATE SUB 函数1 2 NOW CURDATE CURTIME DATE 函数1 3 实战 二 统计类三 字符类3 1 LOCATE 函数3 2 concat 函数3 3 concat ws 函数3 4 g
  • 牢记公式,ardupilot EKF2就是纸老虎(四)!

    版权声明 xff1a 本文为博主原创文章 xff0c 转载请附上博文链接 xff01 四 一睹EKF2芳容 因为篇幅过长 xff0c 写的一些公式会乱码 xff0c 没办法只能把 牢记公式 xff0c ardupilot EKF2就是纸老虎
  • Java Optional使用

    文章目录 Optional一 Optional 简介二 创建 Optional 实例2 1 empty 方法2 2 of 方法2 3 ofNullable 方法 三 Optional的使用3 1 访问 Optional 对象的值3 1 1
  • 正则表达式:基础详解以及在Java中的使用

    文章目录 一 正则表达式1 1 正则表达式中的特殊字符1 2 正则表达式所支持的合法字符1 3 方括号表达式1 4 边界匹配符1 5 三种模式的数量表示符 二 应用2 1 String 类2 2 Pattern 类和 Matcher 类 一
  • Python学习:关键字global和nonlocal的用法说明

    一 global global关键字用来在函数或其他局部作用域中使用全局变量 1 1 如果局部要对全局变量修改 xff0c 而不使用global关键字 count 61 0 def global test count 43 61 1 pri
  • Python:flask框架下前后端的数据交互

    文章目录 前提 一 前端发送数据 xff0c 后端接受数据1 1 路由传参数 数据 1 2 表单提交 二 后端发送数据 xff0c 前端接受数据 前提 后端 xff1a python 的 flask 框架 前端 xff1a html css
  • Python关于None的报错:'NoneType' object is not iterable和cannot unpack non-iterable NoneType object

    文章目录 一 TypeError 39 NoneType 39 object is not iterable xff08 类型错误 xff1a 39 NoneType 39 对象不是可迭代的 xff09 二 TypeError cannot
  • Git:合并分支----git merge命令应用的三种情景

    文章目录 一 git merge 命令应用的三种情景1 1 快进 无冲突 1 2 非 快进 xff0c 修改不同文件 无冲突 1 3 非 快进 xff0c 修改相同文件 有冲突 一 git merge 命令应用的三种情景 1 1 快进 无冲
  • Git:远程分支----git fetch命令的使用

    git fetch 命令的使用 从远程主机克隆 Git 的 clone 命令会为你自动将远程主机命名为 origin xff0c 拉取它的所有数据 xff0c 创建一个指向它的 master 分支的指针 xff0c 并且在本地将其命名为 o
  • Git:移除文件----git rm命令的使用

    文章目录 一 git rm 命令使用1 1 rm 命令1 2 git rm 命令1 3 git rm f 命令1 4 git rm cached 命令 一 git rm 命令使用 Git 本地数据管理 xff0c 大概可以分为三个区 xff
  • 【OpenMv小车】OpenMv追小球的小车之pid调用

    pid py gt gt https github com wagnerc4 flight controller blob master pid py openmv 官网 xff1a http book openmv cc project
  • 【深入理解C++】函数模板作为成员函数

    文章目录 1 普通类的成员函数模板2 类模板的成员函数模板 1 普通类的成员函数模板 不管是普通类还是类模板 xff0c 它们的成员函数都可以是函数模板 xff0c 称为成员函数模板 xff0c 但不可以是虚函数 xff0c 否则编译器报错
  • QGroundControl开发之使用自定义mavlink

    工具 对QGC进行二次开发时 xff0c 常常会遇到想使用自定义mavlink的情况 xff0c 但不像APM那样编译命令会根据xml文件自动生成mavlink协议 QGC似乎不能自动生成mavlink协议 xff08 之前试过似乎不能自动
  • 字符串连接 (c语言)

    题目描述 将给定的字符串连接起来 书中的算法描述如下 xff1a 图 xff1a 字符串连接算法 输入描述 三对字符串 xff0c 每对字符串占一行 xff0c 用空格隔开 每个字符串只包含数字和英文字母大小写且长度不超过100 输出描述
  • STM32—UART中断收发 Day4

    软件 xff1a STM32CubeMX xff0c MDK ARM 硬件 xff1a 蓝桥杯物联网Lora开发板 xff0c 板载芯片STM32L071 一 STM32CubeMX配置 1 先在连接 xff08 Connectivity
  • 虚拟机出现command XXX is available in /bin/ls问题

    问题 xff1a 使用本地的shell命令时候 The command could not be located because 39 usr bin bin 39 is not included in the PATH environme
  • 全志lichee的pack命令

    全志lichee目录打包命令流程 pack 将打包命令传进去build sh脚本里面 查看buildsh里面的脚本命令 其实里面的脚本还是较为简单地的 xff0c 仅仅是作为一个过渡 xff0c 然后就跑进去buildroot script
  • Linux_kernel驱动之GPIO子系统

    前言 xff1a gpio子系统的内容在drivers gpio文件夹下 xff0c 主要文件有 xff1a devres c xff1a devres c是针对gpio api增加的devres机制的支持gpiolib c xff1a g