1.文件
1.1引脚功能定义
vendor/nxp-opensource/kernel_imx/include/dt-bindings/pinctrl/pins-imx8mm.h
1.2 imx8m芯片数据手册
iMX_8M_Mini_RM_RevB.pdf
2. Pinctrl
飞思卡尔的io配置与全志、瑞芯微做法有点不同。
飞思卡尔的pinctrl注册时的格式为:<mux_reg conf_reg input_reg mux_val input_val pad_val >
其中,
mux_reg:复用寄存器地址
conf_reg:配置寄存器地址
input_reg:输入寄存器地址
mux_val:复用寄存器值
input_val:输入寄存器值
pad_val:管脚速率、开漏等功能选择
例如:
上述方框内最后形成 0x1F0 0x458 0x000 0x0 0x0 0x19
对应格式<mux_reg conf_reg input_reg mux_val input_val pad_val >
3. 举例
3.1 设备树
leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_gpio_led>;
led0: cpu {
label = "cpu";
gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;
default-state = "on";
linux,default-trigger = "heartbeat";
};
led1: user {
label = "user";
gpios = <&gpio5 4 GPIO_ACTIVE_LOW>;
default-state = "on";
};
};
pinctrl_gpio_led: gpioledgrp {
fsl,pins = <
MX8MM_IOMUXC_SPDIF_RX_GPIO5_IO4 0x19
MX8MM_IOMUXC_SPDIF_TX_GPIO5_IO3 0x19
>;
};
3.2. 推导
例如 MX8MM_IOMUXC_SPDIF_RX_GPIO5_IO4 0x19
即
0x1EC 0x454 0x000 0x5 0x0 0x19
3.2.1 确定IO
从原理图设计中,一定可以知道使用芯片的哪一个管脚,这里是GPIO5_IO[4]
3.2.2 确定芯片手册中的mux_reg寄存器
从iMX_8M_Mini_RM_RevB.pdf中搜索关键字,GPIO5_IO[4]
可以找到
这里找到了 GPIO5_IO[4] 对应的MUX寄存器 IOMUXC_SW_MUX_CTL_PAD_SPDIF_RX
可得出 mux_reg = 0x1EC
3.2.3 确定芯片手册中的conf_reg寄存器
从iMX_8M_Mini_RM_RevB.pdf中搜索关键字,SPDIF_RX,该关键字是从IOMUXC_SW_MUX_CTL_PAD_SPDIF_RX 得出。
搜索找到了IOMUXC_SW_PAD_CTL_PAD_SPDIF_RX
可得出 conf_reg = 0x454
3.2.4. 确定芯片手册中的input_reg寄存器
从iMX_8M_Mini_RM_RevB.pdf中翻看 第8章里面的IOMUXC节部分,这部分有SELECT_INPUT寄存器。
但是这些SELECT_INPUT 中没有SPDIF_RX 、GPIO5_IO[4]关键字,所以对于GPIO5_IO[4]没有input_reg寄存器,于是
input_reg = 0x0
3.2.5 确定芯片手册中的mux_val
从mux_reg寄存器的内容中选择对应的功能,选择ALT5功能。
于是 mux_val = 0x05
3.2.6 确定芯片手册中的input_val
因为不存在input_reg寄存器,所以填写0,
input_value = 0x0
3.2.7. 确定芯片手册中的pad_val
从conf_reg寄存器的内容中选择对应的功能。
例如选择
00X X1 — Drive strength X1
1X FAST — Select fast slew rate (SR=0)
那么
pad_val = 00011001 = 0x19
pad_val = PAD_CTL_SRE_MAX | PAD_CTL_DSE_255
3.2.8. 综述
mux_reg = 0x1EC
conf_reg = 0x454
input_reg = 0x0
mux_val = 0x05
input_value = 0x0
pad_val = 0x19
0x1EC 0x454 0x0 0x05 0x0 0x19
快捷方法
以上的推导只是配置参数上推导出寄存器数据,不过通常直接使用pins-imx8mm.h 中定义好的管脚配置,这样既快速又正确。
- 原理图找到gpio 号 :GPIO5_IO[4]
- 在数据手册iMX_8M_Mini_RM_RevB.pdf中查找GPIO5_IO[4]
- 找到寄存器的名称 IOMUXC_SW_MUX_CTL_PAD_SPDIF_RX
- vendor/nxp-opensource/kernel_imx/include/dt-bindings/pinctrl/pins-imx8mm.h 中搜寻SPDIF_RX 与 GPIO5_IO4 即可找出MX8MM_IOMUXC_SPDIF_RX_GPIO5_IO4