Amlogic方案遙控器配置(Android11)

配置路線

鍵值變化路徑:
ScanCode --> Keycode Lable --> KeyCode Layout --> KeyLable --> Keycode – > KeyEvent
文件映射路徑:
*.dtsi --> input-event-codes.h --> *.kl --> InputEventLable.h --> kecodes.h --> PhoneWindowManager.java

一、獲取Scancode

當一個紅外遙控器的某個按鍵未適配時,有多種方法查看這個按鍵的scancode。

  1. 在控制臺輸入logcat 查看log,如:
meson-ir fe084040.ir: scancode 76 undefined
meson-ir fe084040.ir: no valid key to handle

如果已經適配了就會顯示如下信息:

RemoteIME: keycode: 20, realAction: false
RemoteIME: keycode: 20, realAction: true
  1. 在控制臺輸入dmesg -c
[ 3195.358431] meson-ir fe084040.ir: scancode 76 undefined
[ 3195.358479] meson-ir fe084040.ir: no valid key to handle

輸入之后再按下按鍵,然后再輸入一次dmesg -c就會顯示上面的內容,如果適配了這個按鍵則不會有任何顯示
3. 在控制臺輸入echo 8 > /proc/sys/kernel/printk

可以看到我上面未定義的物理碼值是76,轉換成十六進制后是4c

二、獲取Customcode

不同款式的遙控器有不同的用戶碼,使用cat /sys/devices/virtual/remote/amremote/customcode命令進行查看遙控器用戶碼,在串口執行該命令后,按下遙控器的任意鍵,再次執行該命令就可以看到你使用這款遙控器的用戶碼了。我這款遙控器的用戶碼為0x7984

三、Scancode和Customcode的映射文件DTSI

path:common/arch/arm64/boot/dts/amlogic/meson-ir-map.dtsi
按照里面原本的內容的樣子添加,注意customcode改成你的遙控器的,里面面的映射如下:

customcode = <0x7984>;
release_delay = <80>;
size  = <31>;   /*keymap size*/
keymap = <REMOTE_KEY(0x12, KEY_POWER)
REMOTE_KEY(0x06, KEY_HOME)
REMOTE_KEY(0x1A, KEY_BACK)
REMOTE_KEY(0x10, KEY_VOLUMEUP)

前面的這個十六進制數就是scancode的十六進制,當然我們也可以看遙控器的規格書,上面會直接標注好scancode
后面的KEY_XXX需要在linux-event-codes.h文件中定義。
Path: external/u-boot/include/dt-bindings/input/linux-event-codes.h

#define KEY_BACK        158 /* AC Back */
#define KEY_FORWARD     159 /* AC Forward */

這個文件中后面那一列的數字則會在.kl文件中定義
進行到這里的時候,使用getevent -l再按下按鍵就已經能有相應的反饋了。

四、kl文件

4.1 getevent -l

無論是藍牙遙控器還是紅外遙控器,都需要確定其使用的kl (KeyLayoutFile)文件。在安卓shell 環境(串口控制臺)執行命令確認kl 文件:getevent -l
首先會顯示當前適配的遙控器列表

add device 1: /dev/input/event1name:     "cec_input"
add device 2: /dev/input/event4name:     "ir_keypad"
add device 3: /dev/input/event5name:     "ir_keypad1"
add device 4: /dev/input/event3name:     "gpio_keypad"
add device 5: /dev/input/event2name:     "vad_keypad"
add device 6: /dev/input/event0name:     "input_btrcu"
add device 7: /dev/input/event6name:     "adc_keypad"

以上內容代表了適配了七套遙控器,名稱分別是"cec_input" “ir_keypad” 等
下面我們按下遙控器的某一個按鍵會出現下面的內容

/dev/input/event4: EV_KEY       KEY_RIGHT            DOWN
/dev/input/event4: EV_SYN       SYN_REPORT           00000000
/dev/input/event4: EV_KEY       KEY_RIGHT            UP
/dev/input/event4: EV_SYN       SYN_REPORT           00000000

前兩行表示按鍵被按下,后兩行表示按鍵被釋放
EV_SYN: 用作分隔事件的標記。 事件可以在時間或空間上分開,例如使用多點觸控協議。
EV_KEY: 用于描述鍵盤,按鈕或其他類似鍵的設備的狀態更改。
根據這里顯示顯示的event4我們可以知道我們的遙控設備為"ir_keypad"

