一文搞懂|Linuxpinctrl/gpio子系统

嵌入式悦翔园 2023-06-08 11:40

关注星标公众号,第一时间获取信息

前言

注: 所有文章基于linux-3.13以上,本系列主要介绍 GPIO的一些基本知识,驱动操作GPIO的接口,应用层通过sysfs操作GPIO的接口,GPIO一些debug信息查看,以及对高通相关GPIO的寄存器操作。分享给刚刚接触外设bsp的小伙伴们。当然后面有时间还会分享GPIO子系统框架和pinctrl子系统框架,先知道黑盒怎么使用,然后咱再打开仔细瞅瞅。

本篇为驱动申请GPIO和操作GPIO接口篇,分别介绍驱动通过GPIO子系统和PINCTRL 子系统提供的接口对GPIO的操作

GPIO 子系统操作GPIO

GPIO子系统接口简介

相关实现在driver/gpio/gpiolib.c

1、gpio_request 申请GPIO

int gpio_request(unsigned gpio, const char *label)

参数解析:

  • gpio: gpio编号
  • label: 名称
  • 返回值: 成功返回0,失败返回负值

2、gpio_request_one 申请GPIO,同时制定配置方式 输出或输入模式

int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)

3、gpio_free 释放GPIO

void gpio_free(unsigned gpio)

参数解析:

  • gpio: gpio编号

4、gpio_direction_input 设置GPIO为输入模式

int gpio_direction_input(unsigned gpio)

参数解析:

  • gpio: gpio编号
  • 返回值: 成功返回0,失败返回负值

5、gpio_direction_output 设置GPIO为输出模式

int gpio_direction_output(unsigned gpio, int value)

参数解析:

  • gpio: gpio编号
  • value: 设置为输出模式时的初始值
  • 返回值: 成功返回0,失败返回负值

6、gpio_set_value 设置(写)GPIO的值

void __gpio_set_value(unsigned gpio, int value)
#define gpio_set_value  __gpio_set_value

  • gpio: gpio编号
  • value: 设置的值
  • 返回值: 成功返回0,失败返回负值

7、gpio_get_value 获取(读)GPIO的值

int __gpio_get_value(unsigned gpio)
#define gpio_get_value  __gpio_get_value
  • gpio: gpio编号
  • 返回值: 获取的值

8、gpio_to_irq 内核通过调用该函数将gpio端口转换为中断

int gpio_to_irq(unsigned gpio)
  • gpio: gpio编号
  • 返回值:中断编号可以传给request_irq()和free_irq()

举个例子:单个GPIO

申请gpio4,输出模式,输出高(从设备树配置)

设备树设置

gpio_test{
 status="ok";
 gpio_req=<&tlmn 4 0>;

代码实现

struct device dev;
gpio4 = of_get_named_gpio(dev.of_node,"gpio_req"0);
err = gpio_request(gpio4, "qti-can-reset");
 if (err < 0) {
         return err;
 } 
gpio_direction_output(gpio4, 0);                
gpio_set_value(gpio4,1);                

GPIO数组申请一个gpio数组 [36,42,132],主要是设备树 设备树

gpios = <&tlmm 36 0>,
                <&tlmm 42 0>,
                <&tlmm 132 0>;
        qcom,gpio-reset = <1>;
        qcom,gpio-standby = <2>;
        qcom,gpio-req-tbl-num = <0 1 2>;  
        qcom,gpio-req-tbl-flags = <1 0 0>; 
        qcom,gpio-req-tbl-label = "CAMIF_MCLK2",  
                                                                "CAM_RESET2",
                                                               "CAM_STANDBY2";

解析:

PINCTRL 子系统操作GPIO

pinctrl 子系统相关接口

1、devm_pinctrl_get 解析对应的设备树,获取pinctrl资源

struct pinctrl *devm_pinctrl_get(struct device *dev)
  • dev: 驱动设备结构体
  • 返回值:pinctrl节点

2、pinctrl_lookup_state 获取各种state的gpio配置

struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p, const char *name) 
  • p: pinctrl节点
  • name:gpio配置的名字

3、pinctrl_select_state 将上面获取的指定state状态设置到硬件中*/

int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)

举个例子

高通的配置为例子

在pinctrl设备树添加一个节点

&tlmn{
 
 pin_teset_default:pin_teset_default{
                 mux {
                          pins = "gpio0""gpio1"
                          function = "qup00";
                  };
                  config {
                          pins = "gpio0""gpio1"
                          drive-strength = <2>;
                          bias-disable;
                  };
 }
}

