rk3288-android8-IR-mouse

news2024/11/14 20:24:44

IR问题:

mouse按键使用不了

然后排查:

1.排查上报

	ir_key6{ 
		rockchip,usercode = <0xbf00>;
		rockchip,key_table =
		<0xff KEY_POWER>,
		<0xfe KEY_MUTE>,		
		<0xfd KEY_1>, 
	    <0xfc KEY_2>, 
	    <0xfb KEY_3>, 
	    <0xfa KEY_4>, 
	    <0xf9 KEY_5>, 
	    <0xf8 KEY_6>,
	    <0xf7 KEY_7>, 
	    <0xf6 KEY_8>, 
	    <0xf5 KEY_9>, 
	    <0xf3 KEY_0>,		
		<0xb5 KEY_CHANNELUP>,      //pin+
		<0xb4 KEY_CHANNELDOWN>, //pin-			
		<0xb7 KEY_VOLUMEUP>,
		<0xb6 KEY_VOLUMEDOWN>,		
        <0x9e KEY_HOME>,		
		<0xec KEY_UP>,
		<0xeb KEY_DOWN>,
		<0xee KEY_LEFT>,
		<0xed KEY_RIGHT>,	
		<0xef  KEY_ENTER>,//KEY_ENTER>,   
		<0xe8 KEY_ENTER>,//KEY_ENTER>, 
        <0xe9   KEY_MENU>,	
		<0xbf KEY_SCREENLOCK>,//mouse switch	pinxian
		<0xf0 388>,//mouse switch	xinhao	
		<0xea KEY_BACK>,	
		<0xae KEY_PLAYPAUSE>, 
		<0xb2 KEY_CLOSE>, 	//3d	
		<0xad KEY_STOPCD>,	
		<0xa9 KEY_REWIND>, 
		<0xa8 KEY_FASTFORWARD>, 
		<0xab KEY_PREVIOUSSONG>,
		<0xaa KEY_NEXTSONG>; 
	};	

可以知道<0xf0 388>,使我们这个博客的主角

//插播一下,IR就三个引脚,检查硬件接好后按动遥控器

echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print

可以在串口打印上看到键码值

rk3288:/ # cat proc/kmsg
<6>[  753.280233] USERCODE=0xbf00
<6>[  753.307258] RMC_GETDATA=ec

然后先获取到你的遥控器的CODE值和键码值

这时候硬件是好的

然后,

rk3288:/ # getevent
add device 1: /dev/input/event2
  name:     "rk29-keypad"
add device 2: /dev/input/event1
  name:     "SIGMACHIP Usb Mouse"
add device 3: /dev/input/event0
  name:     "ff680020.pwm"
/dev/input/event0: 0001 0067 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0067 00000000
/dev/input/event0: 0000 0000 00000000
^C
130|rk3288:/ #
130|rk3288:/ # getevent -l
add device 1: /dev/input/event2
  name:     "rk29-keypad"
add device 2: /dev/input/event1
  name:     "SIGMACHIP Usb Mouse"
add device 3: /dev/input/event0
  name:     "ff680020.pwm"
/dev/input/event0: EV_KEY       KEY_UP               DOWN
/dev/input/event0: EV_SYN       SYN_REPORT           00000000
/dev/input/event0: EV_KEY       KEY_UP               UP
/dev/input/event0: EV_SYN       SYN_REPORT           00000000

"ff680020.pwm"这个是映射表

#$_FOR_ROCKCHIP_RBOX_$
#$_rbox_$_modify_$_chenzhi_20120220: add for IR remote

key 28    ENTER
key 116   POWER             
key 158   BACK              
key 139   MENU         
key 217   SEARCH             
key 232   DPAD_CENTER       
key 108   DPAD_DOWN         
key 103   DPAD_UP           
key 102   HOME              
key 105   DPAD_LEFT         
key 106   DPAD_RIGHT        
key 115   VOLUME_UP 
key 114   VOLUME_DOWN
key 143   NOTIFICATION      
key 113   VOLUME_MUTE
key 388   TV_KEYMOUSE_MODE_SWITCH
key 164   MEDIA_PLAY_PAUSE
key 141   SETTINGS

