嵌入式Linux下矩陣鍵盤應用
By Toradex 胡珊逢
1). 簡介
觸控式螢幕,無論是電阻式還是電容式,在嵌入式領域有著廣泛的使用。配合設計優秀的 GUI,能夠給使用者帶來很好的體驗。很多時候,觸控式螢幕在使用之前都需要進行校準,並且當外界的溫度發生變化時,可能需要重新校準。對於電容屏還會受到靜電的干擾。因此在工業裝置上,為了保證輸入的準確性,矩陣鍵盤仍被廣泛地使用。
控制器通過輪詢矩陣鍵盤的行列GPIO獲取按鍵的情況。Linux 是一種多工非實時作業系統,其他任務的執行會影響到矩陣鍵盤輪詢,從而導致按鍵識別出現錯誤。本文所演示的嵌入式平臺基於NXP
iMX6 SoC,帶有一個鍵盤控制器KPP,除了能夠實現輪詢矩陣鍵盤外,還支援自
Toradex的 iMX6計算機模組,根據不同的系列支援部分按鍵,Colibri iMX6 為 5*5,Apalis iMX6為7*6。下面我們將以Colibri iMX6 Linux 4.1.41為例,介紹矩陣鍵盤的應用。
本文所演示的平臺來自於Toradex Colibri iMX6嵌入式平臺,其支援的最大矩陣鍵盤為5*5,而Toradex另一個產品系列Apalis系列則最大支援7*6。
2). 準備
b).Colibri iMX6作業系統使用Toradex Linux Release V2.7b3,下載和更新方法請參考這裡。
3). 配置KPP驅動並測試
a). 預設配置下,KPP 驅動並沒有開啟,需要修改imx6dl-colibri-eval-v3.dts和imx6qdl-colibri.dtsi device tree 檔案。你可以直接使用下面的補丁,修改矩陣鍵盤的配置。
b). 然後重新生成dtb檔案,並更新到Colibri iMX6後重啟。
--------------------------------
$ make imx6dl-colibri-eval-v3.dtb
--------------------------------
c). 在啟動日誌中可以看到 KPP 驅動被載入
--------------------------------
[email protected]:/dev/input# dmesg|grepkpp
[1.551426] input: 20b8000.kpp as /devices/soc0/soc/2000000.aips-bus/20b8000.kpp/input/input0
--------------------------------
d). Linux輸入裝置識別KPP
--------------------------------
[email protected]:~# xinput
? Virtual core pointerid=2[master pointer(3)]
?? Virtual core XTEST pointerid=4[slave pointer(2)]
??stmpe-tsid=8[slavepointer(2)]
? Virtual core keyboardid=3[master keyboard (2)]
? Virtual core XTEST keyboardid=5[slavekeyboard (3)]
?gpio-keysid=6[slavekeyboard (3)]
?20b8000.kppid=7[slavekeyboard (3)]
--------------------------------
e). 根據在 device tree 中的GPIO 配置,短接任一對 ROW 和 KEY 的引腳,即可模擬按鍵。
--------------------------------
pinctrl_kpp: kppgrp {
fsl,pins = <
MX6QDL_PAD_KEY_ROW2__KEY_ROW2 0x1b010/*SODIMM 186*/
MX6QDL_PAD_KEY_ROW4__KEY_ROW4 0x1b010/*SODIMM188*/
MX6QDL_PAD_CSI0_DAT5__KEY_ROW5 0x1b010/*SODIMM155*/
MX6QDL_PAD_GPIO_2__KEY_ROW6 0x1b010/*SODIMM180*/
MX6QDL_PAD_GPIO_5__KEY_ROW7 0x1b010/*SODIMM176*/
MX6QDL_PAD_KEY_COL2__KEY_COL2 0x110b0/*SODIMM184*/
MX6QDL_PAD_KEY_COL4__KEY_COL4 0x110b0/*SODIMM178*/
MX6QDL_PAD_GPIO_19__KEY_COL5 0x110b0/*SODIMM168*/
MX6QDL_PAD_CSI0_DAT6__KEY_COL6 0x110b0/*SODIMM157*/
MX6QDL_PAD_GPIO_4__KEY_COL7 0x110b0/*SODIMM174*/
>;
--------------------------------
f). 通過evtest命令,檢視按下的鍵值,以及是否屬於長按等資訊。
--------------------------------
[email protected]:~# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:20b8000.kpp
/dev/input/event1:stmpe-ts
/dev/input/event2:gpio-keys
Select the device event number [0-2]: 0
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "20b8000.kpp"
......
Testing ... (interrupt to exit)
Event: time 1502961213.623148, type 4 (EV_MSC), code 4 (MSC_SCAN), value 12
Event: time 1502961213.623148, type 1 (EV_KEY), code 2 (KEY_1), value 1
Event: time 1502961213.623148, -------------- SYN_REPORT ------------
Event: time 1502961213.873096, type 1 (EV_KEY), code 2 (KEY_1), value 2
Event: time 1502961213.873096, -------------- SYN_REPORT ------------
Event: time 1502961213.913117, type 1 (EV_KEY), code 2 (KEY_1), value 2
Event: time 1502961213.913117, -------------- SYN_REPORT ------------
Event: time 1502961213.953088, type 1 (EV_KEY), code 2 (KEY_1), value 2
Event: time 1502961213.953088, -------------- SYN_REPORT ------------
Event: time 1502961213.963156, type 4 (EV_MSC), code 4 (MSC_SCAN), value 12
Event: time 1502961213.963156, type 1 (EV_KEY), code 2 (KEY_1), value 0
--------------------------------
4). KPP應用程式開發示例
a). 在應用程式中,用structinput_event讀取按鍵的資訊。
--------------------------------
structinput_event {
structtimeval time;
__u16 type;//型別
__u16 code;//鍵值
__s32 value;//按下還是釋放
};
--------------------------------
b). 具體請參考下面的原始碼
// input_event中讀取按下鍵值以及按下、保持、釋放動作。
--------------------------------
[email protected]:~# ./maxtrix_keypad_test
25 keys.
Press any key.
Key press
Code: 7
Key release
Code: 7
Key press
Code: 7
Key hold
Code: 7
Key hold
Code: 7
Key hold
Code: 7
Key hold
Code: 7
Key hold
Code: 7
Key release
Code: 7
--------------------------------
5). 總結
KPP 還具有其他功能,利於識別組合鍵、消除 ghost key等,矩陣鍵盤電路也需要做一些修改,如使用二極體,具體的參考IMX6SDLRM文件中Chapter 39Keypad Port (KPP)章節。
相關推薦
嵌入式Linux下矩陣鍵盤應用
By Toradex 胡珊逢 1). 簡介 觸控式螢幕,無論是電阻式還是電容式,在嵌入式領域有著廣泛的使用。配合設計優秀的 GUI,能夠給使用者帶來很好的體驗。很多時候,觸控式螢幕在使用之前都需要進行校準,並且當外界的溫度發生變化時,可能需要重新校準。對於電容屏還會受
嵌入式Linux下Qt的中文顯示
tdi IT too file ron main.c nts 環境變量 copy 一般情況下,嵌入式Qt界面需要中文顯示,下面總結自己在項目中用到的可行的辦法 1,下載一種中文簡體字體,比如我用的是”方正準圓簡體“,把字體文件放在ARM開發板系統的Qt字庫中,即/usr/l
Linux下,為應用程序添加桌面圖標(ubuntu18.4)
ccf 打開終端 desktop spa ubun icons alt x86 保存文件 一、桌面圖標位置 Lniux下桌面圖標儲存路徑為:/usr/share/applications 二、桌面圖標格式 所有桌面圖標格式均為desktop,即名為XXX.desktop
linux下關閉鍵盤的重復擊鍵
command eat con ubunt conf inux line linux下 delay https://askubuntu.com/questions/576421/disable-keyboard-repeat-from-command-line You ca
Linux下,為應用程式新增桌面圖示(ubuntu18.4)
一、桌面圖示位置 Lniux下桌面圖示儲存路徑為:/usr/share/applications 二、桌面圖示格式 所有桌面圖示格式均為desktop,即名為XXX.desktop 三、編輯內容(常用) // 檔案頭(必須) [Desktop Entry] /
如何在Linux下模擬鍵盤輸入 利用驅動程式實現
參考:http://blog.csdn.net/absurd/archive/2009/09/13/4549514.aspx 驅動程式: #include <linux/module.h> #include <linux/modulepa
將web應用和mysql都部署到linux下,web應用通過jdbc就無法獲取到mysql連線。
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested
LVGUI在嵌入式LINUX下的編譯
本文比較亂,算是一個隨筆,記錄一下將LVGUI交叉編譯到MIPS架構的嵌入式Linux裝置中,主要關於自己編寫對應的makefile來對LVGUI進行編譯。 首先,Makefile 最好和lv的幾個工程目錄在同一目錄下,如下圖: 其次,為了讓標頭檔案(h檔
嵌入式Linux下CAN匯流排配置
題背景:本人開發板使用的是迅為iTOP4412精英版,額外購買的CAN/485模組,如下圖: 但是插上模組之後,在終端使用ifconfig can0命令發現開發板讀不到CAN裝置,顯示“ifconfig: SIOCGIFFLAGS: No such device”。如下圖: 在重新配置核心後,可以讀出
嵌入式Linux下ALSA音訊架構ALSA-lib移植與編譯心得
*************************************************************************************************************************** 作者:EasyWave
Linux下根據tomcat應用程序來查詢其埠號
假設應用名稱叫pear,並假設路徑為:/datong/tomcat-pear/ 方法一,根據PID查詢應用埠號,前提是應用已經執行 1,找到改應用的PID:ps -ef | grep pear | grep tomcat | awk ‘{if($1==“tomcat”) print$
嵌入式Linux下串列埠除錯
By Toradex秦海 1). 簡介 UART串列埠是嵌入式裝置最為常用的除錯和通訊介面之一,無論是RS232還是RS422/485都有著非常廣泛的應用,因此本文就基於嵌入式Linux演示在User Space進行串列埠除錯。 本文所演示的平臺來自於Toradex Co
嵌入式Linux下中文字型顯示
By Toradex 胡珊逢 1). 簡介 嵌入式平臺預設釋出的嵌入式Linux版本通常並不包含中文字型支援,本文就通過Toradex計算機模組平臺來演示如何新增中文字型的顯示,因為Toradex的Linux釋出是基於OpenEmbedded/Yocot 專案編譯的,因此這
基於嵌入式linux下的libcurl開發
1、ubuntu 交叉編譯環境搭建: 原始碼:curl-7.5.31.tar.gz (https://curl.haxx.se/download.html) 交叉編譯環境:arm-none-linux-gnueabi- [email protected]
嵌入式Linux下Gstreamer程式設計示例
By Toradex秦海 1). 簡介 Gstreamer多媒體開發框架是當前嵌入式Linux裝置最為常用的多媒體應用處理平臺,關於Gstreamer開發框架的介紹請參考我們過往發表的其他相關文章,這裡不再贅述而是直接展示使用C語言基於Gstreamer進行攝像頭處理的示例
ARM+Linux下看門狗應用
筆者在設計ARM+Linux的產品中,使用了看門狗ADM706。這款IC的定時間隔為1.6s。由於使用ARM9的核心,作業系統為Linux。整個系統完全啟動時間較長,超出了看門狗的喂狗時間門限。因此在CPU能完全啟動開始喂狗前,看門狗又給出了復位訊號,導致CPU重啟。由於
嵌入式 linux下利用backtrace追蹤函式呼叫堆疊以及定位段錯誤
一般察看函式執行時堆疊的方法是使用GDB(bt命令)之類的外部偵錯程式,但是,有些時候為了分析程式的BUG,(主要針對長時間執行程式的分析),在程式出錯時打印出函式的呼叫堆疊是非常有用的。在glibc標頭檔案"execinfo.h"中聲明瞭三個函式用於獲取當前執行緒的函式呼
嵌入式linux下復位音效卡驅動
最近在做一個對講系統,平臺是tiny6410搭載的linux.遇到的問題是對講一段時間後音效卡會掛掉,報出的錯誤是s3c64xx_dma_stop: channel still active.經過長
ARM平臺嵌入式Linux下使用3G/4G 模組
簡介 隨著工業發展,嵌入式裝置接入網路的需求日益增多,在沒有有線或者無線乙太網的環境下,直接通過3G/4G Modem連線運營商網路來接入網際網路不失為一個好方法,本文就著重介紹基於ARM平臺的嵌入式裝置在Embedded Linux下使用3G/4G Modem的方法。 目
嵌入式Linux下RTC時間的讀寫
參考資料 首先下載ntp的原始碼 解壓縮之後,編譯: ./configure --prefix=/opt/ntp-arm --exec-prefix=/opt/ntp-arm --host=arm-linux --enable-all-clocks --enable-parse-cloc