基於飛凌 NXP IMX6X平臺細說GPIO複用-

本文簡單介紹一下GPIO的複用,配置GPIO的方式多種多樣,本文只介紹經過IOMUX的方式配置GPIO,主要適用於飛凌 OKMX6Q-CV1.3 平臺Linux4.1.15操做系統,其餘平臺也能夠參考,可是不一樣平臺之間會存在差別,需客戶自行修改以適應本身的使用。html

1、使用IOMUX方式配置GPIO

1. 以底板上UART2_TX引腳爲例,能夠看到該引腳目前的功能是串口功能,將該引腳複用爲GPIO使用,在飛凌提供的硬件手冊中能夠查看到該引腳對應的padname爲EIM_D26。linux


f_bc6019a398efc583e247428f3d0d3cc7&t=jpg&o=&s=&v=1583564599

 

2.在內核源碼linux4.1.15/arch/arm/boot/dts/imx6q-pinfunc.h中搜索EIM_D26能夠看到以下宏定義:ide


f_3b698584a12e04e0c3ba7ef09a6117eb&t=png&o=&s=&v=1583564588


其中spa

#define  操作系統

0x0bc 0x3d0 0x0003d

MX6QDL_PAD_EIM_D26__GPIO3_IO26orm

0x5 0x0htm

爲該引腳做爲GPIO的定義開發

 

3. 在linux4.1.15/arch/arm/boot/dts/imx6qdl-sabresd.dtsi設備樹中從新配置該引腳,首先搜EIM_D26找到相關的引腳配置,能夠看到原有功能是被配置成爲串口功能:get

 

pinctrl_uart2:uart2grp {

fsl,pins= <

MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1

MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1

>;

};

&uart2{

pinctrl-names= "default";

pinctrl-0= <&pinctrl_uart2>;

status= "okay";

};

將status= "okay"修改成:status= "disabled"

&uart2{

pinctrl-names= "default";

pinctrl-0= <&pinctrl_uart2>;

status= "disabled";

};

 

以上修改是關閉串口功能的調用,而後接着添加該引腳GPIO功能的配置:

 

f_f066bc38faa9b162be3606f0aa9d3403&t=png&o=&s=&v=1583564577  

以上修改完成後,從新編譯,並將新生成的鏡像燒寫到開發板上便可。

引腳複用的原則是:在設備樹中添加想要實現的該引腳的功能,並把之前的複用功能去掉,無複用功能直接添加便可。

 2、文件系統的操做

以上操做完成了內核中的引腳複用的配置,下面咱們看一下應用中怎麼操做;開發板啓動後能夠在文件系統中執行如下操做。

 

❶ 計算對應 sys/class/gpio 的值 GPIOn_IOx = (n-1)*32 + x  

那麼GPIO3_IO26=(3-1)*32+26=90

 

❷  將 GPIO3_IO26 設置爲輸出。

echo 90 > /sys/class/gpio/export 用於通知系統須要導出控制的GPIO 引腳編號

 

❸ 將該引腳設置爲輸出

echo out > /sys/class/gpio/gpio90/direction 將GPIO設置爲輸出

 

❹ 設置輸出引腳的電平

echo 1 >/sys/class/gpio/gpio90/value 輸出爲高電平

echo 0> /sys/class/gpio/gpio90/value 輸出爲低電平

設置高電平或者是低電平後,可以使用萬用表測量一下該引腳的具體電平值。

 

❺ 取消該引腳的導出

echo 90 > /sys/class/gpio/unexport 通知系統取消導出

 

❻ 將 該引腳設置爲輸入

echo 90 > /sys/class/gpio/export 用於通知系統須要導出控制的GPIO 引腳編號

echo in> /sys/class/gpio/gpio90/direction 將GPIO設置爲輸入這時給該引腳接高電平,輸入即爲高電平,反之爲低電平

設置爲輸入模式能夠經過cat /sys/class/gpio/gpio90/value 命令查看當前值

 

以上是一個引腳功能複用的整個過程,下面簡單介紹一下一些參數的配置。  

3、對一些參數的解讀

在imx6q-pinfunc.h中


#define 

0x0bc0x3d0 0x000 0x5 0x0

MX6QDL_PAD_EIM_D26__GPIO3_IO26



這5個值得含義,已經作了解釋

/* The pin function ID is a tuple of

 * <mux_reg conf_reg input_reg mux_mode input_val>*/

在imx6qdl-sabresd.dtsi中也有一個值得設置:

MX6QDL_PAD_EIM_D26__GPIO3_IO26  0x30b0

以上這6個參數有如下對應關係:


0x0bc

0x3d0

0x000

0x5

0x0

0x30b0

mux_reg_ofs

conf_reg_ofs

input_reg_ofs

mux_mode

input_val

pad_ctrl


這些參數的具體值是根據CPU手冊的IOMUX章節查找配置的。


1. 肯定mux_reg_ofs的值

在CPU手冊中搜索padname, EIM_D26引腳在CPU手冊中是EIM_DATA26,以下圖紅色方框圈出的偏移地址就是mux_reg_ofs的值。

 

f_a1e5a47d867fa8a0d0f5c09dc50affe5&t=png&o=&s=&v=1583564566

 

2. 肯定conf_reg_ofs的值

搜索EIM_DATA26,下圖紅色方框圈出的偏移地址即爲該值。

 

f_5bf0bc67ed582c0db5064b5a6e2d55a4&t=png&o=&s=&v=1583564542

 

3. 肯定input_reg_ofs的值

iMX6Q  CPU手冊中沒有該引腳做爲gpio時對應的input配置,因此是0x000,那麼對應的input_val,該值也爲0x0。

 

4.肯定mux_mode的值

搜索IOMUXC_SW_MUX_CTL_PAD_EIM_DATA26,能夠看到該值是0x5。

 

f_380186f09f73f2b14d42c6e05bed0832&t=png&o=&s=&v=1583564534

  

5. 肯定pad_ctrl的值

搜索IOMUXC_SW_PAD_CTL_PAD_EIM_DATA26,能夠看到該寄存器的各個位的含義,根據本身的實際狀況來肯定該值,該寄存器位數較多沒有截全,請自行查看CPU手冊。


f_3090279e846b55175cfe3b62516491ed&t=png&o=&s=&v=1583564521

 

以上是小編對 GPIO複用 的一些淺顯的理解,但願對您有所幫助。小編水平有限可能會存在一些紕漏,敬請諒解。對於更深刻的知識,若是您想了解能夠結合CPU手冊以及源代碼自行研究,有什麼好的看法也能夠給咱們一塊分享,很是感謝您的閱讀。


原文連接:https://www.forlinx.com/article_view_291.html

相關文章
相關標籤/搜索