基于Amlogic T972:结合DTS、驱动、Datasheet,解析Pinctrl子系统、GPIO脚的复用方法

news2024/11/18 14:23:23

文章目录

  • 前言
  • 一、概念
    • 1.1 Pinctrl devices
    • 1.2 Pinctrl client devices
  • 二、例(1)GPIOZ_9/10 复用为 i2c2_z
    • 2.1 Pin controller devices
      • 2.1.1 设备树配置: dts
      • 2.1.2 源码:驱动配置
      • 2.1.3 Datasheet
    • 2.2 Pinctrl client devices
      • 2.2.1 设备树配置:dts
  • 三、例(2)GPIOH_21/22 复用为 i2c1_h
    • 3.1 Pin controller devices
      • 3.1.1 设备树配置: dts
      • 3.1.2 源码:驱动配置
      • 3.1.3 Datasheet
    • 3.2 Pinctrl client devices
      • 3.2.1 设备树配置:dts
      • 3.2.2 设备树:图解
  • 四、例(3)GPIOZ_1/2 复用为 i2c1_z
    • 4.1 Pin controller devices
      • 4.1.1 设备树配置: dts
      • 4.1.2 源码:驱动配置
      • 4.1.3 Datasheet
  • 五、结尾
    • 5.1 关于 _z 和 _h 后缀的含义

前言

本文结合Amlogic T972平台的设备树(DTS)、驱动源码、Datasheet,重点关注如何通过Pinctrl子系统,实现PIN脚的复用。
通过DTS的3个例子的分析,结合datasheet,确认了PIN脚复用方法。另一方面,自然也解析出了DTS中pinctrl部分的书写方法。

  • 对于Andorid驱动的开发,如楼下所用Amlogic T972平台,在原厂所提供的AOSP源码中,在其DTS文件中,各个PIN脚的配置均已做好,只需使用或改变PIN脚功能时,只需在DTS中修改即可。

  • 例如,如果我们想将例(3)中的GPIOZ_1和GPIOZ_2脚,对应于i2c1_z,作为i2c1(即i2c-1)来使用,则只需:

    • i2c1_h_pins 更换为 i2c1_z_pins
    • i2c1_h_pins_slp_input 更换为 i2c1_z_pins_slp_input
  • 楼上的做法,其实就是通过PIN MUX,设置其通路寄存器,将GPIOZ_1和GPIOZ_2脚连接至i2c1模块


//common\arch\arm\boot\dts\amlogic\tl1_t962x2_x301_1g.dts
&i2c1 {
	status = "okay";
	clock-frequency = <300000>;
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c1_z_pins>; //备注:如楼上,从i2c1_h_pins切换为i2c1_z_pins
	pinctrl-1 = <&i2c1_z_pins_slp_input>;//备注:即可给i2c1换一对PIN脚
};

一、概念

Pinctrl 即Pin controller(Soc的引脚控制器)。所有的Soc引脚,它们的功能、状态等,都需要经过配置后才可使用,下面就是一个如何控制引脚的逻辑框图。

最左边的【PAD】是最终的引脚,而它的功能,是由它右边的部分决定的,例如此PAD连接的是哪个module、它的状态是什么等等。具体的框图分析,要详细阅读datasheet,并结合驱动代码来了解,将在另外一篇文章中介绍。

在这里插入图片描述

1.1 Pinctrl devices

提供服务,可以用它来复用引脚、配置引脚,是一个软件上的概念。

1.2 Pinctrl client devices

使用服务,Pinctrl系统的客户,即使用Pinctrl系统的设备。声明自己要使用哪些引脚的哪些功能,怎么配置它们。

注意:Pin controller和GPIO Controller不同:(1) Pin controller 通过控制MUX功能复用,可以控制一个的具体功能,例如将具体的PIN设置为I2C功能,或者简单的GPIO功能;(2)GPIO Controller只有普通GPIO功能,如上拉、下拉、设置输入或输出方向。(3)两者的关系是先用Pin controller把引脚配置为GPIO,再用GPIO Controler把引脚配置为输入或输出。

二、例(1)GPIOZ_9/10 复用为 i2c2_z

2.1 Pin controller devices

2.1.1 设备树配置: dts

