`
dss16694
  • 浏览: 148966 次
社区版块
存档分类
最新评论

android手机霍尔开关的介绍

 
阅读更多

转自CSDN:http://blog.csdn.net/wlwl0071986/article/details/9154541

一、HALL开关原理及手机应用


                手机中用来控制线路通断的器件主要有三种类型:开关、干簧管和霍尔元件。不同的是开关一般是由人工

         手动控制,而干簧管和霍尔元件则通过磁信号来控制线路的通与断。霍尔(HALL)传感器是一种电子元件,其

         外型封装和三极管非常相象。它是由HALL元件,放大器、施密特电路以及集电极开路输出三极管组成,当磁场

         作用于HALL元件时产生一个微小的HALL电压,经放大器放大和施密特电路后使三极管导通输出低电平,而没

         有磁场作用的时候(即翻盖打开后)三极管截止输出为高电平。和干簧管相比HALL传感器寿命更长,不容易损

         坏,而且对振动,加速度不太敏感,作用时开关时间也比较快,通常为0.1~~2ms比干簧管的1~~3ms快得多。

 

                手机中HALL传感器由一个开关型HALL元件和两个电源开关控制管组成。其导通与否完全受到手机CPU输

         出的HALL高电平信号控制,电源则来自于电池。当翻盖合上时装在翻盖中的磁铁的磁场作用于HALL传感器 

        (一般翻盖/折叠手机都把磁铁安装在翻盖上),HALL电路中的三极管导通,从传感器的引脚输出低电平,如果

         是在通话后则作为“挂机”信号送给CPU挂机。(这也就是为什么合上翻盖后手机就挂断的道理)。

 

                当用户打开翻盖时,HALL不受磁场感应,HALL电路中的三极管截止,输出为高电平,如果该信号是在来

         电时产生的,那么在送给CPU时,CPU便作为开机信号而接听电话。但如果仅仅是用户做其他操作比如输入短

         信,电话号码单纯打开翻盖,该电路信号由CPU作为背景灯控制信号使背景灯点亮。(每次开盖的时候背景灯

         都要点亮,同时记录一次翻盖次数)。小心的用工具仅仅掀开一点点翻盖的时候背景灯是不会亮的,因为这时

         候还有磁场作用于HALL元件,当打开到一定角度的时候,失去磁场作用的HALL电路的三极管便截止输入高电

         平,CPU在收到该信号后便驱动背景灯电路点燃背景灯。

               当用户取消“翻盖接听”的选项后,CPU送出的HALL信号为低电平,从而使那两个电源开关控制管截止,没

        有电源供给,即使在有无磁场信号时输出的电压都不会改变,因而也就失去了开关的作用。因此在这样的情况

        下,来电后你翻盖CPU根据设置并不接通电话,这时候你需要按下接听键才能接听。

二、硬件连接

 

 

 

 

 

 

 

            NOTE: 当有磁场改变的时候在OUT脚位会输出一个 H 或者 L 电平,与OUT 相连的PIN脚必须是一个可唤醒系统的中断

 

三、HALL KEY实现
       在驱动gpio_event.c里添加中断注册和回掉函数

#define GN_HALL_KEY_OPEN    111 
#define GN_HALL_KEY_CLOSE   112 			-------给系统上报的键值
#define GN_GPIO_HALL_EINT_PIN         	40

u8  hall_key_state_bak; 
spinlock_t	hall_lock; 
struct hall_irq_info 
{ 
    int irq; 
    struct work_struct work; 
}; 
struct hall_irq_info hall_info; 
enum hall_state 
{ 
    HALL_CLOSE = 0, 
    HALL_OPEN =1 
};

INIT_WORK(&(hall_info.work), work_func);
         ---------------初始化工作队列
err = gpio_request(GN_GPIO_HALL_EINT_PIN, "Hall Key IRQ GPIO"); 
 if (err) { 
        printk(KERN_ERR "%s: Failed to request GPIO %d\n", 
                __func__, GN_GPIO_HALL_EINT_PIN); 
        goto err_request_gpio_failed; 
    } 
    gpio_tlmm_config(GPIO_CFG(GN_GPIO_HALL_EINT_PIN, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP, GPIO_CFG_6MA),GPIO_CFG_ENABLE); 
    gpio_free(GN_GPIO_HALL_EINT_PIN); 
    hall_info.irq= gpio_to_irq(GN_GPIO_HALL_EINT_PIN); 
    if (__gpio_get_value(GN_GPIO_HALL_EINT_PIN) == 0) { 
        pr_info("HALL_KEY: init the request irq for RISING\n"); 
		hall_key_state_bak = 0; 
        switch_set_state((struct switch_dev *)&hall_data, HALL_CLOSE); 
        err = request_irq(hall_info.irq, hall_irq, IRQF_TRIGGER_HIGH, "Hall_Key", NULL); 
    } else { 
        pr_info("HALL_KEY: init the request irq for FALLING\n"); 
        hall_key_state_bak = 1; 
        switch_set_state((struct switch_dev *)&hall_data, HALL_OPEN); 
        err = request_irq(hall_info.irq, hall_irq, IRQF_TRIGGER_LOW, "Hall_Key", NULL); 
    } 
    enable_irq_wake(hall_info.irq); 
    if (err < 0) { 
        pr_err("HALL_KEY: enable_irq_wake failed...\n"); 
        goto err_request_irq_failed; 
    }
			-------------中断的配置
static void work_func(struct work_struct *work) 
{

	-
	-
	if (kpd_hallkey_state==1) { //hall open 
        input_report_key(hall_input_dev, GN_HALL_KEY_OPEN, 1); 
        input_sync(hall_input_dev); 
        input_report_key(hall_input_dev, GN_HALL_KEY_OPEN, 0); 
        input_sync(hall_input_dev); 
        switch_set_state((struct switch_dev *)&hall_data, HALL_OPEN); 
    } else {//hall close 
        input_report_key(hall_input_dev, GN_HALL_KEY_CLOSE, 1); 
        input_sync(hall_input_dev); 
        input_report_key(hall_input_dev, GN_HALL_KEY_CLOSE, 0); 
        input_sync(hall_input_dev); 
        switch_set_state((struct switch_dev *)&hall_data, HALL_CLOSE); 
    }
	-
	-
}
	
static irqreturn_t hall_irq(int irq, void *dev_id) 
{ 

    disable_irq_nosync(hall_info.irq); 
    schedule_work(&hall_info.work); 
    return IRQ_HANDLED; 

}

 四、按键唤醒系统

       要实现按键唤醒系统,首先,在驱动中,设置此键会被上报。如:
               

__set_bit(KEY_2, kpd_input_dev->keybit);
__set_bit(KEY_3, kpd_input_dev->keybit);

 
       这样,才能确保按键被注册处理,否则,上层收不到按键事件。
       另外,在7x27a_kp.kl文件中,设置devices\qcom\msm7627a_sku3\7x27a_kpd.kl

                      

key 111   GN_HALL_KEY_OPEN  WAKE
key 112   GN_HALL_KEY_CLOSE

 

         这样就可实现按键唤醒系统了。

 

五、新增两个按键实现hall key

       1. 首先修改底层gpio_event.c文件中的按键定义:
              

#define GN_HALL_KEY_OPEN 111
#define GN_HALL_KEY_CLOSE 112

 
       2. 修改devices\qcom\msm7627a_sku3\7x27a_kpd.kl文件,增加
              

key 111  GN_HALL_KEY_OPEN WAKE  (打开可以唤醒)
key 112  GN_HALL_KEY_CLOSE

 
       3. 在frameworks\base\include\ui\keycodelabels.h KEYCODES结构体中增加
              

{ "GN_HALL_KEY_OPEN", 111 },
{ "GN_HALL_KEY_CLOSE", 112 },

 
       4. 在frameworks\base\core\java\android\view\keyevent.java构造函数中增加:
              

public static final int KEYCODE_GN_HALL_KEY_OPEN    = 111;
public static final int KEYCODE_ GN_HALL_KEY_CLOSE = 112;

 
       5. 修改:  private static final int LAST_KEYCODE           = KEYCODE_BUTTON_MODE;
           为private static final int LAST_KEYCODE =KEYCODE_ GN_HALL_KEY_CLOSE;
           在frameworks\base\native\include\android\keycodes.h的enum中增加:
              

AKEYCODE_GN_HALL_KEY_CLOSE   = 250,
AKEYCODE_GN_HALL_KEY_CLOSE  = 251,

 
       6. 在frameworks\base\libs\ui\input.cpp的issystemkey中增加:
              case AKEYCODE_GN_HALL_KEY_CLOSE:
              case AKEYCODE_GN_HALL_KEY_CLOSE: 
           这样bool KeyEvent::isSystemKey() const {
                     return isSystemKey(getKeyCode());
           才能由scancode转换为keycode供上层应用截取。

     7. 在frameworks/base/core/res/res/values/attrs.xml中增加:

<enum name="KEYCODE_GN_HALL_KEY_OPEN" value="250" />
<enum name="KEYCODE_GN_HALL_KEY_CLOSE" value="251" />

 

分享到:
评论

相关推荐

    霍尔传感器

    霍尔传感器A3144是由Allegro Microsystems公司生产的高性能开关型霍尔效应传感器,适用于宽温范围(-40℃至150℃)的应用环境。该传感器内部集成了电压调整电路、反向电源保护电路、霍尔元件、温度补偿电路、微信号...

    传感器在手机PPT学习教案.pptx

    本篇将详细介绍几种常见的手机传感器,包括重力传感器、霍尔传感器、光线传感器和触摸传感器。\n\n1. 重力传感器:\n重力传感器是一种基于压电效应的新型传感器。在手机中,如iPhone和Android设备,内置的重力传感器...

    AT项目蓝牙控制小车-上海场.pdf

    本文档介绍了基于Android Things的蓝牙控制小车系统的结构原理和过程控制。该系统由蓝牙模块HC-05、双路电机驱动L298N、霍尔传感器和 Android Things boards组成。 串口通信 串口通信是小车系统的核心组件之一。该...

    便携式家居控制检测

    手机客户端基于Android 2.3操作系统,通过GPRS(通用分组无线服务)模块与家居控制端进行通信。GPRS是一种蜂窝网络技术,允许设备在移动通信网络中进行数据传输。用户可以通过手机应用程序发送字符指令,这些指令由...

    嵌入式课程设计-蓝牙无线数据传输.pdf

    利用Android Studio开发手机APP,实现与硬件设备的蓝牙连接和数据交互。 3.2 手机APP的主要功能模块:包括数据展示模块、控制模块、设置模块等,确保用户能够便捷地查看系统状态并进行相应操作。 4 软件调试过程和...

    嵌入式课程设计-蓝牙无线数据传输.docx

    主芯片作为系统的控制中心,处理来自霍尔传感器的信号,控制开关磁阻电机的工作状态,并与WIFI模块通信,实现数据传输。 2.1.3 WIFI模块 WIFI模块负责与外部网络的连接,使系统能够远程上传数据,或者接收远程控制...

    Find7手机工作原理

    这款手机采用了直板大屏触摸设计,结合了网络应用、商务、智能和多媒体娱乐功能,运行Android4.3/Color OS系统,搭载2.3GHz四核处理器,拥有5.5英寸FULL HD全贴合屏幕,以及1300万像素主摄像头和500万像素前置摄像头...

    ZigBee无线传感网技术与应用开发V2.0

    - **Android用户控制程序**:开发Android应用,允许用户通过智能手机控制物联网设备。 - **ZigBee节点控制程序**:编写控制ZigBee节点的软件程序。 - **添加自定义传感器节点**:根据需求添加新的传感器节点到现有...

Global site tag (gtag.js) - Google Analytics