45 pinctrl子系统 和 gpio子系统

本文详细介绍了6ull平台的GPIO与Pinctrl子系统的使用方法,包括配置pin的复用和电气属性,利用GPIO子系统进行输入输出设置等。同时提供了具体的设备树修改示例和驱动编写指南。

一、6ull 的 gpio 使用步骤

  • 1、设置 pin 的 复用 和 电气属性(通过 pinctrl 子系统
  • 2、配置 gpio 的输入输出,高低电平(通过 GPIO子系统

二、pinctrl子系统

pinctrl 和 gpio 子系统详解

  • 借助 pinctrl子系统 来设置一个 pin 的 复用电气属性
    打开文件 imx6ull.dtsi
// 详见 imx6ull.dtsi 参考手册 176,1542
iomuxc: iomuxc@020e0000 {
   
       // 这个结点表示 IO控制器 外设
		// compatible属性用来匹配pinctrl驱动
		compatible = "fsl,imx6ul-iomuxc";
		// 此为寄存器地址范围,此地址范围的寄存器控制每个 pin 的复用和电气属性
		// 基地址,大小
		reg = <0x020e0000 0x4000>;  
};
// gpr 控制器,详见 imx6ull.dtsi 参考手册 1475
gpr: iomuxc-gpr@020e4000 {
   
   
		compatible = 	"fsl,imx6ul-iomuxc-gpr",
						"fsl,imx6q-iomuxc-gpr", "syscon";
		reg = <0x020e4000 0x4000>;
};

 ......
// iomuxc_snvs 控制器,详见 imx6ull.dtsi 参考手册 1495
iomuxc_snvs: iomuxc-snvs@02290000 {
   
   
		compatible = "fsl,imx6ull-iomuxc-snvs";
		reg = <0x02290000 0x10000>;
};
  • 打开 imx6ull-alientek-emmc.dts 文件:
// 对节点 iomuxc 进行追加
// 追加方式:&标签名
&iomuxc {
   
   
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_hog_1>;
	imx6ul-evk {
   
     // evk 是官方开发板
		pinctrl_hog_1: hoggrp-1 {
   
   
			fsl,pins = <
				MX6UL_PAD_UART1_RTS_B__GPIO1_IO19	0x17059 /* SD1 CD */
				MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT	0x17059 /* SD1 VSELECT */
				MX6UL_PAD_GPIO1_IO09__GPIO1_IO09        0x17059 /* SD1 RESET */
			>;
		};

		...

		

		pinctrl_i2c2: i2c2grp {
   
   
			fsl,pins = <
				MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x4001b8b0
				MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x4001b8b0
			>;
		};

		pinctrl_lcdif_dat: lcdifdatgrp {
   
   
			fsl,pins = <
				MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79
				MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79
				...
			>;
		};

		...
	};
};
  • pinctrl 子系统就是:创建一个 设备子节点 ,然后 将此设备所用 pin 的配置信息 都放到 这个子节点 里面
    注意格式:存放 pin 配置信息的 属性名 一定要是 fsl,pins

  • 如何添加 一个 pin 的配置信息
    MX6UL_PAD_UART1_RTS_B__GPIO1_IO19

fsl,pins = <
				MX6UL_PAD_UART1_RTS_B__GPIO1_IO19	0x17059 /* SD1 CD */
				MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT	0x17059 /* SD1 VSELECT */
				MX6UL_PAD_GPIO1_IO09__GPIO1_IO09        0x17059 /* SD1 RESET */
			>;

imx6ul-pinfunc.h 中找到

/*
 * The pin function ID is a tuple of
 * <mux_reg conf_reg input_reg mux_mode input_val>
 */

#define MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x0090 0x031C 0x0000 0x5 0x0

mux_reg conf_reg input_reg mux_mode input_val
0x0090 0x031C 0x0000 0x5 0x0

iomuxc 节点 首地址0x020e00000x0090 是偏移地址,UART1_RTS_B 绝对地址为 0x020e0090(imx6ull参考手册 1581)
muxmode:5 表示复用为 GPIO1_IO19
在这里插入图片描述
conf_reg:0x031C,相对于基地址的偏移,0x020e0000 + 0x031c = 0x020e031c ,这个地址寄存器是 UART1_RTS_B电气属性配置寄存器0x17059 是写给此寄存器来配置电气属性
input_reg :0,偏移为 0,表示 UART1_RTS_B 这个 pin 没有 input 功能
input_val:0,写给 input_reg 寄存器的值,但是这个 pin 没有

  • pinctrl 驱动工作原理简介
    如何找到 imx6ull 对应的 pinctrl 子系统驱动(半导体厂商写好的)
    使用 节点的 compatible 属性
    驱动文件里面有一个描述 驱动兼容性 的内容,当设备树节点的 compatible 属性驱动里面的兼容性(也是字符串)匹配时,就表示设备和驱动匹配了,表示设备可以使用该驱动文件
    所以只需要全局搜索设备节点里面的 compatible 属性的值 即可找到那个文件,为 /driver/pinctrl/freescale/pinctrl-imx6ul.c,注意其中的 of_device_id 结构体
static struct of_device_id imx6ul_pinctrl_of_match[] = {
   
   
	{
   
    .compatible = "fsl,imx6ul-iomuxc", .data = &imx6ul_pinctrl_info, },
	{
   
    .compatible = "fsl,imx6ull-iomuxc-snvs", .data = &imx6ull_snvs_pinctrl_info, },
	{
   
    /* sentinel */ }
};

因此设备树中的对应节点使用的驱动是此文件
当驱动和设备节点匹配以后,会执行 probe类 函数 :imx6ul_pinctrl_probe

三、gpio 子系统

  • 使用 gpio 子系统 来操作 gpio
&usdhc1 {
   
   
	pinctrl-names = "default", "state_100mhz", "state_200mhz";
	pinctrl-0 = <&pinctrl_usdhc1>;  // 此设备相关的io有这3个
	pinctrl-1 = <&pinctrl_usdhc1_100mhz>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值