本文簡單介紹一下GPIO的複用,配置GPIO的方式多種多樣,本文只介紹通過IOMUX的方式配置GPIO,主要適用於飛凌 OKMX6Q-CV1.3 平臺Linux4.1.15操作系統,其他平臺也可以參考,但是不同平臺之間會存在差異,需客戶自行修改以適應自己的使用。
一、使用IOMUX方式配置GPIO
1. 以底板上UART2_TX引腳爲例,可以看到該引腳目前的功能是串口功能,將該引腳複用爲GPIO使用,在飛凌提供的硬件手冊中可以查看到該引腳對應的padname爲EIM_D26。
2.在內核源碼linux4.1.15/arch/arm/boot/dts/imx6q-pinfunc.h中搜索EIM_D26可以看到如下宏定義:
其中
#define | 0x0bc 0x3d0 0x000 |
MX6QDL_PAD_EIM_D26__GPIO3_IO26 | 0x5 0x0 |
爲該引腳作爲GPIO的定義
3. 在linux4.1.15/arch/arm/boot/dts/imx6qdl-sabresd.dtsi設備樹中重新配置該引腳,首先搜EIM_D26找到相關的引腳配置,可以看到原有功能是被配置成爲串口功能:
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功能的配置:
以上修改完成後,重新編譯,並將新生成的鏡像燒寫到開發板上即可。
引腳複用的原則是:在設備樹中添加想要實現的該引腳的功能,並把以前的複用功能去掉,無複用功能直接添加即可。
二、文件系統的操作
以上操作完成了內核中的引腳複用的配置,下面我們看一下應用中怎麼操作;開發板啓動後可以在文件系統中執行以下操作。
❶ 計算對應 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 命令查看當前值
以上是一個引腳功能複用的整個過程,下面簡單介紹一下一些參數的配置。
三、對一些參數的解讀
在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的值。
2. 確定conf_reg_ofs的值
搜索EIM_DATA26,下圖紅色方框圈出的偏移地址即爲該值。
3. 確定input_reg_ofs的值
iMX6Q CPU手冊中沒有該引腳作爲gpio時對應的input配置,所以是0x000,那麼對應的input_val,該值也爲0x0。
4.確定mux_mode的值
搜索IOMUXC_SW_MUX_CTL_PAD_EIM_DATA26,可以看到該值是0x5。
5. 確定pad_ctrl的值
搜索IOMUXC_SW_PAD_CTL_PAD_EIM_DATA26,可以看到該寄存器的各個位的含義,根據自己的實際情況來確定該值,該寄存器位數較多沒有截全,請自行查看CPU手冊。
以上是小編對 GPIO複用 的一些淺顯的理解,希望對您有所幫助。小編水平有限可能會存在一些紕漏,敬請諒解。對於更深入的知識,如果您想了解可以結合CPU手冊以及源代碼自行研究,有什麼好的見解也可以給我們一塊分享,非常感謝您的閱讀。
轉自飛凌嵌入式官網,原文鏈接:https://www.forlinx.com/article_view_291.html