【摘录】MTK按键扫描原理及相关代码

一.MTK按键扫描原理:

不同的MTK平台内部提供的按键数目各有不同,但是扫描原理大致一样,这里以MTK6253为例来讲解记录。

MTK提供6*742个矩阵键盘,加上Power键总共43个按键,其中BB芯片引出6根行线ROW7根列线COL,如下图。

  

 

  下面来说明一下扫描原理:

在初始化或是没有按键的情况下,ROW设置为输出,COL设置为输入。

BB芯片的内部设有一个按键中断,在没有任何按键的情况下,所有CLO线为高电平,ROW线为低电平,一旦有按键按下,比如key10(ROW1,COL2)有按下,由于COL2线与ROW1线直接相连,COL2线即被拉低,只要COL线有被拉低的,内部按键中断便会响应,内部按键中断产生后,BB就知道有按键产生,这时就进行按键扫描,判断出事哪个按键按下,然后进行相应的处理。

中断产生后,BB先发出消息将所有COL线置高,所有ROW线置低,扫描COL线,比如key10(ROW1,COL2)有按下,会扫描到COL2被拉低;再将将所有ROW线置高,所有COL线置低,扫描ROW线,比如key10(ROW1,COL2)有按下,会扫描到ROW1被拉低;那么COL2ROW1组合起来就知道哪个按键按下了。

  

   但是实际上按键中断产生后,扫描过程已经在BB内部迅速完成,然后把相应的按键位置用寄存器保存起来。

每个寄存器16位,每一位代表一个按键,那么总共53个按键,需要4个寄存器去保存。按键的对应位置如下图:

寄存器的每个位对应一个按键,默认为1,当有按键按下,那么相应位置0。然后系统去读这四个寄存器,就能知道是哪一个按键按下。

读取代码如下:

   kbd_map_temp_reg = ( ((kal_uint32)(DRV_Reg(KP_MID_KEY) << 16))|((kal_uint32)(DRV_Reg(KP_LOW_KEY))) );

      
#if defined(DRV_KBD_32KEYS_ABOVE)

      kbd_map_temp_reg1 
= (kal_uint32)(DRV_Reg(KP_HI_KEY));

      
#elif defined(DRV_KBD_48KEYS_ABOVE)

      kbd_map_temp_reg1 
= ( ((kal_uint32)(DRV_Reg(KP_HI_KEY) << 16))|((kal_uint32)(DRV_Reg(KP_MID1_KEY))) );

      
#elif defined(DRV_KBD_64KEYS_ABOVE)

      kbd_map_temp_reg1 
= ( ((kal_uint32)(DRV_Reg(KP_MID2_KEY) << 16))|((kal_uint32)(DRV_Reg(KP_MID1_KEY))) );

      kbd_map_temp_reg2 
= (kal_uint32)(DRV_Reg(KP_HI_KEY));

      
#endif

二.代码部分:

按键扫描代码在kbdmain.c文件中的kbd_task_main函数。上层MMI处理在keybrd.c文件里。

  首先,在Kbd_Init初始化时注册按键中断

  DRV_Register_HISR(DRV_KP_HISR_ID, Kbd_HisrEntry);

其次,一旦有按键产生,那么在中断处理函数里面发送一个按键事件,在kbd_task_main函数里会有一个死循环一直不停的扫描这个按键时间,若没有按键事件发生,那么就退出此次循环(continue),一旦检测到有按键事件发生,便开始读取寄存器中的值并进行相关处理。

void Kbd_HisrEntry(void)

{  

#ifdef KEY_DEBUG

   dbg_print(
"Kbd_HisrEntry\r\n");

#endif

#if defined(__EXTEND_QWERTY_KEYPAD__)

//use gpt polling instead of key IRQ event trigger

   IRQMask(IRQ_KPAD_CODE);

#endif //#if defined(__EXTEND_QWERTY_KEYPAD__)

   KBD_DBG(__LINE__, KBD_GetTimeStamp(), ust_get_current_time(),
0);

   
/*lint -e(534)*/kal_set_eg_events(KBD.event,1,KAL_OR); //设置按键事件         

}

  kbd_task_main函数中检查按键事件

 if (!(event_group & 1)) 
       
continue;

最后,将按键时间发送到MMI层进行处理。

