[FAQ06059] [Keypad]如何设计GPIO中断模拟普通按键控制静音等功能 |
FAQ Content[Description]
如何设计GPIO中断模拟普通按键控制静音等功能
[Solution]
参考设计思路:Kernel 底层可以参考kpd.c的POWEY USE EINT 的方式设计:把Key_MUTE送到framework
1.声明中断下半程的tasklet
#if KPD_PWRKEY_USE_EINT
static void kpd_pwrkey_handler(unsigned long data); static DECLARE_TASKLET(kpd_pwrkey_tasklet, kpd_pwrkey_handler, 0); static u8 kpd_pwrkey_state = !KPD_PWRKEY_POLARITY; #endif 2.实现中断服务函数 发送按键消息到framework
#if KPD_PWRKEY_USE_EINT static void kpd_pwrkey_handler(unsigned long data) { bool pressed; u8 old_state = kpd_pwrkey_state; kpd_pwrkey_state = !kpd_pwrkey_state;
pressed = (kpd_pwrkey_state == !!KPD_PWRKEY_POLARITY); if (kpd_show_hw_keycode) { printk(KPD_SAY "(%s) HW keycode = using EINT\n", pressed ? "pressed" : "released"); } input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, pressed); kpd_print("report Linux keycode = %u\n", KPD_PWRKEY_MAP); /* for detecting the return to old_state */
mt65xx_eint_set_polarity(KPD_PWRKEY_EINT, old_state); mt65xx_eint_unmask(KPD_PWRKEY_EINT); } 3.kpd_pdrv_probe()中加入__set_bit(KPD_PWRKEY_MAP, kpd_input_dev->keybit);
声明中断初始化: mt_set_gpio_mode(GPIO_KPD_MUTEKEY_EINT_PIN, GPIO_KPD_MUTEKEY_EINT_PIN_M_EINT); mt_set_gpio_dir(GPIO_KPD_MUTEKEY_EINT_PIN, GPIO_DIR_IN); //mt_set_gpio_pull_enable(GPIO_KPD_MUTEKEY_EINT_PIN, GPIO_PULL_DISABLE); mt_set_gpio_pull_enable(GPIO_KPD_MUTEKEY_EINT_PIN, GPIO_PULL_ENABLE); mt_set_gpio_pull_select(GPIO_KPD_MUTEKEY_EINT_PIN, GPIO_PULL_UP); #if KPD_PWRKEY_USE_EINT mt65xx_eint_set_sens(KPD_PWRKEY_EINT, KPD_PWRKEY_SENSITIVE); mt65xx_eint_set_hw_debounce(KPD_PWRKEY_EINT, KPD_PWRKEY_DEBOUNCE); mt65xx_eint_registration(KPD_PWRKEY_EINT, true, KPD_PWRKEY_POLARITY, kpd_pwrkey_eint_handler, false); #endif 4.dct tool配置GPIO为中断模式 5.注意实现静音按键,拨下开关时间会很长,如果只有一个KEY_MUTE,一直长按(press),没有发release,framework上长按事件会爆掉,建议拔下中断GPIO=0 发KEY_MUTE;拨上中断GPIO=1 发KEY_MUTE1;
如何添加一个按键:请参看MTK online FAQ :MTK on-line > FAQ Home > SW > ALPS > Driver - input system>FAQ04495 [Keypad]How to add a new key on android ICS\ICS2 或者拔下中断GPIO=0 发KEY_MUTE的press,接着马上发送release;在上层通过lastkey静音,newkey释放静音。 framework上在phonewindowmanager收到按键之后,可以拦截KEY_MUTE和KEY_MUTE1 去设置setting 的DB和静音模式 在framework/base/policy/src/com/android/impl/PhoneWindowManager.java 添加调试code 确认按键正常 if (true) { Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount=" + repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed); } //ADD log check the mute key dispatching
if(keyCode == KeyEvent.KEYCODE_MUTE) Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " MUTE"); 6.audio 静音模式接口
静音调用设置setRingerMode状态 RINGER_MODE_SILENT 静音,且无振动 RINGER_MODE_VIBRATE 静音,但有振动 RINGER_MODE_NORMAL 正常声音 铃响模式的设置是通过mAudioManager(音频管理器)来实现的. mAudioManager所在服务如下: 文件: frameworks/base/media/java/android/media/AudioManager.java public static final int RINGER_MODE_SILENT = 0; public static final int RINGER_MODE_VIBRATE = 1; public static final int RINGER_MODE_NORMAL = 2; public void setRingerMode(int ringerMode) { IAudioService service = getService(); try { service.setRingerMode(ringerMode); } catch (RemoteException e) { Log.e(TAG, "Dead object in setRingerMode", e); } } 在拦截静音键或者在apk上接收key值添加相应的控制 |
相关推荐
该驱动程序提供了丰富的功能,包括 GPIO、中断、背光、PWM、BT、FM、LCD、Camera 等。下面将对 MTK 驱动程序的各个方面进行详细介绍。 一、GPIO 介绍 GPIO(General Purpose Input/Output)是 MTK 驱动程序中的一...
标题中的“IR.rar_IR DRIVER_Keypad_gpio-ir_s3c2440_wince keypad GP”揭示了这个压缩包包含的是一个与红外(IR)技术相关的驱动程序,特别是针对S3C2440处理器的GPIO(General Purpose Input/Output)键盘驱动。...
在GPIO Keypad的设计中,BIT1618C模块通常包含一组可编程的GPIO引脚,这些引脚可以配置为输入或输出,以模拟传统键盘的行列扫描方式。这种扫描方法涉及通过轮询一组行线和列线来检测按键是否被按下。当一个按键被按...
在本文中,我们将深入探讨如何在基于s3c6410开发板的平台上实现QT界面的按键控制功能。这个项目,名为“s3c-keypad”,是一个专门为s3C系列处理器设计的QT应用程序,旨在利用Qt库创建一个用户友好的图形界面,允许...
- 设计考虑了音量控制和静音功能。 5. **翻盖手机 (Clamshell)** - 对于翻盖式手机,设计中包含了开合状态检测功能。 - 开合状态用于决定屏幕是否唤醒以及背光是否开启。 #### 数据结构 GPIO 应用程序涉及到的...
5. **fgpio.c**:这可能是GPIO功能驱动的具体实现,比如设置GPIO的输入/输出模式,读写GPIO值,或者配置中断等功能。 6. **gpio.h**:头文件,包含了驱动程序中用到的GPIO相关函数声明和常量定义,如GPIO请求和释放...
总之,"STM32例程 Tutorial 23 - 4x4 Keypad"是一个实用的学习资源,它涵盖了STM32微控制器与外部设备交互的基础知识,包括GPIO配置、键盘扫描、中断处理等。通过学习和实践这个教程,开发者能够增强对STM32应用开发...
6. **错误检测和处理**:良好的嵌入式系统设计需要考虑到故障情况,包括按键卡死、重复输入等,开发者可能已经实施了错误检测和恢复机制。 7. **低功耗设计**:对于电池供电的设备,优化代码以降低能耗至关重要。这...
"Keypad库"是一个专为电子项目设计的库,它主要用于处理硬件键盘输入,常见于嵌入式系统或物联网(IoT)设备中。在这些系统中,物理按键的读取和管理通常需要复杂的编程逻辑,而Keypad库则简化了这一过程。下面将详细...
BITEK AK系列ADC Keypad则是将这一功能与按键输入相结合的产品,适用于各种需要模拟信号输入和用户交互的场合,如工业控制、智能家居、医疗设备等。 在教材中,首先会介绍ADC的基本工作原理,包括逐次逼近型、双...
2. **中断处理**:STMPE的中断功能可以实时响应按键按下和释放事件,通过中断向CPU发送信号,使得应用程序能够快速响应用户的操作。 3. **GPIO读取**:STMPE的GPIO端口可以配置为输入模式,用于检测按键的高电平或...
在 MTK 驱动中,GPIO 的设置包括充电参数、外部中断、按键定义等方面。在 chr_parameter.c 文件中,定义了充电控制脚和振机控制脚的设置。在 eint_def.c 文件中,定义了外部中断的具体引脚设置。在 keypad_def.c ...
Samsung Keypad驱动是专为Samsung电子设备设计的一款键盘输入设备驱动程序,主要用于处理硬件按键的输入事件。该驱动适用于OK6410平台,是Linux内核的一部分,遵循GNU General Public License(GPL)进行分发,允许...
3. **中断处理**:当按键被按下或释放时,`keypad`会产生中断信号。驱动程序需要注册中断处理函数来响应这些信号,并将按键事件转化为内核可理解的数据结构。 4. **设备文件**:在用户空间,`keypad`通常表现为一个...
这部分代码可能包括初始化GPIO,设置中断处理,定义扫描矩阵(如果keypad是矩阵型的),以及解析按键状态的函数。 总的来说,这个压缩包可能包含了一个完整的ARM 10处理器驱动键盘的实例,涵盖了从硬件接口到软件...
5. 通信:驱动可能会使用I2C、SPI或其他总线协议与按键控制器通信。 6. 卸载:当设备关闭或不再使用时,驱动会释放资源并卸载。 在开发这样的驱动程序时,开发者需要对OMAP4 SoC的硬件特性有深入理解,包括其GPIO...
1、STM32F103通过设置GPIO口与4x4矩阵按键模块相连,通过代码读取哪些按键被按下。 2、代码使用KEIL开发,当前在STM32F103C8T6运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量...
2. 多重中断处理:M16C62P支持中断功能,可以设置键盘扫描作为一个定时中断事件,以降低CPU的占用率。当检测到按键按下时,中断服务程序负责识别按键并执行相应操作。 3. 软件编程:在C语言环境下,可以使用M16C62P...
4. 处理中断:为了实时响应按键,可以配置GPIO中断。当有按键按下时,中断服务程序会触发,执行相应的操作。 5. 键盘消抖:由于机械触点的抖动,可能会导致短暂的误读,因此需要软件消抖处理,例如延时重试或比较两...
在keypad程序中,每个按键可能有一个或多个槽函数,当按下按键时,对应的槽函数会被调用,可能实现数字或功能键的输出。 5. **自定义控件** 如果需要实现特殊形状或功能的按键,可以继承QWidget类并重写其...