首页 > 其他分享 >Pinctrl子系统pinctrl_desc结构体进一步介绍

Pinctrl子系统pinctrl_desc结构体进一步介绍

时间:2024-10-31 12:16:37浏览次数:6  
标签:struct pin 引脚 pinctrl dev pctldev Pinctrl desc

往期内容

本专栏往期内容:

  1. Pinctrl子系统和其主要结构体引入

input子系统专栏:

  1. 专栏地址:input子系统
  2. input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
    – 末片,有往期内容观看顺序

I2C子系统专栏:

  1. 专栏地址:IIC子系统
  2. 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
    – 末篇,有往期内容观看顺序

总线和设备树专栏:

  1. 专栏地址:总线和设备树
  2. 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
    – 末篇,有往期内容观看顺序

img

前言

在上一篇文章中对Pincontroller进行了简单的介绍(Pinctrl子系统和其主要结构体引入),以及对设备树也进行了示范,对Pincontroller的结构体进行的引入,也就是起了个开头,知道了是用pinctrl_dev来指代一个Pincontroller,可以提到了可以通过提供一个pinctrl_desc再去调用某个函数来实现一个pinctrl_dev。那么接下来就进一步讲解。

那么接下来看看pinctrl_dev --> pinctrl_desc *desc --> pinctrl_ops、pinmux_ops、pinconf_ops

1. 作用1:描述、获得引脚 pinctrl_ops

使用pinctrl_ops来操作引脚,主要功能有二:

  • 来取出某组的引脚:get_groups_count、get_group_pins
  • 处理设备树中pin controller中的某个节点:dt_node_to_map,把device_node转换为一系列的pinctrl_mapimg
\Linux-4.9.88\include\linux\pinctrl\pinctrl.h

struct pinctrl_ops {
	int (*get_groups_count) (struct pinctrl_dev *pctldev);
	const char *(*get_group_name) (struct pinctrl_dev *pctldev,
				       unsigned selector);
	int (*get_group_pins) (struct pinctrl_dev *pctldev,
			       unsigned selector,
			       const unsigned **pins,
			       unsigned *num_pins);
	void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file *s,
			  unsigned offset);
	int (*dt_node_to_map) (struct pinctrl_dev *pctldev,
			       struct device_node *np_config,
			       struct pinctrl_map **map, unsigned *num_maps);
	void (*dt_free_map) (struct pinctrl_dev *pctldev,
			     struct pinctrl_map *map, unsigned num_maps);
};

struct pinctrl_ops 结构体定义了全局引脚控制操作(pin control operations),这些操作需要由引脚控制器驱动程序实现。该结构体中的函数指针代表不同的操作接口,允许驱动程序通过这些接口与引脚控制子系统进行交互。

  • get_groups_count: 返回当前已注册的引脚组(pin group)数量。该函数用于获取系统中引脚组的总数。
  • get_group_name: 返回特定引脚组的名称。通过组选择器 selector 作为参数,驱动可以获取某个引脚组的名称。
  • get_group_pins: 返回与特定组选择器对应的引脚数组,并通过参数 pinsnum_pins 返回该数组的指针和引脚数量。此函数用于查询引脚组包含的具体引脚。
  • pin_dbg_show: 可选的 debugfs 显示挂钩,用于在调试文件系统(debugfs)中展示每个引脚的设备相关信息。它可以在调试时提供关于某个引脚的详细信息。
  • dt_node_to_map: 解析设备树(Device Tree)中的 “pin 配置节点” 并为其创建映射表项(mapping table entries)。这些映射表项通过 mapnum_maps 输出参数返回。该函数是可选的,适用于支持设备树的引脚控制器驱动。
  • dt_free_map: 释放通过 dt_node_to_map 创建的映射表项。顶层的 map 指针需要释放,同时还要释放映射表项中动态分配的成员。该函数是可选的,对于不支持设备树的引脚控制器驱动,可以忽略此函数。

这些操作为引脚控制子系统提供了操作引脚组、解析设备树节点、调试显示等功能接口。

2. 作用2:引脚复用 pinmux_ops

img

把某一组引脚配置成某一功能,GPIO模式??或是其它模式

\Linux-4.9.88\include\linux\pinctrl\pinmux.h
struct pinmux_ops {
	int (*request) (struct pinctrl_dev *pctldev, unsigned offset);
	int (*free) (struct pinctrl_dev *pctldev, unsigned offset);
	int (*get_functions_count) (struct pinctrl_dev *pctldev);
	const char *(*get_function_name) (struct pinctrl_dev *pctldev,
					  unsigned selector);
	int (*get_function_groups) (struct pinctrl_dev *pctldev,
				  unsigned selector,
				  const char * const **groups,
				  unsigned *num_groups);
	int (*set_mux) (struct pinctrl_dev *pctldev, unsigned func_selector,
			unsigned group_selector);
	int (*gpio_request_enable) (struct pinctrl_dev *pctldev,
				    struct pinctrl_gpio_range *range,
				    unsigned offset);
	void (*gpio_disable_free) (struct pinctrl_dev *pctldev,
				   struct pinctrl_gpio_range *range,
				   unsigned offset);
	int (*gpio_set_direction) (struct pinctrl_dev *pctldev,
				   struct pinctrl_gpio_range *range,
				   unsigned offset,
				   bool input);
	bool strict;
};

