一、6ull 的 gpio 使用步骤
- 1、设置 pin 的 复用 和 电气属性(通过 pinctrl 子系统 )
- 2、配置 gpio 的输入输出,高低电平(通过 GPIO子系统)
二、pinctrl子系统
- 借助
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 节点 首地址 为 0x020e0000 ,0x0090 是偏移地址,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>

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

被折叠的 条评论
为什么被折叠?