4.2 dumpsys input

在前面我們看到我們按下按鍵時相應的是event4,我們可以使用cat /proc/bus/input/devices查看我們系統中連接的輸入設備的詳細信息。

I: Bus=0010 Vendor=0001 Product=0001 Version=0100
N: Name="ir_keypad"
P: Phys=keypad/input0
S: Sysfs=/devices/platform/fe084040.ir/input/input4
U: Uniq=
H: Handlers=rfkill mouse0 event4
B: PROP=0
B: EV=7
B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 0 0 70000 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe
B: REL=103

從我們之前監聽到的按鍵事件我們可以看到處理該按鍵的事件是event4,這里我們對應上的設備名應該是 “ir_keypad”
然后在(串口控制臺)執行命令 dumpsys input,可以根據所連接的遙控器的名稱找到遙控器對應的kl文件。
根據這個IR遙控器設備ir_keypad的設備名,我們找到了下面這段內容:

  ir_keypadClasses: 0x00000029Path: /dev/input/event4Enabled: trueDescriptor: d2c52ff0f656fac4cd7b7a118d575e0109a9fe1cLocation: keypad/input0ControllerNumber: 0UniqueId:Identifier: bus=0x0010, vendor=0x0001, product=0x0001, version=0x0100KeyLayoutFile: /vendor/usr/keylayout/Vendor_0001_Product_0001.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile:HaveKeyboardLayoutOverlay: falseVideoDevice: <none>

可以看到這里所用到的Android層映射文件為/vendor/usr/keylayout/Vendor_0001_Product_0001.kl(這里的usr對于不同項目是不一樣的)
我這里是device/amlogic/common/products/mbox/Vendor_0001_Product_0001.kl

4.3 踩過的坑請注意

當我找到我的device/amlogic/common/products/mbox/目錄下之后發現有多個kl文件
在這里插入圖片描述

按理說應該是Vendor_0001_Product_0001.kl才對,但是實際上使用的卻是Vendor_0001_Product_0002.kl文件,經過多方排查發現是因為在編譯的時候mk文件對他進行了改動:
path:device/amlogic/common/products/mbox/sc2/device.mk

#use tv remote layout for mbox if livetv is built
ifeq ($(TARGET_BUILD_LIVETV), true)PRODUCT_COPY_FILES += \device/amlogic/common/products/mbox/Vendor_0001_Product_0002.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/Vendor_0001_Product_0001.kl
elsePRODUCT_COPY_FILES += \device/amlogic/common/products/mbox/Vendor_0001_Product_0001.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/Vendor_0001_Product_0001.kl
endif

這里由于變量TARGET_BUILD_LIVETV的值為true,所以將Vendor_0001_Product_0002.kl文件的內容拷貝到了Vendor_0001_Product_0001.kl里面,所以雖然用的是0001但是其實改動需要在0002中進行。

4.4 改動kl文件

patch: device/amlogic/common/products/mbox/Vendor_0001_Product_0002.kl

 key 158      BACKkey 139      MENUkey 102      HOME

前面的值是DTSI中的值,后面的是有底層文件與之相對應的。
進行到這里,按鍵功能就已經生效了,一般做到這里也就可以了。
繼續往下追查這個值是在KeyLabel文件中定義的

五、KeyLabel文件

  • Path: frameworks/native/include/input/InputEventLabels.h
  • Content:
DEFINE_KEYCODE(BACK),

再往下就是Keycode值的對應

六、Keycode

包含以下三個文件:

  • Native
    • Path: frameworks/native/include/android/keycodes.h
    • Content:
AKEYCODE_BACK            = 4,
  • Java
    • Path: frameworks/base/core/java/android/view/KeyEvent.java
    • Content
public static final int KEYCODE_BACK            = 4;
  • Res
    • Path: frameworks/base/core/res/res/values/attrs.xml
    • Content:
<enum name="KEYCODE_BACK" value="4" />

現在,當你使用logcat -s RemoteIME命令就能夠看到控制臺輸出了keycode,這個值就和我們上面的值對應上了
[圖片]

七、KeyEvent