key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 14    DEL


key 407   MEDIA_NEXT
key 412   MEDIA_PREVIOUS


#key 400   TV_MEDIA_MULT_BACKWARD
#key 401   TV_MEDIA_MULT_FORWARD
#key 402   TV_MEDIA_PLAY_PAUSE
#key 64    TV_MEDIA_PLAY
#key 65    TV_MEDIA_PAUSE
#key 66    TV_MEDIA_STOP
#key 67    TV_MEDIA_REWIND
#key 68    TV_MEDIA_FAST_FORWARD
#key 87    TV_MEDIA_PREVIOUS
#key 88    TV_MEDIA_NEXT

key 388   TV_KEYMOUSE_MODE_SWITCH

就是驱动映射到android的键值

rk3288-8.1/sdk$ grep -rnH "AKEYCODE_TV_KEYMOUSE_MODE_SWITCH" ./frameworks/
./frameworks/native/include/android/keycodes.h:777:    AKEYCODE_TV_KEYMOUSE_MODE_SWITCH = 289
./frameworks/native/services/inputflinger/InputReader.cpp:2478:    if (keyCode == AKEYCODE_TV_KEYMOUSE_MODE_SWITCH) {

android会再把TV_KEYMOUSE_MODE_SWITCH映射成AKEYCODE_TV_KEYMOUSE_MODE_SWITCH=289

然后我发现遥控按键并没有反应

然后查阅资料发现这一段是关于遥控鼠标和遥控按键

 

 查询log

374   446 D WindowManager: interceptKeyTq keycode=0 interactive=true keyguardActive=false policyFlags=22000000

发现这个按键的keycode=0

问题已经找到了,哪里回事导致=0呢

然后追查到

03-02 10:16:19.061   370   443 D InputReader: BatchSize: 2 Count: 2
03-02 10:16:19.061   370   443 D InputReader: Input event: device=3 type=0x0001 code=0x0184 value=0x00000000 when=189219995000
03-02 10:16:19.061   370   443 I InputReader: KeyboardInputMapper::processKey key= keyCode=0
03-02 10:16:19.061   370   443 I InputReader: InputDevice::process key= keyCode=388
03-02 10:16:19.062   370   443 D InputReader: Input event: device=3 type=0x0000 code=0x0000 value=0x00000000 when=189219995000
03-02 10:16:19.062   370   443 I InputReader: InputDevice::process key= keyCode=0

经过排查发现

 这里上报的code=0x0184不就是我们的键值388吗?

 

 然后我发现这里都上报到了,但是到

 到这里就变成keycode=0了,我强行吧keycode拉到289发现功能正常,果然就是这中间丢失了keycode导致的,于是我在上面设置一个变量让num作为标志位,388上报的时候让num=1;

然后keycode=0的时候判断一下是不是388的上报,如果num==1,则手动keycode=289;强行到按键值后发现功能正常;

Index: InputReader.cpp
===================================================================
--- InputReader.cpp     (revision 101)
+++ InputReader.cpp     (working copy)
@@ -89,7 +89,8 @@
 
 static const int KEYCODE_ENTER = 28;
 static const int KEYCODE_DPAD_CENTER = 232;
-
+static const int KEYCODE_KEYMOUSE_MODE_SWITCH = 289;
+static int num=0; 
 // --- Static Functions ---
 
 template<typename T>
@@ -1208,6 +1209,10 @@
         ALOGD("Input event: device=%d type=0x%04x code=0x%04x value=0x%08x when=%lld",
                 rawEvent->deviceId, rawEvent->type, rawEvent->code, rawEvent->value,
                 rawEvent->when);
+               if(rawEvent->code==0x0184)
+               {
+               num=1;
+               }
 #endif
 
         if (mDropUntilNextSync) {
@@ -2448,7 +2453,7 @@
     uint32_t policyFlags;
 
     if (getEventHub()->mapKey(getDeviceId(), scanCode, usageCode, mMetaState,
-                              &keyCode, &keyMetaState, &policyFlags)) {
+                              &keyCode, &keyMetaState, &policyFlags)) {                                          
         keyCode = AKEYCODE_UNKNOWN;
         keyMetaState = mMetaState;
         policyFlags = 0;
@@ -2463,6 +2468,12 @@
        sprintf(mID,"%d",getDeviceId());
        property_set("sys.ID.mID",mID);
 
+                       if(keyCode==0&&num==1)
+                       {
+                               num=0;
+                               keyCode=289;
+                       }
+
        if (down) {
           if (keyCode == AKEYCODE_TV_KEYMOUSE_MODE_SWITCH) {
                   if (strcmp(mKeyMouseState, "on")==0) {
@@ -3760,28 +3771,8 @@
         newViewport.setNonDisplayViewport(rawWidth, rawHeight);
     }
     bool viewportChanged = mViewport != newViewport;
-       char value_private[PROP_VALUE_MAX];
     if (viewportChanged) {
         mViewport = newViewport;
-               property_get("persist.sys.displayrot", value_private, "0");
-               int cmpRet = atoi(value_private);
-               ALOGD("tp persist.sys.displayrot~~~~~~~~~~~~~~~~~~~~~~~~~ = %d",cmpRet);    
-               if (cmpRet == 0)    
-               {        
-                       mViewport.orientation = DISPLAY_ORIENTATION_0;
-               }  
-               else if(cmpRet == 90)    
-               {
-                       mViewport.orientation = DISPLAY_ORIENTATION_90;  
-               }
-               else if(cmpRet == 180)
-               {
-                       mViewport.orientation = DISPLAY_ORIENTATION_180;  
-               }
-               else if(cmpRet == 270)
-               {
-                       mViewport.orientation = DISPLAY_ORIENTATION_270;  
-               }
 
         if (mDeviceMode == DEVICE_MODE_DIRECT || mDeviceMode == DEVICE_MODE_POINTER) {
             // Convert rotated viewport to natural surface coordinates.
@@ -6380,6 +6371,8 @@
         mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, x);
         mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, y);
         mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);
     } else if (currentFingerCount == 0) {
         // Case 3. No fingers down and button is not pressed. (NEUTRAL)
         if (mPointerGesture.lastGestureMode != PointerGesture::NEUTRAL) {
@@ -6538,6 +6531,10 @@
         mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, y);
         mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE,
                 down ? 1.0f : 0.0f);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(
+                AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(
+                AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);
 
         if (lastFingerCount == 0 && currentFingerCount != 0) {
             mPointerGesture.resetTap();
@@ -6784,6 +6781,10 @@
                     mPointerGesture.referenceGestureX);
             mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y,
                     mPointerGesture.referenceGestureY);
+            mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X,
+                    commonDeltaX);
+            mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y,
+                    commonDeltaY);
             mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f);
         } else if (mPointerGesture.currentGestureMode == PointerGesture::FREEFORM) {
             // FREEFORM mode.
@@ -6880,6 +6881,10 @@
                         AMOTION_EVENT_AXIS_Y, mPointerGesture.referenceGestureY + deltaY);
                 mPointerGesture.currentGestureCoords[i].setAxisValue(
                         AMOTION_EVENT_AXIS_PRESSURE, 1.0f);