&pinctrl_periphs {

// …… 省略 ……

	i2c2_z_pins:i2c2_z {
		mux {
			groups = "i2c2_sda_z", //"i2c2_sda_z"在源码中配置,楼下其余地方groups实现方法相同
				"i2c2_sck_z";
			function = "i2c2";
			bias-pull-up;
			drive-strength = <3>;
		};
	};

	i2c2_z_pins_slp_input:i2c2_z_slp_input {
		mux {
			groups = "GPIOZ_9", "GPIOZ_10";
			function = "gpio_periphs";
			input-enable;
			bias-disable;
		};
	};

2.1.2 源码:驱动配置

//common\drivers\amlogic\pinctrl\pinctrl-meson-axg-pmx.h
#define GROUP(grp, f)							\
	{								\
		.name = #grp,						\
		.pins = grp ## _pins,                                   \
		.num_pins = ARRAY_SIZE(grp ## _pins),			\
		.data = (const struct meson_pmx_axg_data[]){		\
			PMX_DATA(f),					\
		},							\
	}


//common\drivers\amlogic\pinctrl\pinctrl-meson-tl1.c
/* i2c2 */
static const unsigned int i2c2_sda_z_pins[] = {GPIOZ_10};
static const unsigned int i2c2_sck_z_pins[] = {GPIOZ_9};

static struct meson_pmx_group meson_tl1_periphs_groups[] = {
// ……  省略 ……
	/* bank GPIOZ */
	GROUP(i2c2_sda_z,	1), //备注:此处的Group(grp, f=1), 即PMX_DATA(f=1),对应datasheet,正好是I2C_EE_M2
	GROUP(i2c2_sck_z,	1),
// ……  省略 ……
}

static const char * const i2c2_groups[] = {
	"i2c2_sda_h", "i2c2_sck_h",
	"i2c2_sda_z", "i2c2_sck_z",
};

2.1.3 Datasheet

  • 下图为GPIO脚复用的Fun定义部分,楼上例一的表格遵循相同的循序,从Fun1开始
  • 再次印证,meson_tl1_periphs_groups[]中GROUP(i2c2_sda_z, 1)宏的第2个参数,即为复用Fun的序号,从1开始
  • 总结:若需要将GPIOZ_9和GPIOZ_10配置为i2c2_z,需设置Mux fun=1
    在这里插入图片描述

2.2 Pinctrl client devices

2.2.1 设备树配置:dts

//mesontl1.dtsi
			i2c2: i2c@1d000 {
				compatible = "amlogic,meson-i2c";
				status = "disabled";
				reg = <0x1d000 0x20>;
				interrupts = <GIC_SPI 215 IRQ_TYPE_EDGE_RISING>,
					<GIC_SPI 94 IRQ_TYPE_EDGE_RISING>;
				#address-cells = <1>;
				#size-cells = <0>;
				clocks = <&clkc CLKID_I2C>;
				clock-frequency = <100000>;
			};
//tl1_t962x2_x301_1g.dts	
&i2c2 {
	status = "okay";
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c2_z_pins>; //备注:使用Pinctrl的状态1配置,将配置为i2c2
	pinctrl-1 = <&i2c2_z_pins_slp_input>;//备注:使用Pinctrl的状态2配置,i2c2将配置为GPIO input
	clock-frequency = <400000>;

	tas5805: tas5805@36 {
		compatible = "ti,tas5805";
		#sound-dai-cells = <0>;
		codec_name = "tas5805";
		reg = <0x2d>;
		status = "disable";
	};

	ad82584f: ad82584f@62 {
		compatible = "ESMT, ad82584f";
		#sound-dai-cells = <0>;
		reg = <0x31>;
		status = "okay";
		reset_pin = <&gpio_ao GPIOAO_6 0>;
	};

};

三、例(2)GPIOH_21/22 复用为 i2c1_h

3.1 Pin controller devices

3.1.1 设备树配置: dts

common\arch\arm\boot\dts\amlogic\mesontl1.dtsi
&pinctrl_periphs {
// …… 省略 ……

	i2c1_h_pins:i2c1_h {
		mux {
			groups = "i2c1_sda_h",
				"i2c1_sck_h";
			function = "i2c1";
			bias-pull-up;
			drive-strength = <3>;
		};
	};

	i2c1_h_pins_slp_input:i2c1_h_slp_input {
		mux {
			groups = "GPIOH_21", "GPIOH_22";
			function = "gpio_periphs";
			input-enable;
			bias-disable;
		};
	};
    // …… 省略 ……
} // end of &pinctrl_periphs 

3.1.2 源码:驱动配置

//common\drivers\amlogic\pinctrl\pinctrl-meson-axg-pmx.h
#define GROUP(grp, f)							\
	{								\
		.name = #grp,						\
		.pins = grp ## _pins,                                   \
		.num_pins = ARRAY_SIZE(grp ## _pins),			\
		.data = (const struct meson_pmx_axg_data[]){		\
			PMX_DATA(f),					\
		},							\
	}


//common\drivers\amlogic\pinctrl\pinctrl-meson-tl1.c
/* i2c1 */
static const unsigned int i2c1_sda_h_pins[] = {GPIOH_22};
static const unsigned int i2c1_sck_h_pins[] = {GPIOH_21};

static struct meson_pmx_group meson_tl1_periphs_groups[] = {
    // …… 省略 ……
	/* bank GPIOH */
	GROUP(i2c1_sda_h,	1),
	GROUP(i2c1_sck_h,	1),
    // …… 省略 ……
}

3.1.3 Datasheet

  • 下图为GPIO脚复用的Fun定义部分,从Func=1开始,到~Func=7
  • 再次印证,meson_tl1_periphs_groups[]中GROUP(i2c1_sda_h, 1)宏的第2个参数,即为复用Fun的序号,从1开始
  • 总结:若需要将GPIOH_21和GPIOH_22配置为i2c1_h,需设置Mux fun=1

在这里插入图片描述

3.2 Pinctrl client devices

3.2.1 设备树配置:dts

  • 默认状态(“default”):pinctrl-0 = <&i2c1_h_pins>;
  • 睡眠状态(“sleep”):pinctrl-1 = <&i2c1_h_pins_slp_input>;

//common\arch\arm\boot\dts\amlogic\tl1_t962x2_x301_1g.dts
&i2c1 {
	status = "okay";
	clock-frequency = <300000>;
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&i2c1_h_pins>; //备注:引用pinctrl的配置0,将配置为i2c1_h
	pinctrl-1 = <&i2c1_h_pins_slp_input>;

	lcd_extern_i2c0: lcd_extern_i2c@0 {
		compatible = "lcd_ext, i2c";
		dev_name = "i2c_T5800Q";
		reg = <0x1c>;
		status = "okay";
	};

	lcd_extern_i2c1: lcd_extern_i2c@1 {
		compatible = "lcd_ext, i2c";
		dev_name = "i2c_ANX6862";
		reg = <0x20>;
		status = "okay";
	};

	lcd_extern_i2c2: lcd_extern_i2c@2 {
		compatible = "lcd_ext, i2c";
		dev_name = "i2c_ANX7911";
		reg = <0x74>;
		status = "okay";
	};

	lcd_extern_i2c3: lcd_extern_i2c@3 {
		compatible = "lcd_ext, i2c";
		dev_name = "i2c_CS602";
		reg = <0x66>;
		status = "disable";
	};
};

3.2.2 设备树:图解

在这里插入图片描述

四、例(3)GPIOZ_1/2 复用为 i2c1_z

4.1 Pin controller devices

4.1.1 设备树配置: dts

common\arch\arm\boot\dts\amlogic\mesontl1.dtsi
&pinctrl_periphs {
// …… 省略 ……

	i2c1_z_pins:i2c1_z {
		mux {
			groups = "i2c1_sda_z",
				"i2c1_sck_z";
			function = "i2c1";
			bias-pull-up;
			drive-strength = <3>;
		};
	};

	/*
	 * i2c sleep mode1: set the gpio the input
	 * in this scene, pull up power is off
	 */
	i2c1_z_pins_slp_input:i2c1_z_slp_input {
		mux {
			groups = "GPIOZ_1", "GPIOZ_2";
			function = "gpio_periphs";
			input-enable;
			bias-disable;
		};
	};
    // …… 省略 ……
} // end of &pinctrl_periphs 

4.1.2 源码:驱动配置

//common\drivers\amlogic\pinctrl\pinctrl-meson-axg-pmx.h
#define GROUP(grp, f)							\
	{								\
		.name = #grp,						\
		.pins = grp ## _pins,                                   \
		.num_pins = ARRAY_SIZE(grp ## _pins),			\
		.data = (const struct meson_pmx_axg_data[]){		\
			PMX_DATA(f),					\
		},							\
	}


//common\drivers\amlogic\pinctrl\pinctrl-meson-tl1.c
/* i2c2 */
static const unsigned int i2c2_sda_z_pins[] = {GPIOZ_10};
static const unsigned int i2c2_sck_z_pins[] = {GPIOZ_9};

static struct meson_pmx_group meson_tl1_periphs_groups[] = {
// ……  省略 ……
	/* bank GPIOZ */
	GROUP(i2c2_sda_z,	1), //此处的Group(grp, f=1), 即PMX_DATA(f=1),对应datasheet,正好是I2C_EE_M2
	GROUP(i2c2_sck_z,	1),
// ……  省略 ……
}

static const char * const i2c2_groups[] = {
	"i2c2_sda_h", "i2c2_sck_h",
	"i2c2_sda_z", "i2c2_sck_z",
};

4.1.3 Datasheet

  • 下图为GPIO脚复用的Fun定义部分,楼上例一的表格遵循相同的循序,从Fun1开始
  • 再次印证,meson_tl1_periphs_groups[]中GROUP(i2c1_sda_z, 3)宏的第2个参数,即为复用Fun的序号,从1开始
  • 总结:若需要将GPIOZ_1和GPIOZ_2配置为i2c1,需设置Mux fun=3

在这里插入图片描述

五、结尾

5.1 关于 _z 和 _h 后缀的含义

  • i2c1_z 与 i2c1_h 的区别,_z为使用GPIO_BANK_Z上的PIN脚, 而_h为GPIO_BANK_H上的PIN脚
  • 在例(2)的配置中,实际连接到i2c1模块上的PIN脚复用配置,为GPIO_BANK_H上的PIN脚

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云桌面,开启云上高效办公之旅!

在传统办公模式中&#xff0c;企业必须自己购买服务器和数据库软件才能进行日常管理&#xff0c;部署繁琐&#xff0c;还需要日常运维。而云桌面办公系统通过将传统的计算机终端与云计算平台有机地结合起来&#xff0c;使企业能够轻松应对各种变化带来的威胁和压力。 其中华为云…

用户与技术双向推动,小游戏赛道迎来新一轮增长机会

2017 年 12 月 28 日&#xff0c;微信小游戏正式上线。“跳一跳”刷爆了微信朋友圈&#xff0c;随后欢乐斗地主、坦克大战、纪念碑谷、拳皇等经典游戏纷纷出现在小游戏平台上。在过去的5年间&#xff0c;各大平台纷纷紧跟微信的步伐&#xff0c;纷纷入局小游戏&#xff0c;当前…

回调函数的基本使用

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、什么是回调函数二、为什么要…

打开新世界大门,测试人可以用Chrome插件干什么?

什么是Chrome插件 这篇文章所说的Chrome插件&#xff0c;也就是我们通常说的Chrome扩展 (Chrome Extension)&#xff0c;是一个用Web技术开发、用来增强浏览器功能的软件&#xff0c;它其实就是一个由 HTML、CSS、JS、图片等资源组成的一个 .crx 后缀的压缩包。 让我们来看看…

Android12屏下指纹解析

版权声明&#xff1a;本文为梦想全栈程序猿原创文章&#xff0c;转载请附上原文出处链接和本声明 前言&#xff1a;google官方更新了Android12的指纹架构&#xff0c;新添加了关于屏下指纹(屏下光学跟屏下超声波)的支持&#xff0c; 刚好近期要研究这个&#xff0c;想把自己的…

移动硬盘安装ubuntu系统二——启动U盘安装

一. 简介 在之前的一篇文章中记录了使用VMware Workstation给移动硬盘中安装Ubuntu系统过程&#xff0c;本篇文章简单记录使用启动盘安装 Ubuntu 20.04.5系统到移动硬盘。 二. 制作Ubuntu镜像的系统启动盘 按照官网 Install Ubuntu desktop上介绍&#xff0c;在 Windows 上可…

【Transformer】——李宏毅机器学习笔记

Transformer 前言 transformer是一个sequence-to-sequence(seq2seq) 的 model input a sequence&#xff0c;output a sequence. The output length is determined by model. 例如 语音辨识&#xff1a; 那么为什么不能把以上三种模型结合起来&#xff0c;进行语音识别呢&…

代码随想录拓展day3 922. 按奇偶排序数组II;24. 两两交换链表中的节点;234.回文链表;143.重排链表

代码随想录拓展day3 922. 按奇偶排序数组II&#xff1b;24. 两两交换链表中的节点&#xff1b;234.回文链表&#xff1b;35.搜索插入位置 数组和链表的题目。链表的操作几天没看又忘了&#xff0c;果然是要及时复习加反复复习。 922. 按奇偶排序数组II 922. 按奇偶排序数组 …

【小程序】宿主环境之通信模型和运行机制

目录 宿主环境 1. 什么是宿主环境 2. 小程序的宿主环境 通行模型 1. 通信的主体 2. 小程序的通信模型 运行机制 5. 小程序启动的过程 6. 页面渲染的过程 宿主环境 1. 什么是宿主环境 宿主环境&#xff08;host environment&#xff09;指的是程序运行所必须的依赖环…

论文笔记Point·E: A System for Generating 3D Point Clouds from Complex Prompts

之前的文本生成3D模型的方法生成一个模型需要多块GPU跑好几个小时&#xff0c;该文章提出的方法生成一个3D模型只需要单GPU1-2分钟。 该文章生成的3D模型的质量并不是当下最好的&#xff0c;但是生成速度很快&#xff0c;因此在现实中很有意义。 从文本生成3D模型的过程分为三…

Redis 对象

在 Redis底层数据结构介绍1 中我们介绍了Redis用到的所有主要数据结构&#xff0c;比如简单动态字符串&#xff08;SDS&#xff09;、双端链表、字典、压缩列表、整数集合等等。Redis并没有直接使用这些数据结构来实现键值对数据库&#xff0c;而是基于这些数据结构创建了一个对…

第7章 数据库设计和ER模型

第7章 数据库设计和ER模型 考试范围 7.1-7.7 考试题型&#xff1a;数据库设计题 考试内容&#xff1a; 掌握基本ER模型的概念与ER图的设计&#xff1b; 掌握将ER模型转换成关系模式的方法。 1、掌握基本ER模型的概念与ER图的设计 概念 E-R 模型是数据库设计中广泛使用的数…

2022-金盾信安杯

web 有来无回 考察xxe盲注 参考博客&#xff1a;https://blog.csdn.net/m0_49623330/article/details/113641498 <!ENTITY % a SYSTEM "http://vps/test.dtd"> %a; ] > 在自己服务器上编写dtd文件 <!ENTITY % dtd "<!ENTITY % hack SYSTEM ht…

零基础小白如何提高学Python的效率?

Python在所有的编成语言对小白来说是最友好的一种语言&#xff0c;简单、清晰、易学&#xff0c;但是有句话说万事开头难&#xff0c;对于很多连计算机基础都没有的伙伴来说&#xff0c;Python学习的效率极其低&#xff0c;这也导致了一部分放弃学习Python。 为了能够解决大家…

Android MAT的使用

下载与配置 MAT下载地址&#xff1a; Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation JAVA 11下载地址&#xff1a; Java Downloads | Oracle 由于最新版的MAT还需要JAVA 11&#xff0c;所以还需要配置JAVA 11的环境。 JAVA 11环境配置&#xff…

ssm药店药品进销存管理系统idea maven mysql

任何系统都要遵循系统设计的基本流程&#xff0c;本系统也不例外&#xff0c;同样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现…

【项目实战:核酸检测平台】第五章 众志诚城

本章目标 完成转运人员、接收人员、数据上传人员端 用到技术&#xff1a; EasyExcel、ElementUIPlus。lodop打印 概述 这一章要完成转运人员、接收人员、数据上传人员端的业务模块&#xff0c;从网上的资料我并没有找到相关的界面&#xff0c;没关系自己脑补就好了&#x…

React DAY05

复习&#xff1a; 1.JSX中的数据绑定 内容绑定&#xff1a;<div>{表达式}</div> 属性绑定&#xff1a;<img src{表达式}/> 样式绑定&#xff1a;<div className{表达式} style{样式对象}></div> 事件绑定&#xff1a;<button onClick{函数} …

跨境电商卖家:减少客户流失的 5 个最佳策略

关键词&#xff1a;跨境电商卖家、客户流失 跨境电商卖家获取新客户的成本可能比保留现有客户高出 25%。 这是有道理的&#xff1a;您可以花费数周时间研究如何让新客户进入您的业务&#xff0c;并投入大量时间和精力来制定完美的潜在客户生成策略&#xff0c;但如果无法留住合…

VMware创建Linux虚拟机之(五)Spark完全分布式部署教程

Hello&#xff0c;转眼间已到2022年底&#xff0c;学期末…… 总体来说&#xff0c;今年经历了很多&#xff0c;真正的成长了许多&#xff0c;成熟了许多。 只能说&#xff0c;希望&#xff0c;明天依旧美好&#xff01;&#xff01;&#xff01; &#x1f412;本篇博客使用到…