RK平台Android4.4 添加一个新的遥控器支持以及添加特殊按键【转】

本文转载自:http://blog.csdn.net/coding__madman/article/details/52904063

瑞芯微平台

SDK:Android4.4

好久没写博客了,最近工作中需要在SDK中添加一个新的遥控器支持,由于自己对java代码比较头大,过程也是一波三折,整个流程其实分析下来并不难,这里做个简单的总结。也算是学习android的一个开端。

1.  遥控器红外键值到linux层的映射

      安卓4.4后linux层和红外层的键值映射是在设备树中修改的,不需要在linux中修改驱动代码,直接在相应的dts文件中修改即可,首先每个遥控器都有一个usercode,按照瑞芯微方面提供的文档:

在终端中输入命令:echo 1 > sys/module/cmcc_pwm_remotectl/parameters/code_print

其中USERCODE=0xf601的遥控器用户码,用来标识是哪一个遥控器,RMC_GETDATA=bb,这个是遥控器设备linux驱动中对应的按键上报的对应的键值。

文件目录\kernel\arch\arm\boot\dts\xxx.dts

在代码中先添加如下框架(文件里面照葫芦画瓢)(先把usercode这样加上,然后输入上面的命令才能记录相应按键DTS中对应的值):

我这上面是修改好的样子,0xbb和0xbc分别对应的是向上键和确定键。这些都是记录的键值,

<0xbc KEY_REPLY>, 其中0xbc在DTS文件中确定键对应的宏定义 KEY_REPLY这个要在input.h文件中去找

input.h文件路径:kernel\arch\arm\boot\dts\include\dt-bindings\input\input.h

DTS文件中每一按键的键值都可以通过打印来记录,每一个键值所对应的宏可以通过linux驱动层中input.h文件中对应的宏找到。名字一定要保持一致!其中上面确定键对应的232是linux层上报android层的键值。

就这样记录所有的按键,然后在DTS文件对号入座,第一步遥控器红外层到linux层的键值映射就搞定了

2. Linux层到android层的键值映射

同样通过终端输入命令:getevent 记录Linux层到android层的键值记录

对应的映射文件就是110b0030_pwm.kl 这个是可以在相关配置文件修改确定是哪个KL文件是linux层到android层键值映射,也可以修改为自己创建的KL文件。

文件目录:盒子根文件目录下的/system/usr/keylayout/110b0030_pwm.kl文件

这里232是确定键从Linux层上报到android层的键值,其中确定键对应的宏DPAD_CENTER 这个可以在keyevent.java文件中找到

一般的遥控器常规按键做到这两步了,基本都没问题了,但是特殊按键的添加还需要继续完善!

通常Linux驱动层基本不需要修改,第一步:我们只需要修改对应的KL文件即可。

已遥控器上的搜索按键为例:

由于DTS文件中:

<0xa7 KEY_PROGRAM>  a7是记录的搜索键的键值, 后边对应的宏是input.h文件中可以找到对应的,这个加进去就好了

KL文件中:

key 362   TV_SEARCH    //362是getevent命令记录的搜索键的键值, TV_SEARCH是自定义的宏,这个名字自己可以随便定义。

第二个修改的地方是keycodes.h文件

文件目录:frameworks\native\include\android\keycodes.h

在文件中添加一个没有用到的键值

第三个修改的地方是KeycodeLables.h文件

文件目录:\frameworks\native\include\input\KeycodeLables.h

第四个修改attrs.xml文件

文件目录:\frameworks\base\core\res\res\values\arrrs.xml

第五个修改的文件:KeyEvent.java    (这个文件修改的地方有两个)

如果添加的是最后一个别忘了LAST_KEYCODE 这个要和最后一个保持一致.下面还有一个地方也要添加:

至此特殊按键搜索按键从红键值外层到android层的键值映射就完成了。搜索按键到android应用层的键值映射就是257.

特殊按键应用层特殊处理可以修改PhoneWindowManager.java文件

文件目录:\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java

