转自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_thall_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中增加:

android霍尔功能,android手机霍尔开关的引见相关推荐

  1. android远程打电话,Android打电话功能 Android实战教程第三篇之简单实现拨打电话功能...

    想了解Android实战教程第三篇之简单实现拨打电话功能的相关内容吗,杨道龙在本文为您仔细讲解Android打电话功能的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android拨打电话 ...

  2. android霍尔功能,浅谈霍尔传感器用于手机的作用和用途有哪些?

    想必大家买了手机以后,都会看一下使用手册吧!这时候大家有没有发现,有一项参数写着霍尔传感器,这是个什么东西呢?很多人都有疑问吧!下面就带大家了解一下霍尔传感器用于手机的作用和用途. 霍尔传感器用于手机 ...

  3. android提醒功能,android service实现循环定时提醒功能

    人每天都要喝8杯水才能保持健康,于是苦逼的程序员总是一遍代码就忘了时间,于是我突发奇想能不能开发一个apk能够实现固定的间隔时间定时提醒我要喝水了呢? apk基本功能: 1)能够设置间隔时间 2)在a ...

  4. android倒计时功能,android实现倒计时功能(开始、暂停、0秒结束)

    本文实例为大家分享了android实现倒计时功能的具体代码,供大家参考,具体内容如下 [思路]:通过 timer 执行周期延时的任务,handler 中将计时信息更新,并在计时结束时结束 timer ...

  5. android倒计时功能,Android 实现列表倒计时功能

    Android 实现列表倒计时功能 发布时间:2020-08-21 21:47:11 来源:脚本之家 阅读:147 作者:Choi晨 单个计时器,然后遍历数据 刷新条目: 两种实现方式:1.Handl ...

  6. android Textview 功能,Android:TextView的常用功能

    android:autoText如果设置,将自动执行输入值的拼写纠正.此处无效果,在显示输入法并输入的时候起作用 android:bufferType指定getText()方式取得的文本类别.选项ed ...

  7. android侧边栏功能,Android实现滑动侧边栏

    在Android应用开发中,滑动侧边栏经常使用,今天我也试着自己进行了一个简单的实践,虽然功能还不是很强大,但是可以保留下来为以后的开发使用,有需要时在进行简单的修改.实现一个滑动侧边栏思路也很简单: ...

  8. Android好评功能,Android自定义View实现五星好评效果

    本文实例为大家分享了Android实现五星好评效果的具体代码,供大家参考,具体内容如下 这个效果想必大家都非常熟悉,那么Android如何自定义实现这种效果呢? 首先自定义属性: 下面看看具体实现: ...

  9. android菜单功能,Android“设置”菜单

    本部分介绍了实现和自定义 Android"设置"菜单可以使用的选项. 设置主屏幕 在 Android 7.0 及更高版本中,"设置主屏幕"页面因增添了建议的设置 ...

最新文章

  1. 关于ASPNET在IIS一些问题的经验总结
  2. python3.x 使用正则表达式拆分字符串并换行显示
  3. ASP.NET 2.0中轻松实现网站换肤
  4. 计算机 双 ip地址,win7双ip怎么设置_Win7电脑如何设置双IP地址
  5. PUTTY、Xshell远程连接Linux与PUTTY、Xshell密匙认证
  6. Atcoder AGC031B Reversi (DP计数)
  7. Oracle学习:序列
  8. 的函数原型_JS基础函数、对象和原型、原型链的关系
  9. 迁移.net framework 工程到.net core
  10. 360 屏蔽ajax,怎么在easy ui做全局Ajax拦截啊?
  11. Linux 30岁了~我们也老了
  12. EPT DATA数据库能查到1998-2013年工业企业数据库
  13. java 生成jni_Javah生成JNI头文件
  14. 计算机基础知识和运用2作图,2020年9月统考《计算机应用基础》基础知识试题及答案2...
  15. 基础篇:异步编程不会?我教你啊!CompletableFuture(JDK1.8)
  16. Discuz安全之伪装后台,修改后台登陆页面信息
  17. ctfshow 做题 MISC入门 模块 21~30
  18. 【虚幻引擎4(UE4)实用技巧】-关于高亮显示物体轮廓线
  19. 大数据是什么?初学者怎样理解大数据技术
  20. 【工大SCIR】AAAI20 基于反向翻译和元学习的低资源神经语义解析

热门文章

  1. elasticsearch6.8 基础查询类型(must、must_not、should、filter)
  2. gif动态图片怎样裁剪后还是动图?
  3. 西工大硕士就业计算机,一位西北工业大学学生哀叹:末流985进不了大厂,保研华科或成电...
  4. Excel技巧—开始菜单之意想不到的复制
  5. Python Selenium 各浏览器下载到特定文件夹方法总结
  6. Vue父组件如何给子组件传递图片属性?为什么父组件传递的图片子组件接收不到?
  7. HTML 与 CSS 中的文本
  8. Android 动画介绍及自定义3D动画效果的基本使用
  9. 杂文 | 自媒体创业泡沫消亡史
  10. Mathpix公式识别OCR软件使用教程