RK3568驱动指南|第十一篇 pinctrl 子系统-第123章dt_node_to_map函数分析

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第十一篇 pinctrl 子系统_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第123章dt_node_to_map函数分析

设备树(Device Tree)中存放的是对硬件设备信息的描述,包含了硬件设备的配置和连接信息,例如在pinctrl节点中的引脚的配置和映射关系。而rockchip_dt_node_to_map 函数的作用就是根据设备树中的节点信息,生成对应的引脚映射数组。这个映射数组将描述硬件功能(如复用功能和配置信息)与设备树中的引脚信息进行绑定。

dt_node_to_map函数已经在122.4.1小节的pinctrl_ops函数操作集中进行了简单的讲解,现在将对该函数进行详细的介绍。该函数的具体实现在内核源码的“drivers/pinctrl/pinctrl-rockchip.c”文件中,在讲解该函数之前需要先对struct pinctrl_map结构体进行介绍,该结构体定义在内核源码的“include/linux/pinctrl/machine.h”目录下,具体内容如下所示:

struct pinctrl_map {
	const char *dev_name;       // 设备名称
	const char *name;           // 映射名称
	enum pinctrl_map_type type; // 映射类型
	const char *ctrl_dev_name;  // 控制设备名称
	union {
		struct pinctrl_map_mux mux;         // 复用映射数据
		struct pinctrl_map_configs configs; // 配置映射数据
	} data;
};

该结构体用于在引脚控制器中定义引脚的映射关系。通过映射类型的不同,可以将引脚与具体的复用功能或配置信息关联起来,从而实现引脚的配置和控制。然后来看rockchip_dt_node_to_map函数,该函数的具体内容如下所示:

static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
				 struct device_node *np,
				 struct pinctrl_map **map, unsigned *num_maps)
{
struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); // 获取引脚控制器的私有数据指针
	const struct rockchip_pin_group *grp; // 引脚组指针
	struct device *dev = info->dev; // 设备指针
	struct pinctrl_map *new_map; // 新的引脚映射数组
	struct device_node *parent; // 父节点指针
	int map_num = 1; // 映射数量,默认为1
	int i;

	/* 查找引脚组 */
	grp = pinctrl_name_to_group(info, np->name); // 根据节点名称查找对应的引脚组
	if (!grp) {
		dev_err(dev, "unable to find group for node %pOFn\n", np); // 如果找不到引脚组,打印错误信息
		return -EINVAL;
	}

	map_num += grp->npins; // 计算映射数量,包括复用映射和配置映射

	new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL); // 分配内存空间用于存储映射数组
	if (!new_map)
		return -ENOMEM;

	*map = new_map; // 将分配的映射数组赋值给输出参数
	*num_maps = map_num; // 将映射数量赋值给输出参数

	/* 创建复用映射 */
	parent = of_get_parent(np); // 获取节点的父节点
	if (!parent) {
		kfree(new_map); // 如果父节点不存在,释放分配的映射数组内存空间
		return -EINVAL;
	}
	new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; // 设置映射类型为复用映射
	new_map[0].data.mux.function = parent->name; // 复用功能名称为父节点的名称
	new_map[0].data.mux.group = np->name; // 引脚组名称为节点的名称
	of_node_put(parent); // 释放父节点的引用计数

	/* 创建配置映射 */
	new_map++; // 映射数组指针向后移动一个位置
	for (i = 0; i < grp->npins; i++) {
		new_map[i].type = PIN_MAP_TYPE_CONFIGS_PIN; // 设置映射类型为配置映射
		new_map[i].data.configs.group_or_pin =
			pin_get_name(pctldev, grp->pins[i]); // 引脚组或引脚名称为引脚组中的引脚名称
		new_map[i].data.configs.configs = grp->data[i].configs; // 配置信息数组为引脚组中该引脚的配置信息
		new_map[i].data.configs.num_configs = grp->data[i].nconfigs; // 配置信息数量为引脚组中该引脚的配置数量
	}

	dev_dbg(dev, "maps: function %s group %s num %d\n",
		(*map)->data.mux.function, (*map)->data.mux.group, map_num); // 打印调试信息,显示创建的引脚映射的功能名称、组名和数量

	return 0; // 返回成功标志
}

第14-20行:函数根据设备节点的名称使用pinctrl_name_to_group函数查找与该节点对应的引脚组。如果找不到引脚组,则函数打印错误消息并返回EINVAL错误代码。

第22行:函数根据引脚组的引脚数量计算需要创建的映射数量。映射数量包括复用映射和配置映射。