struct pinmux_ops 结构体定义了引脚复用(pinmux)操作,主要用于实现支持引脚复用功能的引脚控制器驱动程序。该结构体提供了一系列回调函数,允许引脚控制器子系统与引脚复用功能进行交互。

  • request: 核心功能调用,用于判断特定的引脚是否可以被用于复用。在实际选择复用设置前,核心会调用该函数来请求引脚。驱动程序可以通过返回负值拒绝该请求。
  • free: 与 request() 相反,释放被请求的引脚。这是在引脚复用完成后释放引脚的回调函数。
  • get_functions_count: 返回当前引脚复用驱动中可选择的复用功能数量。
  • get_function_name: 根据复用选择器 selector 返回某个复用功能的名称。核心通过调用此函数来确定应将某个设备映射到哪个复用设置。
  • get_function_groups: 根据功能选择器 selector 返回与该复用功能相关的引脚组名称数组,并通过 groupsnum_groups 返回受影响的组及其数量。可以与 pinctrl_ops 中的函数结合使用以获取受影响的引脚。
  • set_mux: 启用特定的复用功能与引脚组关联。该函数根据 func_selector 选择特定的复用功能,并根据 group_selector 选择一组引脚进行复用设置。驱动程序不需要检测复用冲突,系统会自动处理引脚冲突。
  • gpio_request_enable: 请求并启用某个引脚的 GPIO 模式。如果引脚控制器支持每个引脚单独复用为 GPIO 模式,则需要实现此函数。参数包括 GPIO 范围和在该范围内的引脚偏移量。
  • gpio_disable_free: 释放之前启用的 GPIO 复用设置,与 gpio_request_enable 作用相反。
  • gpio_set_direction: 对于需要引脚复用的 GPIO 控制器,当 GPIO 配置为输入或输出时可能需要不同的设置。该函数允许控制引脚方向(输入或输出)。
  • strict: 如果为真,则不允许引脚同时作为 GPIO 和复用其他功能使用。在批准引脚请求之前,会严格检查 gpio_ownermux_owner 以防止冲突。

pinmux_ops 提供了驱动与引脚复用子系统之间的交互接口,用于管理引脚复用、GPIO 配置、引脚组和功能的分配。

3. 作用3:引脚配置 pinconf_ops

img

上拉?下拉?等等

\Linux-4.9.88\include\linux\pinctrl\pinconf.h
struct pinconf_ops {
#ifdef CONFIG_GENERIC_PINCONF
	bool is_generic;
#endif
	int (*pin_config_get) (struct pinctrl_dev *pctldev,
			       unsigned pin,
			       unsigned long *config);
	int (*pin_config_set) (struct pinctrl_dev *pctldev,
			       unsigned pin,
			       unsigned long *configs,
			       unsigned num_configs);
	int (*pin_config_group_get) (struct pinctrl_dev *pctldev,
				     unsigned selector,
				     unsigned long *config);
	int (*pin_config_group_set) (struct pinctrl_dev *pctldev,
				     unsigned selector,
				     unsigned long *configs,
				     unsigned num_configs);
	int (*pin_config_dbg_parse_modify) (struct pinctrl_dev *pctldev,
					   const char *arg,
					   unsigned long *config);
	void (*pin_config_dbg_show) (struct pinctrl_dev *pctldev,
				     struct seq_file *s,
				     unsigned offset);
	void (*pin_config_group_dbg_show) (struct pinctrl_dev *pctldev,
					   struct seq_file *s,
					   unsigned selector);
	void (*pin_config_config_dbg_show) (struct pinctrl_dev *pctldev,
					    struct seq_file *s,
					    unsigned long config);
};

struct pinconf_ops 结构体定义了引脚配置操作,用于支持引脚配置功能的驱动程序实现。它包含一系列函数指针,这些函数用于获取和设置单个引脚及引脚组的配置。

  • is_generic: (可选)如果引脚控制器希望使用通用接口,设置该标志以告诉框架其为通用接口。
  • pin_config_get: 获取特定引脚的配置。如果请求的配置在该控制器上不可用,返回 -ENOTSUPP;如果可用但被禁用,返回 -EINVAL
  • pin_config_set: 配置单个引脚的设置。该函数接受引脚的配置参数和数量,允许驱动程序在特定引脚上设置多个配置。
  • pin_config_group_get: 获取特定引脚组的配置。该函数通过选择器返回整个引脚组的配置,便于一次性读取多个引脚的设置。
  • pin_config_group_set: 配置引脚组内所有引脚的设置。与 pin_config_set 类似,但作用于整个引脚组。
  • pin_config_dbg_parse_modify: (可选)用于调试文件系统的功能,允许修改引脚配置。
  • pin_config_dbg_show: (可选)调试文件系统中的显示钩子,提供特定引脚的设备信息。
  • pin_config_group_dbg_show: (可选)调试文件系统中的显示钩子,提供特定引脚组的设备信息。
  • pin_config_config_dbg_show: (可选)调试文件系统中的显示钩子,解码并显示驱动程序的引脚配置参数。