在xxx.dtsi中添加一个设备 使用

pinctrl_test{
  status="ok";
  pinctrl-name="default";
  pinctrl-0=<&pin_teset_default>;
}

代码实现

dev->pins->p = devm_pinctrl_get(dev);

 dev->pins->default_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_DEFAULT); 
  pinctrl_select_state(dev->pins->p, dev->pins->default_state);

probe自动配置pinctrl

如上个例子中,我们是不需要自己进行pinctrl适配的,device和驱动在匹配之后会进行适配。调用我们驱动的probe时,pinctrl相关已经初始化好了。获取相关状态和设置相关状态

__device_attach
    bus_for_each_drv(dev->bus, NULL, &data, __device_attach_driver);
        __device_attach_driver 
            driver_match_device(drv, dev); 
            driver_probe_device(struct device_driver *drv, struct device *dev)
                really_probe
                    pinctrl_bind_pins 
                        drv->probe(dev)


int pinctrl_bind_pins(struct device *dev)
{
   
   dev->pins->p = devm_pinctrl_get(dev);

   
   dev->pins->default_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_DEFAULT); 
   dev->pins->init_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_INIT);
   
   if (IS_ERR(dev->pins->init_state)) {
       
       ret = pinctrl_select_state(dev->pins->p, dev->pins->default_state); 
   } else {
       ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);
   }

#ifdef CONFIG_PM 
   dev->pins->sleep_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_SLEEP);
   dev->pins->idle_state = pinctrl_lookup_state(dev->pins->p, PINCTRL_STATE_IDLE);
#endif

   return 0;
}

作者:dirike

链接:https://blog.csdn.net/dirike/article/details/118052374

来源:CSDN

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐阅读



01

加入嵌入式交流群


02

嵌入式资源获取


03

STM32中断优先级详解


04

STM32下载程序新思路--使用串口下载程序


