mtk硬件启动关闭蓝牙功能的项目:mtk 硬件ScanCode和keycode应用示例

项目要求:该项目由于没有使用android5.0,导致启动bluetooth的蓝牙audio
slave功能必须使用第三方模组,该第三方模组,启动是通过android主板通过GPIO控制。UI界面是通过图形选择或者一个kpd组合按键来打开关闭或者是启动蓝牙搜索功能。

1,用户按键的侦测:

标准的行为,用户的组合按键,kernel里面向上层发送scancode,然后framework把scancode转换成keycode的keyevent,该keyevent会被PhoneWindows接受并处理。

对于mtk,从按键到keycode,已经被封装起来,这个封装的工具就是dct.

例如,我们的项目组合按键是:KCOL2+KROW1,我们可以在图形工具中如选择我们的配置

在例子中,我们设置该案件的keycode是SYM

当然,也可以自己定义新的keycode,我嫌麻烦,就直接使用现成的,如何定义新的按键,请看附录:

2,侦测用户按键行为,发送相应的intent

上面的keycode在发送到各个window之前,是被PhoneWindowManager.java接收到的,在其中有一个方法:

@Override

public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, booleanisScreenOn) {

望文生义,看名字我们就知道这个函数的作用。我们在代码中如下拦截:

if (keyCode== KeyEvent.KEYCODE_SYM) {

Log.e("zcfdebug","nowwe catch the bluetooth button action !");

if (down){

Log.e("zcfdebug","nowwe catch the bluetooth button down !");

}

if (up){

Log.e("zcfdebug","nowwe catch the bluetooth button up !");

}

return 1;

}

当然,KEYCODE_SYM是原来系统中已经定义的keycode,其实就是输入法的选择,我们需要屏蔽这个功能,在alps/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java:

/**

* @hide

*/

public voiddispatchKeyEvent(Context context, int seq, KeyEvent key,

FinishedEventCallback callback) {

booleanhandled = false;

/*zcfdebug--<<

synchronized(mH) {

if(DEBUG) Log.d(TAG, "dispatchKeyEvent");

if(mCurMethod != null) {

if(key.getAction() == KeyEvent.ACTION_DOWN

&& key.getKeyCode() == KeyEvent.KEYCODE_SYM) {

showInputMethodPickerLocked();

handled = true;

}else {

try {

if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod);

final long startTime = SystemClock.uptimeMillis();

enqueuePendingEventLocked(startTime, seq, mCurId, callback);

mCurMethod.dispatchKeyEvent(seq, key, mInputMethodCallback);

return;

} catch (RemoteException e) {

Log.w(TAG, "IME died: " + mCurId + " dropping: "+ key, e);

}

}

}

}

zcfdebug-->>*/

callback.finishedEvent(seq, handled);

}

注释掉原有功能就好了。

按照我们的项目定义,按键3-5秒为蓝牙状态电源打开搜索功能,长按8秒以上为关闭。关闭的时候,长按8秒没有任何动作。

if (keyCode== KeyEvent.KEYCODE_SYM) {

Log.e("zcfdebug","nowwe catch the bluetooth button action !");

if (down){

Log.e("zcfdebug","nowwe catch the bluetooth button down !");

//lastSymKeyDownTime=System.currentTimeMillis();

lastSymKeyDownTime=event.getEventTime();

}

if (up){

Log.e("zcfdebug","nowwe catch the bluetooth button up !");

SymKeyPressTime=event.getEventTime()-lastSymKeyDownTime;

//SymKeyPressTime=System.currentTimeMillis()-lastSymKeyDownTime;

Log.e("zcfdebug","theSymKeyPressTime is "+SymKeyPressTime);

if(SymKeyPressTime>2000&& SymKeyPressTime<5000){

Log.e("zcfdebug","nowwe catch the bluetooth press 3 second!");

}

if(SymKeyPressTime>7000){

Log.e("zcfdebug","nowwe catch the bluetooth press 8 second!");

}

}

return 1;

}

蓝牙开关等动作,我们在外边的apk程序中实现,我们只要发送intent实现就OK了,代码如下:

if (keyCode== KeyEvent.KEYCODE_SYM) {

Log.e("zcfdebug","nowwe catch the bluetooth button action !");

if (down){

Log.e("zcfdebug","nowwe catch the bluetooth button down !");

//lastSymKeyDownTime=System.currentTimeMillis();

lastSymKeyDownTime=event.getEventTime();

}

if (up){

Log.e("zcfdebug","nowwe catch the bluetooth button up !");

SymKeyPressTime=event.getEventTime()-lastSymKeyDownTime;

//SymKeyPressTime=System.currentTimeMillis()-lastSymKeyDownTime;

Log.e("zcfdebug","theSymKeyPressTime is "+SymKeyPressTime);

if(SymKeyPressTime>2000&& SymKeyPressTime<5000){

Log.e("zcfdebug","nowwe catch the bluetooth press 3 second!");

Intent btStartStopIntent = new Intent(BT_STARTSTOP);

mContext.sendBroadcast(btStartStopIntent);

}

if(SymKeyPressTime>7000){

Log.e("zcfdebug","nowwe catch the bluetooth press 8 second!");

Intent btPairIntent = new Intent(BT_PAIR);

mContext.sendBroadcast(btPairIntent);

}

}

return 1;

}

应用程序如何接收处理intent,将在下一篇文章描述

附录:Howto add a new key on android ICS\ICS2:

[Description]

How to add a new keyon android ICS/ICS2

[Solution]

1.在DCTtool keypad list
文件增加新按键的选项

alps\mediatek\source\dct\Keypad_YuSu.cmp中添加新键,如SMS快捷键

KEY_SYM

KEY_SMS

KEY_0

2.打开DCTtool
在keypad矩阵中在相应定义的按键位中添加新按键,如SMS,然后Save

3.修改linux键盘码文件input.h

由于preloader\uboot\kernel\factory等情况分开使用,相应的文件路径下的input.h都应该修改

为新按键增加键码值

kernel\include\linux\input.h

bionic\libc\kernel\common\linux\input.h

external\kernel-headers\original\linux\input.h

external\qemu\linux_keycodes.h

mediatek\plaform\mt6575\preloader\src\drivers\inc\linux\input.h

Mediatek\plaform\mt6575\uboot\inc\linux\input.h

如KEY_SMS

#define KEY_SMS 252

4.增加keypadlayout文件键盘映射,linux和androidkey映射

mediatek\config\<projectname>\mt6575-kpd.kl

如:

key 252 SMS

其中252是linux键码,SMS是android识别key值如果是需要唤醒系统,还需要增加WAKE

如果新按键是全键盘的一些生僻字符,修改:mediatek\config\<project
name>\mt6575-kpd.kcm

5.修改Java识别keycode

framework/base/include/ui/KeyCodelabels.h

KEYCODES数据结构后面增加

{"SMS",220}

framework/base/native/include/android/KeyCodes.h

在按键定义项增加AKEYCODE_SMS = 220;

6.修改Java键盘事件

framework/base/core/java/android/view/keyevent.java

/**

*@hide

*/

public static finalint KEYCODE_SMS =220;

最后的按键为新增的

private static finalint LAST_KEYCODE ==KEYCODE_SMS;

以上/**/注释的code是android非开放API或变量定义的时候,需要添加JavaDoc的识别,否则要运

行makeupdate-api才能build通过

如果是系统按键,修改framework/base/libs/ui/input.cpp

isSystemKey()增加caseAKEYCODE_SMS:

7.修改XML文件描述符framework/base/core/res/res/values/attr.xml

<enumname="KEYCODE_SMS" value="220" />

8.增加测试验证log在android

framework\base\policy\src\com\android\internal\polidy\impl\phoneWindowManager.java

在interceptKeyBeforeDispatching()增加

if(keycode==KeyEvent.KEYCODE_SMS){

log.d(TAG,"interceptKeyTi KEYCODE_SMS keyCode="+ keyCode + "down=" + down + "

repeatCount=" +repeatCount + “ keyguardOn=” + keyguardOn + “ mHomePressed=”+

9.可以抓log确认,或者增加测试APK检测

Kernal log:

<4>[253.828234]kpd:register = fffe ffff ffff ffff ff

<4>[253.828825]kpd:(pressed) HW keycode = 0

<4>[253.829348]kpd:report Linux keycode = 252

<4>[253.829857]kpd:save new keymap state

<4>[254.030814]kpd:register = ffff ffff ffff ffff ff

<4>[254.031405]kpd:(released) HW keycode = 0

<4>[254.031936]kpd:report Linux keycode = 252

<4>[254.032445]kpd:save new keymap state

Android log:

WindowManager:interceptKeyTq keycode=220 screenIsOn=true keyguardActive=false

policyFlags =#2000000 down =false canceled = false

D WindowManager:interceptKeyTi keyCode=220 down=false repeatCount=0 keyguardOn=false

mHomePressed=falsecanceled=false

D WindowManager:interceptKeyTi KEYCODE_SMS keyCode=220 down=false repeatCount=0

keyguardOn=falsemHomePressed=false canceled=false

时间: 2024-08-18 03:24:57

mtk硬件启动关闭蓝牙功能的项目:mtk 硬件ScanCode和keycode应用示例的相关文章

mtk硬件启动关闭蓝牙功能的项目:mtk 上层操作GPIO应用示例

mtk硬件启动关闭蓝牙功能的项目:mtk上层操作GPIO应用示例 项目要求: 接上篇: 1:蓝牙按键(KCOL2+KROW1)长按3秒,软件上控制GPIO144拉高2秒后关闭,蓝牙就开启并搜索配对.同时拉高GPIO98,控制音频的模拟开关切换蓝牙音源. 2:蓝牙在工作状态下,给出个1.8V的高电平,给GPIO145用来检测蓝牙的工作状态. 3:蓝牙在工作装态下想要重新配对,在长按蓝牙按键3秒,控制GPIO97拉高3秒后关闭,蓝牙模块在收到这个信号后执行清空列表和重新搜索功能. 4:蓝牙按键(KC

微信小程序开发-蓝牙功能开发

0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数据帧格式的定义,当然这部分就不是本次博客的重点.1. 准备硬件 这里我准备了CH341SER这个作为USB转串口.用sscom5.13.1 串口工具.由于我不太懂硬件开发.硬件部分都是由公司其他人开发的.我只是负责把环境搭建起来.然后负责我的微信小程序开发. 2. 开发小程序简单讲解 onLoad

记录使用微信小程序的NFC和蓝牙功能读取15693芯片的开发历程

开发目标: (1) 对于Android手机,直接通过微信小程序调用手机的NFC功能,对15693协议的芯片进行读写操作: (2)对于苹果手机(及没有NFC模块的手机),通过微信小程序的蓝牙功能连接到蓝牙/NFC读写器,然后通过蓝牙发送指令操作读写器对15693协议的芯片进行读写操作. DAY #1 上午开了半天会,下午开始开发. 先开发简单的:直接通过Android手机的NFC模块读写芯片.开发思路如下: 1. 首先调用 wx.getHCEState(OBJECT), 判断设备是否支持NFC,如

经测试稳定可用的蓝牙链接通信Demo,记录过程中遇到的问题的思考和解决办法,并整理后给出一个Utils类可以简单调用来实现蓝牙功能

说明:这是本人在蓝牙开发过程中遇到过的问题记录和分析,以及解决办法. 在研究过程中,许多的前人给出的解决方案和思路指导对我相当有帮助,但并非都是可采取的解决方法, 经过本人对这些方法的测试和使用过后,给出自己的理解和解决方案,不一定是正确的,但这些方法的确可以解决问题. 如果有人遇到同样的问题,并且看到我的文章解决,那是我的荣幸. !!!!!!但特别需要说明的是,看的越多,不明白的越多,我的看法可能是完全错误的,这些方法只是暂时解决了我的问题, !!!!!!如果有人发现了我的错误,请私信或评论告

分分钟解决iOS开发中App启动广告的功能

前不久有朋友需要一个启动广告的功能,我说网上有挺多的,他说,看的不是很理想.想让我写一个,于是乎,抽空写了一个,代码通俗易懂,简单的封装了一下,各种事件用block回调的,有俩种样式的广告,一种是全屏广告,另一种是下面露logo的,类似网页新闻的启动广告.依赖SDWebImage主要用来下载网络的广告图片,一般项目里面网络图片都用的这个框架,所以在此不做过多的阐述.下面让我们来看看我封装的过程,对于新手来说,可以学习一下这种封装的思想. 1.首先建一个继承View的LBLaunchImageAd

海美迪Q5智能机顶盒的蓝牙功能

虽然在硬件上,海美迪Q5智能机顶盒没有集成蓝牙模块,但是在软件系统上,Q5是支持蓝牙驱动的,所以它可以通过USB外接蓝牙适配器来扩展出蓝牙功能,简单来说,就是你另外买个蓝牙适配器,插到Q5上面,就能用Q5连接耳机/音箱/游戏手柄等等蓝牙设备了. 本文主要记录了我用Q5连接蓝牙音箱的操作步骤: Step1:我使用的是下面这款蓝牙适配器,奥睿科(ORICO) BTA-406-RD Step2:启动Q5,进设置界面,在左边选择"蓝牙",右边会显示"要监测设备,请打开蓝牙功能&quo

手动、自动配置IP参数与启动/关闭网络接口:ifconfig、ifup、ifdown

这三个命令的用途都是启动网络接口,不过,ifup与ifdown仅能就/etc/sysconfig/network-scripts内的ifcfg-ethX(X为数字)进行启动或关闭的操作,并不能直接修改网络参数,除非手动调整ifcfg-ethX文件才行.至于ifconfig则可以直接手动为某个接口配置IP或调整其网络参数. 1.ifconfig ifconfig主要是可以手动启动.查看与修改网络接口的相关参数,可以修改的参数很多,包括IP参数以及MTU等,它的语法如下: [[email prote

mysql启动关闭的批处理,感觉很好用在其他论坛帖子上找到的,感谢分享

最近用mysql的时间比较多,每次都在计算机管理工具下面去启动,感觉很麻烦,于是搜索了下果然有前辈已经做出了这些东西,今天收藏整理,mysql启动关闭的批处理感觉很好用在其他论坛帖子上找到的,感谢互联网上无私的朋友分享,以下代码直接复制粘贴后做成bat文件双击即可使用 cls @echo off :设置窗口字体颜色 color 0a :设置窗口标题 TITLE MySQL管理程序 call :checkAdmin goto menu :菜单 :menu cls echo. echo.=-=-=-

iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)

一.前言 iOS开发更新APP我觉得是比较坑的就是审核时间比较长,审核比较严,对于刚入行的小伙伴来说,雷区比较多:所以热更新是比较重要的: 大家也许会发现我们常用的QQ现在下来也就一百多兆,但是用了几个月后发现QQ在手机上占有一个多G的内存,特别是手机内存比较小的小伙伴,这是因为你在使用过程中,有一些功能是你下载下来的: 二.创建Framework 1.新建项目 新建一个Cocoa Touch Framework项目,然后在这个项目里面写你的新的功能,比如我创建了一个控制器,在控制器里面加载一张