+                mPointerGesture.currentGestureCoords[i].setAxisValue(
+                        AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
+                mPointerGesture.currentGestureCoords[i].setAxisValue(
+                        AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);
             }
 
             if (mPointerGesture.activeGestureId < 0) {
@@ -7002,6 +7007,8 @@
         mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y);
         mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE,
                 hovering ? 0.0f : 1.0f);
+        mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, x);
+        mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, y);
         mPointerSimple.currentProperties.id = 0;
         mPointerSimple.currentProperties.toolType =
                 mCurrentCookedState.cookedPointerData.pointerProperties[currentIndex].toolType;

 

  

大概补丁就这样,仅供参考!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE进阶第六课:SpringBoot ⽇志⽂件

上篇文章介绍了SpringBoot配置文件&#xff0c;这篇文章我们将会介绍SpringBoot ⽇志⽂件 荔枝1.日志有什么用2.自定义日志输出2.1获取程序日志对象2.2使用相关方法输出日志2.3日志级别2.3.1日志级别的作用2.3.2日志级别如何设置2.4日志格式3.持久化日志4.更简单的日志输出4.1使…

【移动端表格组件】uniapp简单实现H5,小程序,APP多端兼容表格功能,复制即用,简单易懂【详细注释版本】

前言&#xff1a; 由于最近需要做移动端的项目 有个pc端的后台系统里面需要移一部分页面过来 而里面就有很多的表格&#xff0c;我就开始惯例网上先找前人栽的树&#xff0c;我好乘凉 然后找了一圈发现&#xff0c;不管是主流的移动端ui库或者网上自己写的帖子&#xff0c;或者…

