1. 程式人生 > >嵌入式Linux下矩陣鍵盤應用

嵌入式Linux下矩陣鍵盤應用

By Toradex 胡珊逢

1). 簡介

觸控式螢幕,無論是電阻式還是電容式,在嵌入式領域有著廣泛的使用。配合設計優秀的 GUI,能夠給使用者帶來很好的體驗。很多時候,觸控式螢幕在使用之前都需要進行校準,並且當外界的溫度發生變化時,可能需要重新校準。對於電容屏還會受到靜電的干擾。因此在工業裝置上,為了保證輸入的準確性,矩陣鍵盤仍被廣泛地使用。

控制器通過輪詢矩陣鍵盤的行列GPIO獲取按鍵的情況。Linux 是一種多工非實時作業系統,其他任務的執行會影響到矩陣鍵盤輪詢,從而導致按鍵識別出現錯誤。本文所演示的嵌入式平臺基於NXP iMX6 SoC,帶有一個鍵盤控制器KPP,除了能夠實現輪詢矩陣鍵盤外,還支援自

帶上拉電阻、消抖、多按鍵識別、長按等功能。使用者可以直接GPIO連線到按鍵上,無需新增電阻和二極體。如果使用二極體,還可以支援更多的按鍵組合。預設的KPP 最大支援8*8矩陣鍵盤。

Toradex iMX6計算機模組,根據不同的系列支援部分按鍵,Colibri iMX6  5*5Apalis iMX67*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.dtsimx6qdl-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_kppkppgrp {

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,能夠給使用者帶來很好的體驗。很多時候,觸控式螢幕在使用之前都需要進行校準,並且當外界的溫度發生變化時,可能需要重新校準。對於電容屏還會受

嵌入式LinuxQt的中文顯示

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檔

嵌入式LinuxCAN匯流排配置

題背景:本人開發板使用的是迅為iTOP4412精英版,額外購買的CAN/485模組,如下圖:   但是插上模組之後,在終端使用ifconfig can0命令發現開發板讀不到CAN裝置,顯示“ifconfig: SIOCGIFFLAGS: No such device”。如下圖:   在重新配置核心後,可以讀出

嵌入式LinuxALSA音訊架構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]

嵌入式LinuxGstreamer程式設計示例

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的方法。 目

嵌入式LinuxRTC時間的讀寫

參考資料 首先下載ntp的原始碼 解壓縮之後,編譯: ./configure --prefix=/opt/ntp-arm --exec-prefix=/opt/ntp-arm  --host=arm-linux --enable-all-clocks --enable-parse-cloc