紅外遙控鍵

紅外

本章節旨在讓用戶自定義紅外遙控功能,需要有板載紅外接收的板卡。

12.1.?獲取紅外遙控鍵值

由于不同遙控器廠家定義的按鍵鍵值不一樣,所以配置不通用,需要獲取實際按鍵對應的鍵值。

1
2
3
4
5
6
#設置輸出等級
echo '7 4 1 7'> /proc/sys/kernel/printk
#開啟打印
echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print#此時按下按鍵串口終端就會有打印USERCODE和鍵值

提示

如果是ssh或者桌面終端不會直接打印信息到終端,需要執行 dmesg 命令進行查看

以野火紅外遙控器為例:

遙控器資料鏈接:?野火【紅外遙控_1838】模塊

../../_images/telecontroller_0.jpg


對著板卡按下按鍵,每按下一個按鍵就會打印USERCODE和鍵值到串口終端。

../../_images/telecontroller_1.jpg

記錄USERCODE值和按鍵對應的RMC_GETDATA值,后續需要修改鍵值對應的事件。

12.2.?修改設備樹紅外按鍵事件

需要修改內核源碼板卡對應的設備樹,如果不確定設備樹是哪個的,可以執行?ls -l /boot?看 rk-kernel.dtb軟連接到哪個dtb,改對應的dts即可。

以魯班貓1的dts為例:

../../_images/telecontroller_2.jpg

找到紅外對應的pwm ir節點,魯班貓1對應的是pwm3,修改ir_key_lubancat部分

  • 將實際的USERCODE值改到 rockchip,usercode = <0xff00>;

  • 將鍵值和需要配置事件改到rockchip,key_table表里面。

對應的事件可以從?內核源碼/include/dt-bindings/input/linux-event-codes.h?中取。linux-event-codes.h文件定義了輸入事件的類型和代碼,用于描述和標識各種輸入設備(如鍵盤、鼠標、觸摸屏等)生成的事件。

例如,遙控器上面的電源按鍵需要配置為板卡的電源開關機鍵,那么可以從linux-event-codes.h找到的事件KEY_POWER。

例如,遙控器上面的按鍵1要對應鍵盤上的1,那么可以從linux-event-codes.h找到的事件KEY_1。