嵌入式悦翔园 专注于嵌入式技术,包括但不限于STM32、Arduino、51单片机、物联网、Linux等编程学习笔记,同时包含大量的学习资源。欢迎关注,一同交流学习,共同进步!
评论 (0)
  • 故障现象一辆2016款奔驰C200L车,搭载274 920发动机,累计行驶里程约为13万km。该车组合仪表上的防侧滑故障灯、转向助力故障灯、安全气囊故障灯等偶尔异常点亮,且此时将挡位置于R挡,中控显示屏提示“后视摄像头不可用”,无法显示倒车影像。 故障诊断用故障检测仪检测,发现多个控制单元中均存储有通信类故障代码(图1),其中故障代码“U015587 与仪表盘的通信存在故障。信息缺失”出现的频次较高。 图1 存储的故障代码1而组合仪表中存储有故障代码“U006488 与用户界
    虹科Pico汽车示波器 2025-04-23 11:22 83浏览
  •   后勤实验仿真系统平台深度解析   北京华盛恒辉后勤实验仿真系统平台依托计算机仿真技术,是对后勤保障全流程进行模拟、分析与优化的综合性工具。通过搭建虚拟场景,模拟资源调配、物资运输等环节,为后勤决策提供数据支撑,广泛应用于军事、应急管理等领域。   应用案例   目前,已有多个后勤实验仿真系统平台在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润后勤实验仿真系统平台。这些成功案例为后勤实验仿真系统平台的推广和应用提供了有力支持。   一、核心功能   (一)后勤资源模拟
    华盛恒辉l58ll334744 2025-04-23 15:39 120浏览
  • 前言本文主要演示基于TL3576-MiniEVM评估板HDMI OUT、DP 1.4和MIPI的多屏同显、异显方案,适用开发环境如下。Windows开发环境:Windows 7 64bit、Windows 10 64bitLinux开发环境:VMware16.2.5、Ubuntu22.04.5 64bitU-Boot:U-Boot-2017.09Kernel:Linux-6.1.115LinuxSDK:LinuxSDK-[版本号](基于rk3576_linux6.1_release_v
    Tronlong 2025-04-23 13:59 102浏览
  •   复杂电磁环境模拟系统平台解析   一、系统概述   北京华盛恒辉复杂电磁环境模拟系统平台是用于还原真实战场或特定场景电磁环境的综合性技术平台。该平台借助软硬件协同运作,能够产生多源、多频段、多体制的电磁信号,并融合空间、时间、频谱等参数,构建高逼真度的电磁环境,为电子对抗、通信、雷达等系统的研发、测试、训练及评估工作提供重要支持。   应用案例   目前,已有多个复杂电磁环境模拟系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润复杂电磁环境模拟系统。这些成功案例为复杂电
    华盛恒辉l58ll334744 2025-04-23 10:29 159浏览
  •   无人机结构仿真与部件拆解分析系统平台解析   北京华盛恒辉无人机结构仿真与部件拆解分析系统无人机技术快速发展的当下,结构仿真与部件拆解分析系统平台成为无人机研发测试的核心工具,在优化设计、提升性能、降低成本等方面发挥关键作用。以下从功能、架构、应用、优势及趋势展开解析。   应用案例   目前,已有多个无人机结构仿真与部件拆解分析系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机结构仿真与部件拆解分析系统。这些成功案例为无人机结构仿真与部件拆解分析系统的推广和应用提
    华盛恒辉l58ll334744 2025-04-23 15:00 157浏览
  •   陆地边防事件紧急处置系统平台解析   北京华盛恒辉陆地边防事件紧急处置系统平台是整合监测、预警、指挥等功能的智能化综合系统,致力于增强边防安全管控能力,快速响应各类突发事件。以下从系统架构、核心功能、技术支撑、应用场景及发展趋势展开全面解读。   应用案例   目前,已有多个陆地边防事件紧急处置系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润陆地边防事件紧急处置系统。这些成功案例为陆地边防事件紧急处置系统的推广和应用提供了有力支持。   一、系统架构   感知层:部
    华盛恒辉l58ll334744 2025-04-23 11:22 113浏览
  • 一、行业背景与市场需求高血压作为全球发病率最高的慢性病之一,其早期监测与管理已成为公共卫生领域的重要课题。世界卫生组织数据显示,全球超13亿人受高血压困扰,且患者群体呈现年轻化趋势。传统血压计因功能单一、数据孤立等缺陷,难以满足现代健康管理的需求。在此背景下,集语音播报、蓝牙传输、电量检测于一体的智能血压计应运而生,通过技术创新实现“测量-分析-管理”全流程智能化,成为慢性病管理的核心终端设备。二、技术架构与核心功能智能血压计以电子血压测量技术为基础,融合物联网、AI算法及语音交互技术,构建起多
    广州唯创电子 2025-04-23 09:06 143浏览
  •   电磁频谱数据综合管理平台系统解析   一、系统定义与目标   北京华盛恒辉电磁频谱数据综合管理平台融合无线传感器、软件定义电台等前沿技术,是实现无线电频谱资源全流程管理的复杂系统。其核心目标包括:优化频谱资源配置,满足多元通信需求;运用动态管理与频谱共享技术,提升资源利用效率;强化频谱安全监管,杜绝非法占用与干扰;为电子战提供频谱监测分析支持,辅助作战决策。   应用案例   目前,已有多个电磁频谱数据综合管理平台在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁频谱数
    华盛恒辉l58ll334744 2025-04-23 16:27 151浏览
  • 在科技飞速发展的当下,机器人领域的每一次突破都能成为大众瞩目的焦点。这不,全球首届人形机器人半程马拉松比赛刚落下帷幕,赛场上的 “小插曲” 就掀起了一阵网络热潮。4月19日,北京亦庄的赛道上热闹非凡,全球首届人形机器人半程马拉松在这里激情开跑。20支机器人队伍带着各自的“参赛选手”,踏上了这21.0975公里的挑战之路。这场比赛可不简单,它将机器人放置于真实且复杂的动态路况与环境中,对机器人在运动控制、环境感知和能源管理等方面的核心技术能力进行了全方位的检验。不仅要应对长距离带来的续航挑战,还要
    用户1742991715177 2025-04-22 20:42 98浏览
  • 一、技术背景与市场机遇在智能家居高速发展的今天,用户对家电设备的安全性、智能化及能效表现提出更高要求。传统取暖器因缺乏智能感知功能,存在能源浪费、安全隐患等痛点。WTL580-C01微波雷达感应模块的诞生,为取暖设备智能化升级提供了创新解决方案。该模块凭借微波雷达技术优势,在精准测距、环境适应、能耗控制等方面实现突破,成为智能取暖器领域的核心技术组件。二、核心技术原理本模块采用多普勒效应微波雷达技术,通过24GHz高频微波信号的发射-接收机制,实现毫米级动作识别和精准测距。当人体进入4-5米有效
    广州唯创电子 2025-04-23 08:41 129浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