MTK keypad调试,扩张键盘IC AW9523

FROM:http://blog.csdn.net/aree/article/details/28683741

按键没有hal层

设备中断-------驱动------>内核按键码(SCANCODE)-------*.kl--------> android keycode(char*)--------- KeycodeLabels.h ------>android keyevent(int, KeyEvent.java)

B:android keycode(char*)--------------- *.kcm/*.kcm.bin ------------>显示字符(char)


---

\alps\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java

[java]  view plain  copy
  1.  public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {  
  2.      if (!mSystemBooted) {  
  3.          // If we have not yet booted, don't let key events do anything.  
  4.          return 0;  
  5.      }  
  6.   
  7.  // Handle special keys.  
  8.      switch (keyCode) {  
  9.          //add by //SCAN_123  ---  
  10. case KeyEvent.KEYCODE_FN:  
  11.     if (down){  
  12.         fnflag = (!fnflag);  
  13.         Log.i(TAG, "fn status is " + fnflag);  
  14.         result &= ~ACTION_PASS_TO_USER;  
  15.         //add fn icon   trs 2012-07-20  
  16.         Intent intent = new Intent(Intent.ACTION_FN_STATUS);  
  17.         intent.putExtra("fn_status", fnflag);  
  18.         mContext.sendBroadcast(intent);  
  19.     }  
  20.     break;  
  21. case KeyEvent.KEYCODE_F1:  
  22. case KeyEvent.KEYCODE_F2:  
  23. case KeyEvent.KEYCODE_F3:  
  24. case KeyEvent.KEYCODE_F4:  
  25.     if (!down){  
  26.         handleFKeys(keyCode);  
  27.     }  
  28.     result &= ~ACTION_PASS_TO_USER;  
  29.     break;  
  30. //add end//SCAN_123 ---       


event hub  alps\frameworks\base\services\input\
event read

------------- alps\frameworks\base\core\java\android\view\KeyEvent.java 上层

[java]  view plain  copy
  1. public class KeyEvent extends InputEvent implements Parcelable {  
  2.     /** Key code constant: Unknown key code. */  
  3.     public static final int KEYCODE_UNKNOWN         = 0;  
  4.     /** Key code constant: Soft Left key. 
  5.      * Usually situated below the display on phones and used as a multi-function 
  6.      * feature key for selecting a software defined function shown on the bottom left 
  7.      * of the display. */  
  8.     public static final int KEYCODE_SOFT_LEFT       = 1;  
  9.     /** Key code constant: Soft Right key. 
  10.      * Usually situated below the display on phones and used as a multi-function 
  11.      * feature key for selecting a software defined function shown on the bottom right 
  12.      * of the display. */  
  13.     public static final int KEYCODE_SOFT_RIGHT      = 2;  
  14.     /** Key code constant: Home key. 
  15.      * This key is handled by the framework and is never delivered to applications. */  
  16.     public static final int KEYCODE_HOME            = 3;  
  17.     /** Key code constant: Back key. */  
  18.     public static final int KEYCODE_BACK            = 4;  
  19.     /** Key code constant: Call key. */  
  20.     public static final int KEYCODE_CALL            = 5;  
[java]  view plain  copy
  1.     public static final int KEYCODE_KANA            = 218;  
  2.     /** Key code constant: Assist key. 
  3.      * Launches the global assist activity.  Not delivered to applications. */  
  4.     public static final int KEYCODE_ASSIST          = 219;  
  5.     public static final int KEYCODE_SCAN          = 220;//sam add   
  6.     public static final int KEYCODE_SCAN_LEFT          = 221;  
  7.     public static final int KEYCODE_SCAN_RIGHT          = 222;  
  8.     public static final int KEYCODE_FN             = 223;  
  9.     private static final int LAST_KEYCODE           = KEYCODE_FN;//KEYCODE_ASSIST;  
  10.   
  11.      private static void populateKeycodeSymbolicNames() {  
  12.         SparseArray names = KEYCODE_SYMBOLIC_NAMES;  
  13.         names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");  
  14.         names.append(KEYCODE_SOFT_LEFT, "KEYCODE_SOFT_LEFT");  
  15.         names.append(KEYCODE_SOFT_RIGHT, "KEYCODE_SOFT_RIGHT");  
  16.         names.append(KEYCODE_HOME, "KEYCODE_HOME");  
  17.         names.append(KEYCODE_BACK, "KEYCODE_BACK");  
  18.         names.append(KEYCODE_CALL, "KEYCODE_CALL");  
  19.         names.append(KEYCODE_ENDCALL, "KEYCODE_ENDCALL");  
  20.         names.append(KEYCODE_0, "KEYCODE_0");  

alps\frameworks\base\api\17.txt   // android API 17 = android4.2 //找到 17.txt文件改  //可能需要使用命令:./make update-api

[java]  view plain  copy
  1. field public static final int KEYCODE_HOME = 3// 0x3  //与上面的数字值要一样。  
  2. ...  
  3. field public static final int META_SHIFT_RIGHT_ON = 128// 0x80  
  4. field public static final int META_SYM_ON = 4// 0x4  
  5. field public static final int KEYCODE_SCAN = 220// 0xdc  
  6. field public static final int KEYCODE_SCAN_LEFT = 221// 0xdd  
  7. field public static final int KEYCODE_SCAN_RIGHT = 221// 0xde  


---

alpsAteam\frameworks\native\include\android\keycodes.h

[cpp]  view plain  copy
  1.     AKEYCODE_KANA            = 218,  
  2.     AKEYCODE_ASSIST          = 219,  
  3.     AKEYCODE_SCAN            = 220,//sam add  
  4.     AKEYCODE_SCAN_LEFT       = 221,  
  5.     AKEYCODE_SCAN_RIGHT      = 222,  
  6.     AKEYCODE_FN              = 223,  
  7.     // NOTE: If you add a new keycode here you must also add it to several other files.  
  8.     //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.  
  9. };  

---

\alps\frameworks\base\libs\androidfw\Input.cpp

