gpio_button_smdk2410_meri.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * drivers/char/gpio_button_smdk2410.c
  3.  *
  4.  * button handler for SMDK-2410
  5.  *
  6.  * Based on gpio_button_kings.c
  7.  *
  8.  * Author: Janghoon Lyu <nandy@mizi.com>
  9.  * Date  : $Date: 2002/10/14 11:09:47 $
  10.  *
  11.  * $Revision: 1.1.2.5 $
  12.  *
  13.  * This file is subject to the terms and conditions of the GNU General Public
  14.  * License. See the file COPYING in the main directory of this archive
  15.  * for more details.
  16.  *
  17.  * 2002-10-08: Janghoon Lyu <nandy@mizi.com>
  18.  *   - not tested completely
  19.  */
  20. #include <linux/config.h>
  21. #include <linux/module.h>
  22. #include <linux/kernel.h>
  23. #include <linux/init.h>
  24. #include <asm/hardware.h>
  25. #include <linux/kbd_ll.h>
  26. #include <linux/irq.h>
  27. #include <linux/timer.h>
  28. #include "s3c2410_gpio_button.h"
  29. #undef DEBUG
  30. #ifdef DEBUG
  31. #define DPRINTK( x... ) printk( ##x )
  32. #else
  33. #define DPRINTK( x... )
  34. #endif
  35. static struct timer_list button_check_timer;
  36. #define BUTTON_DELAY 3 /* 30ms */
  37. #define TIMER_BT_NUM 4
  38. typedef struct button_type_tk {
  39. u32 gpio;
  40. u8 scancode;
  41. u8 active;
  42. int status;
  43. char *name;
  44. } BUTTON_TYPE_TK;
  45. BUTTON_TYPE_TK gpio_buttons_tk[] = {
  46. { GPIO_SMDK_UP, SCANCODE_UP, LOW_ACTIVE, KEY_RELEASED, "up"},
  47. { GPIO_SMDK_DOWN, SCANCODE_DOWN, LOW_ACTIVE, KEY_RELEASED, "down"},
  48. { GPIO_SMDK_LEFT, SCANCODE_LEFT, LOW_ACTIVE, KEY_RELEASED, "left"},
  49. { GPIO_SMDK_RIGHT, SCANCODE_RIGHT, LOW_ACTIVE, KEY_RELEASED, "right"}
  50. };
  51. enum {
  52. KEYPAD_BT1 = 0,
  53. KEYPAD_BT2,
  54. KEYPAD_BT3,
  55. KEYPAD_BT4,
  56. KEYPAD_BT5,
  57. KEYPAD_BT6,
  58. KEYPAD_BT7,
  59. };
  60. static void keypad_handler(int status, void *priv)
  61. {
  62. int row = (int)priv;
  63. BUTTON_TYPE *buttons = (BUTTON_TYPE *)&gpio_buttons[row];
  64. if (status) {
  65. handle_scancode(buttons->scancode, KEY_PRESSED);
  66. } else {
  67. handle_scancode(buttons->scancode, KEY_RELEASED);
  68. }
  69. DPRINTK("%s, 0x02%x, st:%dn", buttons->name, buttons->scancode,status);
  70. }
  71. static void tk_button_check_timer_handler(unsigned long data)
  72. {
  73. int i;
  74. BUTTON_TYPE_TK *buttons = (BUTTON_TYPE_TK *)&gpio_buttons_tk[0];
  75. int pre_status;
  76. cli();
  77. for (i = 0; i < TIMER_BT_NUM; i++) {
  78. pre_status = buttons->status;
  79. buttons->status = read_gpio_bit(buttons->gpio) ?
  80. KEY_RELEASED : KEY_PRESSED;
  81. if (pre_status == buttons->status) {
  82. buttons++;
  83. continue;
  84. }
  85. handle_scancode(buttons->scancode, buttons->status);
  86. DPRINTK("%s, st:%dn", buttons->name, buttons->status);
  87. buttons++;
  88. }
  89. sti();
  90. mod_timer(&button_check_timer, jiffies + (BUTTON_DELAY));
  91. }
  92. void __init s3c2410tk_button_init(void)
  93. {
  94. set_gpio_ctrl(GPIO_SMDK_UP);
  95. set_gpio_ctrl(GPIO_SMDK_DOWN);
  96. set_gpio_ctrl(GPIO_SMDK_LEFT);
  97. set_gpio_ctrl(GPIO_SMDK_RIGHT);
  98. init_timer(&button_check_timer);
  99. button_check_timer.function = tk_button_check_timer_handler;
  100. button_check_timer.expires = jiffies + (BUTTON_DELAY);
  101. add_timer(&button_check_timer);
  102. }
  103. void __exit s3c2410tk_button_exit(void)
  104. {
  105. del_timer_sync(&button_check_timer);
  106. }
  107. BUTTON_TYPE gpio_buttons[] = {
  108. { IRQ_SMDK_BT1, GPIO_SMDK_BT1, SCANCODE_POWER, LOW_ACTIVE,
  109.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "eint2", keypad_handler, 
  110.   NULL, (void *) KEYPAD_BT1 },
  111.    { IRQ_SMDK_BT2, GPIO_SMDK_BT2, SCANCODE_RECORD, LOW_ACTIVE, 
  112.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "eint11", keypad_handler, 
  113.   NULL, (void *) KEYPAD_BT2 },
  114.   
  115. { IRQ_SMDK_BT3, GPIO_SMDK_BT3, SCANCODE_ACTION, LOW_ACTIVE,
  116.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "eint19", keypad_handler, 
  117.   NULL, (void *) KEYPAD_BT3 },
  118.   
  119. { IRQ_SMDK_BT4, GPIO_SMDK_BT4, SCANCODE_SLIDE_UP, LOW_ACTIVE,
  120.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "eint10", keypad_handler, 
  121.   NULL, (void *) KEYPAD_BT4 },
  122.   
  123. { IRQ_SMDK_BT5, GPIO_SMDK_BT5, SCANCODE_SLIDE_CENTER, LOW_ACTIVE,
  124.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "eint13", keypad_handler, 
  125.   NULL, (void *) KEYPAD_BT5 },
  126.   
  127. { IRQ_SMDK_BT6, GPIO_SMDK_BT6, SCANCODE_SLIDE_DOWN, LOW_ACTIVE,
  128.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "eint14", keypad_handler, 
  129.   NULL, (void *) KEYPAD_BT6 },
  130.   
  131. { IRQ_SMDK_BT7, GPIO_SMDK_BT7, SCANCODE_ENTER, LOW_ACTIVE,
  132.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "eint15", keypad_handler, 
  133.   NULL, (void *) KEYPAD_BT7 },
  134. #if CONFIG_PM
  135. { IRQ_SMDK_POWER_BT, GPIO_SMDK_POWER_BT, 0, LOW_ACTIVE,
  136.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "Power", pwButtonHandler, 
  137.   NULL, NULL },
  138. #else
  139. { IRQ_SMDK_POWER_BT, GPIO_SMDK_POWER_BT, 0, LOW_ACTIVE,
  140.   GPIO_BOTH_EDGES, GPIO_PULLUP_EN, "Power", NULL, NULL, NULL },
  141. #endif
  142. END_OF_LIST2
  143. };