一、Pin Controller主要工作
- pin multiplexing:基于ARM core的嵌入式處理器一般會提供豐富的功能,例如camera interface、LCD interface、USB、I2C、SPI等等。雖然處理器有幾百個pin,但是這些pin還是不夠配置設定,是以有些pin需要複用。
- pin configuration:這些配置參數包括:pull-up/down電阻的設定, tri-state設定,drive-strength的設定。
注:每個pin controller在dts中應該隻表示一個node,詳見dts。
二、以 imx6qp.dts
配置UART為例
imx6qp.dts
/* UART devices*/
&uart1 {
pinctrl-names = "default";
pinctrl- = <&pinctrl_uart1>;
status = "okay";
};
pinctrl_uart1: uart1grp {
fsl,pins = <
MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA
MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA
>;
};
在
<Kernel_Dir>arch\arm\boot\dts\imx6q-pinfunc.h
中對上述宏的定義如下:
//<mux_regconf_reginput_regmux_modeinput_val>
#define MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x280 0x650 0x000 0x3 0x0
#define MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x284 0x654 0x8fc 0x3 0x1
其中
MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA
每個值的定義如下:
- mux_reg: mux_ctrl_ofs = 0x284;
- conf_reg: pad_ctrl_ofs = 0x654;
- input_reg: sel_input_ofs = 0x8fc;
- mux_mode = 0x3;
- sel_input:input_value = 0x1;
- pad_ctrl = 0x1b0b1l;
具體值定義的解釋如下:
參數 | 含義 |
---|---|
_mux_ctrl_ofs | MUX控制寄存器的偏移位址(16進制), 用于選擇引腳的功能 |
_pad_ctrl_ofs | 控制寄存器的偏移位址(16進制) |
_select_input_ofs | SELECT_INPUT寄存器偏移位址(16進制) |
_mux_mode | MUX模式,bit0~3,範圍0~7 |
_select_input | Daisy Chain模式, bit0~1,範圍0~3 |
_pad_ctrl | 控制寄存器的值 |
三、查找對應的寄存器的值
我們隻知道在硬體電路上使用了uart1來做為調試口,使用了
CSI0_DAT10(TX)
和
CSI0_DAT11(RX)
兩個管腳。此處以配置
CSI0_DAT11
腳為uart1的RX功能為例。
檢視晶片手冊”iMX6DQPRM.pdf”引腳複用以及配置的功能在”External Signals and Pin Multiplexing”章節都能夠索引到。步驟如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQ3chVEa0V3bT9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVP9EVT4FkaNxGZXlVeWNjYqVzVaZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TNyYTMwEDN1EzMxgDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
1、在Pin Assignments中可以找到配置 CSI0_DAT11
引腳對應的寄存器
CSI0_DAT11
從中我們知道,要配置該引腳為
UART1_RX_DATA
功能,那麼需要設定
Mode=ALT3
,與之對應的寄存器為
SW_PAD_CTL_PAD_CSI0_DATA11
。
2、SW_PAD_CTL_PAD_CSI0_DATA11寄存器
從上面的資訊可知,這個寄存器的
offset=0x654
,複位後的
config=0x0001b01b0
。
是以,我們就知道在dts中需要填入以下資訊。
conf_reg: pad_ctrl_ofs = 0x654;
pad_ctrl = 0x1b0b0+0x01(Set SRE=1) = 0x1b0b1;
3、查找 CSI0_DAT11
引腳複用的資訊
CSI0_DAT11
回到”External Signals and Pin Multiplexing”章節,在Muxing Options 中找到配置
CSI0_DAT11
引腳複用的資訊,需将
ALT3
帶入查找。
可知我們需要配置兩個寄存器:
IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA11
IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT
4、IOMUXC_SW_MUX_CTL_PAD_CSI0_DATA11寄存器
從上面的資訊可知,這個寄存器的
offset=0x284
,想要使用
UART1_RX_DATA
的功能,需要設定
MUX_MODE=ALT3=011
,是以dts需做如下配置:
mux_reg: mux_ctrl_ofs = 0x284;
mux_mode = 0x3;
5、IOMUXC_UART1_UART_RX_DATA_SELECT_INPUT寄存器
從上面的資訊可知,這個寄存器的
offset=0x920
,想要使用
UART1_RX_DATA
的功能,需要設定
DAISY=01
,是以dts需做如下配置:
input_reg: sel_input_ofs = 0x920;
sel_input:input_value = 0x1;
至此,dts中關于
CSI0_DAT11
引腳配置為
UART1_RX_DATA
功能的配置就完成了。
PINS-TOOL-IMX
FSL 為i.MX6系列晶片的引腳配置提供了一個PINS-TOOL-IMX的軟體,可以在下面的路徑下載下傳:
http://www.nxp.com/products/software-and-tools/software-development-tools/processor-expert-and-embedded-components/software-suites/pins-tool-for-i.mx-application-processors:PINS-TOOL-IMX
參考資料
1、Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
2、Documentation/pinctrl.txt
3、http://blog.csdn.net/michaelcao1980/article/details/50730421