224. 基本计算器

224. 基本计算器给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数&#xff0c;比如 eval() 。 示例 1&#xff1a;输入&#xff1a;s "1 1"输出&#xff1a;2示例 2&#…

【Pygame实战】变异狗大战:据说是最近还不错的小游戏,这一个个玩到表情崩坏,点开即玩,赶紧来~(Python代码搞笑版本)

前言 只有你想不到&#xff0c;没有我找不到写不了的好游戏&#xff01; 哈喽。我是你们的栗子同学啦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 今天小编去了我朋友家里玩儿&#xff0c…

ExSwin-Unet 论文研读

ExSwin-Unet摘要1 引言2 方法2.1 基于窗口的注意力块2.2 外部注意力块2.3 不平衡的 Unet 架构2.4 自适应加权调整2.5 双重损失函数3 实验结果3.1 数据集3.2 实现细节3.3 与 SOTA 方法的比较3.4 消融研究4 讨论和限制5 结论数据集来源&#xff1a; https://feta.grand-challenge…

图扑 Web SCADA 智慧制硅厂,打造新时代制硅工业

前言 我国目前是全球最大的工业硅生产国、消费国和贸易国&#xff0c;且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识&#xff0c;随着我国“双碳”目标的推进&#xff0c;光伏产业链快速发展&#xff0c;在光伏装机需求的带动下&#…

武汉凯迪正大KD305系列智能数字绝缘电阻测试仪

一、概述 KD305系列智能数字绝缘电阻测试仪采用嵌入式工业单片机实时操作系统&#xff0c;数字模拟指针与数字段码显示结合&#xff0c;该系列表具有多种电压输出等级&#xff08;500V、1000V、2500V、5000V、10000V&#xff09;、容量大、抗干扰强、模拟指针与数字同步显示、交…

数据结构考研习题精选

&#xff11; A假设比较&#xff54;次&#xff0c;由于换或不换&#xff0c;则必然有&#xff12;&#xff3e;&#xff54;种可能。又设有&#xff4e;个关键字&#xff0c;&#xff4e;&#xff01;排列组合&#xff0c;则必然有&#xff12;&#xff3e;&#xff54;&…

vue-element-admin执行npm install时的一些报错。

文章目录1. 首先在gitee上拉取的中文版2. 执行npm install的一些报错3. 参考文章1. 首先在gitee上拉取的中文版 git clone -b i18n https://gitee.com/panjiachen/vue-element-admin.git 2. 执行npm install的一些报错 npm install Please make sure you have the correct acc…

跨境电商平台,亚马逊、eBay、Shopee……哪个好?

2023一开始&#xff0c;随着各项利好政策的出台&#xff0c;中国跨境电商正在重新步入最好的时代。一些跨境电商企业纷纷开启上市热潮&#xff0c;身边许多人也跃跃欲试想转行跨境电商。专业数据显示&#xff0c;接下来将会有更多的跨境企业走向资本化的道路&#xff0c;借助资…