第24-26行:函数使用kcalloc函数为映射数组(new_map)分配内存空间。分配的大小为映射数量乘以每个映射的大小。如果内存分配失败,函数将返回ENOMEM错误代码。

第28-29行:函数将分配的映射数组(new_map)和映射数量(map_num)通过输出参数map和num_maps返回给调用者。

第31-40行:函数首先获取设备节点的父节点,并将其作为复用映射的功能名称。然后,函数设置第一个映射的类型为PIN_MAP_TYPE_MUX_GROUP,并将父节点的名称作为映射的数据。同时,将设备节点的名称作为映射的组名。最后,函数使用of_node_put释放父节点的引用计数。

第42-52行:函数遍历引脚组的引脚数组,并为每个引脚创建一个配置映射。函数设置映射的类型为PIN_MAP_TYPE_CONFIGS_PIN,并将引脚的名称作为映射的数据。同时,将引脚组中该引脚的配置信息和配置数量设置为映射的配置数据。函数使用pin_get_name函数获取引脚的名称。

rockchip_dt_node_to_map函数根据设备节点的信息创建引脚映射,包括复用映射和配置映射。复用映射用于将引脚组的功能与父节点的功能关联起来,而配置映射用于将引脚的配置信息与引脚的名称关联起来。这些映射将用于配置引脚控制器,以确保引脚在系统中正确地配置和使用。这个函数在设备树解析过程中被调用,以便为每个设备节点创建相应的引脚映射。

到这里关于pinctrl子系统第一阶段的讲解到这里就结束了,为了帮助大家整合讲解过的知识点,作者绘制了以下思维导图:

注:该思维导图的存放路径为iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\05_思维导图\01_pinctrl 阶段1.jpg

图 123-1

大家可以根据该思维导图,对上面章节的内容进行梳理,从而真正理解pinctrl子系统框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/315068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python入门】day26:统计字符串中出现指定字符的次数

案例 实际上if name“main”:就相当于是 Python 模拟的程序入口 。由于模块之间相互引用&#xff0c;不同模块可能都有这样的定义&#xff0c;而入口程序只能有一个&#xff0c;选中哪个入口程序取决于 ** ** name** **的值。 代码 #-*- coding:utf-8 -*- #开发时间&#xff…

第一波!2024年1月精选6款实用AI人工智能设计工具合集

大家好&#xff0c;这是进入2024年之后的第一波干货合集&#xff01;这次的干货合集还是以 AI 相关的设计干货开头&#xff0c;这次有了在本地无限制帮你清理图片中元素的 AI 工具&#xff0c;有知名免费图库出品的实时 AI 图片生成工具、将截图直接转化为代码的超强工具&#…

听觉障碍应该找哪些专业人士?如何获得这些职业?

如果您有听觉障碍的困扰可以寻求以下专业人士的帮助。如果你有兴趣从事听力学职业&#xff0c;可以考虑以下 十几个选项&#xff1a; 1. 临床听力学家 临床听力学家检查患者以诊断他们的听力、平衡或耳朵相关问题。他们与所有年龄段的患者一起工作&#xff0c;或专门针对特定群…

一步步指南:从指定时长中提取需求的帧图片,高效剪辑视频

在现代多媒体时代&#xff0c;视频已经成生活中不可或缺的一部分。从视频中提取某一帧图片&#xff0c;或者对视频进行剪辑&#xff0c;都是常见的需求。下面一起来看云炫AI智剪如何从指定时长中提取需求的帧图片&#xff0c;如何高效地剪辑视频。 按指定时长提取视频某帧图片的…

Openwrite帮我们实现一文多发

Openwrite 一文多发 当你想进入这个搞自媒体的圈子&#xff0c;学着人家一样去搞流量、做IP的时候&#xff0c;就会发现&#xff0c;卖铲子的和卖教程的都赚钱了。而对于商业一无所知的人&#xff0c;只能是接盘侠。可是&#xff0c;接盘侠又如何呢&#xff1f;高客单付不起&a…

【PaperReading】4. TAP

Category Content 论文题目 Tokenize Anything via Prompting 作者 Ting Pan, Lulu Tang, Xinlong Wang, Shiguang Shan (Beijing Academy of Artificial Intelligence) 发表年份 2023 摘要 提出了一个统一的可提示模型&#xff0c;能够同时对任何事物进行分割、识别和…

使用postman做接口测试(一)

