电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

浅析MTK hall霍尔传感器之原理

2022-04-14 08:13分类:传感器 阅读:

    霍尔元件   霍尔元件是依据霍尔效应制做的一种电磁场感应器。霍尔效应是光电效用的一种,这一状况是霍尔元件(A.H.Hall,1855—1938)于1879年在科学研究金属材料的导电性组织时看到的。之后发觉半导体材料、导电性液体等也是有这类效用,而半导体材料的霍尔效应比金属材料强得多,运用这状况做成的各种各样霍尔传感器,普遍地运用于工控自动化技术性、无损检测技术及信息资源管理等层面。霍尔效应是科学研究半导体器件特性的主要方式。根据霍尔效应试验测量的霍尔系数,可以分辨半导体器件的导电性种类、自由电子浓度值及自由电子电子密度等关键主要参数。   原理   电磁场中有一个霍尔元件半导体材料片,恒定电流I从A到B根据此片。在洛仑兹力的效果下,I的电子流在根据霍尔元件半导体材料时往一侧偏位,使此片在CD方位上造成电势差,这就是所说的霍尔电压。   霍尔电压随磁化强度的变动而转变 ,电磁场越强,工作电压越高,电磁场越弱,工作电压越低,霍尔电压值不大,一般唯有好多个毫伏,但经集成电路芯片中的功率放大器变大,就能使该工作电压变大到足够輸出极强的数据信号。若使霍尔元件集成电路芯片起感测器功效,必须 用机械设备的办法来更改磁通量。下面的图一样的办法是用一个旋转的离心叶轮做为操纵磁通量的电源开关,当离心叶轮叶子处在磁石和霍尔元件集成电路芯片中间的磁密里时,电磁场偏移集成化片,霍尔电压消退。那样,霍尔元件集成电路芯片的输出电压的转变,就能表明出离心叶轮转动轴的某一部位,运用这一原理,可将霍尔元件集成电路芯片片要功效点火正时感应器。霍尔效应感应器归属于被动性感应器,它要有另加开关电源才可以工作中,这一特性使它能检验转速比低的运作状况。   霍尔效应   霍尔效应从其本质上讲是运作的自由电子在电磁场中受洛仑兹力功效造成的偏移。当自由电子(电子器件或空穴)被管束在液体原料中,这类偏移就致使在竖直电流量和磁场的方向上造成正负电荷的聚集,进而产生额外的横着静电场。针对图一所显示的半导体材料试件,若在X方位通以电流量Is,在Z方位加电磁场B,则在Y方位即试件A,A′电级两边就逐渐聚集异号正电荷而发生对应的额外静电场。静电场的偏向取决策于检测试样的电种类。显而易见,该静电场是阻拦自由电子再次向侧面偏位,   当自由电子受到的横着静电力eEH与洛仑兹力相同时,试品两边正电荷的累积就做到均衡,故有   ⑴   在其中EH为霍尔元件静电场,V是自由电子在电流的方向上的均值飘移速率。设试件的宽为b,薄厚为d,自由电子浓度值为n,则   ⑵   由⑴、⑵两式可获得   ⑶   即霍尔电压VH(A、A′电级中间的工作电压)与ISB相乘正比例与样品薄厚d反比。比例系数 称之为霍尔系数,它是表明原材料霍尔效应高低的主要主要参数,只需测到 VH(伏)及其了解IIs(安)、B(高斯函数)和d(厘 米)可按住式测算RH(公分3/库伦)   归类   霍尔元件分成线形霍尔元件和电源开关型霍尔元件二种。   (一)电源开关型霍尔元件由稳压电源、霍尔传感器、差分放大器,斯密特触发器原理和輸出级构成,它輸出数据量。电源开关型霍尔元件也有一种独特的方式,称之为锁键型霍尔元件。   (二)线性型霍尔元件由霍尔传感器、线形放大仪和射极跟随器构成,它輸出模拟量输入。   线形霍尔元件又可分成开环增益式和闭环控制式。闭环控制式霍尔元件又被称为零磁通量霍尔元件。线形霍尔元件关键用以交直流电流和工作电压精确测量。。   电源开关型   如图4所显示,在其中Bnp为工作中点“开”的磁通量,BRP为释放出来点“关”的磁通量。当另加的磁通量超出姿势点Bnp时,感应器輸出低电频,当磁通量降至姿势点Bnp下列时,感应器輸出脉冲信号不会改变,一直要降至释放出来点BRP时,感应器才由低电频跃变成上拉电阻。Bnp与BRP中间的落后使电源开关姿势更加靠谱。   锁键型   如图所示5所显示,当磁通量超出姿势点Bnp时,感应器輸出由上拉电阻跃变成低电频,而在外面电磁场注销后,其輸出情况维持不会改变(即锁存情况),务必增加反方向磁通量做到BRP时,才可以使脉冲信号造成转变。   线性型   输出电压与另加磁化强度呈线性相关,如图所示3所显示,由此可见,在B1~B2的磁通量范畴内有不错的线性,磁通量超过此范畴的时候展现饱和。   开环增益式电流传感器   因为通电螺线管內部存有电磁场,其高低与输电线中的电流量正相关,故能够运用霍尔元件精确测量出电磁场,进而明确输电线中交流电的尺寸。运用这一基本原理能够设计方案做成霍尔元件电流传感器。其优势不是与被测电源电路产生电触碰,不危害被测电源电路,不耗费被测开关电源的输出功率,尤其适用于大电流量感测器。   霍尔元件电流传感器原理如图所示6所显示,规范圆形变压器铁芯有一个空缺,将霍尔元件插进空缺中,圆形上绕有电磁线圈,当交流电经过电感线圈时造成电磁场,则霍尔元件有讯号輸出。   闭环控制式电流传感器   磁均衡式电流传感器也叫霍尔元件闭环控制电流传感器,也称赔偿式感应器,即主控制回路被测电流量Ip在聚磁芯住所形成的电磁场根据一个初级线圈,电流量所造成的电磁场实现赔偿, 进而使霍尔元件元器件处在检验零磁通量的运行状态。   磁均衡式电流传感器的实际运行流程为:当主控制回路有一电流量根据时,在电线上形成的电磁场被聚磁芯集聚并磁感应到霍尔元件元器件上, 所造成的讯号輸出用以推动相对应的整流管并使其通断,进而得到一个赔偿电流量Is。 这一电流量再经过多匝绕阻造成电磁场 ,该电磁场与被测电流量形成的电磁场恰好反过来,因此赔偿了原本的电磁场, 使霍尔元件元器件的輸出慢慢减少。当与Ip与线圈匝数乘积 所造成的电磁场相同时,Is不会再提升,这时候的霍尔元件元器件起标示零磁通量的功效 ,这时还可以根据Is来均衡。被测电流量的一切变动都是会毁坏这一均衡。 一旦电磁场不平衡,霍尔元件元器件就会有数据信号輸出。经功率放大电路后,马上就会有对应的交流电穿过次级绕组以对失调的电磁场实现赔偿。从电磁场失调到再度均衡,需要的時间理论上不上1μs,这是一个稳定平衡的全过程。 浅析MTK hall霍尔传感器之原理

  2. dws配终断脚和也就能脚

  (依据电路原理图中“09_CAMERA_SENSOR”页中, “HALL”一部分【OUT】脚位所联接 - 也就能脚GPIO12)

  v666为例子

  dws配备pin脚: - 因为硬件配置下拉-》dws也需要配出下拉

  EintMode|Def.Mode M0|M1|M2|M3|M4|M5|M6|M7|InPull En|InPull SelHigh|Def.Dir|In|Out|OutHigh|VarName1

  GPIO12 1 0:GPIO12 1 1 IN GPIO_HALL_1_PIN

  dws配备EINT:

  EINTVar|Debounce Time(ms)|Polarity|SensiTIve_Level|Debounce En

  EINT12 HALL_1 0 Low Level Disable

  dts:

  * HALL GPIO standardizaTIon */

  &pio {

  hall_pin_default: halldefaultcfg {

  };

  hall_pin_as_int: hallint@12 {

  pins_cmd_dat {

  pins = 《PINMUX_GPIO12__FUNC_GPIO12》;

  slew-rate = 《0》;

  bias-pull-up = 《00》;

  };

  };

  };

  &keypad {

  pinctrl-names = “default”, “hall_pin_as_int”;

  pinctrl-0 = 《&hall_pin_default》;

  pinctrl-1 = 《&hall_pin_as_int》;

  status = “okay”;

  };

  /* HALL GPIO end */

  一、 查询是不是有键值汇报

  getevent -i

  add device 8: /dev/input/event1

  bus: 0019

  vendor 2454

  product 6500

  version 0010

  name: “mtk-kpd” // 与声音加减法键、锁屏键、hall同一个event

  locaTIon: “”

  id: “”

  version: 1.0.1

  getevent -t /dev/input/event1 // 打印出出去的是16进制

  [70.169911] 0001 0085 00000001 // 85 -》 133 避开

  [70.169911] 0000 0000 00000000

  [70.352126] 0001 0085 00000000

  [70.352126] 0000 0000 00000000

  二、查询编码明确汇报键值

  1. alps\kernel-3.18\drivers\input\keyboard\mediatek\kpd.c

  #define KEY_HALL_F3 133 //for hall eint report key far // 磁石避开

  #define KEY_HALL_F4 134 //for hall eint report key close // 磁石挨近

  2. alps/device/magcomm/magc6580_we_c_m/mtk-kpd.kl , 投射给顶层

  key 114 0x72 VOLUME_DOWN // 侧键

  key 115 0x73 VOLUME_UP

  key 116 0x74 POWER

   key 133 F3 // 霍尔元件

   key 134 F4

  注:改动此文档,可以用push的形式先实验

  find /system -name mtk-kpd.kl

  /system/usr/keylayout/mtk-kpd.kl

  adb push 。.. /system/usr/keylayout/

  三、加上管理权限

  alps/device/mediatek/common/sepolicy/basic/system_app.te

  # add permission for hall

  allow system_app sysfs_keypad_file:dir { search read write };

  allow system_app sysfs_keypad_file:file { read write getattr setattr open create };

  alps/device/mediatek/common/sepolicy/full/platform_app.te

  # add permission for hall

  allow platform_app sysfs_keypad_file:dir { search read write };

  allow platform_app sysfs_keypad_file:file { read write getattr setattr open create };

  alps/device/mediatek/common/sepolicy/full/priv_app.te

  # add permission for hall

  allow priv_app sysfs_keypad_file:dir { search read write };

  allow priv_app sysfs_keypad_file:file { read write getattr setattr open create };

  四、触控笔插进与拔出来 - 用hall来完成,触控笔尖有带磁(以80 5.1为例子)

  1. 改动alps/device/haocheng/hct6580_weg_a_l/mtk-kpd.kl ,投射给顶层

  key 133 F3

  key 134 F4

   key 136 F6

   key 137 F7

  2. 改动alps\kernel-3.10\drivers\misc\mediatek\keypad\kpd.c,仿制hall_1加上hall_2的编码:

   #ifdef GPIO_HALL_2_PIN

  #define CUSTOM_HALL_2_SUPPORT

  #define GPIO_HALL_2_EINT_PIN GPIO_HALL_2_PIN

  #define GPIO_HALL_2_EINT_PIN_M_EINT GPIO_HALL_2_PIN_M_EINT

  staTIc unsigned int hall_2_irq;

  #define HALL_2_TAG “hall: ”

  #define HALL_2_DBG(fmt, args.。.) printk(HALL_2_TAG fmt, ##args)

  struct work_struct hall_2_eint_work;

  static int hall_2_state_flag = 0;

  static bool hall_2_state = 1; //0: close 1:far

  #define KEY_HALL_F6 136 //for hall eint report key far

  #define KEY_HALL_F7 137 //for hall eint report key close

   #endif

   #ifdef CUSTOM_HALL_2_SUPPORT // 给予给顶层启用插口: /sys/bus/。..

  static volatile int hall_2_status = 0;

  static ssize_t store_hall_2_state(struct device_driver *ddri, const char *buf, size_t count)

  {

  if (sscanf(buf, “%u”, &hall_2_status) != 1) {

  kpd_print(“kpd call state: Invalid values\n”);

  return -EINVAL;

  }

  hall_2_state = (bool)hall_2_status;

  return count;

  }

  static ssize_t show_hall_2_state(struct device_driver *ddri, char *buf)

  {

  ssize_t res;

  res = snprintf(buf, PAGE_SIZE, “%d\n”, hall_2_state);

  return res;

  }

  static DRIVER_ATTR(hall_2_state, S_IWUSR | S_IALLUGO, show_hall_2_state, store_hall_2_state);

   #endif

  static struct driver_attribute *kpd_attr_list[] = {

  &driver_attr_kpd_call_state,

  #ifdef CUSTOM_HALL_SUPPORT

  &driver_attr_hall_state,

  #endif

   #ifdef CUSTOM_HALL_2_SUPPORT // 给予给顶层启用插口: /sys/bus/。..

   &driver_attr_hall_2_state,

   #endif

  };

   #ifdef CUSTOM_HALL_2_SUPPORT

   void kpd_hall_2_key_handler(unsigned long pressed, u16 linux_keycode)

  {

  if(!kpd_input_dev) {

  printk(“KPD input device not ready\n”);

  return;

  }

  input_report_key(kpd_input_dev, linux_keycode, pressed);

  input_sync(kpd_input_dev);

  if (kpd_show_hw_keycode) {

  printk(KPD_SAY “(%s) KEY_HALL keycode =%d \n”, pressed ? “pressed” : “released”, linux_keycode);

  }

  }

  static void hall_2_work_func(struct work_struct *work)

  {

  if(hall_2_state == 1) {

  kpd_hall_key_handler(1, KEY_HALL_F6);

  kpd_hall_key_handler(0, KEY_HALL_F6);

  } else if(hall_2_state == 0) {

  kpd_hall_key_handler(1, KEY_HALL_F7);

  kpd_hall_key_handler(0, KEY_HALL_F7);

  }

  }

  bool get_hall_2_state()

  {

  return hall_2_state;

  }

  EXPORT_SYMBOL(get_hall_2_state);

  void hall_2_eint_func(void)

  {

  disable_irq_nosync(hall_2_irq);

  if(hall_2_state_flag)

  {

  hall_2_state_flag = 0;

  hall_2_state = 1;

  irq_set_irq_type(hall_2_irq,IRQ_TYPE_LEVEL_LOW);

  }

  else{

  hall_2_state_flag = 1;

  hall_2_state = 0;

  irq_set_irq_type(hall_2_irq,IRQ_TYPE_LEVEL_HIGH);

  }

  enable_irq(hall_2_irq);

  schedule_work(&hall_2_eint_work);

  }

  static irqreturn_t hall_2_irq_handler(int irq, void *dev_id)

  {

  hall_2_eint_func();

  return IRQ_HANDLED;

  }

  int hall_2_setup_eint(void)

  {

  struct device_node *hall_node;

  u32 ints[2] = {0, 0};

  mt_set_gpio_dir(GPIO_HALL_2_EINT_PIN, GPIO_DIR_IN);

  mt_set_gpio_mode(GPIO_HALL_2_EINT_PIN, GPIO_HALL_2_EINT_PIN_M_EINT);

  mt_set_gpio_pull_enable(GPIO_HALL_2_EINT_PIN, 0);

  hall_node = of_find_compatible_node(NULL,NULL,“mediatek, HALL_2-eint”);

  if(hall_node){

  printk(“hall_irq has find!\n”);

  of_property_read_u32_array(hall_node, “debounce”, ints, ARRAY_SIZE(ints));

  mt_gpio_set_debounce(ints[0], ints[1]);

  hall_2_irq= irq_of_parse_and_map(hall_node, 0);

  if (!hall_2_irq)

  {

  printk(“irq_of_parse_and_map hall fail!!\n”);

  return -EINVAL;

  }

  if(request_irq(hall_2_irq, hall_2_irq_handler, IRQF_TRIGGER_NONE, “HALL_2-eint”, NULL)) {

  printk(“HALL IRQ NOT AVAILABLE!!\n”);

  return -EINVAL;

  }

  }

  else{

  printk(“null hall_irq node!\n”);

  return -EINVAL;

  }

  return 0;

  }

  #endif

  static int kpd_pdrv_probe(struct platform_device *pdev)

  {

  #ifdef CUSTOM_HALL_SUPPORT

  ._set_bit(KEY_HALL_F3, kpd_input_dev-》keybit);

  ._set_bit(KEY_HALL_F4, kpd_input_dev-》keybit);

  #endif

   #ifdef CUSTOM_HALL_2_SUPPORT

   ._set_bit(KEY_HALL_F6, kpd_input_dev-》keybit); // 也就能input汇报键值

   ._set_bit(KEY_HALL_F7, kpd_input_dev-》keybit);

   #endif

  。..

  #ifdef CUSTOM_HALL_SUPPORT

  INIT_WORK(&hall_eint_work, hall_work_func);

  hall_setup_eint();

  #endif

   #ifdef CUSTOM_HALL_2_SUPPORT

   INIT_WORK(&hall_2_eint_work, hall_2_work_func); // 终断中唤起工作中,工作上汇报key

   hall_2_setup_eint(); // 设定GPIO口情况,从dts获得终断信息内容,申请注册终断

   #endif

  。..

  }

  3. 改动dws,配备GPIO口为终断方式,配备终断的开启方法(脉冲信号or边缘)

  五、39服务平台:

  1. device/mediateksample/k39tv1_bsp_1g/mtk-kpd.kl

   key 133 F3

   key 134 F4

  2. mt6739.dts

   hall_1: hall_1 {

   compatible = “mediatek, hall_1-eint”;

   status = “disabled”;

   };

  3. k39tv1_bsp_1g.dts

   /* HALL GPIO standardization */

   &keypad {

  pinctrl-names = “default”, “hall_pin_as_int”;

  pinctrl-0 = 《&hall_pin_default》;

  pinctrl-1 = 《&hall_pin_as_int》;

  status = “okay”;

  };

  &pio {

  hall_pin_default: halldefaultcfg {

  };

  hall_pin_as_int: hallint@14 {

  pins_cmd_dat {

  pins = 《PINMUX_GPIO14__FUNC_GPIO14》;

  slew-rate = 《0》;

  bias-pull-up = 《00》;

  };

  };

   };

   /* HALL GPIO end */

  4. codegen.dws

  EINT:

  ID EINTVar|Debounce Time(ms)|Polarity|Sensitive_Level|Debounce En

  EINT14 HALL_1 0 Low Level Disable

  GPIO:

  ID EintMode|Def.Mode M0|M1|M2|M3|M4|M5|M6|M7|InPull En|InPull SelHigh|Def.Dir|In|Out|OutHigh|VarName1

  GPIO14 1 0:GPIO14 1 1 1 IN 1 GPIO_HALL_1_PIN

  5. kernel-4.4/drivers/input/keyboard/mediatek/kpd.c

   #ifdef CONFIG_KST_HALL_SUPPORT

   #define CUSTOM_HALL_SUPPORT

  #define GPIO_HALL_EINT_PIN GPIO_HALL_1_PIN

  #define GPIO_HALL_EINT_PIN_M_EINT GPIO_HALL_1_PIN_M_EINT

  static unsigned int hall_irq;

  #define HALL_TAG “hall: ”

  #define HALL_DBG(fmt, args.。.) printk(HALL_TAG fmt, ##args)

  struct work_struct hall_eint_work;

  static int hall_state_flag = 0;

  static bool hall_state = 1; //0: close 1:far

  #define KEY_HALL_F3 133 //116 //for hall eint report key far

  #define KEY_HALL_F4 134 //62 //for hall eint report key close

  struct pinctrl *hallpinctrl;

   struct pinctrl_state *hall_pin_as_int;

   #endif

   #ifdef CUSTOM_HALL_SUPPORT

   static volatile int hall_status = 0;

  static ssize_t store_hall_state(struct device_driver *ddri, const char *buf, size_t count)

  {

  if (sscanf(buf, “%u”, &hall_status) != 1) {

  kpd_print(“kpd call state: Invalid values\n”);

  return -EINVAL;

  }

  hall_state = (bool)hall_status;

  return count;

  }

  static ssize_t show_hall_state(struct device_driver *ddri, char *buf)

  {

  ssize_t res;

  res = snprintf(buf, PAGE_SIZE, “%d\n”, hall_state);

  return res;

  }

   static DRIVER_ATTR(hall_state, S_IWUSR | S_IRUGO, show_hall_state, store_hall_state);

   #endif

  static struct driver_attribute *kpd_attr_list[] = {

  &driver_attr_kpd_call_state,

   #ifdef CUSTOM_HALL_SUPPORT

   &driver_attr_hall_state,

   #endif

  };

   #ifdef CUSTOM_HALL_SUPPORT

   void kpd_hall_key_handler(unsigned long pressed, u16 linux_keycode)

  {

  if(!kpd_input_dev) {

  printk(“KPD input device not ready\n”);

  return;

  }

  input_report_key(kpd_input_dev, linux_keycode, pressed);

  input_sync(kpd_input_dev);

  if (kpd_show_hw_keycode) {

  printk(KPD_SAY “(%s) KEY_HALL keycode =%d \n”, pressed ? “pressed” : “released”, linux_keycode);

  }

  }

  static void hall_work_func(struct work_struct *work)

  {

  printk(“key hall_work_func not ready\n”); //add

  if(hall_state == 1) {

  kpd_hall_key_handler(1, KEY_HALL_F3);

  kpd_hall_key_handler(0, KEY_HALL_F3);

  }

  else if(hall_state == 0) {

  kpd_hall_key_handler(1, KEY_HALL_F4);

  kpd_hall_key_handler(0, KEY_HALL_F4);

  }

  }

  void hall_eint_func(void)

  {

  disable_irq_nosync(hall_irq);

  if(hall_state_flag)

  {

  hall_state_flag = 0;

  hall_state = 1;

  irq_set_irq_type(hall_irq,IRQ_TYPE_LEVEL_LOW);

  }

  else

  {

  hall_state_flag = 1;

  hall_state = 0;

  irq_set_irq_type(hall_irq,IRQ_TYPE_LEVEL_HIGH);

  }

  enable_irq(hall_irq);

  schedule_work(&hall_eint_work);

  }

  static irqreturn_t hall_irq_handler(int irq, void *dev_id)

  {

  hall_eint_func();

  return IRQ_HANDLED;

  }

  int hall_setup_eint(void)

  {

  struct device_node *hall_node;

  u32 ints[2] = {0, 0};

  hall_node = of_find_compatible_node(NULL,NULL,“mediatek, hall_1-eint”);

  if(hall_node){

  printk(“hall_irq has find!\n”);

  of_property_read_u32_array(hall_node, “debounce”, ints, ARRAY_SIZE(ints));

  gpio_set_debounce(ints[0], ints[1]);

  hall_irq= irq_of_parse_and_map(hall_node, 0);

  if (!hall_irq)

  {

  printk(“irq_of_parse_and_map hall fail!!\n”);

  return -EINVAL;

  }

  if(request_irq(hall_irq, hall_irq_handler, IRQF_TRIGGER_NONE, “hall_1-eint”, NULL)) {

  printk(“HALL IRQ NOT AVAILABLE!!\n”);

  return -EINVAL;

  }

  }

  else

  {

  printk(“null hall_irq node!\n”);

  return -EINVAL;

  }

  return 0;

   }

   #endif

   #ifdef CUSTOM_HALL_SUPPORT

   int hall_get_gpio_info(struct platform_device *pdev)

  {

  int ret;

  hallpinctrl = devm_pinctrl_get(&pdev-》dev);

  if (IS_ERR(hallpinctrl)) {

  ret = PTR_ERR(hallpinctrl);

  dev_err(&pdev-》dev, “hallpinctrl err!\n”);

  return ret;

  }

  hall_pin_as_int = pinctrl_lookup_state(hallpinctrl, “hall_pin_as_int”);

  if (IS_ERR(hall_pin_as_int)) {

  ret = PTR_ERR(hall_pin_as_int);

  dev_err(&pdev-》dev, “hall_pin_as_int err!\n”);

  return ret;

  }

  pinctrl_select_state(hallpinctrl, hall_pin_as_int);

  return 0;

   }

   #endif

  static int kpd_pdrv_probe(struct platform_device *pdev)

  {

  ._set_bit(KPD_KEY_MAP, kpd_input_dev-》keybit);

   #ifdef CUSTOM_HALL_SUPPORT

   ._set_bit(KEY_HALL_F3, kpd_input_dev-》keybit);

   ._set_bit(KEY_HALL_F4, kpd_input_dev-》keybit);

   #endif

  。..

  hrtimer_init(&aee_timer_5s, CLOCK_MONOTONIC, HRTIMER_MODE_REL);

  aee_timer_5s.function = aee_timer_5s_func;

   #ifdef CUSTOM_HALL_SUPPORT

   INIT_WORK(&hall_eint_work, hall_work_func);

   hall_get_gpio_info(pdev);

   hall_setup_eint();

   #endif

  err = kpd_create_attr(&kpd_pdrv.driver);

  。..

  }

  调节实例

  实例一 : hall堵塞 - 电容器贴错

  状况 :

  服务平台 : androidN,MTK6737

  清查全过程: 1. 查询是不是有键值汇报 - 拿磁石挨近

  getevent -t /dev/input/event1 - 无键值汇报

  2. 查验dws中的gpio口配备&终断配备、dts终断配备均ok(依据电路原理图获知EINT12 即 GPIO12)

  3. 接数字示波器量终断脚 - 磁石挨近时 终断脚无高低电频转变

  4. 交到硬件配置朋友查验 -》 一个电容器贴错,更换后ok

  解决计划方案: 控料 改bom

  实例二 : hall堵塞 - hall集成ic贴反

  状况 :

  服务平台 : androidN,MTK6737

  清查全过程: 1. 查询是不是有键值汇报 - 拿磁石挨近

  getevent -t /dev/input/event1 - 无键值汇报

  2. 查验dws中的gpio口配备&终断配备、dts终断配备均ok

  3. hall集成ic贴反了 -》 纠正ok

  实例三 : hall堵塞 - 硬件配置短路故障

  状况 :

  服务平台 : androidN,MTK6737

  清查全过程: 1. 查询是不是有键值汇报 - 拿磁石挨近

  getevent -t /dev/input/event1 - 无键值汇报

  2. 用钳子将hall终断脚短地(平时下拉为上拉电阻,低电频为终断) - 有键值汇报


上一篇:android开发笔记之高级主题—磁传感器的简单介绍

下一篇:如何利用隔离器来避免传感器受到信号干扰

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部