當按鍵傳到 fromworks 我們只需要更改 KeyEvent.java 來完成最后的按鍵定義,之后就是到 PhoneWindowManager.java 來實現按鍵功能實現攔截或繼續傳遞。

  • Path: frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
  • Content:
 onKeyDowncase KeyEvent.KEYCODE_YOUR_PRIVATE_KEY: {//do sthreturn true;
}

總之

一般情況下按照dtsi–>linux-event-codes.h–>kl 的順序來改就可以了,如果還出現其他問題則繼續查看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164644.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過這個簡單的技巧讓我們的 JavaScript 代碼變得異常快

通過這個簡單的技巧讓我們的 JavaScript 代碼變得異常快 秘訣&#xff1a;了解JavaScript 虛擬機(VM)的內部工作原理。 首先&#xff0c;我們來談談像 V8 這樣的JavaScript 虛擬機(VM)。可以把它想象成我們的操作的大腦 —— 它將我們簡潔的代碼變成計算機可以理解和執行的東…

免費圖書教材配套資料:Spark大數據技術與應用(第2版)

《Spark大數據技術與應用&#xff08;第2版&#xff09;》課程內容全面介紹了Spark大數據技術的相關知識&#xff0c;內容包含包括Spark概述、Scala基礎、Spark編程、Spark編程進階、Spark SQL結構化數據文件處理、Spark Streaming實時計算框架、Spark GraphX圖計算框架、Spark…

方法簽名【C#】

1條件&#xff1a; 簽名的作用&#xff1a;為了在眾多方法中找到匹配的方法。【自己想要的方法】類似明星的簽名。雖然2個人的名字一樣&#xff0c;但并不是同一個人&#xff0c;這就需要用到簽名的條件。 方法名稱&#xff1a;注意大小寫。 參數個數。 參數類型及順序&…

STL—next_permutation函數

目錄 1.next_permutation函數的定義 2.簡單使用 2.1普通數組全排列 2.2結構體全排列 2.3string 3.補充 1.next_permutation函數的定義 next_permutation函數會按照字母表順序生成給定序列的下一個較大的排列&#xff0c;直到整個序列為降序為止。與其相對的還有一個函數—…

實用工具推薦 | 在線制作電子書

?隨著互聯網的發展&#xff0c;越來越多的人開始關注知識的傳播和分享。而電子書作為一種方便攜帶、易于分享的形式&#xff0c;越來越受到人們的青睞。今天&#xff0c;就為大家推薦一款實用的工具——FLBOOK在線制作電子雜志平臺&#xff0c;讓你輕松在線制作電子書&#xf…

【python學習】基礎篇-常用模塊-re模塊:正則表達式高效操作字符串

在Python中&#xff0c;正則表達式主要通過re模塊來實現。以下是一些常用的正則表達式用法&#xff1a; 匹配值&#xff1a; pattern r\d # 匹配一個或多個數字 pattern r\b\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\b #匹配日期格式 pattern rhello # 匹配字符串“hello”\…

【LeetCode】挑戰100天 Day12(熱題+面試經典150題)

【LeetCode】挑戰100天 Day12&#xff08;熱題面試經典150題&#xff09; 一、LeetCode介紹二、LeetCode 熱題 HOT 100-142.1 題目2.2 題解 三、面試經典 150 題-143.1 題目3.2 題解 一、LeetCode介紹 LeetCode是一個在線編程網站&#xff0c;提供各種算法和數據結構的題目&…

HTTP客戶端警告:Going to buffer response body of large or unknown size

HTTP客戶端警告&#xff1a;Going to buffer response body of large or unknown size 點關注不迷路&#xff0c;歡迎再訪&#xff01; 精簡博客內容&#xff0c;盡量已行業術語來分享。 努力做到對每一位認可自己的讀者負責。 幫助別人的同時更是豐富自己的良機。 目錄 HTTP客…

IAR為恩智浦S32M2提供全面支持,提升電機控制能力

IAR Embedded Workbench for Arm已全面支持恩智浦最新的S32系列&#xff0c;可加速軟件定義汽車的車身和舒適性應用的開發 瑞典烏普薩拉&#xff0c;2023年11月22日 – 嵌入式開發軟件和服務的全球領導者IAR現已全面支持恩智浦半導體&#xff08;NXP Semiconductors&#xff0…

