设备树中的pin 信息,是在什么时候被初始化的?

一、开发环境

  • SOC : IMX6ULL
  • 系统内核:4.1.15

二、问题描述

Linux 内核提供了pinctrl 和gpio 子系统用于GPIO 驱动。pinctrl_ctrl 子系统从设备树中获取pin 信息,然后配置pin复用 和pin电气特征(上/下拉,速度,驱动能力等)。

如下是一个led 在设备树中的pin信息:

pinctrl_led:ledgrp{
			fsl,pins = <
			MX6UL_PAD_GPIO1_IO03__GPIO1_IO03  0x10B0
			>
		};

我们在设备树中添加了pin 信息,但是我们写设备驱动程序的时候,并没有调用API 去初始化pin,在哪个阶段,初始化了pin 信息呢?

三、过程分析

我们将GPIO1 IO03 这个IO 用于led 控制,来进行这个过程的说明。

3.1 I.MX6U IO

I.MX6U IO 分为两个域

  • IOMUXC_SNVS ( SNVS 域)
  • IOMUXC (通用域)

IOMUXC 域的设备树描述

iomuxc 在 设备树头文件 imx6ull.dtsi 的描述如下:

iomuxc: iomuxc@020e0000 {
				compatible = "fsl,imx6ul-iomuxc";
				reg = <0x020e0000 0x4000>;
			};

3.2 pin 信息

GPIO1 IO03 这个IO 属于 IOMUXC (通用域),pin 信息要添加在 设备树 IOMUXC 节点里面,作为子节点。

在这里插入图片描述

3.3 IOMUXC 对应的驱动程序

Linux 内核根据 IOMUXC 的compatible 属性值查找IOMUXC 的驱动程序,找到 imx6ul_pinctrl_driver 这个驱动,这个驱动of_match 表中的compatible 属性值与IOMUXC 的compatible 值一致。源码在pinctrl-imx6ul.c 中。

imx6ul_pinctrl_driver 是platform 框架下的设备驱动程序,当设备和驱动匹配的时候,probe 函数会执行。

3.4 imx6ul_pinctrl_probe

static struct platform_driver imx6ul_pinctrl_driver = {
	.driver = {
		.name = "imx6ul-pinctrl",
		.owner = THIS_MODULE,
		.of_match_table = of_match_ptr(imx6ul_pinctrl_of_match),
	},
	.probe = imx6ul_pinctrl_probe,
	.remove = imx_pinctrl_remove,
};

从 imx6ul_pinctrl_probe 逐层查看源码实现,发现最终是在 imx_pinctrl_probe_dt 函数负责读取pin 信息,并通过pinctrl_register 注册到系统。

在这里插入图片描述

四、结论

在系统启动过程中,当pinctrl 驱动程序和设备树中的设备节点匹配时,pinctrl 驱动程序的probe 函数会执行,完成pin 信息的初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdut_llkkyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值