Rockchip Pinctrl 开发文档

2023-10-27

Rockchip Pinctrl 开发文档

前言

概述

本文介绍Rockchip PIN-CTRL驱动及DTS使用方法。

产品版本

芯片名称 内核版本
RK3568/RK3399/RK3368/RK3288/PX30/RK3128/RK3126/RV1126 Linux-4.19
RK3588/RV1106 Linux-5.10

引脚命名规则

Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序号(pin) 组成。

GPIO(通用输入输出)

  • 控制器和GPIO控制器数量一致
  • 端口固定 A、B、C和D
  • 索引序号固定 0、1、2、3、4、5、6、7

举例RK3588,从RK3588-TRM.pdf的Chapter 20 GPIO章节看到

There are five GPIOs (GPIO0 in PD_PMU,GPIO1/GPIO2/GPIO3/GPIO4 in PD_BUS)

有5个GPIO控制器,每个控制器可以控制32个IO,作为GPIO功能时,端口行为由GPIO控制器寄存器配置。

IOMUX(输入输出复用)

Rockchip Pin可以复用成多种功能,同一个控制器如果存在多种复用引脚,一般叫做m0、m1、m2等等,如I2C控制器有两组复用引脚,分别是2cm0、i2cm1。

引脚复用配置的寄存器是在GRF/PMUGRF(RK3588叫做IOC)。

举例RK3588 BUS_IOC_GPIO1B_IOMUX_SEL_H Address: Operational Base + offset (0x002C)

gpio1b7_sel
4’h0: GPIO
4’h2: MIPI_CAMERA2_CLK_M0
4’h3: SPDIF1_TX_M0
4’h4: PCIE30X2_PERSTN_M3
4’h5: HDMI_RX_CEC_M2
4’h6: SATA2_ACT_LED_M1
4’h9: I2C5_SDA_M3
4’ha: UART1_RX_M1
4’hb: PWM13_M2

如下是RK3588 I2C5的IOMUX:
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JI8tthxB-1688990103568)(./Rockchip_Developer_Guide_Linux_Pinctrl/I2C.png)]

多通路复用支持硬件设计更为灵活,当外设工作电压是1.8V或3.3V,可以选择不同电压域VCCIO的引脚。

注意:多通路复用的寄存器配置,对TX类的引脚没有用,对RX类的引脚起作用。

PULL(端口上下拉)

Rockchip IO PAD的bias一般支持3种模式

  • bias-disable
  • bias-pull-up
  • bias-pull-down

上下拉配置是作用于IO PAD,配置对GPIO/IOMUX都起作用。

DRIVE-STRENGTH(端口驱动强度)

Rockchip IO PAD的驱动强度,根据不同工艺,支持不同强度配置;RK3399之前的芯片,驱动强度配置按mA为单位配置,RK1808之后芯片,一般按照Level为单位,档位的数值即为寄存器配置值。

举例RK3588 TRM中GPIO0_C7的驱动强度等级如下:

gpio0c7_ds
GPIO0C7 DS control Driver Strength Selection
3’b000: 100ohm
3’b100: 66ohm
3’b010: 50ohm
3’b110: 40ohm
3’b001: 33ohm
3’b101: 25ohm

软件驱动依然按照Level来处理,即上述寄存器描述对应:

3’b000: Level0
3’b100: Level4
3’b010: Level2
3’b110: Level6
3’b001: Level1
3’b101: Level5

DTS中drive-strength=<5>;表示配置为Level5,即寄存器写3'b101

SMT(端口斯密特触发器)

Rockchip IO PAD大多数芯片支持SMT功能,默认不使能;使能SMT可以消除边沿抖动,加大VIH VIL的电压区间,增强IO的信号稳定性。一般I2C的SCL/SDA会默认使能SMT功能。

驱动介绍

Rockchip pinctrl驱动包括Pinctrl驱动(drivers/pinctrl/pinctrl-rockchip.c) 和 GPIO驱动(drivers/gpio/gpio-rockchip.c)。

Pinctrl驱动是主要驱动,提供IO的方法集,包括PINMUX、PINCONF 和 GPIO。

GPIO驱动是完成 gpiochip 的功能,包括 GPIO 和 IRQ。

pinctrl-rockchip

//TO-DO

gpio-rockchip

//TO-DO

DTS介绍