特殊按键处理这次应用层的做法是修改PhoneWindowManager.java文件,同时在上面的目录中添加keyfunction.java文件。

[java]  view plain   copy
  1. package com.android.internal.policy.impl;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileNotFoundException;  
  7. import java.lang.reflect.Field;  
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10. import java.util.HashMap;  
  11. import java.io.File;  
  12.   
  13. import javax.xml.parsers.DocumentBuilder;  
  14. import javax.xml.parsers.DocumentBuilderFactory;  
  15. import javax.xml.parsers.ParserConfigurationException;  
  16.   
  17. import org.w3c.dom.Document;  
  18. import org.w3c.dom.NodeList;  
  19.   
  20. import org.w3c.dom.Element;  
  21. import org.w3c.dom.Node;  
  22. import java.io.Serializable;  
  23.   
  24. import org.xml.sax.SAXException;  
  25. import android.os.Looper;  
  26. import android.content.Context;  
  27. import android.content.Intent;  
  28. import android.content.IntentFilter;  
  29. import android.content.ContextWrapper;  
  30. import android.util.Log;  
  31. import android.os.Message;  
  32. import android.os.Messenger;  
  33. import android.os.Bundle;  
  34. import android.os.Handler;  
  35. import android.os.IBinder;  
  36. import android.os.UserHandle;  
  37. import android.media.AudioService;  
  38. import android.os.RemoteException;  
  39. import android.os.ServiceManager;  
  40. import android.os.SystemClock;  
  41. //import com.hisilicon.android.HiDisplayManager;  
  42. //import com.hisilicon.android.DispFmt;  
  43. import android.widget.Toast;  
  44. import android.view.KeyEvent;  
  45. import android.os.SystemProperties;  
  46. import android.content.res.Configuration;  
  47. import android.app.ActivityManagerNative;  
  48. import android.app.ActivityManager;  
  49. import android.content.ComponentName;  
  50. import android.content.pm.PackageInfo;  
  51. //import android.view.VGAToast;  
  52.   
  53. public class Keyfunction {  
  54.     private static Keyfunction mInstance = null;  
  55.     private static final String KEYFUNTIONXLMNAME = "/system/etc/keyfunction.xml";  
  56.     private static final int MSG_TO_SET_FORMAT = 111;  
  57.     private static Context mContext;  
  58. //    private HiDisplayManager mDisplayManager = null;  
  59.     private ToastUtil toast = null;  
  60.     private String mProduc_name = null;  
  61.     private final String TAG = "Keyfunction";  
  62.   
  63.     private boolean is4Cpu = true;  
  64.     private static ArrayList<Integer> settingFormatValueList = new ArrayList<Integer>();  
  65.     private static ArrayList<String> settingFormatStringList = new ArrayList<String>();  
  66.   
  67.     private File avplay;  
  68.     private int[] threeD_ValueList = { 19, 20, 21};  
  69.     private String[] threeD_StringList = { "1080P 24Hz FramePacking", "720P 60Hz FramePacking", "720P 50Hz FramePacking"};  
  70.     private int[] fourK_ValueList = { 0x100, 0x101, 0x102, 0x103};  
  71.     private String[] fourK_StringList = { "3840X2160 24Hz", "3840X2160 25Hz", "3840X2160 30Hz", "4096X2160 24Hz"};  
  72.   
  73.     private int nCurrentFormat;  
  74.     private boolean currFmtInSets = false;  
  75.     private int nCurrentFormatIndex;  
  76.     private String CurrentFormatIndexString;  
  77.   
  78.     private boolean bEventWasHandled = true;  
  79.   
  80.     private final long TIME_SPACE = 3000;  
  81.     private int mScreenCount = 0;  
  82.     private Keyfunction(Context context) {  
  83.         Log.e(TAG, "-------->Keyfunction <---------");  
  84.         showStartMsg = false;  
  85.         mContext = context;  
  86.         loadKeyFuntion(mContext);  
  87.         toast = new ToastUtil();  
  88.   
  89.       
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小庄老师

要是觉得不错,就给我点支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值