[cpp]  view plain  copy
  1. bool KeyEvent::isSystemKey(int32_t keyCode) {  
  2.     switch (keyCode) {  
  3.         case AKEYCODE_MENU:  
  4.         case AKEYCODE_SOFT_RIGHT:  
  5.         case AKEYCODE_HOME:  
  6.         case AKEYCODE_BACK:  
  7.         case AKEYCODE_CALL:  
  8.         ....  
  9.         case AKEYCODE_SEARCH:  
  10.         case AKEYCODE_SCAN://sam add --below...  
  11.         case AKEYCODE_SCAN_LEFT:  
  12.         case AKEYCODE_SCAN_RIGHT:  
  13.         case AKEYCODE_FN:  
  14.         case AKEYCODE_F1:  
  15.         case AKEYCODE_F2:  
  16.         case AKEYCODE_F3:  
  17.         case AKEYCODE_F4:  
  18.             return true;  
  19.     }  


----

alps\frameworks\native\include\input\KeycodeLabels.h
...
static const KeycodeLabel KEYCODES[] = {//下层与上层的对照,能过字符串把两个数字来找的。
 
[cpp]  view plain  copy
  1.   { "SOFT_LEFT", 1 },  
  2.    { "SOFT_RIGHT", 2 },  
  3.    { "HOME", 3 },  
  4.    { "BACK", 4 },  
  5. ...  
  6.     { "KANA", 218 },  
  7.     { "ASSIST", 219 },  
  8.     { "SCAN", 220 },//sam add  
  9.     { "SCAN_LEFT", 221 },  
  10.     { "SCAN_RIGHT", 222 },  
  11.     { "FN", 223 },  
  12.     // NOTE: If you add a new keycode here you must also add it to several other files.  
  13.     //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.  
  14.   
  15.   
  16.     { NULL, 0 }  
  17. };  



mtk-kpd.kl //底层
....

[objc]  view plain  copy
  1. key 102   HOME  
  2. ...  
  3. key 59   F1  
  4. key 60   F2  
  5. key 61   F3  
  6. key 62   F4  
  7. key 464  FN  
  8.   
  9. key 220   SCAN  
  10. key 125   SCAN_LEFT  
  11. key 128   SCAN_RIGHT  


...
----
//mt6571/72可以做18个的扩展键盘(3个row pin和3个col pin),但做不了更多,
3*3*2 =power , volume ,   

更多keypad需要做8*8 (8 row pin 和8 col pin)

也可以外挂一个键盘ic来做。
-----
//mtk默认pmic有两个key ,一个是 power key,另一个是 vlume down key/home key/ 

在codegen.dws中
[KEYPAD Setting]页面,有一个PowerKey use EINT ,选中,则会打开了这个开关  KPD_PWRKEY_USE_EINT在mediatek\kernel\drivers\keypad\kpd.c中使用到.一般我们不用EINT做power key,而是默认使用pmic做power key.
[cpp]  view plain  copy
  1. "378654" snippet_file_name="blog_20140605_4_3325559" name="code" class="cpp">alps\mediatek\platform\mt6572\kernel\drivers\keypad\kpd.c  
[cpp]  view plain  copy
  1. /* 
  2.  * Copyright (C) 2010 MediaTek, Inc. 
  3.  * 
  4.  * Author: Terry Chang  
  5.  * 
  6.  * This software is licensed under the terms of the GNU General Public 
  7.  * License version 2, as published by the Free Software Foundation, and 
  8.  * may be copied, distributed, and modified under those terms. 
  9.  * 
  10.  * This program is distributed in the hope that it will be useful, 
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  13.  * GNU General Public License for more details. 
  14.  * 
  15.  */  
  16.   
  17. #include   
  18. #include   
  19. #include   
  20. #include   
  21. #include   
  22. #include   
  23. #include   
  24. #include   
  25. #include   
  26. #include   
  27. #include   
  28. #include   
  29.   
  30. #include   
  31. #include   
  32.   
  33.   
  34. #include   
  35. #include   
  36. #include       /* custom file */  
  37. #include   
  38. #include   
  39. #include   
  40. #include   
  41. #include   
  42. #include   
  43. #include   
  44.   
  45. #include   
  46.   
  47. #if 1   //ATA_TEST  
  48. #define KPD_AUTOTEST_BY_KP    
  49. #endif  
  50.   
  51. #define KPD_NAME    "mtk-kpd"  
  52.   
  53. /* Keypad registers */  
  54. #define KP_STA          (KP_BASE + 0x0000)  
  55. #define KP_MEM1         (KP_BASE + 0x0004)  
  56. #define KP_MEM2         (KP_BASE + 0x0008)  
  57. #define KP_MEM3         (KP_BASE + 0x000c)  
  58. #define KP_MEM4         (KP_BASE + 0x0010)  
  59. #define KP_MEM5         (KP_BASE + 0x0014)  
  60. #define KP_DEBOUNCE     (KP_BASE + 0x0018)  
  61. #define KP_SCAN_TIMING      (KP_BASE + 0x001C)  
  62. #define KP_SEL          (KP_BASE + 0x0020)  
  63. #define KP_EN           (KP_BASE + 0x0024)  
  64.   
  65. #define KPD_NUM_MEMS    5  
  66. #define KPD_MEM5_BITS   8  
  67.   
  68. #define KPD_NUM_KEYS    72  /* 4 * 16 + KPD_MEM5_BITS */  
  69.   
  70. #define KPD_DEBOUNCE_MASK   ((1U << 14) - 1)  
  71.   
  72. #define KPD_SAY     "kpd: "  
  73. #if KPD_DEBUG  
  74. #define kpd_print(fmt, arg...)  printk(KPD_SAY fmt, ##arg)  
  75. #else  
  76. #define kpd_print(fmt, arg...)  do {} while (0)  
  77. #endif  
  78.   
  79.   
  80. static struct input_dev *kpd_input_dev;  
  81. static bool kpd_suspend = false;  
  82. static int kpd_show_hw_keycode = 1;  
  83. static int kpd_show_register = 1;  
  84. static int kpd_enable_lprst = 1;  
  85.   
  86. /* for AEE manual dump */  
  87. #if 0  
  88. static bool kpd_volumn_down_flag = false;  
  89. static bool kpd_volumn_up_flag = false;  
  90. static inline void check_aee_dump()  
  91. {  
  92.     if( (kpd_volumn_down_flag == true) && (kpd_volumn_up_flag == true))  
  93.     {  
  94.         printk(KPD_SAY "kpd_volumn_up+ volumn_down,will trige DB\n");  
  95.         aee_kernel_reminding("manual dump ""Triggered by press KEY_VOLUMEUP+KEY_VOLUMEDOWN");  
  96.     }  
  97. }  
  98. #endif  
  99.   
  100. /* for backlight control */  
  101. #if KPD_DRV_CTRL_BACKLIGHT  
  102. static void kpd_switch_backlight(struct work_struct *work);  
  103. static void kpd_backlight_timeout(unsigned long data);  
  104. static DECLARE_WORK(kpd_backlight_work, kpd_switch_backlight);  
  105. static DEFINE_TIMER(kpd_backlight_timer, kpd_backlight_timeout, 0, 0);  
  106.   
  107. static unsigned long kpd_wake_keybit[BITS_TO_LONGS(KEY_CNT)];  
  108. static u16 kpd_wake_key[] __initdata = KPD_BACKLIGHT_WAKE_KEY;  
  109.   
  110. static volatile bool kpd_backlight_on;  
  111. static atomic_t kpd_key_pressed = ATOMIC_INIT(0);  
  112. #endif  
  113.   
  114. /* for slide QWERTY */  
  115. #if KPD_HAS_SLIDE_QWERTY  
  116. static void kpd_slide_handler(unsigned long data);  
  117. static DECLARE_TASKLET(kpd_slide_tasklet, kpd_slide_handler, 0);  
  118.   
  119. static u8 kpd_slide_state = !KPD_SLIDE_POLARITY;  
  120. #endif  
  121.   
  122. /* for Power key using EINT */  
  123. #if KPD_PWRKEY_USE_EINT  
  124. static void kpd_pwrkey_handler(unsigned long data);  
  125. static DECLARE_TASKLET(kpd_pwrkey_tasklet, kpd_pwrkey_handler, 0);  
  126. static u8 kpd_pwrkey_state = !KPD_PWRKEY_POLARITY;  
  127. #endif  
  128.   
  129. /* for Power key using PMIC */  
  130. /*********************************************************************/  
  131. #if 0//KPD_PWRKEY_USE_PMIC //for 77 chip and earlier version   power key bug, has fixed on 89 chip  
  132.   
  133. static void kpd_pwrkey_handler(struct work_struct *work);  
  134. static DECLARE_WORK(pwrkey_pmic_work, kpd_pwrkey_handler);  
  135. #endif  
  136. /*********************************************************************/  
  137.   
  138. /* for keymap handling */  
  139. static DEFINE_SPINLOCK(keymap_handler_spinlock);  
  140. static void kpd_keymap_handler(unsigned long data);  
  141. static DECLARE_TASKLET(kpd_keymap_tasklet, kpd_keymap_handler, 0);  
  142.   
  143.   
  144. #define KPD_INIT_KEYMAP_FULL()  \  
  145. {   \  
  146.     [0] = KEY_1,        \  
  147.     [1] = KEY_2,        \  
  148.     [2] = KEY_3,        \  
  149.     [3] = KEY_4,        \  
  150.     [4] = KEY_5,        \  
  151.     [5] = KEY_6,        \  
  152.     [6] = KEY_7,        \  
  153.     [7] = KEY_8,        \  
  154.     [8] = KEY_9,        \  
  155.     [9] = KEY_VOLUMEDOWN,       \  
  156.     [10] = KEY_VOLUMEUP,        \  
  157.     [11] = KEY_0,       \  
  158.     [12] = KEY_ENTER,       \  
  159.     [13] = KEY_TAB,     \  
  160.     [14] = KEY_BACKSPACE,       \  
  161.     [15] = KEY_STAR,        \  
  162.     [16] = KEY_POUND,       \  
  163.     [17] = KEY_SYM,     \  
  164.     [18] = KEY_DOT,     \  
  165.     [19] = KEY_FN,      \  
  166.     [20] = KEY_F1,      \  
  167.     [21] = KEY_F2,      \  
  168.     [22] = KEY_F3,      \  
  169.     [23] = KEY_F4,      \  
  170.     [24] = KEY_DEL,     \  
  171.     [25] = KEY_S,       \     
  172.     [25] = KEY_OK,      \         
  173. }      
  174.   
  175.   
  176. //static u16 kpd_keymap[KPD_NUM_KEYS] = KPD_INIT_KEYMAP_FULL(); //KPD_INIT_KEYMAP();  
  177. static u16 kpd_keymap[KPD_NUM_KEYS] = KPD_INIT_KEYMAP();  
  178. static u16 kpd_keymap_state[KPD_NUM_MEMS] = {  
  179.     0xffff, 0xffff, 0xffff, 0xffff, 0x00ff  
  180. };  
  181. /*********************************************************************/  
  182. /*************************kpd function decleare***************************/  
  183. /*********************************************************************/  
  184. static int kpd_pdrv_probe(struct platform_device *pdev);  
  185. static int kpd_pdrv_remove(struct platform_device *pdev);  
  186. #ifndef CONFIG_HAS_EARLYSUSPEND   
  187. static int kpd_pdrv_suspend(struct platform_device *pdev, pm_message_t state);  
  188. static int kpd_pdrv_resume(struct platform_device *pdev);  
  189. #endif  
  190.   
  191. void mtk_kpd_get_gpio_col(unsigned int COL_REG[], unsigned int GPIO_MODE[]);  
  192. void kpd_auto_test_for_factorymode(void);  
  193.   
  194. static struct platform_driver kpd_pdrv = {  
  195.     .probe      = kpd_pdrv_probe,  
  196.     .remove     = kpd_pdrv_remove,  
  197. #ifndef CONFIG_HAS_EARLYSUSPEND   
  198.     .suspend    = kpd_pdrv_suspend,  
  199.     .resume     = kpd_pdrv_resume,  
  200. #endif    
  201.     .driver     = {  
  202.         .name   = KPD_NAME,  
  203.         .owner  = THIS_MODULE,  
  204.     },  
  205. };  
  206. /********************************************************************/  
  207. void mtk_kpd_get_gpio_col(unsigned int COL_REG[], unsigned int GPIO_MODE[])  
  208. {  
  209.     int i;  
  210.     for(i = 0; i< 8; i++)  
  211.     {  
  212.         COL_REG[i] = 0;  
  213.         GPIO_MODE[i] = 0;  
  214.     }  
  215.     kpd_print("Enter mtk_kpd_get_gpio_col! \n");  
  216.       
  217.     #ifdef GPIO_KPD_KCOL0_PIN  
  218.         kpd_print("checking GPIO_KPD_KCOL0_PIN! \n");  
  219.         COL_REG[0] = GPIO_KPD_KCOL0_PIN;  
  220.         GPIO_MODE[0] |= (GPIO_KPD_KCOL0_PIN_M_KCOL << 4);  
  221.     #endif  
  222.   
  223.     #ifdef GPIO_KPD_KCOL1_PIN  
  224.         kpd_print("checking GPIO_KPD_KCOL1_PIN! \n");  
  225.         COL_REG[1] = GPIO_KPD_KCOL1_PIN;  
  226.         GPIO_MODE[1] |= (GPIO_KPD_KCOL1_PIN_M_KCOL << 4);  
  227.     #endif  
  228.   
  229.     #ifdef GPIO_KPD_KCOL2_PIN  
  230.         kpd_print("checking GPIO_KPD_KCOL2_PIN! \n");  
  231.         COL_REG[2] = GPIO_KPD_KCOL2_PIN;  
  232.         GPIO_MODE[2] |= (GPIO_KPD_KCOL2_PIN_M_KCOL << 4);  
  233.     #endif  
  234.   
  235.     #ifdef GPIO_KPD_KCOL3_PIN  
  236.         kpd_print("checking GPIO_KPD_KCOL3_PIN! \n");  
  237.         COL_REG[3] = GPIO_KPD_KCOL3_PIN;  
  238.         GPIO_MODE[3] |= (GPIO_KPD_KCOL3_PIN_M_KCOL << 4);  
  239.     #endif  
  240.   
  241.     #ifdef GPIO_KPD_KCOL4_PIN  
  242.         kpd_print("checking GPIO_KPD_KCOL4_PIN! \n");  
  243.         COL_REG[4] = GPIO_KPD_KCOL4_PIN;  
  244.         GPIO_MODE[4] |= (GPIO_KPD_KCOL4_PIN_M_KCOL << 4);  
  245.     #endif  
  246.   
  247.     #ifdef GPIO_KPD_KCOL5_PIN  
  248.         kpd_print("checking GPIO_KPD_KCOL5_PIN! \n");  
  249.         COL_REG[5] = GPIO_KPD_KCOL5_PIN;  
  250.         GPIO_MODE[5] |= (GPIO_KPD_KCOL5_PIN_M_KCOL << 4);  
  251.     #endif  
  252.   
  253.     #ifdef GPIO_KPD_KCOL6_PIN  
  254.         kpd_print("checking GPIO_KPD_KCOL6_PIN! \n");  
  255.         COL_REG[6] = GPIO_KPD_KCOL6_PIN;  
  256.         GPIO_MODE[6] |= (GPIO_KPD_KCOL6_PIN_M_KCOL << 4);  
  257.     #endif  
  258.   
  259.     #ifdef GPIO_KPD_KCOL7_PIN  
  260.         kpd_print("checking GPIO_KPD_KCOL7_PIN! \n");  
  261.         COL_REG[7] = GPIO_KPD_KCOL7_PIN;  
  262.         GPIO_MODE[7] |= (GPIO_KPD_KCOL7_PIN_M_KCOL << 4);  
  263.     #endif  
  264. }  
  265.   
  266. #ifdef KPD_AUTOTEST_BY_KP  
  267. void kpd_reset_keymap_state(u16 state[])  
  268. {  
  269.     int i;  
  270.     for(i = 0; i < (KPD_NUM_MEMS - 1); i++)  
  271.         state[i] = 0xffff;  
  272.       
  273.     state[(KPD_NUM_MEMS - 1)] = 0x00ff;  
  274.     return;  
  275. }  
  276.   
  277. void kpd_kcol_scan_for_factorymode(void)  
  278. {  
  279.     unsigned int COL_REG[8], COL_LAST = 0;  
  280.     unsigned int GPIO_MODE[8];  
  281.     int i, col_num;  
  282.       
  283. #if !KPD_USE_EXTEND_TYPE  
  284.     kpd_print("Enter kpd_kcol_scan_for_factorymode on single keypad! \n");  
  285.     col_num =   8;  
  286. #else                 
  287.     kpd_print("Enter kpd_kcol_scan_for_factorymode on double keypad! \n");    
  288.     col_num =   3;  
  289. #endif    
  290.       
  291.     disable_irq_nosync(MT_KP_IRQ_ID);  
  292.     *(volatile u16 *)KP_EN = 0;  
  293.     kpd_keymap_handler(1);  
  294.     msleep(100);      
  295.       
  296.     mtk_kpd_get_gpio_col(COL_REG, GPIO_MODE);  
  297.       
  298.     for(i = 0; i < col_num; i++)  
  299.     {  
  300.         if (COL_REG[i] != 0)  
  301.             mt_set_gpio_mode(COL_REG[i], GPIO_MODE_GPIO);  
  302.     }  
  303.   
  304.     for(i = 0; i < col_num; i++)  
  305.     {  
  306.         if (COL_REG[i] != 0)  
  307.         {  
  308.             mt_set_gpio_mode(COL_REG[i], ((GPIO_MODE[i] >> 4) & 0x0f));  
  309.             kpd_reset_keymap_state(kpd_keymap_state);  
  310.             COL_LAST = COL_REG[i];  
  311.             *(volatile u16 *)KP_EN = 0x1;  
  312.             kpd_print("kpd_kcol_scan_for_factorymode:  KP enable KCOL=%d \n", i);  
  313.         }  
  314.                                 
  315.         msleep(100);  
  316.         if(*(volatile u16 *)KP_STA & 0x01)                        
  317.                 kpd_keymap_handler(2);  
  318.   
  319.         if(0 != COL_LAST)  
  320.         {     
  321.             msleep(100);  
  322.             kpd_keymap_handler(1);  
  323.             *(volatile u16 *)KP_EN = 0;  
  324.             mt_set_gpio_mode(COL_LAST, GPIO_MODE_GPIO);  
  325.             kpd_print("kpd_kcol_scan_for_factorymode:  KP disable KCOL=%d \n", i);  
  326.             COL_LAST = 0;  
  327.         }  
  328.     }  
  329.   
  330.     for(i = 0; i < col_num; i++)  
  331.     {  
  332.         if (COL_REG[i] != 0)  
  333.             mt_set_gpio_mode(COL_REG[i], ((GPIO_MODE[i] >> 4) & 0x0f));  
  334.     }  
  335.       
  336.     kpd_reset_keymap_state(kpd_keymap_state);  
  337.     *(volatile u16 *)KP_EN = 0x1;     
  338.       
  339.     if(upmu_get_pwrkey_deb()!=1)  
  340.     {  
  341.             kpd_pwrkey_pmic_handler(0);  
  342.             msleep(100);  
  343.             kpd_pwrkey_pmic_handler(1);  
  344.     }     
  345.       
  346.     enable_irq(MT_KP_IRQ_ID);  
  347.     return;  
  348. }  
  349. #else       //KPD_AUTOTEST_BY_KP  
  350. void kpd_auto_test_for_factorymode(void)  
  351. {  
  352.     unsigned int COL_REG[8];  
  353.     unsigned int GPIO_MODE[8];  
  354.     int i;  
  355.       
  356.     kpd_pwrkey_pmic_handler(1);  
  357.     msleep(100);  
  358.     kpd_pwrkey_pmic_handler(0);  
  359.       
  360. #ifdef KPD_PMIC_RSTKEY_MAP  
  361.     kpd_pmic_rstkey_handler(1);  
  362.     msleep(100);  
  363.     kpd_pmic_rstkey_handler(0);  
  364. #endif  
  365.   
  366.     kpd_print("Enter kpd_auto_test_for_factorymode! \n");  
  367.     mtk_kpd_get_gpio_col(COL_REG, GPIO_MODE);  
  368.       
  369.     for(i = 0; i < 8; i++)  
  370.     {  
  371.         if (COL_REG[i] != 0)  
  372.         {  
  373.             msleep(100);  
  374.             kpd_print("kpd kcolumn %d pull down!\n", COL_REG[i]);  
  375.             mt_set_gpio_pull_select(COL_REG[i], 0);  
  376.             msleep(100);  
  377.             kpd_print("kpd kcolumn %d pull up!\n", COL_REG[i]);  
  378.             mt_set_gpio_pull_select(COL_REG[i], 1);  
  379.         }  
  380.     }  
  381.   
  382.     return;  
  383. }  
  384. #endif      //KPD_AUTOTEST_BY_KP  
  385.   
  386. /********************************************************************/  
  387.   
  388.   
  389. /********************************************************************/  
  390. /*****************for kpd auto set wake up source*************************/  
  391. /********************************************************************/  
  392. static volatile int call_status = 0;  
  393. static ssize_t kpd_store_call_state(struct device_driver *ddri, const char *buf, size_t count)  
  394. {  
  395.     if (sscanf(buf, "%u", &call_status) != 1) {  
  396.             kpd_print("kpd call state: Invalid values\n");  
  397.             return -EINVAL;  
  398.         }  
  399.   
  400.     switch(call_status)  
  401.         {  
  402.         case 1 :  
  403.             kpd_print("kpd call state: Idle state!\n");  
  404.         break;  
  405.         case 2 :  
  406.             kpd_print("kpd call state: ringing state!\n");  
  407.         break;  
  408.         case 3 :  
  409.             kpd_print("kpd call state: active or hold state!\n");     
  410.         break;  
  411.               
  412.         default:  
  413.             kpd_print("kpd call state: Invalid values\n");  
  414.         break;  
  415.     }  
  416.     return count;  
  417. }  
  418.   
  419. static ssize_t kpd_show_call_state(struct device_driver *ddri, char *buf)  
  420. {  
  421.     ssize_t res;  
  422.     res = snprintf(buf, PAGE_SIZE, "%d\n", call_status);       
  423.     return res;     
  424. }  
  425. static DRIVER_ATTR(kpd_call_state,  S_IWUSR | S_IRUGO,  kpd_show_call_state,    kpd_store_call_state);  
  426.   
  427. static struct driver_attribute *kpd_attr_list[] = {  
  428.     &driver_attr_kpd_call_state,  
  429. };  
  430.   
  431. /*----------------------------------------------------------------------------*/  
  432. static int kpd_create_attr(struct device_driver *driver)   
  433. {  
  434.     int idx, err = 0;  
  435.     int num = (int)(sizeof(kpd_attr_list)/sizeof(kpd_attr_list[0]));  
  436.     if (driver == NULL)  
  437.     {  
  438.         return -EINVAL;  
  439.     }  
  440.   
  441.     for(idx = 0; idx < num; idx++)  
  442.     {  
  443.         if((err = driver_create_file(driver, kpd_attr_list[idx])))  
  444.         {              
  445.             kpd_print("driver_create_file (%s) = %d\n", kpd_attr_list[idx]->attr.name, err);  
  446.             break;  
  447.         }  
  448.     }      
  449.     return err;  
  450. }  
  451. /*----------------------------------------------------------------------------*/  
  452. static int kpd_delete_attr(struct device_driver *driver)  
  453.     {  
  454.     int idx ,err = 0;  
  455.     int num = (int)(sizeof(kpd_attr_list)/sizeof(kpd_attr_list[0]));  
  456.   
  457.     if (!driver)  
  458.     return -EINVAL;  
  459.   
  460.     for (idx = 0; idx < num; idx++)   
  461.     {  
  462.         driver_remove_file(driver, kpd_attr_list[idx]);  
  463.     }  
  464.       
  465.     return err;  
  466. }  
  467. /*----------------------------------------------------------------------------*/  
  468. /********************************************************************/  
  469. /********************************************************************/  
  470. /********************************************************************/  
  471.   
  472. /* for autotest */  
  473. #if KPD_AUTOTEST  
  474. static const u16 kpd_auto_keymap[] = {  
  475.     KEY_OK, KEY_MENU,  
  476.     KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT,  
  477.     KEY_HOME, KEY_BACK,  
  478.     KEY_CALL, KEY_ENDCALL,  
  479.     KEY_VOLUMEUP, KEY_VOLUMEDOWN,  
  480.     KEY_FOCUS, KEY_CAMERA,  
  481. };  
  482. #endif  
  483.   
  484. /* for AEE manual dump */  
  485. #define AEE_VOLUMEUP_BIT    0  
  486. #define AEE_VOLUMEDOWN_BIT  1  
  487. #define AEE_DELAY_TIME      15  
  488. /* enable volup + voldown was pressed 5~15 s Trigger aee manual dump */  
  489. #define AEE_ENABLE_5_15     1  
  490. static struct hrtimer aee_timer;  
  491. static unsigned long  aee_pressed_keys;  
  492. static bool aee_timer_started;  
  493.   
  494. #if AEE_ENABLE_5_15  
  495. #define AEE_DELAY_TIME_5S   5  
  496. static struct hrtimer aee_timer_5s;  
  497. static bool aee_timer_5s_started;  
  498. static bool flags_5s;  
  499. #endif  
  500.   
  501. static inline void kpd_update_aee_state(void) {  
  502.     if(aee_pressed_keys == ((1<
  503.         /* if volumeup and volumedown was pressed the same time then start the time of ten seconds */  
  504.         aee_timer_started = true;  
  505.           
  506. #if AEE_ENABLE_5_15  
  507.         aee_timer_5s_started = true;  
  508.         hrtimer_start(&aee_timer_5s,   
  509.                 ktime_set(AEE_DELAY_TIME_5S, 0),  
  510.                 HRTIMER_MODE_REL);  
  511. #endif  
  512.         hrtimer_start(&aee_timer,   
  513.                 ktime_set(AEE_DELAY_TIME, 0),  
  514.                 HRTIMER_MODE_REL);  
  515.         kpd_print("aee_timer started\n");  
  516.     } else {  
  517.         if(aee_timer_started) {  
  518. /* 
  519.   * hrtimer_cancel - cancel a timer and wait for the handler to finish. 
  520.   * Returns: 
  521.   * 0 when the timer was not active.  
  522.   * 1 when the timer was active. 
  523.  */  
  524.             if(hrtimer_cancel(&aee_timer))  
  525.             {  
  526.                 kpd_print("try to cancel hrtimer \n");  
  527. #if AEE_ENABLE_5_15  
  528.                 if(flags_5s)  
  529.                 {  
  530.                     printk("Pressed Volup + Voldown5s~15s then trigger aee manual dump.\n");  
  531.                     aee_kernel_reminding("manual dump""Trigger Vol Up +Vol Down 5s");  
  532.                 }  
  533. #endif  
  534.                       
  535.             }  
  536. #if AEE_ENABLE_5_15  
  537.             flags_5s = false;  
  538. #endif  
  539.             aee_timer_started = false;  
  540.             kpd_print("aee_timer canceled\n");  
  541.         }  
  542.   
  543. #if AEE_ENABLE_5_15  
  544.         if(aee_timer_5s_started) {  
  545. /* 
  546.   * hrtimer_cancel - cancel a timer and wait for the handler to finish. 
  547.   * Returns: 
  548.   * 0 when the timer was not active.  
  549.   * 1 when the timer was active. 
  550.  */  
  551.             if(hrtimer_cancel(&aee_timer_5s))  
  552.             {  
  553.                 kpd_print("try to cancel hrtimer (5s) \n");  
  554.             }  
  555.             aee_timer_5s_started = false;  
  556.             kpd_print("aee_timer canceled (5s)\n");  
  557.         }  
  558.   
  559. #endif  
  560.     }  
  561. }  
  562.   
  563. static void kpd_aee_handler(u32 keycode, u16 pressed) {  
  564.     if(pressed) {  
  565.         if(keycode == KEY_VOLUMEUP) {  
  566.             __set_bit(AEE_VOLUMEUP_BIT, &aee_pressed_keys);  
  567.         } else if(keycode == KEY_VOLUMEDOWN) {  
  568.             __set_bit(AEE_VOLUMEDOWN_BIT, &aee_pressed_keys);  
  569.         } else {  
  570.             return;  
  571.         }  
  572.         kpd_update_aee_state();  
  573.     } else {  
  574.         if(keycode == KEY_VOLUMEUP) {  
  575.             __clear_bit(AEE_VOLUMEUP_BIT, &aee_pressed_keys);  
  576.         } else if(keycode == KEY_VOLUMEDOWN) {  
  577.             __clear_bit(AEE_VOLUMEDOWN_BIT, &aee_pressed_keys);  
  578.         } else {  
  579.             return;  
  580.         }  
  581.         kpd_update_aee_state();  
  582.     }  
  583. }  
  584.   
  585. static enum hrtimer_restart aee_timer_func(struct hrtimer *timer) {  
  586.     //printk("kpd: vol up+vol down AEE manual dump!\n");  
  587.     //aee_kernel_reminding("manual dump ", "Triggered by press KEY_VOLUMEUP+KEY_VOLUMEDOWN");  
  588.     aee_trigger_kdb();  
  589.     return HRTIMER_NORESTART;  
  590. }  
  591.   
  592. #if AEE_ENABLE_5_15  
  593. static enum hrtimer_restart aee_timer_5s_func(struct hrtimer *timer) {  
  594.       
  595.     //printk("kpd: vol up+vol down AEE manual dump timer 5s !\n");  
  596.     flags_5s = true;  
  597.     return HRTIMER_NORESTART;  
  598. }  
  599. #endif  
  600.   
  601. static inline void kpd_get_keymap_state(u16 state[])  
  602. {  
  603.     state[0] = *(volatile u16 *)KP_MEM1;  
  604.     state[1] = *(volatile u16 *)KP_MEM2;  
  605.     state[2] = *(volatile u16 *)KP_MEM3;  
  606.     state[3] = *(volatile u16 *)KP_MEM4;  
  607.     state[4] = *(volatile u16 *)KP_MEM5;  
  608.     if (kpd_show_register) {  
  609.         printk(KPD_SAY "register = %x %x %x %x %x\n",  
  610.                state[0], state[1], state[2], state[3], state[4]);  
  611.     }  
  612. }  
  613.   
  614. static inline void kpd_set_debounce(u16 val)  
  615. {  
  616.     mt65xx_reg_sync_writew((u16)(val & KPD_DEBOUNCE_MASK), KP_DEBOUNCE);  
  617. }  
  618.   
  619. #if KPD_DRV_CTRL_BACKLIGHT  
  620. static void kpd_switch_backlight(struct work_struct *work)  
  621. {  
  622.     if (kpd_backlight_on) {  
  623.         kpd_enable_backlight();  
  624.         kpd_print("backlight is on\n");  
  625.     } else {  
  626.         kpd_disable_backlight();  
  627.         kpd_print("backlight is off\n");  
  628.     }  
  629. }  
  630.   
  631. static void kpd_backlight_timeout(unsigned long data)  
  632. {  
  633.     if (!atomic_read(&kpd_key_pressed)) {  
  634.         kpd_backlight_on = !!atomic_read(&kpd_key_pressed);  
  635.         schedule_work(&kpd_backlight_work);  
  636.         data = 1;  
  637.     }  
  638.     kpd_print("backlight timeout%s\n",   
  639.               data ? ": schedule backlight work" : "");  
  640. }  
  641.   
  642. void kpd_backlight_handler(bool pressed, u16 linux_keycode)  
  643. {  
  644.     if (kpd_suspend && !test_bit(linux_keycode, kpd_wake_keybit)) {  
  645.         kpd_print("Linux keycode %u is not WAKE key\n", linux_keycode);  
  646.         return;  
  647.     }  
  648.   
  649.     /* not in suspend or the key pressed is WAKE key */  
  650.     if (pressed) {  
  651.         atomic_inc(&kpd_key_pressed);  
  652.         kpd_backlight_on = !!atomic_read(&kpd_key_pressed);  
  653.         schedule_work(&kpd_backlight_work);  
  654.         kpd_print("switch backlight on\n");  
  655.     } else {  
  656.         atomic_dec(&kpd_key_pressed);  
  657.         mod_timer(&kpd_backlight_timer,  
  658.                   jiffies + KPD_BACKLIGHT_TIME * HZ);  
  659.         kpd_print("activate backlight timer\n");  
  660.     }  
  661. }  
  662. #endif  
  663.   
  664. #if KPD_HAS_SLIDE_QWERTY  
  665. static void kpd_slide_handler(unsigned long data)  
  666. {  
  667.     bool slid;  
  668.     u8 old_state = kpd_slide_state;  
  669.   
  670.     kpd_slide_state = !kpd_slide_state;  
  671.     slid = (kpd_slide_state == !!KPD_SLIDE_POLARITY);  
  672.     /* for SW_LID, 1: lid open => slid, 0: lid shut => closed */  
  673.     input_report_switch(kpd_input_dev, SW_LID, slid);  
  674.     input_sync(kpd_input_dev);  
  675.     kpd_print("report QWERTY = %s\n", slid ? "slid" : "closed");  
  676.   
  677.     if(old_state) {  
  678.         mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 0);  
  679.     } else {  
  680.         mt_set_gpio_pull_select(GPIO_QWERTYSLIDE_EINT_PIN, 1);  
  681.     }  
  682.     /* for detecting the return to old_state */  
  683.     mt65xx_eint_set_polarity(KPD_SLIDE_EINT, old_state);  
  684.     mt65xx_eint_unmask(KPD_SLIDE_EINT);  
  685. }  
  686.   
  687. static void kpd_slide_eint_handler(void)  
  688. {  
  689.     tasklet_schedule(&kpd_slide_tasklet);  
  690. }  
  691. #endif  
  692.   
  693. #if KPD_PWRKEY_USE_EINT  
  694. static void kpd_pwrkey_handler(unsigned long data)  
  695. {  
  696.     bool pressed;  
  697.     u8 old_state = kpd_pwrkey_state;  
  698.   
  699.     kpd_pwrkey_state = !kpd_pwrkey_state;  
  700.     pressed = (kpd_pwrkey_state == !!KPD_PWRKEY_POLARITY);  
  701.     if (kpd_show_hw_keycode) {  
  702.         printk(KPD_SAY "(%s) HW keycode = using EINT\n",  
  703.                pressed ? "pressed" : "released");  
  704.     }  
  705.     kpd_backlight_handler(pressed, KPD_PWRKEY_MAP);  
  706.     input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, pressed);  
  707.     input_sync(kpd_input_dev);  
  708.     kpd_print("report Linux keycode = %u\n", KPD_PWRKEY_MAP);  
  709.   
  710.     /* for detecting the return to old_state */  
  711.     mt65xx_eint_set_polarity(KPD_PWRKEY_EINT, old_state);  
  712.     mt65xx_eint_unmask(KPD_PWRKEY_EINT);  
  713. }  
  714.   
  715. static void kpd_pwrkey_eint_handler(void)  
  716. {  
  717.     tasklet_schedule(&kpd_pwrkey_tasklet);  
  718. }  
  719. #endif  
  720. /*********************************************************************/  
  721. #if 0//KPD_PWRKEY_USE_PMIC //for 77 chip and earlier version   power key bug, has fixed on 89 chip  
  722. static void kpd_pwrkey_handler(struct work_struct *work)  
  723. {  
  724.     int pressed = 1;  
  725.     /* report  Press*/  
  726.     input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, pressed);  
  727.     input_sync(kpd_input_dev);  
  728.     if (kpd_show_hw_keycode) {  
  729.         printk(KPD_SAY "(%s) HW keycode = using PMIC\n",  
  730.                pressed ? "pressed" : "released");  
  731.     }  
  732.     while(1)  
  733.     {  
  734.         if(upmu_get_pwrkey_deb() == 1)  
  735.         {  
  736.             pressed = 0;  
  737.             /* Report Release */  
  738.             input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, pressed);  
  739.             input_sync(kpd_input_dev);  
  740.         if (kpd_show_hw_keycode) {  
  741.                printk(KPD_SAY "(%s) HW keycode = using PMIC\n",  
  742.                  pressed ? "pressed" : "released");  
  743.         }             
  744.             break;  
  745.         }  
  746.         msleep(10);  
  747.     }         
  748. }  
  749.   
  750. void kpd_pwrkey_pmic_handler(unsigned long pressed)  
  751. {  
  752.     printk(KPD_SAY "Power Key generate, pressed=%ld\n", pressed);  
  753.     if(!kpd_input_dev) {  
  754.         printk("KPD input device not ready\n");  
  755.         return;  
  756.     }  
  757.     if(get_chip_eco_ver() == CHIP_E2) {  
  758.         input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, pressed);  
  759.         input_sync(kpd_input_dev);  
  760.         if (kpd_show_hw_keycode) {  
  761.             printk(KPD_SAY "(%s) HW keycode =%d using PMIC\n",  
  762.                    pressed ? "pressed" : "released", KPD_PWRKEY_MAP);  
  763.         }  
  764.     } else {  
  765.         schedule_work(&pwrkey_pmic_work);  
  766.     }  
  767. }  
  768. #endif  
  769. /*********************************************************************/  
  770. #if KPD_PWRKEY_USE_PMIC  
  771.   
  772. void kpd_pwrkey_pmic_handler(unsigned long pressed)  
  773. {  
  774.     printk(KPD_SAY "Power Key generate, pressed=%ld\n", pressed);  
  775.     if(!kpd_input_dev) {  
  776.         printk("KPD input device not ready\n");  
  777.         return;  
  778.     }  
  779.       
  780.         input_report_key(kpd_input_dev, KPD_PWRKEY_MAP, pressed);  
  781.         input_sync(kpd_input_dev);  
  782.         if (kpd_show_hw_keycode) {  
  783.             printk(KPD_SAY "(%s) HW keycode =%d using PMIC\n",  
  784.                    pressed ? "pressed" : "released", KPD_PWRKEY_MAP);  
  785.         }  
  786. }  
  787. #endif  
  788.   
  789. /*********************************************************************/  
  790. void kpd_pmic_rstkey_handler(unsigned long pressed)  
  791. {  
  792.     printk(KPD_SAY "PMIC reset Key generate, pressed=%ld\n", pressed);  
  793.     if(!kpd_input_dev) {  
  794.         printk("KPD input device not ready\n");  
  795.         return;  
  796.     }  
  797. #ifdef KPD_PMIC_RSTKEY_MAP  
  798.         input_report_key(kpd_input_dev, KPD_PMIC_RSTKEY_MAP, pressed);  
  799.         input_sync(kpd_input_dev);  
  800.         if (kpd_show_hw_keycode) {  
  801.             printk(KPD_SAY "(%s) HW keycode =%d using PMIC\n",  
  802.                    pressed ? "pressed" : "released", KPD_PMIC_RSTKEY_MAP);  
  803.         }  
  804.         kpd_aee_handler(KPD_PMIC_RSTKEY_MAP, pressed);  
  805. #endif  
  806. }  
  807.   
  808. static void kpd_keymap_handler(unsigned long data)  
  809. {  
  810.     int i, j;  
  811.     bool pressed;  
  812.     u16 new_state[KPD_NUM_MEMS], change, mask;  
  813.     u16 hw_keycode, linux_keycode;  
  814.   
  815.     spin_lock(&keymap_handler_spinlock);  
  816.     kpd_get_keymap_state(new_state);  
  817.   
  818. #ifdef KPD_AUTOTEST_BY_KP  
  819.     if(data == 1)  
  820.         kpd_reset_keymap_state(new_state);  
  821.         kpd_print("kpd_keymap_handler:  data=%d, new_state = %x %x %x %x %x \n",  
  822.                      data, new_state[0], new_state[1], new_state[2], new_state[3], new_state[4]);         
  823. #endif  
  824.   
  825.     for (i = 0; i < KPD_NUM_MEMS; i++) {  
  826.         change = new_state[i] ^ kpd_keymap_state[i];  
  827.         if (!change)  
  828.             continue;  
  829.   
  830.         for (j = 0; j < 16; j++) {  
  831.             mask = 1U << j;  
  832.             if (!(change & mask))  
  833.                 continue;  
  834.   
  835.             hw_keycode = (i << 4) + j;  
  836.             /* bit is 1: not pressed, 0: pressed */  
  837.             pressed = !(new_state[i] & mask);  
  838.             if (kpd_show_hw_keycode) {  
  839.                 printk(KPD_SAY "(%s) HW keycode = %u\n",  
  840.                        pressed ? "pressed" : "released",  
  841.                        hw_keycode);  
  842.             }  
  843.             BUG_ON(hw_keycode >= KPD_NUM_KEYS);  
  844.             linux_keycode = kpd_keymap[hw_keycode];           
  845.             if (unlikely(linux_keycode == 0)) {  
  846.                 kpd_print("Linux keycode = 0\n");  
  847.                 continue;  
  848.             }         
  849.               
  850. #ifdef KPD_AUTOTEST_BY_KP  
  851.             if((get_boot_mode() != FACTORY_BOOT) && (get_boot_mode() != ATE_FACTORY_BOOT))  
  852. #endif            
  853.             kpd_aee_handler(linux_keycode, pressed);  
  854.             kpd_backlight_handler(pressed, linux_keycode);  
  855.             input_report_key(kpd_input_dev, linux_keycode, pressed);  
  856.             input_sync(kpd_input_dev);  
  857.             kpd_print("report Linux keycode = %u\n", linux_keycode);  
  858.         }  
  859.     }  
  860.       
  861.     memcpy(kpd_keymap_state, new_state, sizeof(new_state));  
  862.     //kpd_print("save new keymap state\n");  
  863. #ifdef KPD_AUTOTEST_BY_KP  
  864.     if(data == 0)  
  865. #endif  
  866.     enable_irq(MT_KP_IRQ_ID);  
  867.     spin_unlock(&keymap_handler_spinlock);  
  868. }  
  869.   
  870. static irqreturn_t kpd_irq_handler(int irq, void *dev_id)  
  871. {  
  872.     /* use _nosync to avoid deadlock */  
  873.     disable_irq_nosync(MT_KP_IRQ_ID);  
  874.   
  875.     tasklet_schedule(&kpd_keymap_tasklet);  
  876.     return IRQ_HANDLED;  
  877. }  
  878.   
  879. static long kpd_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  
  880. {  
  881.     void __user *uarg = (void __user *)arg;  
  882.     struct kpd_ledctl ledctl;  
  883.   
  884.     switch (cmd) {  
  885. #if KPD_AUTOTEST  
  886.     case PRESS_OK_KEY://KPD_AUTOTEST disable auto test setting to resolve CR ALPS00464496  
  887.         if(test_bit(KEY_OK, kpd_input_dev->keybit)){  
  888.         printk("[AUTOTEST] PRESS OK KEY!!\n");  
  889.         input_report_key(kpd_input_dev, KEY_OK, 1);  
  890.         input_sync(kpd_input_dev);  
  891.         }else{  
  892.             printk("[AUTOTEST] Not Support OK KEY!!\n");  
  893.         }  
  894.         break;  
  895.     case RELEASE_OK_KEY:  
  896.         if(test_bit(KEY_OK, kpd_input_dev->keybit)){  
  897.         printk("[AUTOTEST] RELEASE OK KEY!!\n");  
  898.         input_report_key(kpd_input_dev, KEY_OK, 0);  
  899.         input_sync(kpd_input_dev);  
  900.         }else{  
  901.             printk("[AUTOTEST] Not Support OK KEY!!\n");  
  902.         }  
  903.         break;  
  904.     case PRESS_MENU_KEY:  
  905.         if(test_bit(KEY_MENU, kpd_input_dev->keybit)){  
  906.         printk("[AUTOTEST] PRESS MENU KEY!!\n");  
  907.         input_report_key(kpd_input_dev, KEY_MENU, 1);  
  908.         input_sync(kpd_input_dev);  
  909.         }else{  
  910.             printk("[AUTOTEST] Not Support MENU KEY!!\n");  
  911.         }  
  912.         break;  
  913.     case RELEASE_MENU_KEY:  
  914.         if(test_bit(KEY_MENU, kpd_input_dev->keybit)){  
  915.         printk("[AUTOTEST] RELEASE MENU KEY!!\n");  
  916.         input_report_key(kpd_input_dev, KEY_MENU, 0);  
  917.         input_sync(kpd_input_dev);  
  918.         }else{  
  919.             printk("[AUTOTEST] Not Support MENU KEY!!\n");  
  920.         }  
  921.   
  922.         break;  
  923.     case PRESS_UP_KEY:  
  924.         if(test_bit(KEY_UP, kpd_input_dev->keybit)){  
  925.         printk("[AUTOTEST] PRESS UP KEY!!\n");  
  926.         input_report_key(kpd_input_dev, KEY_UP, 1);  
  927.         input_sync(kpd_input_dev);  
  928.         }else{  
  929.             printk("[AUTOTEST] Not Support UP KEY!!\n");  
  930.         }  
  931.         break;  
  932.     case RELEASE_UP_KEY:  
  933.         if(test_bit(KEY_UP, kpd_input_dev->keybit)){  
  934.         printk("[AUTOTEST] RELEASE UP KEY!!\n");  
  935.         input_report_key(kpd_input_dev, KEY_UP, 0);  
  936.         input_sync(kpd_input_dev);  
  937.         }else{  
  938.             printk("[AUTOTEST] Not Support UP KEY!!\n");  
  939.         }  
  940.         break;  
  941.     case PRESS_DOWN_KEY:  
  942.         if(test_bit(KEY_DOWN, kpd_input_dev->keybit)){  
  943.         printk("[AUTOTEST] PRESS DOWN KEY!!\n");  
  944.         input_report_key(kpd_input_dev, KEY_DOWN, 1);  
  945.         input_sync(kpd_input_dev);  
  946.         }else{  
  947.             printk("[AUTOTEST] Not Support DOWN KEY!!\n");  
  948.         }  
  949.         break;  
  950.     case RELEASE_DOWN_KEY:  
  951.         if(test_bit(KEY_DOWN, kpd_input_dev->keybit)){  
  952.         printk("[AUTOTEST] RELEASE DOWN KEY!!\n");  
  953.         input_report_key(kpd_input_dev, KEY_DOWN, 0);  
  954.         input_sync(kpd_input_dev);  
  955.         }else{  
  956.             printk("[AUTOTEST] Not Support DOWN KEY!!\n");  
  957.         }  
  958.         break;  
  959.     case PRESS_LEFT_KEY:  
  960.         if(test_bit(KEY_LEFT, kpd_input_dev->keybit)){  
  961.         printk("[AUTOTEST] PRESS LEFT KEY!!\n");  
  962.         input_report_key(kpd_input_dev, KEY_LEFT, 1);  
  963.         input_sync(kpd_input_dev);  
  964.         }else{  
  965.             printk("[AUTOTEST] Not Support LEFT KEY!!\n");  
  966.         }  
  967.         break;  
  968.     case RELEASE_LEFT_KEY:  
  969.         if(test_bit(KEY_LEFT, kpd_input_dev->keybit)){  
  970.         printk("[AUTOTEST] RELEASE LEFT KEY!!\n");  
  971.         input_report_key(kpd_input_dev, KEY_LEFT, 0);  
  972.         input_sync(kpd_input_dev);  
  973.         }else{  
  974.             printk("[AUTOTEST] Not Support LEFT KEY!!\n");  
  975.         }  
  976.         break;  
  977.     case PRESS_RIGHT_KEY:  
  978.         if(test_bit(KEY_RIGHT, kpd_input_dev->keybit)){  
  979.         printk("[AUTOTEST] PRESS RIGHT KEY!!\n");  
  980.         input_report_key(kpd_input_dev, KEY_RIGHT, 1);  
  981.         input_sync(kpd_input_dev);  
  982.         }else{  
  983.             printk("[AUTOTEST] Not Support RIGHT KEY!!\n");  
  984.         }  
  985.         break;  
  986.     case RELEASE_RIGHT_KEY:  
  987.         if(test_bit(KEY_RIGHT, kpd_input_dev->keybit)){  
  988.         printk("[AUTOTEST] RELEASE RIGHT KEY!!\n");  
  989.         input_report_key(kpd_input_dev, KEY_RIGHT, 0);  
  990.         input_sync(kpd_input_dev);  
  991.         }else{  
  992.             printk("[AUTOTEST] Not Support RIGHT KEY!!\n");  
  993.         }  
  994.         break;  
  995.     case PRESS_HOME_KEY:  
  996.         if(test_bit(KEY_HOME, kpd_input_dev->keybit)){  
  997.         printk("[AUTOTEST] PRESS HOME KEY!!\n");  
  998.         input_report_key(kpd_input_dev, KEY_HOME, 1);  
  999.         input_sync(kpd_input_dev);  
  1000.         }else{  
  1001.             printk("[AUTOTEST] Not Support HOME KEY!!\n");  
  1002.         }  
  1003.         break;  
  1004.     case RELEASE_HOME_KEY:  
  1005.         if(test_bit(KEY_HOME, kpd_input_dev->keybit)){  
  1006.         printk("[AUTOTEST] RELEASE HOME KEY!!\n");  
  1007.         input_report_key(kpd_input_dev, KEY_HOME, 0);  
  1008.         input_sync(kpd_input_dev);  
  1009.         }else{  
  1010.             printk("[AUTOTEST] Not Support HOME KEY!!\n");  
  1011.         }  
  1012.         break;  
  1013.     case PRESS_BACK_KEY:  
  1014.         if(test_bit(KEY_BACK, kpd_input_dev->keybit)){  
  1015.         printk("[AUTOTEST] PRESS BACK KEY!!\n");  
  1016.         input_report_key(kpd_input_dev, KEY_BACK, 1);  
  1017.         input_sync(kpd_input_dev);  
  1018.         }else{  
  1019.             printk("[AUTOTEST] Not Support BACK KEY!!\n");  
  1020.         }  
  1021.         break;  
  1022.     case RELEASE_BACK_KEY:  
  1023.         if(test_bit(KEY_BACK, kpd_input_dev->keybit)){  
  1024.         printk("[AUTOTEST] RELEASE BACK KEY!!\n");  
  1025.         input_report_key(kpd_input_dev, KEY_BACK, 0);  
  1026.         input_sync(kpd_input_dev);  
  1027.         }else{  
  1028.             printk("[AUTOTEST] Not Support BACK KEY!!\n");  
  1029.         }  
  1030.         break;  
  1031.     case PRESS_CALL_KEY:  
  1032.         if(test_bit(KEY_CALL, kpd_input_dev->keybit)){  
  1033.         printk("[AUTOTEST] PRESS CALL KEY!!\n");  
  1034.         input_report_key(kpd_input_dev, KEY_CALL, 1);  
  1035.         input_sync(kpd_input_dev);  
  1036.         }else{  
  1037.             printk("[AUTOTEST] Not Support CALL KEY!!\n");  
  1038.         }  
  1039.         break;  
  1040.     case RELEASE_CALL_KEY:  
  1041.         if(test_bit(KEY_CALL, kpd_input_dev->keybit)){  
  1042.         printk("[AUTOTEST] RELEASE CALL KEY!!\n");  
  1043.         input_report_key(kpd_input_dev, KEY_CALL, 0);  
  1044.         input_sync(kpd_input_dev);  
  1045.         }else{  
  1046.             printk("[AUTOTEST] Not Support CALL KEY!!\n");  
  1047.         }  
  1048.         break;  
  1049.     case PRESS_ENDCALL_KEY:  
  1050.         if(test_bit(KEY_ENDCALL, kpd_input_dev->keybit)){  
  1051.         printk("[AUTOTEST] PRESS ENDCALL KEY!!\n");  
  1052.         input_report_key(kpd_input_dev, KEY_ENDCALL, 1);  
  1053.         input_sync(kpd_input_dev);  
  1054.         }else{  
  1055.             printk("[AUTOTEST] Not Support ENDCALL KEY!!\n");  
  1056.         }  
  1057.         break;  
  1058.     case RELEASE_ENDCALL_KEY:  
  1059.         if(test_bit(KEY_ENDCALL, kpd_input_dev->keybit)){  
  1060.         printk("[AUTOTEST] RELEASE ENDCALL KEY!!\n");  
  1061.         input_report_key(kpd_input_dev, KEY_ENDCALL, 0);  
  1062.         input_sync(kpd_input_dev);  
  1063.         }else{  
  1064.             printk("[AUTOTEST] Not Support ENDCALL KEY!!\n");  
  1065.         }  
  1066.         break;  
  1067.     case PRESS_VLUP_KEY:  
  1068.         if(test_bit(KEY_VOLUMEUP, kpd_input_dev->keybit)){  
  1069.         printk("[AUTOTEST] PRESS VOLUMEUP KEY!!\n");  
  1070.         input_report_key(kpd_input_dev, KEY_VOLUMEUP, 1);  
  1071.         input_sync(kpd_input_dev);  
  1072.         }else{  
  1073.             printk("[AUTOTEST] Not Support VOLUMEUP KEY!!\n");  
  1074.         }  
  1075.         break;  
  1076.     case RELEASE_VLUP_KEY:  
  1077.         if(test_bit(KEY_VOLUMEUP, kpd_input_dev->keybit)){  
  1078.         printk("[AUTOTEST] RELEASE VOLUMEUP KEY!!\n");  
  1079.         input_report_key(kpd_input_dev, KEY_VOLUMEUP, 0);  
  1080.         input_sync(kpd_input_dev);  
  1081.         }else{  
  1082.             printk("[AUTOTEST] Not Support VOLUMEUP KEY!!\n");  
  1083.         }  
  1084.         break;  
  1085.     case PRESS_VLDOWN_KEY:  
  1086.         if(test_bit(KEY_VOLUMEDOWN, kpd_input_dev->keybit)){  
  1087.         printk("[AUTOTEST] PRESS VOLUMEDOWN KEY!!\n");  
  1088.         input_report_key(kpd_input_dev, KEY_VOLUMEDOWN, 1);  
  1089.         input_sync(kpd_input_dev);  
  1090.         }else{  
  1091.             printk("[AUTOTEST] Not Support VOLUMEDOWN KEY!!\n");  
  1092.         }  
  1093.         break;  
  1094.     case RELEASE_VLDOWN_KEY:  
  1095.         if(test_bit(KEY_VOLUMEDOWN, kpd_input_dev->keybit)){  
  1096.         printk("[AUTOTEST] RELEASE VOLUMEDOWN KEY!!\n");  
  1097.         input_report_key(kpd_input_dev, KEY_VOLUMEDOWN, 0);  
  1098.         input_sync(kpd_input_dev);  
  1099.         }else{  
  1100.             printk("[AUTOTEST] Not Support VOLUMEDOWN KEY!!\n");  
  1101.         }  
  1102.         break;  
  1103.     case PRESS_FOCUS_KEY:  
  1104.         if(test_bit(KEY_FOCUS, kpd_input_dev->keybit)){  
  1105.         printk("[AUTOTEST] PRESS FOCUS KEY!!\n");  
  1106.         input_report_key(kpd_input_dev, KEY_FOCUS, 1);  
  1107.         input_sync(kpd_input_dev);  
  1108.         }else{  
  1109.             printk("[AUTOTEST] Not Support FOCUS KEY!!\n");  
  1110.         }  
  1111.         break;  
  1112.     case RELEASE_FOCUS_KEY:  
  1113.         if(test_bit(KEY_FOCUS, kpd_input_dev->keybit)){  
  1114.         printk("[AUTOTEST] RELEASE FOCUS KEY!!\n");  
  1115.         input_report_key(kpd_input_dev, KEY_FOCUS, 0);  
  1116.         input_sync(kpd_input_dev);  
  1117.         }else{  
  1118.             printk("[AUTOTEST] Not Support RELEASE KEY!!\n");  
  1119.         }  
  1120.         break;  
  1121.     case PRESS_CAMERA_KEY:  
  1122.         if(test_bit(KEY_CAMERA, kpd_input_dev->keybit)){  
  1123.         printk("[AUTOTEST] PRESS CAMERA KEY!!\n");  
  1124.         input_report_key(kpd_input_dev, KEY_CAMERA, 1);  
  1125.         input_sync(kpd_input_dev);  
  1126.         }else{  
  1127.             printk("[AUTOTEST] Not Support CAMERA KEY!!\n");  
  1128.         }  
  1129.         break;  
  1130.     case RELEASE_CAMERA_KEY:  
  1131.         if(test_bit(KEY_CAMERA, kpd_input_dev->keybit)){  
  1132.         printk("[AUTOTEST] RELEASE CAMERA KEY!!\n");  
  1133.         input_report_key(kpd_input_dev, KEY_CAMERA, 0);  
  1134.         input_sync(kpd_input_dev);  
  1135.         }else{  
  1136.             printk("[AUTOTEST] Not Support CAMERA KEY!!\n");  
  1137.         }  
  1138.         break;  
  1139. #endif  
  1140.   
  1141.     case SET_KPD_BACKLIGHT:  
  1142.         if (copy_from_user(&ledctl, uarg, sizeof(struct kpd_ledctl)))  
  1143.             return -EFAULT;  
  1144.   
  1145.         //kpd_set_backlight(ledctl.onoff, &ledctl.div, &ledctl.duty);  
  1146.         break;  
  1147.   
  1148.     case SET_KPD_KCOL:  
  1149. #ifndef KPD_AUTOTEST_BY_KP  
  1150.         kpd_auto_test_for_factorymode();  
  1151. #else  
  1152.         kpd_kcol_scan_for_factorymode();  
  1153. #endif        
  1154.         printk("[kpd_auto_test_for_factorymode] test performed!!\n");  
  1155.         break;  
  1156.     default:  
  1157.         return -EINVAL;  
  1158.     }  
  1159.   
  1160.     return 0;  
  1161. }  
  1162.   
  1163. static int kpd_dev_open(struct inode *inode, struct file *file)  
  1164. {  
  1165.     return 0;  
  1166. }  
  1167.   
  1168. static struct file_operations kpd_dev_fops = {  
  1169.     .owner      = THIS_MODULE,  
  1170.     .unlocked_ioctl = kpd_dev_ioctl,  
  1171.     .open       = kpd_dev_open,  
  1172. };  
  1173.   
  1174. static struct miscdevice kpd_dev = {  
  1175.     .minor  = MISC_DYNAMIC_MINOR,  
  1176.     .name   = KPD_NAME,  
  1177.     .fops   = &kpd_dev_fops,  
  1178. };  
  1179.   
  1180. static int kpd_open(struct input_dev *dev)  
  1181. {  
  1182. #if KPD_HAS_SLIDE_QWERTY  
  1183.     bool evdev_flag=false;  
  1184.     bool power_op=false;  
  1185.     struct input_handler *handler;  
  1186.     struct input_handle *handle;  
  1187.     handle = rcu_dereference(dev->grab);  
  1188.     if (handle)  
  1189.     {  
  1190.         handler = handle->handler;  
  1191.         if(strcmp(handler->name, "evdev")==0)   
  1192.         {  
  1193.             return -1;  
  1194.         }     
  1195.     }  
  1196.     else   
  1197.     {  
  1198.         list_for_each_entry_rcu(handle, &dev->h_list, d_node) {  
  1199.             handler = handle->handler;  
  1200.             if(strcmp(handler->name, "evdev")==0)   
  1201.             {  
  1202.                 evdev_flag=true;  
  1203.                 break;  
  1204.             }  
  1205.         }  
  1206.         if(evdev_flag==false)  
  1207.         {  
  1208.             return -1;    
  1209.         }     
  1210.     }  
  1211.   
  1212.     power_op = powerOn_slidePin_interface();  
  1213.     if(!power_op) {  
  1214.         printk(KPD_SAY "Qwerty slide pin interface power on fail\n");  
  1215.     } else {  
  1216.         kpd_print("Qwerty slide pin interface power on success\n");  
  1217.     }  
  1218.           
  1219.     mt65xx_eint_set_sens(KPD_SLIDE_EINT, KPD_SLIDE_SENSITIVE);  
  1220.     mt65xx_eint_set_hw_debounce(KPD_SLIDE_EINT, KPD_SLIDE_DEBOUNCE);  
  1221.     mt65xx_eint_registration(KPD_SLIDE_EINT, true, KPD_SLIDE_POLARITY,  
  1222.                              kpd_slide_eint_handler, false);  
  1223.                                
  1224.     power_op = powerOff_slidePin_interface();  
  1225.     if(!power_op) {  
  1226.         printk(KPD_SAY "Qwerty slide pin interface power off fail\n");  
  1227.     } else {  
  1228.         kpd_print("Qwerty slide pin interface power off success\n");  
  1229.     }  
  1230.   
  1231. #if 0  
  1232.     /*qwerty slide: GPIO 214. input, mode=EINT, pull enbale, pull select high*/  
  1233.     mt_set_gpio_mode(214, 2);  
  1234.     mt_set_gpio_dir(214, 0);  
  1235.     mt_set_gpio_pull_enable(214, 1);  
  1236.     mt_set_gpio_pull_select(214, 0);  
  1237. #endif  
  1238. #endif    
  1239.     return 0;  
  1240. }  
  1241.   
  1242.   
  1243.   
  1244.   
  1245.   
  1246. #if 1 // AW9523  扩展键盘IC:  
  1247.   
  1248. #define GPIO_SIMULATE_I2C  
  1249.   
  1250. #define AW9523_EINT_GPIO               GPIO144  
  1251. #define AW9523_EINT_NO                 5  //CUST_EINT_MHALL_NUM   
  1252.   
  1253. #define AW9523_RESET_PIN GPIO128  
  1254.   
  1255. #define KPD_AW9523_SWITCH_DEBOUNCE       10   //50  // 30  
  1256. #define KPD_AW9523_SWITCH_POLARITY          CUST_EINT_MHALL_POLARITY  
  1257. #define KPD_AW9523_SWITCH_SENSITIVE      CUST_EINT_EDGE_SENSITIVE  // CUST_EINT_MHALL_SENSITIVE  
  1258.   
  1259. static void kpd_aw9523_handler(unsigned long data);  
  1260. static DECLARE_TASKLET(kpd_aw9523_tasklet, kpd_aw9523_handler, 0);  
  1261. static u8 kpd_aw9523_state = !CUST_EINT_POLARITY_LOW;   
  1262.   
  1263. #define LED_SLAVE_ADDR        0xb0//0xB6  
  1264. //#if defined(GPIO_SIMULATE_I2C)  
  1265. #define I2C_SDA_GPIO         GPIO114    //GPIO111      // ROW1  
  1266. #define I2C_SCL_GPIO         GPIO113    //GPIO108      // COL1  
  1267.   
  1268. typedef enum {  
  1269. P0_0=0,  
  1270. P0_1,  
  1271. P0_2,  
  1272. P0_3,  
  1273. P0_4,  
  1274. P0_5,  
  1275. P0_6,  
  1276. P0_7  
  1277. } P0_Enum;  
  1278.   
  1279. typedef enum {  
  1280. P1_0=0,  
  1281. P1_1,  
  1282. P1_2,   
  1283. P1_3,  
  1284. P1_4,   
  1285. P1_5,  
  1286. P1_6,  
  1287. P1_7  
  1288. } P1_Enum;  
  1289.   
  1290. #define AW9523_I2C_MAX_LOOP 50  
  1291.   
  1292. #define Y_NUM  6    
  1293. #define X_NUM  6                // has pullup resistor   
  1294.   
  1295. //  P0 ---> X_NUM ---> col         input  
  1296. //  P1 ---> Y_NUM ---> line(row)   output  
  1297. const P0_Enum COL[X_NUM] =  {P0_0, P0_1, P0_2, P0_3, P0_4, P0_5};  
  1298. //const P1_Enum Line[Y_NUM] = {P1_2, P1_3, P1_4, P1_5, P1_6, P1_7};    
  1299. const P1_Enum Line[Y_NUM] = {P1_0, P1_1, P1_2, P1_3, P1_4, P1_5};    
  1300.   
  1301. const u8  aw9523_key[Y_NUM][X_NUM]={  
  1302. //     1          2          3          4              5              6  
  1303. /* 
  1304.     {KEY_7,     KEY_8,    KEY_9, KEY_POUND,         KEY_OK,         KEY_BACK}, 
  1305.     {KEY_4,     KEY_5,      KEY_6,  KEY_STAR        ,KEY_1,     KEY_2}, 
  1306.     {KEY_LEFT,  KEY_UP,      KEY_MENU,     KEY_RIGHT,         KEY_DOWN,         KEY_HOME}, 
  1307.     {KEY_A, KEY_0,   KEY_B, KEY_C,         KEY_D,         KEY_S},       //SCAN here 
  1308.     {KEY_E,     KEY_F,      KEY_G,     KEY_H,   KEY_I,         KEY_J}, 
  1309.     {KEY_K,     KEY_L,      KEY_M,     KEY_N,         KEY_O,         KEY_P}, 
  1310. */  
  1311.   
  1312.     {KEY_F1,     KEY_F2,    KEY_F3, KEY_F4,         KEY_DEL,         KEY_3},  
  1313.     {KEY_FN,     KEY_0,      KEY_DOT,  KEY_SYM      ,KEY_OK,     KEY_ENTER},  

你可能感兴趣的:(MTK,linux,Android)