依次從linux-event-codes.h中找到按鍵對應的事件后,將按鍵值和實際一一對應,修改得到以下內容:

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
     ir_key_lubancat{rockchip,usercode = <0xff00>;rockchip,key_table =<0xba   KEY_POWER>,   //電源按鍵<0xb8   KEY_MENU>,     //菜單按鍵<0xbc   KEY_BACK>,      //返回按鍵<0xbb   KEY_HOME>,      //home鍵按鍵<0xea   KEY_PLAY>,      //播放按鍵<0xbf   KEY_VOLUMEUP>,  //音量加按鍵<0xe6   KEY_VOLUMEDOWN>,   //音量鍵按鍵<0xf6   KEY_FASTFORWARD>,  //快進按鍵<0xf8   KEY_FASTREVERSE>,  //快退按鍵<0xf2   KEY_BACKSPACE>,    //BaskSpace按鍵<0xf3   KEY_1>,            //按鍵1<0xe7   KEY_2>,<0xa1   KEY_3>,<0xf7   KEY_4>,<0xe3   KEY_5>,<0xa5   KEY_6>,<0xbd   KEY_7>,<0xad   KEY_8>,<0xb5   KEY_9>,<0xe9   KEY_0>;            //按鍵0};

注意

按鍵對應的事件是自定義的,事件可根據實際需求確定

12.3.?修改設備樹事件頭文件

默認使用了rk定義的事件頭文件,該文件不全面,使用內核通用的事件頭文件linux-event-codes.h,如果不注釋rk的頭文件會報重復定義的警告。

1
2
//#include <dt-bindings/input/rk-input.h>
#include <dt-bindings/input/linux-event-codes.h>

../../_images/telecontroller_3.jpg

12.4.?編譯并替換設備樹

參考驅動篇:?編譯設備樹章節

12.5.?測試

編譯并替換設備樹后,可進行測試,按下電源按鍵就會彈出關機窗口,打開桌面終端,按下按鍵1、2等數字按鍵,命令行也會同步輸入相應數字,與鍵盤無異。

../../_images/telecontroller_4.jpg

因為驅動使用的是輸入子系統,可以檢測輸入事件的方法檢測按鍵事件。

1
2
#確認紅外對應的事件
ls /dev/input/by-path/ -l

../../_images/telecontroller_5.jpg

找到pwm-event對應的事件就是紅外的事件。

可以通過以下程序監測輸入事件。

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>int main(int argc, char *argv[])
{struct input_event in_ev = {0};int fd = -1;int pulse_count=0;/* 校驗傳參 */if (2 != argc) {fprintf(stderr, "usage: %s <input-dev>\n", argv[0]);exit(-1);}/* 打開文件 */if (0 > (fd = open(argv[1], O_RDONLY))) {perror("open error");exit(-1);}for ( ; ; ) {/* 循環讀取數據 */if (sizeof(struct input_event) !=read(fd, &in_ev, sizeof(struct input_event))) {perror("read error");exit(-1);}printf("type:%d code:%d value:%d\n",in_ev.type, in_ev.code, in_ev.value);}
}

創建buttons.c并將以上內容添加buttons.c,編譯并運行

1
2
3
4
5
#編譯
gcc buttons.c -o buttons#運行,需要指定實際的pwm-event
sudo ./buttons /dev/input/event0

以下是按下按鍵1的情況,對應事件KEY_1。

../../_images/telecontroller_6.jpg

可見,打印的code值為2,對應linux-event-codes.h中的 “#define KEY_1 2”,也即可以通過code值區分事件,value可確定按鍵是否按下。

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

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

相關文章

同一個虛擬環境中conda和pip安裝的文件存儲位置解析

文章目錄 存儲位置的基本區別conda安裝的包pip安裝的包 看似相同實則不同的機制實際路徑示例這種差異帶來的問題如何檢查包安裝來源最佳實踐建議 總結 存儲位置的基本區別 conda安裝的包 存儲在Anaconda(或Miniconda)目錄下的pkgs和envs子目錄中&#xff1a; ~/anaconda3/en…

機器學習極簡入門:從基礎概念到行業應用

有監督學習&#xff08;supervised learning&#xff09; 讓模型學習的數據包含正確答案&#xff08;標簽&#xff09;的方法&#xff0c;最終模型可以對無標簽的數據進行正確處理和預測&#xff0c;可以分為分類與回歸兩大類 分類問題主要是為了“盡可能分開整個數據而畫線”…

split和join的區別?

split和join是Python中用于處理字符串的兩種方法&#xff0c;它們的主要區別在于功能和使用場景。? split()方法 ?split()方法用于將字符串按照指定的分隔符分割成多個子串&#xff0c;并返回這些子串組成的列表?。如果不指定分隔符&#xff0c;則默認分割所有的空白字符&am…

MySQL從入門到精通(二):Windows和Mac版本MySQL安裝教程

目錄 MySQL安裝流程 &#xff08;一&#xff09;、進入MySQL官網 &#xff08;二&#xff09;、點擊下載&#xff08;Download&#xff09; &#xff08;三&#xff09;、Windows和Mac版本下載 下載Windows版本 下載Mac版本 &#xff08;四&#xff09;、驗證并啟動MySQL …

LeetCode 解題思路 45(分割等和子集、最長有效括號)

解題思路&#xff1a; dp 數組的含義&#xff1a; 在數組中是否存在一個子集&#xff0c;其和為 i。遞推公式&#xff1a; dp[i] | dp[i - num]。dp 數組初始化&#xff1a; dp[0] true。遍歷順序&#xff1a; 從大到小去遍歷&#xff0c;從 i target 開始&#xff0c;直到 …

電影感戶外啞光人像自拍攝影Lr調色預設,手機濾鏡PS+Lightroom預設下載!

調色詳情 電影感戶外啞光人像自拍攝影 Lr 調色&#xff0c;是借助 Lightroom 軟件&#xff0c;針對戶外環境下拍攝的人像自拍進行后期處理。旨在模擬電影畫面的氛圍與質感&#xff0c;通過調色賦予照片獨特的藝術氣息。強調打造啞光效果&#xff0c;使畫面色彩不過于濃烈刺眼&a…

使用 NV?Ingest、Unstructured 和 Elasticsearch 處理非結構化數據

作者&#xff1a;來自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 為 RAG 應用構建可擴展的非結構化文檔數據管道。 Elasticsearch 原生集成了行業領先的生成式 AI 工具和提供商。查看我們的網絡研討會&#xff0c;了解如…

Android 13 使能user版本進recovery

在 debug 版本上&#xff0c;可以在關機狀態下&#xff0c;同時按 電源鍵 和 音量加鍵 進 recovery 。 user 版本上不行。 參考 使用 build 變體 debug 版本和 user 版本的差別之一就是 ro.debuggable 屬性不同。 順著這個思路追蹤&#xff0c;找到 bootable/recovery/reco…

每日算法刷題計劃

這是我每天堅持刷算法題的倉庫&#xff0c;每天刷1-3道&#xff0c;時間30-40min&#xff0c;加油! 目前考慮leetcode洛谷形式&#xff0c;c和python3語言&#xff0c;leetcode主要學核心思想&#xff0c;洛谷學會輸入輸出格式 每日打卡:markdowncsdn打卡 刷題策略: 按分類刷…

紅黑樹():

1. 紅黑樹&#xff1a; 紅黑樹從根節點開始的最長的路徑不會超過最短路徑的2倍。 紅黑樹的話&#xff0c;他的結點的分布沒有我們的AVL樹的結點的分布均衡&#xff0c;但是效率也不錯&#xff0c;AVL樹的結點分布的那么均勻&#xff0c;其實也是在進行了旋轉&#xff0c;付出了…

【AI智能推薦系統】第六篇:隱私保護與聯邦學習在推薦系統中的平衡之道

第六篇:隱私保護與聯邦學習在推薦系統中的平衡之道 提示語:?? “數據不出域,推薦更精準!深度揭秘騰訊、螞蟻集團如何用聯邦學習打造合規推薦系統,隱私計算技術全景解析與工業級實現方案!” 目錄 隱私保護的行業挑戰隱私計算技術體系 2.1 聯邦學習基礎架構2.2 差分隱私…

【Qt/C++】深入理解 Lambda 表達式與 `mutable` 關鍵字的使用

【Qt/C】深入理解 Lambda 表達式與 mutable 關鍵字的使用 在 Qt 開發中&#xff0c;我們常常會用到 lambda 表達式來編寫簡潔的槽函數。今天通過一個實際代碼示例&#xff0c;詳細講解 lambda 的語法、變量捕獲方式&#xff0c;特別是 mutable 的作用。 示例代碼 QPushButto…

記錄 ubuntu 安裝中文語言出現 software database is broken

搜索出來的結果是 sudo apt-get install language-pack-zh-han* 然而,無效,最后手動安裝如下 apt install language-pack-zh-hans apt install language-pack-zh-hans-base apt install language-pack-gnome-zh-hans apt install fonts-arphic-uming apt install libreoffic…

[虛幻官方教程學習筆記]深入理解實時渲染(An In-Depth Look at Real-Time Rendering)

原英文教程地址深入理解實時渲染&#xff08;An In-Depth Look at Real-Time Rendering&#xff09; 文章目錄 1.Intro to An In-Depth Look at Real-Time RenderingCPU VS GPUDeferred VS Forward 2. Before Rendering and OcclusionCulling計算的步驟使用console command:fre…

Linux進程間信號

目錄 信號入門 生活角度中的信號 技術應用角度的信號 信號的發送與記錄 信號處理常見方式概述 產生信號 通過終端按鍵產生 通過系統函數向進程發信號 由軟件條件產生信號 由硬件異常產生信號 阻塞信號 信號其他相關常見概念 在內核中的表示 sigset_t 信號集操作…

Git簡介和發展

Git 簡介 Git是一個開源的分布式版本控制系統&#xff0c;跨平臺&#xff0c;支持Windows、Linux、MacOS。主要是用于項目的版本管理&#xff0c;是由林納斯托瓦茲(Linux Torvalds)在2005年為Linux內核開發而創建。 起因 在2002年至2005年間&#xff0c;Linux內核開發團隊使…

Perspective,數據可視化的超級引擎!

Perspective 是一個強大的交互式數據分析和可視化庫&#xff0c;它允許你創建高度可配置的報告、儀表板、筆記本和應用程序。給用戶提供了一個新的視角來看待數據。 Stars 數9125Forks 數1217 主要特點 高效流式查詢引擎&#xff1a;Perspective使用C編寫&#xff0c;并編譯為…

MySQL COUNT(*) 查詢優化詳解!

目錄 前言1. COUNT(*) 為什么慢&#xff1f;—— InnoDB 的“計數煩惱” &#x1f914;2. MySQL 執行 COUNT(*) 的方式 (InnoDB)3. COUNT(*) 優化策略&#xff1a;快&#xff01;準&#xff01;狠&#xff01;策略一&#xff1a;利用索引優化帶 WHERE 子句的 COUNT(*) (最常見且…

如何在postman使用時間戳

1. 使用 Pre-request Script 動態轉換? 在發送請求前&#xff0c;將日期字符串轉為時間戳并存儲為環境變量/全局變量。 ?示例代碼? // 將日期字符串&#xff08;如 "2023-10-01"&#xff09;轉為時間戳&#xff08;毫秒&#xff09; const dateString "2…

嵌入式學習筆記 - 運算放大器的共模抑制比

一 定義 共模抑制比&#xff08;Common Mode Rejection Ratio, ?CMRR?&#xff09;是衡量差分放大器&#xff08;或差分電路&#xff09;抑制共模信號能力的關鍵指標。它在電子工程中尤為重要&#xff0c;特別是在需要處理微弱信號或對抗環境噪聲的場景中。 核心概念 ?共…