python腳本后臺執行

nohup python script.py &

CMS垃圾收集器深入解析

1.CMS的兩種模式與一種特殊策略 1.1Backgroud CMS(沒有并發失敗的情況) 1.1.1并發標記還能被整理成兩個流程 (1)初始標記 (2)并發標記(3)(4)在這個階段發生(3)并發預處理 (4)可中止的預處理 (5)重新標記 (6)并發清除 1.1.2為什么我們的并發標記細化之后還會額外有兩個流…

【pandas數據處理】數據結構

數據結構 Series基于列表創建數據結構自定義元素的行標簽基于字典創建數據結構 DataFrame對象基于列表創建數據結構設置參數來定義行列標簽基于字典 Series 一維數組對象&#xff0c;不僅包含數據元素&#xff0c;還包含一組與數據元素對應的行標簽。 基于列表創建數據結構 …

C++設計模式之工廠模式(下)——抽象工廠模式

抽象工廠模式 介紹示例示例使用運行結果抽象工廠模式的優缺點優點缺點 總結 介紹 抽象工廠模式是一種創建型設計模式&#xff0c;它提供了一種封裝一組相關或相互依賴對象的方式&#xff0c;而無需指定它們具體的類。它允許客戶端使用抽象接口來創建一系列相關的對象&#xff…

Jquery ajax 同步阻塞引起的UI線程阻塞的坑(loading圖片顯示不出來 )

Jquery ajax 同步阻塞引起的UI線程阻塞的坑&#xff08;loading圖片顯示不出來&#xff0c;layer.load延遲&#xff09;jax重新獲取數據刷新頁面功能&#xff0c;因為ajax屬于耗時操作&#xff0c;想在獲取數據且加載頁面時顯示加載遮罩層&#xff0c;結果發現了ajax的好多坑。…

Elasticsearch自動清理腳本

腳本 我在data下創建的腳本文件就叫:vi /data/clear_log.sh,內容如下 #!/bin/sh #獲取時間 time=`date +%Y-%m-%d %H:%M:%S` cipan=`df -h| grep sda3` #查詢磁盤使用率 liang=`df -h| grep sda3 |grep -v grep |awk {print $5}|tr -d

【數據結構】一題帶你出師鏈表!

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:數據結構 ??操作環境:Visual Studio 2022 題目鏈接 138. 隨機鏈表的復制https://leetcode.cn/problems/copy-list-with-random-pointer/ 題目描述 給你一個長度為 n 的鏈表&#xff0c;每個節點包含一個額外增加的隨機…

Make a BESD file from QTLtools output

Make a BESD file from QTLtools output # 根據基因名與變異rsid編號去重 library(tidyverse) library(readxl) qtltoolsnomi <- read_table("qtltoolsnomi.txt",col_names F) qtltoolsnomi %>% distinct(X1,X8, .keep_all TRUE) -> qtltool qtltool …

qml ParticleSystem3D使用介紹

在 Qt Quick 3D 中,ParticleSystem3D 是用來創建和控制3D粒子系統的元素。粒子系統是圖形編程中用于模擬液體、煙霧、火、星空等現象的技術,它通過生成大量小粒子來模擬這些效果。ParticleSystem3D 提供了一個框架,允許開發者定義粒子的各種屬性,如生命周期、速度、顏色、大…

王道p149 9.設樹B是一棵采用鏈式結構存儲的二叉樹,編寫一個把樹 B中所有結點的左、右子樹進行交換的函數。(c語言代碼實現)

本題代碼如下 void swap(tree* t) {if (*t){treenode* temp (*t)->lchild;(*t)->lchild (*t)->rchild;(*t)->rchild temp;swap(&(*t)->lchild);swap(&(*t)->rchild);} } 完整測試代碼 #include<stdio.h> #include<stdlib.h> typed…

C#string.Format的一些使用

C#中的string.Format方法是一個用于格式化字符串的功能強大的方法。它允許您通過將占位符替換為實際的值來創建格式化的字符串。 一、基本語法是&#xff1a; string.Format(format, arg0, arg1, arg2, ...) 其中&#xff0c; format是一個字符串&#xff0c;其中包含要格式…