`

[转载] [Keypad]如何设计GPIO中断模拟普通按键控制静音等功能

 
阅读更多

 

[FAQ06059] [Keypad]如何设计GPIO中断模拟普通按键控制静音等功能
Branch:ICS2JBJB2

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值添加相应的控制
分享到:
评论

相关推荐

    MTK 驱动介绍——GPIO 中断 PWM 等介绍

    该驱动程序提供了丰富的功能,包括 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.rar_IR DRIVER_Keypad_gpio-ir_s3c2440_wince keypad GP”揭示了这个压缩包包含的是一个与红外(IR)技术相关的驱动程序,特别是针对S3C2440处理器的GPIO(General Purpose Input/Output)键盘驱动。...

    BITEK BIT1618C GPIO Keypad 培訓教材

    在GPIO Keypad的设计中,BIT1618C模块通常包含一组可编程的GPIO引脚,这些引脚可以配置为输入或输出,以模拟传统键盘的行列扫描方式。这种扫描方法涉及通过轮询一组行线和列线来检测按键是否被按下。当一个按键被按...

    s3c-keypad.rar_QT 按键_qt keypad_s3c_s3c-keypad

    在本文中,我们将深入探讨如何在基于s3c6410开发板的平台上实现QT界面的按键控制功能。这个项目,名为“s3c-keypad”,是一个专门为s3C系列处理器设计的QT应用程序,旨在利用Qt库创建一个用户友好的图形界面,允许...

    MTK Design-GPIO

    - 设计考虑了音量控制和静音功能。 5. **翻盖手机 (Clamshell)** - 对于翻盖式手机,设计中包含了开合状态检测功能。 - 开合状态用于决定屏幕是否唤醒以及背光是否开启。 #### 数据结构 GPIO 应用程序涉及到的...

    gpio_driver.rar_SOC_SOC的程序_linux下gpio

    5. **fgpio.c**:这可能是GPIO功能驱动的具体实现,比如设置GPIO的输入/输出模式,读写GPIO值,或者配置中断等功能。 6. **gpio.h**:头文件,包含了驱动程序中用到的GPIO相关函数声明和常量定义,如GPIO请求和释放...

    STM32例程Tutorial 23 - 4x4 Keypad.7z

    总之,"STM32例程 Tutorial 23 - 4x4 Keypad"是一个实用的学习资源,它涵盖了STM32微控制器与外部设备交互的基础知识,包括GPIO配置、键盘扫描、中断处理等。通过学习和实践这个教程,开发者能够增强对STM32应用开发...

    KEYPAD_code_IAM_Keypad_

    6. **错误检测和处理**:良好的嵌入式系统设计需要考虑到故障情况,包括按键卡死、重复输入等,开发者可能已经实施了错误检测和恢复机制。 7. **低功耗设计**:对于电池供电的设备,优化代码以降低能耗至关重要。这...

    keypad库

    "Keypad库"是一个专为电子项目设计的库,它主要用于处理硬件键盘输入,常见于嵌入式系统或物联网(IoT)设备中。在这些系统中,物理按键的读取和管理通常需要复杂的编程逻辑,而Keypad库则简化了这一过程。下面将详细...

    BITEK AK (ADC Keypad) 培訓教材

    BITEK AK系列ADC Keypad则是将这一功能与按键输入相结合的产品,适用于各种需要模拟信号输入和用户交互的场合,如工业控制、智能家居、医疗设备等。 在教材中,首先会介绍ADC的基本工作原理,包括逐次逼近型、双...

    stmpe-keypad.rar_Same Same

    2. **中断处理**:STMPE的中断功能可以实时响应按键按下和释放事件,通过中断向CPU发送信号,使得应用程序能够快速响应用户的操作。 3. **GPIO读取**:STMPE的GPIO端口可以配置为输入模式,用于检测按键的高电平或...

    keypad.zip

    3. **中断处理**:当按键被按下或释放时,`keypad`会产生中断信号。驱动程序需要注册中断处理函数来响应这些信号,并将按键事件转化为内核可理解的数据结构。 4. **设备文件**:在用户空间,`keypad`通常表现为一个...

    MTK驱动2— GPIO

    在 MTK 驱动中,GPIO 的设置包括充电参数、外部中断、按键定义等方面。在 chr_parameter.c 文件中,定义了充电控制脚和振机控制脚的设置。在 eint_def.c 文件中,定义了外部中断的具体引脚设置。在 keypad_def.c ...

    samsung-keypad驱动详解

    Samsung Keypad驱动是专为Samsung电子设备设计的一款键盘输入设备驱动程序,主要用于处理硬件按键的输入事件。该驱动适用于OK6410平台,是Linux内核的一部分,遵循GNU General Public License(GPL)进行分发,允许...

    keypad_c.rar_Keypad_arm_keyp

    这部分代码可能包括初始化GPIO,设置中断处理,定义扫描矩阵(如果keypad是矩阵型的),以及解析按键状态的函数。 总的来说,这个压缩包可能包含了一个完整的ARM 10处理器驱动键盘的实例,涵盖了从硬件接口到软件...

    omap4-keypad.rar_omap4 keypad

    5. 通信:驱动可能会使用I2C、SPI或其他总线协议与按键控制器通信。 6. 卸载:当设备关闭或不再使用时,驱动会释放资源并卸载。 在开发这样的驱动程序时,开发者需要对OMAP4 SoC的硬件特性有深入理解,包括其GPIO...

    基于STM32F103单片机GPIO检测4x4矩阵按键信号的程序代码 0034

    1、STM32F103通过设置GPIO口与4x4矩阵按键模块相连,通过代码读取哪些按键被按下。 2、代码使用KEIL开发,当前在STM32F103C8T6运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量...

    M16C62P-KEYPAD

    2. 多重中断处理:M16C62P支持中断功能,可以设置键盘扫描作为一个定时中断事件,以降低CPU的占用率。当检测到按键按下时,中断服务程序负责识别按键并执行相应操作。 3. 软件编程:在C语言环境下,可以使用M16C62P...

    STM32F429单片机的外设例程 32-STM32F429_KEYPAD

    4. 处理中断:为了实时响应按键,可以配置GPIO中断。当有按键按下时,中断服务程序会触发,执行相应的操作。 5. 键盘消抖:由于机械触点的抖动,可能会导致短暂的误读,因此需要软件消抖处理,例如延时重试或比较两...

    键盘程序keypad

    在keypad程序中,每个按键可能有一个或多个槽函数,当按下按键时,对应的槽函数会被调用,可能实现数字或功能键的输出。 5. **自定义控件** 如果需要实现特殊形状或功能的按键,可以继承QWidget类并重写其...

Global site tag (gtag.js) - Google Analytics