【摘录】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发现…

[html] html哪个标签属性可以通过预解析DNS?

[html] html哪个标签属性可以通过预解析DNS&#xff1f; 1.<meta http-equiv"x-dns-prefetch-control" content"on"> 2.<link rel"dns-prefetch" href"//www.spreadfirefox.com">个人简介 我是歌谣&#xff0c;欢迎和大…

ZT 类模板Stack的实现 by vector

*//*第3章 类模板与函数相似&#xff0c;类也可以被一种或多种类型参数化。容器类就是一个具有这种特性的典型例子&#xff0c;它通常被用于管理某种特定类型的元素。只要使用类模板&#xff0c;你就可以实现容器类&#xff0c;而不需要确定容器中元素的类型。在这一章中&#…

android 学习链接大集合

http://m.cnblogs.com/50734/1581089.html?full1 Understanding User Interface in Android - Part 3: More Views&#xff08;译&#xff09; http://android.yaohuiji.com/ 这个大家应该都知道吧&#xff01;&#xff08;android学习指南&#xff09;转载于:https://www.cnb…

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

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

Swipper.js实现轮播功能

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

使用 function 构造函数创建组件和使用 class 关键字创建组件

使用 function 构造函数创建组件&#xff1a; 如果想要把组件放到页面中&#xff0c;可以把构造函数的名称&#xff0c;当作 组件的名称&#xff0c;以 HTML标签形式引入页面中&#xff0c; 因为在React中&#xff0c;构造函数就是一个最基本的组件。 注意&#xff1a; 组件的首…

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 sdk,我想使用天地图sdk,第三方插件的教程走通了,现在卡住了

用Android Studio按照教程&#xff0c;增加第三方插件的例子走通了&#xff0c;运行后的app可以alert出来了&#xff0c;方法可以用。但是现在&#xff0c;怎么把天地图弄出来啊。本人是前端&#xff0c;不会安卓。天地图官网的使用步骤&#xff1a;1) 将API文件tiandituapi.ja…

[html] 如何优化大数据列表(10万+)的性能?说说你的方案

[html] 如何优化大数据列表&#xff08;10万&#xff09;的性能&#xff1f;说说你的方案 定时器批量绘制, 过滤&#xff0c;查询使用serviceWorker ?个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论…

Java容器Stack

Stack继承关系 Collection 接口AbstractCollectionAbstractListVectorStack 方法 public E push 元素在栈顶&#xff0c;最后一个元素 public synchronized E pop() 删除并返回栈顶元素&#xff08;最后一个&#xff09; public synchronized E peek()返回栈顶元素&#xff08…

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

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

[html] 如何使用纯HTML实现跑马灯的效果?

[html] 如何使用纯HTML实现跑马灯的效果&#xff1f; HTML marquee 元素用来插入一段滚动的文字。 但是该元素已废弃。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面…

字符串处理

Title#region GetSubString /// <summary> /// 取得指定开始和结束字符串中间的数据串 /// </summary> /// <param name"content"></param> /// <param name"startStr"></param> /// <param name"endSt…

HTTP管线化(HTTP pipelining)

默认情况下http协议中每个传输层连接只能承载一个http请求和响应&#xff0c;然后结束。 HTTP是一个简单的协议。客户进程建立一条同服务器进程的 T C P连接&#xff0c;然后发出请求并读取服务器进程的响应。服务器进程关闭连接表示本次响应结束。服务器进程返回的文件通常…

[html] 如果列表元素li的兄弟元素为div,会产生什么情况?

[html] 如果列表元素li的兄弟元素为div&#xff0c;会产生什么情况&#xff1f; 单纯的对html来说主要是破坏了语义结构吧, css方面来说不好统一控制样式&#xff0c;div默认也没有list-style个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xf…

RFC函数的初步使用-同步

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

C# 繁体,简体互转

首先对Miscrosoft.VisualBasic类的引用. using Microsoft.VisualBasic; public static string Traditional2Simplified(string str) { //繁体转简体 return (Microsoft.VisualBasic.Strings.StrConv(str, Microsoft.VisualBasic.VbStrConv.Si…

[html] html的哪个标签可以预渲染?

[html] html的哪个标签可以预渲染&#xff1f; link 标签的 relpreload个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

2017蓝桥杯c语言C组承压计算,蓝桥杯2017Java B组---分巧克力and承压计算

分巧克力package lala;/**儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要…