设备运行状况不能远程手机查看。难道就妥协吗?为何不试试这个办法

一、背景 随着国家经济结构逐步调整&#xff0c;纺织行业自动化、智能化水平逐步提高&#xff0c;业内竞争程度也将加大&#xff1b;整个市场变化快&#xff0c;并呈现出智能化、通用化、网络化、复杂化的新发展趋势。客户订单小批量、个性化、快速交货的特点越来越明显&#…

阅读(1)-----六级

目录 1.单词不懂怎么办&#xff1f; 1.1构词法 1.2上下文 2.句子不通怎么办&#xff1f; 3.时间不够怎么办 &#xff1f; 4.题型 4.1细节题 问文章的细节 4.2主旨题(文章主旨和段落主旨) 4.3语义题 4.4观点题 &#xff08;一共三种&#xff0c;支持、反对和中立 &…

从0开始学python -47

Python CGI编程 -2 GET和POST方法 浏览器客户端通过两种方法向服务器传递信息&#xff0c;这两种方法就是 GET 方法和 POST 方法。 使用GET方法传输数据 GET方法发送编码后的用户信息到服务端&#xff0c;数据信息包含在请求页面的URL上&#xff0c;以"?"号分割…

【面试题】社招中级前端笔试面试题总结

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库typeof null 的结果是什么&#xff0c;为什么&#xff1f;typeof null 的结果是Object。在 JavaScript 第一个版本中&#xff0c;所有值都存储在…

Nginx的反向代理配置笔记

1、反向代理的概念&#xff1a; 对一个大型网站来说&#xff0c;随着网站的访问量的快速增长&#xff0c;单台服务器已经无法承担大量用户的并发访问&#xff0c;必须采用多态服务器协同工作&#xff0c;以提高计算机系统的处理能力。通过Nginx提供的反向代理和负载均衡功能&a…

扬帆优配|国家队重磅出手!千亿巨头突然爆雷,股价狂跌12%!

国家队又出手啦&#xff01; 综合天眼查和国家商场监督管理总局旗下企业信用信息公示系统显现&#xff0c;长江存储科技控股有限责任公司股东结构新增国家集成电路工业出资基金二期股份有限公司、长江工业出资集团有限公司及湖北长晟开展等股东。其中&#xff0c;大基金二期认缴…

Mysql主键约束和唯一约束

Mysql约束 1、作用 约束定义为确保数据完整性必须遵循的规则。 约束可以在创建表的过程中创建&#xff0c;也可以稍后再添加。 在创建表后添加约束时&#xff0c;它将检查现有数据以确定其是否违背该约束。 如果现有数据违背了将添加的约束&#xff0c;那么将不会向指定列施加…

肠道短链脂肪酸如何让人变胖或变瘦

谷禾健康 在目前的审美中&#xff0c;无论男性或女性的肥胖都是不太加分项。除此之外&#xff0c;肥胖还被认为是几种疾病的重要标志物&#xff0c;特别是高血压、2 型糖尿病 (T2DM) 和代谢综合征&#xff0c;肥胖在这些疾病中发挥着明确而重要的病理作用。 肥胖的发生有多种病…

从0开始学python -46

Python CGI编程 什么是CGI CGI 目前由NCSA维护&#xff0c;NCSA定义CGI如下&#xff1a; CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如&#xff1a;HTTP服务器&#xff0c;提供同客户端HTML页面的接口。 网页浏览 为了更好的了解CGI是如何工作…

linux部署kafka

kafka部署需要jdk、zookeeper、 kafka kafka和zookeeper资源自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1410lRItcS4yG5DYmAyYOLg 提取码&#xff1a;rt01 1.jdk部署 略 2.zookeeper部署 2.1 解压 unzip zookeeper-3.4.11.zip 2.2 修改 conf/zoo.cfg 2…