KBD_PUSH_ONEKEY_TO_KBDBUFFER(kbd_onekey_press,kbd_press_key[count]);

  另外附加补充一下:

  如果是全键盘的话,NEOTEL53_09B_GPRS.mak中的KEYPAD_TYPE=QWERTY_KEYPAD。如果有扩展按键的话(即用地或GPIO口模拟ROW线来扩展按键)=KEYPAD_TYPE=EXTEND_QWERTY_KEYPAD

转载于:https://www.cnblogs.com/IamEasy_Man/archive/2010/12/16/1908204.html

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

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

相关文章

导致Android手机崩溃的壁纸,使用错误的壁纸会使你的Android手机崩溃

原标题&#xff1a;使用错误的壁纸会使你的Android手机崩溃现代智能手机是非常复杂的&#xff0c;能够显示大量的内容&#xff0c;并能浏览一系列复杂的色域、文件格式和媒体类型。然而&#xff0c;其中一些功能会以意想不到的方式影响到正常使用。Twitter用户Ice Universe发现…

android app逆向分析,如何开始对Android应用的逆向分析?

本文是我的关于如何开始Android逆向系列文章的第一部分。在文末提供了一个文档&#xff0c;你可以根据该文档说明部署同我一样的实验环境。在了解android应用的逆向之前&#xff0c;你必须对android平台及其架构和android应用程序的构建块(组件)已有了一个较好的理解。如果你并…

Swipper.js实现轮播功能

我是歌谣 放弃很难 但是坚持一定很酷 微信公众号关注小歌谣 今天我们来说一下工作中的一个小需求 就是给我们的页面去实现一个轮播的功能 最近需要实现一个小的需求 就是如何类似于如何把一个图片变成一个轮播效果 于是乎就开始考虑 用一款插件去实现这个功能 所以选择了一…

Spring.NET 1.3.1 正式版已发布

Spring.NET 1.3.1 下载地址为http://www.springframework.net/download.html 正如已经提到的其他地方&#xff0c;这将是Spring.NET的最终版本提供支持的。NET1.x中Spring.NET的未来版本将只针对。NET 2.0和更高版本&#xff0c;让Spring.NET更积极地利用近期功能的更多信息在。…

android wifi连接手机,Android手机无线连接利器-AirDroid

AirDroid是一款可以在电脑的浏览器上对手机进行管理的应用&#xff0c;需要wifi网络支持&#xff0c;手机安装启用服务后&#xff0c;在pc的浏览器即可登陆进行管理和操作&#xff0c;可以管理联系人、短信、文件、应用、照片、铃声、音乐、通话记录&#xff0c;还可以快速搜索…

RFC函数的初步使用-同步

1、由于没有外围系统&#xff0c;采用不同SAP不同client之间进行测试。 首先在A-client搭建需要被调用的RFC函数。在A-client里运行SE37创建函数 在属性页签选择“远程启用的模块” 设定inport参数&#xff0c;传入人员名称去取usr21中的值 设定export参数&#xff0c;其中zper…

Android编程获取手机型号,本机电话号码,sdk版本及firmware版本号(即系统版本号)...

Android开发平台中&#xff0c;可通过TelephonyManager 获取本机号码。 TelephonyManager phoneMgr(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);txtPhoneNumber.setText(phoneMgr.getLine1Number()); //txtPhoneNumber是一个EditText 用于显示手机号注…

判断cloudblob是否存在

这是开博的第一篇&#xff0c;还要废话一下。我写的很多内容都是网上找资料然后自己总结出来的&#xff0c;原出处已经很难找到了&#xff0c;所以不会标出引用的内容。如果侵犯到您的版权&#xff0c;请和我联系&#xff0c;我会删改相关的内容。 cloudblob 是azure blob的一个…

android studio炸包怎么导入,请问android studio如何引入包

梦里花落0921jar包放项目根目录libs文件夹右键选择Add As Library"剩选项默认行点击。Show import popup&#xff0c;这个是用于编辑XML时&#xff0c;自动会弹出一个import的对话框&#xff0c;问你是否需要导入。JavaInsert imports on paste:(All Ask None),这个其实就…

动态规划-直方图最大长方形

