RK3288 红外遥控器增加系统中已有的键值
转载请注明出处:https://www.cnblogs.com/lialong1st/p/10066673.html
CPU:RK3288
系统:Android 5.1
1、查看遥控器的用户码和键值,供应商给的可能是反码,也有可能不正确。
打开红外打印功能有以下两种方式,内核打印可以用串口,也可以在adb中使用指令 # cat proc/kmsg
(1)通过指令打开红外接收的打印功能,然后按遥控器按键,就可以在内核打印中看到用户码和键值。
$ adb shell
root@rk3288:/ # cd sys/module/rockchip_pwm_remotectl/parameters
cd sys/module/rockchip_pwm_remotectl/parameters
root@rk3288:/sys/module/rockchip_pwm_remotectl/parameters # ls
ls
code_print
dbg_level
root@rk3288:/sys/module/rockchip_pwm_remotectl/parameters # cat code_print
cat code_print root@rk3288:/sys/module/rockchip_pwm_remotectl/parameters # echo > code_print
echo > code_print
(2)在红外接收的源码中,给下面变量赋值,也可以打印用户码和键值,但需要重新编译烧录内核
path:kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
static int rk_remote_print_code = ;
2、在dts文件中增加键值,绝大部分键值系统中已经定义,如果没有的就需要自己添加。
path:kernel/arch/arm/boot/dts/rk3288.dtsi
remotectl: pwm@ff680000 {
        compatible = "rockchip,remotectl-pwm";
        reg = <0xff680000 0x10>;
        #pwm-cells = <>;
        pinctrl-names = "default";
        pinctrl- = <&pwm0_pin>;
        clocks = <&clk_gates11 >;
        clock-names = "pclk_pwm";
        remote_pwm_id = <>;
        interrupts = <GIC_SPI  IRQ_TYPE_LEVEL_HIGH>;
        status = "disabled";
    };
