当前位置: 首页 > web >正文

驱动开发学习20250529

引脚控制和GPIO子系统

引脚:元件的引出线
引脚多路复用:引脚工作模式的选择机制
引脚控制器:负责引脚工作模式的选择

引脚控制子系统功能:

  • 引脚复用:使同一引脚能构重用于不同的目的。多路复用会影响引脚组或单个引脚
  • 引脚配置:应用引脚的电气特性,如上拉、下拉、驱动强度、去抖间隔等

pinctrl和设备树

pinctrl只是收集引脚的方式,并将它们传递给驱动程序。引脚控制器驱动程序负责解析DT中的引脚描述,并将其配置应用到芯片中。
驱动程序通常需要一组两个嵌套节点来描述引脚组配置,
第一个节点描述组的功能,第二个节点用于保存引脚配置

  • pinctrl- :提供设备某种状态所需的pinctrl配置列表。它是phandle列表,指向引脚配置节点。
  • pinctrl-name:为列表中的每个状态提供名称

GPIO子系统

在驱动程序内使用GPIO之前,应先向内核声明它,以获取GPIO所有权,防止其他驱动程序访问相同的GPIO。
获取GPIO所有权后,可以进行如下操作:

  • 设置方向
  • 如果用作输出,则切换其输出状态(线路驱动到高电平或低电平)
  • 如果用作输入,则设置去抖间隔,并读取状态。对于映射到IRQ的GPIO线,则可以定义触发中断的边沿或电平,注册中断发生时要运行的处理程序
    内核中的GPIO处理方式:
    旧:建议弃用基于整数的接口,GPIO由整数表示
    新:推荐使用基于描述符的接口,GPIO由不透明结构表示和描述,具有专用API

基于整数的GPIO接口

头文件:# include <linux/gpio.h>

  1. 声明和配置GPIO:
    static int gpio_request(unsigned gpio, const char *label);

gpio表示gpio号,label是内核用来表示sysfs中GPIO的标签
必须检查该函数的返回值,0代表成功,出错时返回错误代码。
使用GPIO后,应该使用gpio_free()函数释放它
void gpio_free(unsigned int gpio);
static bool gpio_is_valid(int number);//在分配GPIO编号之前检查此编号在系统上是否有效
配置GPIO的输出和输入方向:

static int gpio_direction_input(unsigned gpio);
static int gpio_direction_output(unsigned gpio, int value);

当将GPIO配置为输出时,还有value需要配置,即输出方向有效时GPIO应处的状态。
返回值为0或负的错误码
更改GPIO去抖间隔函数:
static int gpio_set_debounce(unsigned gpio, unsigned debounce);
debounce是以毫秒为单位的去抖时间

  1. 访问GPIO——获取、设置值
  • 在原子上下文内
static int gpio_get_value(unsigned gpio);//GPIO方向为输入时
void gpio_set_value(unsigned int gpio, int value);//GPIO方向为输出时
  • 在非原子上下文内
static int gpio_get_value_cansleep(unsigned gpio);
void gpio_get_value_cansleep(unsigned gpio, int value);
  1. 映射到IRQ的GPIO
    输入GPIO可以做IRQ信号。这种IRQ信号可以是边沿触发或电平触发。
    GPIO控制器负责提供GPIO和IRQ之间的映射。
    int gpio_to_irq(unsigned gpio); //返回值为IRQ号
http://www.xdnf.cn/news/9846.html

相关文章:

  • 贝锐蒲公英工业路由器R300A海外版:支持多国4G频段,全球组网
  • 在Spring Cloud中将Redis共用到Common模块
  • ES中must与filter的区别
  • π0-通用VLA模型-2024.11.13-开源
  • 本地部署大模型llm+RAG向量检索问答系统 deepseek chatgpt
  • linux创建虚拟网卡和配置多ip
  • 【NATURE氮化镓】GaN超晶格多沟道场效应晶体管的“闩锁效应”
  • 关于无法下载Qt离线安装包的说明
  • 《胜算》
  • 力扣每日一题——连接两棵树后最大目标节点数目 ||
  • Relooking:损失权重λ 、梯度权重α、学习率η
  • python + vscode 开发环境搭建
  • [探讨] 如何做好技术文档
  • sourcetree无法获取远程所有的tag
  • C++模板类深度解析与气象领域应用指南
  • Rider崩溃问题终极解决指南
  • 荣誉奖项 | TopOn 荣获 “2025 H1优秀出海产品技术服务” 奖
  • webrtc初了解
  • 【数学】求最大公约数问题
  • mongodb源码分析session接受客户端find命令过程
  • 如何轻松将 iPhone 备份到外部硬盘
  • PostgreSQL学会如何建表
  • 网关Gateway
  • rabbitmq AI复习
  • GB/T 14833-2020 合成材料运动场地面层检测
  • 企业内训系统源码开发详解:直播+录播+考试的混合式学习平台搭建
  • C# 导出word 插入公式问题
  • (LeetCode 每日一题)3373. 连接两棵树后最大目标节点数目 II(贪心+深度优先搜索dfs)
  • 【Git】View Submitted Updates——diff、show、log
  • go并发编程| channel入门