Rockchip dts一般把pinctrl节点放在soc.dtsi,例如rk3588s.dtsi,一般位于最后一个节点。

pinctrl节点没有reg,它不是一个标准platform device,寄存器基地值是通过rockchip,grf=<&grf>;传入;驱动内部根据这个基地值,加偏移地址,完成IOMUX、PINCONF的配置;GPIO是使用gpio节点的reg地址。

举例 arch/arm64/boot/dts/rockchip/rk3588s.dtsi

{
	pinctrl: pinctrl {
		compatible = "rockchip,rk3588-pinctrl";
		rockchip,grf = <&ioc>;
		#address-cells = <2>;
		#size-cells = <2>;
		ranges;

		gpio0: gpio@fd8a0000 {
			compatible = "rockchip,gpio-bank";
			reg = <0x0 0xfd8a0000 0x0 0x100>;
			interrupts = <GIC_SPI 277 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&cru PCLK_GPIO0>, <&cru DBCLK_GPIO0>;

			gpio-controller;
			#gpio-cells = <2>;
			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpio1: gpio@fec20000 {
			compatible = "rockchip,gpio-bank";
			reg = <0x0 0xfec20000 0x0 0x100>;
			interrupts = <GIC_SPI 278 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>;

			gpio-controller;
			#gpio-cells = <2>;
			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpio2: gpio@fec30000 {
			compatible = "rockchip,gpio-bank";
			reg = <0x0 0xfec30000 0x0 0x100>;
			interrupts = <GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&cru PCLK_GPIO2>, <&cru DBCLK_GPIO2>;

			gpio-controller;
			#gpio-cells = <2>;
			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpio3: gpio@fec40000 {
			compatible = "rockchip,gpio-bank";
			reg = <0x0 0xfec40000 0x0 0x100>;
			interrupts = <GIC_SPI 280 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>;

			gpio-controller;
			#gpio-cells = <2>;
			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpio4: gpio@fec50000 {
			compatible = "rockchip,gpio-bank";
			reg = <0x0 0xfec50000 0x0 0x100>;
			interrupts = <GIC_SPI 281 IRQ_TYPE_LEVEL_HIGH>;
			clocks = <&cru PCLK_GPIO4>, <&cru DBCLK_GPIO4>;

			gpio-controller;
			#gpio-cells = <2>;
			interrupt-controller;
			#interrupt-cells = <2>;
		};
	};
};

还有arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi文件通过include形式加到rk3588s.dtsi。

新建pinctrl

rk3588s-pinctrl.dtsi文件已经枚举了rk3588s芯片所有iomux的实例,各模块一般不再需要创建iomux实例;创建iomux实例需要遵循如下规则:

  1. 必须在pinctrl节点下

  2. 必须以function+group的形式添加

  3. function+group的格式如下

    function {
    	group {
    		rockchip,pin = <bank gpio func &ref>;
    	};
    };
    
  4. 遵循其他dts的基本规则

引用pinctrl

模块引用pinctrl是通过 pinctrl-namespinctrl-0连接模块和pinctrl驱动。

举例 rk3588 uart2:

{
	uart2: serial@feb50000 {
		compatible = "rockchip,rk3588-uart", "snps,dw-apb-uart";
		reg = <0x0 0xfeb50000 0x0 0x100>;
		interrupts = <GIC_SPI 333 IRQ_TYPE_LEVEL_HIGH>;
		clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>;
		clock-names = "baudclk", "apb_pclk";
		reg-shift = <2>;
		reg-io-width = <4>;
		dmas = <&dmac0 10>, <&dmac0 11>;
		pinctrl-names = "default";
		pinctrl-0 = <&uart2m1_xfer>;
		status = "disabled";
	};
};

uart2m1_xfer是一个pinctrl group;模块可以同时引用多组group.

举例 rk3588 pdm1:

{
	pdm1: pdm@fe4c0000 {
		compatible = "rockchip,rk3588-pdm";
		reg = <0x0 0xfe4c0000 0x0 0x1000>;
		clocks = <&cru MCLK_PDM1>, <&cru HCLK_PDM1>;
		clock-names = "pdm_clk", "pdm_hclk";
		assigned-clocks = <&cru MCLK_PDM1>;
		assigned-clock-parents = <&cru PLL_AUPLL>;
		dmas = <&dmac1 4>;
		dma-names = "rx";
		power-domains = <&power RK3588_PD_AUDIO>;
		pinctrl-names = "default";
		pinctrl-0 = <&pdm1m0_clk
			     &pdm1m0_clk1
			     &pdm1m0_sdi0
			     &pdm1m0_sdi1
			     &pdm1m0_sdi2
			     &pdm1m0_sdi3>;
/* 等同于如下写法 */
/*
 *		pinctrl-0 = <&pdm1m0_clk>,
 *			        <&pdm1m0_clk1>,
 *			        <&pdm1m0_sdi0>,
 *			        <&pdm1m0_sdi1>,
 *			        <&pdm1m0_sdi2>,
 *			        <&pdm1m0_sdi3>;
 */
		#sound-dai-cells = <0>;
		status = "disabled";
	};
};

pinctrl-names可以支持多个实例,pinctrl 默认的有4种实例(state):

#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"

“init” 在driver probe期间生效,probe done之后可能会切换回 “default”(如果probe中切换到其他state,就不会切换回 “init”)。

pinctrl-names 是可以自定义的,有driver去匹配解析。

举例 rk3588 pwm4:

{
	pwm4: pwm@febd0000 {
		compatible = "rockchip,rk3588-pwm", "rockchip,rk3328-pwm";
		reg = <0x0 0xfebd0000 0x0 0x10>;
		#pwm-cells = <3>;
		pinctrl-names = "active";
		pinctrl-0 = <&pwm4m0_pins>;
		clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>;
		clock-names = "pwm", "pclk";
		status = "disabled";
	};
};

FAQ

用户层配置IOMUX

iomux是gcc编译的二进制文件,通过ioctl调用rockchip-pinctrl device,设置iomux,也可以获取iomux当前值。

编译方法:

gcc tools/testing/selftests/rkpinctrl/iomux.c -o iomux

使用方法:

举例:设置 GPIO0_B7 为 func1

[root@RK3588:/]# iomux 0 15 1

举例:获取 GPIO0_B7 当前iomux值

[root@RK3588:/]# iomux 0 15
mux get (GPIO0-15) = 1

配置某个GPIO电平

有个别需求是某个GPIO不属于某个特定模块,更多是某个电源开关,希望在系统开机过错尽快输出高或低电平,要怎么实现呢?

使用"regulator-fixed"

regulator-fixed通常用于定义电压固定的regulator,或由某个GPIO开关控制的regulator。

/以GPIO2_A1需要配置为高电平为例

/ {
	foo_name: foo-name {
		compatible = "regulator-fixed";
		pinctrl-names = "default";
		pinctrl-0 = <&gpio_foo>;
		regulator-name = "vcc-foo";
		regulator-always-on;
	};
};

&pinctrl {
	gpio-foo {
		gpio_foo: gpio-foo {
			rockchip,pins = <2 RK_PA1 RK_FUNC_GPIO &pcfg_output_high>;
		};
	};
};

模块的pinctrl-0不生效

通常模块调用pinctrl-names pinctrl-0配置默认的IOMUX或在IOCONFIG,但不是所有的节点都可以加这两个属性,如果模块被driver_probe_device调用,它就可以加这两个属性。

调试方法:drivers/base/dd.c的pinctrl_bind_pins,在这里加打印看调用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rockchip Pinctrl 开发文档 的相关文章

  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 欧几里得空间——正交矩阵

    设与是欧氏空间V在的两组标准正交基 它们之间的过渡矩阵是即
  • Chrome浏览器Cookie解密

    做过 web 开发的都知道 浏览器会把重要的认证登录认证信息存放到 cookie 中 在 cookie 有效期内 再次访问这个网站的时候就可以直接从 cookie 中获取到登录信息 这样就可以实现自动登录 但仅仅知道知道这些肯定不能满足很多
  • x-www-form-urlencoded到底是什么?

    概述 x www form urlencoded纸面翻译即所谓url格式的编码 是post的默认Content Type 其实我觉得可以认为get和post的默认表单数据传递格式都一样 只是一个在url地址后面加 再加表单数据 另一个是把表
  • docker内的容器如何与宿主机共享IP

    问题 有个项目里面需要将一些服务打包到docker镜像中 打包完成后 发现有些服务有问题 主要集中在一些端侧设备接入用的服务 主要是工业相机 相机扫描不到 原因 当Docker进程启动时 会在主机上创建一个名为docker0的虚拟网桥 此主
  • Linux-C基础知识学习:C语言作业-用for循环完成:输入10个数,求它们的和并输出

    Linux基础知识学习 C语言作业 用for循环完成 输入10个数 求它们的和并输出 用for循环完成 输入10个数 求它们的和并输出 include
  • 详解Java虚拟机内存各个区域

    1 概述 对于java程序员来说 不必手动写代码去管理内存 因为虚拟机的自动内存管理机制会帮我们做 但是一旦出现内存泄漏和溢出方面的问题 如果不了解虚拟机是怎样使用内存的话 那么排查错误将会变得困难 2 运行时数据区域 Java虚拟机在执行
  • Linux安装 zabbix

    zabbix监控安装 1 准备环境 IP地址查看 ifconfig eth0 awk NR 2 print 2 关闭selinux getenforce 2 zabbix server内存尽量大点 4G更好 3 安装Zabbix存储库 清除
  • leaflet 笔记1 marker点高亮显示

    Leaflet 笔记八 marker高亮显示 这个plugin主要是为了方便实现marker的高亮显示 安装 该库已经发布到npmjs上 所以安装非常简单 npm install leaflet marker highlight save
  • web 摄像头拍照并上传

    通过2天的查找资料 终于找到了 摄像头拍照的方法并调试成功 在ie 及火狐等浏览器测试通过 ie 拍照 服务端存储照片 现在分享下经验 1 js控件 jQuery webcam plugin 官网 http www xarg org pro
  • 华为交换机配置SSH远程登录

    连接console线直接配置 1 在服务器端生成本地密钥对
  • Nginx主备模式配置

    Nginx主备模式配置 配置示例 参数解释 配置示例 upstream tomcatserver server ip 8780 max fails 2 fail timeout 30s server ip 8068 max fails 2
  • 计算机网络教程_第二章物理层_整理与复习

    计算机网络教程 第一章 概述 第二章 物理层 第三章 数据链路层 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 计算机网络教程 1 物理层的作用及主要任务 2 数据传输的方式 并行 串行 异步 同步 P40 3
  • 《区块链技术与应用》公开课系列笔记——目录导航页

    目录 区块链技术与应用 公开课笔记1 课程介绍 click here 比特币 BTC 篇 已全部更新完成 区块链技术与应用 公开课笔记2 BTC密码学原理 click here 区块链技术与应用 公开课笔记3 BTC数据结构 click h
  • 【重复图识别】在茫茫图海中,怎么找到相同的它?

    转载请标名出处 背景 在一些图像相关的项目中 重复图识别是很重要的 就比如热图排行榜 需要识别出重复图 涉及图像深度学习的项目 训练数据需要剔除重复图 图片原创 视频原创 需要识别出重复图 等等 什么是相同图片 什么是相同图片 相信在不同场
  • typeAliases中package标签的用法

  • 基于视觉的机器人抓取-综述

    基于视觉的机器人抓取 综述 论文 总结 图例 论文 Vision based Robotic Grasping From Object Localization Object Pose Estimation to Grasp Estimat
  • 解决Uncaught (in promise) TypeError: Object(...) is not a function报错

    今天搬砖的时候遇到一个报错 问题 Uncaught in promise TypeError Object is not a function 如图所示 原因 经过排查 发现原因是导入的JS方法没有用大括号接收 然后又把它当做方法调用了 低
  • SimpleFOC之ESP32(九)—— WIFI、UDP和TCP

    目录 说明 一 网络通信 1 1 准备工作 1 2 UDP通信 1 3 TCP通信 二 硬件准备 三 代码参考 四 代码演示 4 1 WIFI AP模式UDP通信 4 2 WIFI STA模式TCP client通信 五 UDP通信控制电机
  • Leetcode日练4 #34 search for a range

    第三种二分法是要求当下算出中值的左右相邻的值 也就是说每一次都要判别至少3个值 最后是应该剩两个值 34 Search for a Range Given an array of integers nums sorted in non de
  • Rockchip Pinctrl 开发文档

    Rockchip Pinctrl 开发文档 前言 概述 本文介绍Rockchip PIN CTRL驱动及DTS使用方法 产品版本 芯片名称 内核版本 RK3568 RK3399 RK3368 RK3288 PX30 RK3128 RK312