remote_pwm_id:使用pwm0
path:kernel/arch/arm/boot/dts/rk3288-tb_8846.dts
&remotectl {
    status = "okay";
    handle_cpu_id = <>;
    ir_key0{
        rockchip,usercode = <0xff00>;
        rockchip,key_table =
            <0xf0 KEY_POWER>,        // Power
            <0xad KEY_HOME>,         // Home
            <0xef KEY_MENU>,         // Menu
            <0xa7 KEY_MUTE>,         // mute
            <0xa1 >,              // Mouse
            <0xb2 KEY_UP>,           // Up
            <0xee KEY_PAGEUP>,       // PageUp
            <0xa3 KEY_VOLUMEUP>,     // Vol+
            <0xa8 KEY_LEFT>,         // Left
            <0xa4 KEY_ENTER>,        // Ok/ENTER
            <0xa0 KEY_RIGHT>,        // Right
            <0xab KEY_VOLUMEDOWN>,   // Vol-
            <0xa9 KEY_TAB>,          // Tab
            <0xa5 KEY_DOWN>,         // Down
            <0xed KEY_PAGEDOWN>,     // PageDown
            <0xac KEY_BACK>,         // Back
            <0xe8 KEY_1>,            //
            <0xe4 KEY_2>,            //
            <0xe0 KEY_3>,            //
            <0xe9 KEY_4>,            //
            <0xe5 KEY_5>,            //
            <0xe1 KEY_6>,            //
            <0xea KEY_7>,            //
            <0xe6 KEY_8>,            //
            <0xe2 KEY_9>,            //
            <0xe7 KEY_0>,            //
            <0xeb KEY_DOT>,          // .
            <0xe3 KEY_DELETE>,       // Del
            <0xa6 KEY_PAUSE>,        // Pause
            <0xaa KEY_PLAY>;         // Play
    };
};
usercode:用户码
key_table:左侧为遥控器键值,右侧为按键对应的功能码
绝大部分功能码可以在下面文件中查找到,写宏或者对应的数字都可以(例如mouse键),如果的确没有,可以用功能键代替或者手动添加。
path:kernel/include/dt-bindings/input/input.h
此时,编译烧录,按键值就可以通过 getevent 查看到,但app中收到的按键值可能与实际不对应或者未知按键。
getevent用法:https://www.cnblogs.com/lialong1st/p/9093851.html
3、打开下面路径的文件,可以看到功能码和上层对应的关系, 如果新添加的按键值没有,也需要按照已有的格式手动添加。
没有的按键值,在按键时,上层app收到的值是未知按键。
path:device/rockchip/common/ff680000_pwm.kl
key ENTER
key POWER
key BACK
key MENU
key SEARCH
key DPAD_CENTER
key DPAD_DOWN
key DPAD_UP
key HOME
key DPAD_LEFT
key DPAD_RIGHT
key VOLUME_UP
key VOLUME_DOWN
key NOTIFICATION
key VOLUME_MUTE
key TV_KEYMOUSE_MODE_SWITCH
key PAGE_UP
key PAGE_DOWN
key TAB
key
key
key
key
key
key
key
key
key
key
key PERIOD
key DEL
key MEDIA_PAUSE
key MEDIA_PLAY
中间的数字是功能码对应的数字,与第二步的查找方法一致。
右侧的是与上层对应的关系,在下面路径中任意一个都可以查找到,如有特殊功能键则需要添加。
path:frameworks/base/core/java/android/view/KeyEvent.java(例如:KEYCODE_DPAD_DOWN 只需要取后半部分就可以)
path:frameworks/native/include/input/InputEventLabels.h(例如:DPAD_DOWN 只需要取括号内部的就可以)
注意:数字键不要用小键盘(NUMPAD_0 等等),因为小键盘有多功能。
此时,就大功告成了。
下面为简单的遥控器测试app源码
MainActivity.java
package com.example.aaron.irtest; import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.TextView;
import android.widget.Toast; import java.time.LocalDate; public class MainActivity extends AppCompatActivity { private static final String TAG = "IR";
TextView tv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.display);
} public boolean onKeyDown(int keyCode, KeyEvent event)
{
Log.d(TAG, String.valueOf(keyCode));
switch (keyCode)
{
case KeyEvent.KEYCODE_POWER:
tv.setText("电源键");
Toast.makeText(getBaseContext(), "电源键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_HOME:
tv.setText("主页键");
Toast.makeText(getBaseContext(), "主页键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_MENU:
tv.setText("菜单键");
Toast.makeText(getBaseContext(), "菜单键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_VOLUME_MUTE:
tv.setText("静音键");
Toast.makeText(getBaseContext(), "静音键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_STEM_PRIMARY:
tv.setText("鼠标键");
Toast.makeText(getBaseContext(), "鼠标键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_DPAD_UP:
tv.setText("上键");
Toast.makeText(getBaseContext(), "上键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_PAGE_UP:
tv.setText("上页键");
Toast.makeText(getBaseContext(), "上页键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_VOLUME_UP:
tv.setText("音量+键");
Toast.makeText(getBaseContext(), "音量+键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
tv.setText("左键");
Toast.makeText(getBaseContext(), "左键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_ENTER:
tv.setText("确认键");
Toast.makeText(getBaseContext(), "确认键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
tv.setText("右键");
Toast.makeText(getBaseContext(), "右键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_VOLUME_DOWN:
tv.setText("音量-键");
Toast.makeText(getBaseContext(), "音量-键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_TAB:
tv.setText("Tab键");
Toast.makeText(getBaseContext(), "Tab键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
tv.setText("下键");
Toast.makeText(getBaseContext(), "下键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_PAGE_DOWN:
tv.setText("下页键");
Toast.makeText(getBaseContext(), "下页键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_BACK:
tv.setText("返回键");
Toast.makeText(getBaseContext(), "返回键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_1:
tv.setText("1");
Toast.makeText(getBaseContext(), "1", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_2:
tv.setText("2");
Toast.makeText(getBaseContext(), "2", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_3:
tv.setText("3");
Toast.makeText(getBaseContext(), "3", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_4:
tv.setText("4");
Toast.makeText(getBaseContext(), "4", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_5:
tv.setText("5");
Toast.makeText(getBaseContext(), "5", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_6:
tv.setText("6");
Toast.makeText(getBaseContext(), "6", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_7:
tv.setText("7");
Toast.makeText(getBaseContext(), "7", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_8:
tv.setText("8");
Toast.makeText(getBaseContext(), "8", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_9:
tv.setText("9");
Toast.makeText(getBaseContext(), "9", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_0:
tv.setText("0");
Toast.makeText(getBaseContext(), "0", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_PERIOD:
tv.setText("小数点");
Toast.makeText(getBaseContext(), "小数点", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_DEL:
tv.setText("删除键");
Toast.makeText(getBaseContext(), "删除键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_MEDIA_PAUSE:
tv.setText("暂停键");
Toast.makeText(getBaseContext(), "暂停键", Toast.LENGTH_SHORT).show();
break;
case KeyEvent.KEYCODE_MEDIA_PLAY:
tv.setText("播放键");
Toast.makeText(getBaseContext(), "播放键", Toast.LENGTH_SHORT).show();
break;
}
return false;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.aaron.irtest.MainActivity"> <TextView
android:id="@+id/display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="50sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>
RK3288 红外遥控器增加自定义按键
RK3288 红外遥控器增加系统中已有的键值的更多相关文章
- RK3288 红外遥控器增加自定义按键
		
转载请注明出处:https://www.cnblogs.com/lialong1st/p/10071557.html CPU:RK3288 系统:Android 5.1 1.在 dts 中增加红外遥控 ...
 - 金蝶K3,名称或代码在系统中已被使用,由于数据移动,未能继续以NOLOCK方式扫描
		
使用金蝶K3时出现:名称或代码在系统中已被使用:错误代码:3604(E14H)source:Microsoft OLE DB provider for SQL SERVERDetail:由于数据移动, ...
 - free - 显示系统中已用和未用的内存空间总和.
		
总览 (SYNOPSIS) free [-b | -k | -m] [-o] [-s delay ] [-t] [-V] 描述 (DESCRIPTION) free 显示 系统中 已用和未用的 物理内 ...
 - CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储
		
CockroachDB学习笔记--[译]CockroachDB中的SQL:映射表中数据到键值存储 原文标题:SQL in CockroachDB: Mapping Table Data to Key- ...
 - 仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大
		
仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大 1.介绍 先看图  今天在项目中遇到了一个问题,例如我现在需要传一些数据到后端,数组例如是 let arr = [ {" ...
 - php usort 按照数组中的某个键值排序
		
//php usort 按照数组中的某个键值排序 如果第一个参数小于第二个参数 -> 返回小于0的整数如果第一个参数等于于第二个参数 -> 返回等于0的整数如果第一个参数大于于第二个参数 ...
 - .NET 获取Get方式URL中的参数键值
		
在Web开发中,我们常常会涉及到需要获取Get方式URL中的参数键值的情况,这里简单介绍三种方法: 第一种:常用的做法有使用JavaScript获取location.href后用正则表达式匹配获取此U ...
 - pgsql 查询jsonb中包含某个键值对的表记录
		
pgsql 查询jsonb中包含某个键值对的表记录 表名 table_name ,字段 combos 类型为 jsonb 可为空,示例内容如下, $arr_combos = [ ['id' => ...
 - JAVA整合Redis使用redisTemplate清除库中的所有键值对数据
		
JAVA整合Redis使用redisTemplate清除库中的所有键值对数据,清除所有缓存数据 Set<String> keys = redisTemplate.keys("*& ...
 
随机推荐
- 20145201李子璇 《网络对抗》 Web基础
			
1.实验后回答问题 (1)什么是表单 它在网页中主要负责数据采集功能,通过用户提交的一些数据来建立网站管理者与浏览者之间的桥梁. 两个组成部分:①HTML源代码用于描述表单(比如域,标签和浏览者在页面 ...
 - 20155201 2016-2017-2 《Java程序设计》第十周学习总结
			
20155201 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 Java密码技术 安全的三个属性 机密性 完整性 可用性 密码学: 主要是研究保密通信和信息 ...
 - Git-分支管理【转】
			
本文转载自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 分支管理 分支就是科幻 ...
 - ZOJ 2314 Reactor Cooling(无源汇上下界网络流)
			
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题意: 给出每条边流量的上下界,问是否存在可行流,如果存在则输出. ...
 - SPOJ - PGCD Primes in GCD Table(莫比乌斯反演)
			
http://www.spoj.com/problems/PGCD/en/ 题意: 给出a,b区间,求该区间内满足gcd(x,y)=质数的个数. 思路: 设f(n)为 gcd(x,y)=p的个数,那么 ...
 - Redis复制(replication)
			
介绍 Redis支持简单的主从(master-slave)复制功能,当主Redis服务器更新数据时能将数据同步到从Redis服务器 配置 在Redis中使用复制功能非常容易 在从Redis服务器的re ...
 - python 进制转换
			
print hex(),hex(-) #转换成十六进制 print oct(),oct(-) #转换成八进制 print bin(),bin(-) #转换成二进制 print int("字面 ...
 - Nginx 多进程连接请求/事件分发流程分析
			
Nginx使用多进程的方法进行任务处理,每个worker进程只有一个线程,单线程循环处理全部监听的事件.本文重点分析一下多进程间的负载均衡问题以及Nginx多进程事件处理流程,方便大家自己写程序的时候 ...
 - jq  抖动效果
			
1 .html <div style="margin:50px auto;width:900px;overflow:visible;"> <div id=&quo ...
 - 使用actioncable做的notification(GoRails教学,2课)
			
GoRails视频系列: 1. 用actioncable建立Notifications 2. 见博客: 3. 非认证/登陆user不能使用actioncable 用ActionCable 建立 ...