如何执行HTTP接口测试。包括如下三步&#xff1a; 构造一条符合要求的HTTP请求消息&#xff1b;发给我&#xff0c;我给你回响应&#xff1b;你读取HTTP响应&#xff0c;检查响应内容是否正确。 今天我们就讲&#xff0c;如何使用postman发送符合要求的HTTP请求。 how-如何安…

大创项目推荐 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

在机械行业中,直线导轨和弧形导轨哪个应用范围更广泛?

弧形导轨和直线导轨是两种常见的导轨类型&#xff0c;直线导轨主要被用于高精度或快速直线往复运动场所&#xff0c;而弧形导轨是一种专门设计用于曲线运动的导轨系统&#xff0c;那么在机械行业中&#xff0c;直线导轨和弧形导轨哪个应用范围更加广泛呢&#xff1f; 直线导轨主…

GPT2:Language Models are Unsupervised Multitask Learners

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据&#xff0c;更大的模型 2、大数据量&#xff0c;大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…

数据库创建表并插入数据练习题

一、创建表的要求 创建一个英雄表(hero) 主键 name nickname address groups email telphone 二、 操作步骤 1.登录MySQL [rootlocalhost ~]# systemctl start mysqld [rootlocalhost ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with…

UVa1308/LA2572 Viva Confetti

题目链接 本题是2002年ICPC亚洲区域赛金沢(日本)赛区的H题 题意 我已经把n个圆盘依次放到了桌面上。现按照放置顺序依次给出各个圆盘的圆心位置和半径&#xff0c;问最后有多少圆盘可见&#xff1f;如下图所示。 分析 《训练指南》的题解&#xff1a; 题目说“保证在对输入数据…

Unity网络通讯学习

---部分截图来自 siki学院Unity网络通讯课程 Socket 网络上的两个程序通过一个双向的通信连接实现数据交换&#xff0c;这个连接的一端称为一个 Socket &#xff0c;Socket 包含了网络通信必须的五种信息 Socket 例子{ 协议&#xff1a; TCP 本地&#xff1a; IP &#xff…

Hive数据定义(1)

hive数据定义是hive的基础知识&#xff0c;所包含的知识点有&#xff1a;数据仓库的创建、数据仓库的查询、数据仓库的修改、数据仓库的删除、表的创建、表的删除、表的修改、内部表、外部表、分区表、桶表、表的修改、视图。本篇文章先介绍&#xff1a;数据仓库的创建、数据仓…

【国产之光】开年尝鲜——优秀的AI编码助手 Fitten Code

文章目录 前言1. 工具准备1.0 事先说明1.1 VSCode1.2 Fitten Code1.3 GitHub Copilot 2. 使用测评2.1 需求理解2.2 上下文理解 3. 总结推荐链接 开年尝鲜高质量国产AI编码助手——FittenCode 前言 2024年刚刚开局&#xff0c;清华大学 与 非十科技 就发布了全新的 VSCode AI…

Docker 介绍 及 支持的操作系统

Docker组成&#xff1a; Docker主机(Host)&#xff1a; 一个物理机或虚拟机, 用于运行Docker服务进程和容器, 也成为宿主机, node节点。 Docker服务器端(Server)&#xff1a; Docker守护进程, 运行Docker容器。 Docker客户端(Client)&#xff1a; 客户端使用docker命令或其他工…

搭建LNMP网站平台并部署Web应用

本章主要介绍&#xff1a; 安装Nginx安装MySQL安装PHP在LNMP平台中部署 Web 应用 构建LNMP网站平台就像构建LAMP平台一样&#xff0c;构建LNMP平台也需要Linux服务器&#xff0c;MySQL数据库&#xff0c;PHP解析环境&#xff0c;区别主要在Nginx 与 PHP的协作配置上&#xff0…

基于SPI的插件式开发实现方案之@AutoService+ServiceLoader介绍及Dolphinscheduler中的实际应用

1.插件化开发概述 插件化开发模式正在很多编程语言或技术框架中得以广泛的应用实践&#xff0c;比如大家熟悉的jenkins&#xff0c;docker可视化管理平台rancher&#xff0c;以及日常编码使用的编辑器idea&#xff0c;vscode等。 实现服务模块之间解耦的方式有很多&#xff0…

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉搜索树的最小绝对差 题目描述解题思路 & 代码实现递归法迭代法 题目描述 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#…

10款热门的企业报表工具软件,看看哪款最适合?

1. Microsoft Office Excel&#xff1a;这款软件一般比较简单&#xff0c;适合处理小量数据&#xff0c;常被用来制作报表。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2. VeryReport&#xff1a;这是一款由纯Java编写的报表软件&#xff0c;兼具数…