/* 1017: C03-单调栈算法-最大长方形时间限制: 1 Sec 内存限制: 128 MB 提交: 17 解决: 10 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述给你一个直方图&#xff0c;告诉你各个条形矩形的高度&#xff0c;求基线对齐构成的矩形中面积最大的矩形的面积。对于每一个矩形…

Metropolis Hasting算法

Metropolis Hasting Algorithm: MH算法也是一种基于模拟的MCMC技术&#xff0c;一个很重要的应用是从给定的概率分布中抽样。主要原理是构造了一个精妙的Markov链&#xff0c;使得该链的稳态是你给定的概率密度。它的好处&#xff0c;不用多说&#xff0c;自然是可以对付数学形…

荣耀变鸿蒙系统,鸿蒙系统首批升级机型曝光!荣耀手机遗憾缺席,原因很简单...

原标题&#xff1a;鸿蒙系统首批升级机型曝光&#xff01;荣耀手机遗憾缺席&#xff0c;原因很简单大家好&#xff0c;我是科技君的探讨&#xff0c;欢迎关注我&#xff0c;与我一起进行科技的探讨。华为鸿蒙系统可以说是目前数码圈关注度最高的事件之一了。从早期公布&#xf…

bzoj2733永无乡

永无乡 HYSBZ - 2733 永无乡包含 n 座岛&#xff0c;编号从 1 到 n&#xff0c;每座岛都有自己的独一无二的重要度&#xff0c;按照重要度可 以将这 n 座岛排名&#xff0c;名次用 1 到 n 来表示。某些岛之间由巨大的桥连接&#xff0c;通过桥可以从一个岛 到达另一个岛。如果…

在 Delphi 下使用 DirectSound (14): 测试镶边效果器 IDirectSoundFXFlanger8

{相关结构:} TDSFXFlanger packed recordfWetDryMix: Single; // 0 .. 100 : 50 (%)fDepth: Single; // 0 .. 100 : 100 (%)fFeedback: Single; //-99 .. 99 : -50 (%)fFrequency: Single; // 0 .. 10 : 0.25lWaveform: Longint; // 0 .. 1 : 1fDelay: Sin…

html判断是否在页面,html判断当前页面是否在iframe中的实例

html判断当前页面是否在iframe中的实例在做HTML页面的时候&#xff0c;经常会遇到“如果当前页面显示在iframe中&#xff0c;我们就相应的处理”判断方法为&#xff1a;//判断是否在iframe中if(self!top){parent.window.location.replace(window.location.href);}以上这篇html判…

一种用户体验-显示对话框时灰化你的主窗体

袁永福 ( http://www.xdesigner.cn ) 2007&#xff0d;8&#xff0d;10 程序全部源代码下载(工程文件使用VS.NET2003格式):/Files/xdesigner/DisableMask.rar 在一些Web程序中,有一种页面效果,当弹出一个模拟的对话框时,主页面就整体灰化了,其他的元素不能动弹,只有这个对话框能…

html文档中用于表示页面标题的标记对是,汽车发动机拆装与检修实训超星尔雅答案...

摘要&#xff1a;汽车生活事件也称为应激源( )在教师的直接领导下整个班级的学生一起进行的学习&#xff0c;机拆检修称为( )实训教学二字连用最早出自( )...汽车生活事件也称为应激源( )发动下列不属于课程与教学关系观的是( )在教师的直接领导下整个班级的学生一起进行的学习…

H5|web移动前端自适应适配布局解决方案

方案&#xff1a; 固定一个某些宽度&#xff0c;使用一个模式&#xff0c;加上少许的媒体查询方案使用flexbox解决方案使用百分比加媒体查询使用rem1. 简单问题简单解决 我觉得有些web app并一定很复杂&#xff0c;比如拉勾网&#xff0c;你看看它的页面在iphone4,iphone6,ipad…

[转] 用Diff和Patch工具维护源码

在Unix系统下&#xff0c;维护源码版本可以使用很多方法&#xff0c;其中最常用的当然是大名鼎鼎的CVS&#xff0c;但实际上&#xff0c;简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具&#xff0c;Unix标配中的diff和patch工具就完全可以完成代码的简单备份和…

jQuery 结合 Json 提交数据到Webservice,并接收从Webservice返回的Json数据

简单的Json数据提交 jQuery ajax webservice&#xff1a;get 和 post 一、GET 方式客户端代码vardata { classCode: "0001"}; //这里要直接使用JOSN对象$.ajax({ type: "GET", contentType: "application/json; chars…