4. 使用pinctrl_desc注册得到pinctrl_dev

分析的文件:

相关文章

  • HarmonyOS NEXT 组件市场在DevEco Studio,安装出现Fail to load plugin descriptor fro
     HarmonyOSNEXT开源组件市场  https://gitee.com/harmonyos-cases/cases  根据gitee的下载连接,下载了cases-master.zip。如果在devstudio-settings-plugins-设置按钮-installfromdisk,会报错,说明这个不是真正的插件包。解压这个zip,在plugin文件夹下有个case_plug......
  • 解决elementui中el-radio报错:Blocked aria-hidden on an element because its descend
    今天在使用elment中el-radio的时候发现控制台报错最开始以为是自己哪里写错了,但是后面上网查找的时候发现是浏览器的原因现在来说下解决办法1、可以使用这么一种组合来解决/deep/input[aria-hidden="true"]{display:none!important;}/deep/.el-radio:focus:no......
  • 【SQL 性能分析的4种详细贯通方法】Com______;慢查询日志slow_query_log;profile;explain
    SQL性能分析是一个多维度的过程,涉及到对数据库操作的监控、诊断和优化。以下是使用四种方法详细且连贯地描述SQL性能分析的过程:1.Com_xxx计数器分析MySQL提供了Com_xxx状态变量,用于跟踪不同类型的SQL语句被执行的次数。这些计数器可以帮助我们了解数据库的使用模式和负......
  • 梯度下降(Gradient Descent)详解
    梯度下降(GradientDescent)详解梯度下降是一种优化算法,广泛应用于机器学习和深度学习中,用于最小化损失函数,即通过调整参数来减少模型错误的方法。梯度下降的核心思想是:通过计算损失函数的梯度(即导数),然后沿着梯度下降的方向更新模型的参数,以达到减少损失的目的。基本原理......
  • PbootCMS附件上传报错UNKNOW: Code: 8192; Desc: stripos()
    错误分析:错误信息 UNKNOW:Code:8192;Desc:stripos() 表明在调用 stripos 函数时出现了问题。Code:8192 通常表示PHP的E_DEPRECATED警告,意味着某个函数或功能已被弃用,但仍可使用。修改建议:根据你的描述,需要修改 /core/function/file.php 文件中的 stri......
  • PbootCMS附件上传失败报错UNKNOW: Code: 8192; Desc: stripos():
    问题描述在使用PBootCMS上传附件时,如果遇到错误 UNKNOW:Code:8192;Desc:stripos(),这通常是由于PHP版本或配置问题导致的。stripos() 函数在某些PHP版本中可能会引发警告或错误。解决步骤检查PHP版本确认当前使用的PHP版本是否与PBootCMS兼容。PBootCMS通常支持PHP5.......
  • PbootCMS附件上传失败报错UNKNOW: Code: 8192; Desc: stripos(): Non-string needles
    PbootCMS附件上传失败报错“UNKNOW:Code:8192;Desc:stripos():Non-stringneedleswillbeinterpretedasstringsinthefuture.”是由于PHP版本更新导致的兼容性问题。具体来说,stripos()函数在处理非字符串类型的第二个参数(即needle)时,未来版本的PHP将会将其视为字符串,而......
  • 【ant.design ProDescriptions详细介绍写法】
    代码解析实现效果代码块<ProDescriptionstitle={"详细信息"}column={1}columns={[{title:'姓名',dataIndex:'Name'},{title:'年级',dataIndex:&......
  • PbootCMS附件上传失败报错UNKNOW: Code: 8192; Desc: stripos(): Non-string needles
    当遇到PBootCMS附件上传失败,并报错 UNKNOW:Code:8192;Desc:stripos():Non-stringneedleswillbeinterpretedasstringsinthefuture. 时,这通常是因为PHP的版本更新导致某些函数的行为有所改变。在这个情况下,stripos() 函数在处理非字符串参数时会发出警告,因为它......
  • PbootCMS附件上传失败报错UNKNOW: Code: 8192; Desc: stripos():
    当遇到上传失败报错 UNKNOW:Code:8192;Desc:stripos():Non-stringneedleswillbeinterpretedasstringsinthefuture.Useanexplicitchr()calltopreservethecurrentbehavior;File:/www/wwwroot/aaa.xxxx.com/core/function/file.php;Line:176; 时,可以通......