1. 程式人生 > >linux裝置樹中pinctrl的配置(下)

linux裝置樹中pinctrl的配置(下)

上一篇記錄了裝置樹檔案中管腳普通配置的查詢與確定,這篇介紹一下特殊的配置。

首先還是先看程式碼,看看到底特殊到哪裡。

<span style="font-size:14px;">		pinctrl_gpio_leds: gpioledsgrp {
			fsl,pins = <
				MX6QDL_PAD_DISP0_DAT21__GPIO5_IO15	0x80000000
			>;
		};

		pinctrl_i2c2: i2c2grp {
			fsl,pins = <
				MX6QDL_PAD_EIM_EB2__I2C2_SCL	0x4001b8b1
				MX6QDL_PAD_KEY_ROW3__I2C2_SDA	0x4001b8b1
			>;
		};</span>

可以看出來特殊的配置就是後面的值也就是上一篇講的config(pad_ctrl)的值改變了,變為0x80000000和0x4001b8b1了,當我們查詢相應的pad值時是這樣的:


這明顯不和常理,在上圖中顯示高15位全部置0,取值也沒啥用,那麼為什麼設定為0x80000000和0x4001b8b1呢?在網上搜羅一番沒有任何有幫助的文件,只能靠自己了。還是老思路,查詢裝置樹檔案的讀取原始碼,linux-3.18.22/drivers/pinctrl/freescale/pinctrl-imx.c中,找到了驚喜!!!程式碼如下

<span style="font-size:14px;">/* The bits in CONFIG cell defined in binding doc*/
#define IMX_NO_PAD_CTL	0x80000000	/* no pin config need */
#define IMX_PAD_SION 0x40000000		/* set SION */</span>
再將IMX_NO_PAD_CTL使用部分的程式碼貼上(隨便找一處)
<span style="font-size:14px;">	for (i = j = 0; i < grp->npins; i++) {
		if (!(grp->pins[i].config & IMX_NO_PAD_CTL)) {
			new_map[j].type = PIN_MAP_TYPE_CONFIGS_PIN;
			new_map[j].data.configs.group_or_pin =
					pin_get_name(pctldev, grp->pins[i].pin);
			new_map[j].data.configs.configs = &grp->pins[i].config;
			new_map[j].data.configs.num_configs = 1;
			j++;
		}
	}</span>
可以看出來確實如註釋(/* no pin config need */)所述,表示該管腳的配置config(pad_ctrl)無效,或者說不需要。

同理0x40000000表示設定了SION。但是0x4001b8b1表示什麼意思呢,從上一個註釋(/* The bits in CONFIG cell defined in binding doc*/)可以找到方向,即取binding doc中找,所以開啟linux-3.18.22/Documentation/devicetree/bindings/pinctrl目錄下的fsl,imx6dl-pinctrl.txt檔案,裡面有關於SION的介紹,如下:


再從晶片的參考手冊中查閱可知,SION就相當於一個標誌為(第30位),去掉這一位後config=0x1b8b1,這個值就是從pad_ctrl一節找到的,具體可以參見上一篇關於第6個引數的確定方法。