如題:使用的芯片是imx6ul,在做【4行*8列】按鍵驅動的時候采用的【gpio-matrix-keypad】框架,寫完設備樹以后測驗不通過,僅僅第一行按鍵有效,所以有個疑問(甚至懷疑是不是因為這個原因,所以按鍵驅動是亂套的):
疑問:
我目前僅僅改了設備樹檔案,沒有其他改動。在設備樹中初始化了【gpio-row】和【gpio-col】,但是因為設備樹中代碼并沒有GPIO順序,那么內核怎么識別4行gpio中的行順序,以及8列gpio中的列順序?如果無法確定的話,所以結果應該是亂套的吧?
當前專案具體情況如下:
備注:使用該框架的時候,測驗過4行8列的每個GPIO,都是可控的,設備樹中也屏蔽掉了其他功能復用的地方。
1.1、imx6ul-14x14-evk.dts檔案設備樹添加如下代碼:
根節點下添加key節點:(硬體設計是4行8列,但實際上只用到了3行,所以下面初始化第4行直接沒有初始化)
kpp {
compatible = "gpio-matrix-keypad";//矩陣按鍵驅動名字
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_key>; //按鍵IO配置
debounce-delay-ms = <20>; //消抖
col-scan-delay-us = <20>; //掃描延時
/*4行*/
row-gpios = <
&gpio2 16 GPIO_ACTIVE_HIGH
&gpio2 17 GPIO_ACTIVE_HIGH
&gpio2 18 GPIO_ACTIVE_HIGH
&gpio2 19 GPIO_ACTIVE_HIGH
>;
/*8列*/
col-gpios = <
&gpio2 8 GPIO_ACTIVE_HIGH
&gpio2 9 GPIO_ACTIVE_HIGH
&gpio2 10 GPIO_ACTIVE_HIGH
&gpio2 11 GPIO_ACTIVE_HIGH
&gpio2 12 GPIO_ACTIVE_HIGH
&gpio2 13 GPIO_ACTIVE_HIGH
&gpio2 14 GPIO_ACTIVE_HIGH
&gpio2 15 GPIO_ACTIVE_HIGH
>;
linux,keymap = <
/* row0 */
MATRIX_KEY(0x0, 0x0, KEY_LEFT)
MATRIX_KEY(0x0, 0x1, KEY_UP)
MATRIX_KEY(0x0, 0x2, KEY_F1)
MATRIX_KEY(0x0, 0x3, KEY_X) /* fx */
MATRIX_KEY(0x0, 0x4, KEY_7)
MATRIX_KEY(0x0, 0x5, KEY_4)
MATRIX_KEY(0x0, 0x6, KEY_1)
MATRIX_KEY(0x0, 0x7, KEY_M)
/* row1 */
MATRIX_KEY(0x1, 0x0, KEY_DOWN)
MATRIX_KEY(0x1, 0x1, KEY_RIGHT)
MATRIX_KEY(0x1, 0x2, KEY_F2)
MATRIX_KEY(0x1, 0x3, KEY_O) /* fo */
MATRIX_KEY(0x1, 0x4, KEY_8)
MATRIX_KEY(0x1, 0x5, KEY_5)
MATRIX_KEY(0x1, 0x6, KEY_2)
MATRIX_KEY(0x1, 0x7, KEY_0)
/* row2 */
/*MATRIX_KEY(0x2, 0x0, KEY_)*/
/*MATRIX_KEY(0x2, 0x1, KEY_)*/
MATRIX_KEY(0x2, 0x2, KEY_ENTER)
MATRIX_KEY(0x2, 0x3, KEY_I) /* fi */
MATRIX_KEY(0x2, 0x4, KEY_9)
MATRIX_KEY(0x2, 0x5, KEY_6)
MATRIX_KEY(0x2, 0x6, KEY_3)
MATRIX_KEY(0x2, 0x7, KEY_DOT)
/* row3 */
/*MATRIX_KEY(0x3, 0x0, KEY_)*/
/*MATRIX_KEY(0x3, 0x1, KEY_)*/
/*MATRIX_KEY(0x3, 0x2, KEY_)*/
/*MATRIX_KEY(0x3, 0x3, KEY_)*/
/*MATRIX_KEY(0x3, 0x4, KEY_)*/
/*MATRIX_KEY(0x3, 0x5, KEY_)*/
/*MATRIX_KEY(0x3, 0x6, KEY_)*/
/*MATRIX_KEY(0x3, 0x7, KEY_)*/
>;
gpio-activehigh; //這個一定要加上,不然測驗時按鍵會一直掛起
status = "okay";
};iomuxc復用節點中添加GPIO復用:
pinctrl_key: kpp_grp{
fsl,pins = <
/* row行:輸出模式,輪流【輸出】高電平,同一時刻只能有一個高電平 */
MX6UL_PAD_SD1_CMD__GPIO2_IO16 0x10B0
MX6UL_PAD_SD1_CLK__GPIO2_IO17 0x10B0
MX6UL_PAD_SD1_DATA0__GPIO2_IO18 0x10B0
MX6UL_PAD_SD1_DATA1__GPIO2_IO19 0x10b0
/* column列:輸入模式,采集電平,開關打開時為0,開關按下時為1 */
MX6UL_PAD_ENET2_RX_DATA0__GPIO2_IO08 0xF080
MX6UL_PAD_ENET2_RX_DATA1__GPIO2_IO09 0xF080
MX6UL_PAD_ENET2_RX_EN__GPIO2_IO10 0xF080
MX6UL_PAD_ENET2_TX_DATA0__GPIO2_IO11 0xF080
MX6UL_PAD_ENET2_TX_DATA1__GPIO2_IO12 0xF080
MX6UL_PAD_ENET2_TX_EN__GPIO2_IO13 0xF080
MX6UL_PAD_ENET2_TX_CLK__GPIO2_IO14 0xF080
MX6UL_PAD_ENET2_RX_ER__GPIO2_IO15 0xF080
>;
};1.2 鍵盤設計示意圖如下
對于鍵盤的邏輯我理解的是:
- (1)8列GPIO初始化為輸入,用于檢測引腳電平,因為默認拉低,所以檢測高電平即可。
- (2)4行GPIO初始化為輸出低電平,輪詢輸出1,同一時刻只能有一個高電平。

1.3 當前現象為
系統啟動后使用命令:
hexdump /dev/input/event0
1、然后終端就開始瘋狂列印,但是第一排按鍵【left、up、F1、Fx、7、4、1、M】按下以后,中斷停止列印,松開繼續瘋狂列印。
2、其他按鍵無用。
跪求大佬們幫忙分析下是何原因,不勝感激!!!
uj5u.com熱心網友回復:
最新進展,原貼中設備樹配置有誤,將設備樹做以下修改:1、暫時先禁用row2/3/4,只保留row1來進行除錯,也就是GPIO2_16這一行。
2、GPIO2_16配置為:【&gpio2 16 GPIO_ACTIVE_LOW】
3、8個col還是配置為:【&gpio2 8 GPIO_ACTIVE_HIGH】
然后我按鍵按下一次并彈起M,也就是第一行最后邊那個按鍵,產生如下log,請問是否正常:
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/228175.html
標籤:驅動程序開發區
上一篇:verilog運行mif檔案出現以下錯誤,請大佬解決,謝謝了
下一篇:服務器重新部署踩坑記
