mtk_key.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * Copyright (c) 2012 MediaTek Inc.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in
  11. * the documentation and/or other materials provided with the
  12. * distribution.
  13. *
  14. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  15. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  16. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  17. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  18. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  19. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  20. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  21. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  22. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  23. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  24. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. * SUCH DAMAGE.
  26. */
  27. #include <printf.h>
  28. #include <platform/mt_typedefs.h>
  29. #include <platform/mtk_key.h>
  30. #include <platform/boot_mode.h>
  31. #include <platform/mt_pmic.h>
  32. #include <platform/mt_gpio.h>
  33. #include <platform/mt_pmic_wrap_init.h>
  34. #include <platform/sync_write.h>
  35. #include <platform/upmu_common.h>
  36. #include <target/cust_key.h>
  37. #include <libfdt.h>
  38. #include <lk_builtin_dtb.h>
  39. extern int pmic_detect_powerkey(void);
  40. extern int pmic_detect_homekey(void);
  41. extern kal_uint16 pmic_get_register_value(PMU_FLAGS_LIST_ENUM flagname);
  42. extern kal_uint16 pmic_set_register_value(PMU_FLAGS_LIST_ENUM flagname,kal_uint32 val);
  43. struct keypad_dts_data kpd_dts_data;
  44. static int kpd_dts_init_done = 0;
  45. static unsigned int kpd_fdt_getprop_u32(const void *fdt, int nodeoffset, const char *name)
  46. {
  47. const void *data = NULL;
  48. int len = 0;
  49. data = fdt_getprop(fdt, nodeoffset, name, &len);
  50. if (len > 0 && data)
  51. return fdt32_to_cpu(*(unsigned int *)data);
  52. else
  53. return 0;
  54. }
  55. static void kpd_fdt_getprop_u32_array(const void *fdt, int nodeoffset,
  56. const char *name, char *out_value, int maxlen)
  57. {
  58. const void *data = NULL;
  59. int len = 0;
  60. data = fdt_getprop(fdt, nodeoffset, name, &len);
  61. if (len > 0 && data)
  62. memcpy(out_value, data, len > maxlen ? maxlen : len);
  63. else
  64. memset(out_value, 0, len > maxlen ? maxlen: len);
  65. }
  66. void get_kpd_dts_info(void)
  67. {
  68. int offset;
  69. uint32_t val;
  70. if (kpd_dts_init_done)
  71. return;
  72. memset(&kpd_dts_data, 0, sizeof(kpd_dts_data));
  73. offset = fdt_path_offset(get_lk_overlayed_dtb(), "/kp@10010000");
  74. if (offset >= 0) {
  75. kpd_dts_data.kpd_sw_pwrkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-sw-pwrkey");
  76. kpd_dts_data.kpd_hw_pwrkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-pwrkey");
  77. kpd_dts_data.kpd_sw_rstkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-sw-rstkey");
  78. kpd_dts_data.kpd_hw_rstkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-rstkey");
  79. kpd_dts_data.kpd_use_extend_type = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-use-extend-type");
  80. kpd_dts_data.kpd_hw_recovery_key = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-recovery-key");
  81. kpd_dts_data.kpd_hw_factory_key = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-factory-key");
  82. dprintf(INFO, "kpd_sw_pwrkey = %d, kpd_hw_pwrkey = %d, kpd_sw_rstkey = %d, kpd_hw_rstkey = %d\n",
  83. kpd_dts_data.kpd_sw_pwrkey, kpd_dts_data.kpd_hw_pwrkey, kpd_dts_data.kpd_sw_rstkey, kpd_dts_data.kpd_hw_rstkey);
  84. dprintf(INFO, "kpd_use_extend_type = %d, kpd_hw_recovery_key = %d, kpd_hw_factory_key = %d\n",
  85. kpd_dts_data.kpd_use_extend_type, kpd_dts_data.kpd_hw_recovery_key, kpd_dts_data.kpd_hw_factory_key);
  86. kpd_dts_data.kpd_hw_map_num = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-map-num");
  87. kpd_fdt_getprop_u32_array(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-init-map", kpd_dts_data.kpd_hw_init_map, KPD_NUM_KEYS);
  88. kpd_dts_init_done = 1;
  89. } else {
  90. /* default setting when dts not found: recovery key = pmic home key, factory key = vol down key */
  91. dprintf(CRITICAL, "keypad dts not found, using default setting\n");
  92. kpd_dts_data.kpd_hw_pwrkey = 8;
  93. kpd_dts_data.kpd_hw_rstkey = 17;
  94. kpd_dts_data.kpd_hw_recovery_key = kpd_dts_data.kpd_hw_rstkey;
  95. kpd_dts_data.kpd_hw_factory_key = 0;
  96. }
  97. #ifdef MT65XX_FACTORY_KEY
  98. dprintf(CRITICAL, "MT65XX_FACTORY_KEY 0x%x\n",MT65XX_FACTORY_KEY);
  99. #endif
  100. #ifdef MT65XX_BOOT_MENU_KEY
  101. dprintf(CRITICAL, "MT65XX_BOOT_MENU_KEY 0x%x\n",MT65XX_BOOT_MENU_KEY);
  102. #endif
  103. #ifdef MT65XX_RECOVERY_KEY
  104. dprintf(CRITICAL, "MT65XX_RECOVERY_KEY 0x%x\n",MT65XX_RECOVERY_KEY);
  105. #endif
  106. }
  107. void set_kpd_pmic_mode(void)
  108. {
  109. return;
  110. }
  111. void disable_PMIC_kpd_clock(void)
  112. {
  113. return;
  114. }
  115. void enable_PMIC_kpd_clock(void)
  116. {
  117. return;
  118. }
  119. BOOL mtk_detect_key(unsigned short key) /* key: HW keycode */
  120. {
  121. #ifdef MACH_FPGA
  122. return FALSE;
  123. #else
  124. //dprintf(ALWAYS, "mtk detect key function key = %d\n", key);
  125. unsigned short idx, bit, din;
  126. get_kpd_dts_info();
  127. if (key >= KPD_NUM_KEYS)
  128. return FALSE;
  129. #if 0
  130. if (key % 9 == 8)
  131. key = 8;
  132. #endif
  133. if (key == MTK_PMIC_PWR_KEY) {
  134. /* Power key */
  135. if (1 == pmic_detect_powerkey()) {
  136. dprintf(ALWAYS, "power key is pressed\n");
  137. return TRUE;
  138. }
  139. return FALSE;
  140. }
  141. #ifdef MTK_PMIC_RST_KEY
  142. if (key == MTK_PMIC_RST_KEY) {
  143. //dprintf(INFO, "mtk detect key function pmic_detect_homekey MTK_PMIC_RST_KEY = %d\n", MTK_PMIC_RST_KEY);
  144. if (1 == pmic_detect_homekey()) {
  145. dprintf(ALWAYS, "mtk detect key function pmic_detect_homekey pressed\n");
  146. return TRUE;
  147. }
  148. return FALSE;
  149. }
  150. #endif
  151. idx = key / 16;
  152. bit = key % 16;
  153. din = DRV_Reg16(KP_MEM1 + (idx << 2)) & (1U << bit);
  154. if (!din) {
  155. dprintf(ALWAYS, "key %d is pressed\n", key);
  156. return TRUE;
  157. }
  158. return FALSE;
  159. #endif
  160. }
  161. #if defined(PMIC_CHIP_MT6355) /*--for MT6771P (MT6355)--*/
  162. #define KPD_PMIC_JUST_PWRKEY_RST PMIC_JUST_PWRKEY_RST
  163. #define KPD_PMIC_CLR_JUST_RST PMIC_CLR_JUST_RST
  164. #else /*--for MT6771 (MT6351)--*/
  165. #define KPD_PMIC_JUST_PWRKEY_RST PMIC_JUST_PWRKEY_RST
  166. #define KPD_PMIC_CLR_JUST_RST PMIC_CLR_JUST_RST
  167. #endif
  168. BOOL mtk_detect_pmic_just_rst(void)
  169. {
  170. kal_uint32 just_rst = 0;
  171. dprintf(ALWAYS, "detecting pmic just reset\n");
  172. just_rst = pmic_get_register_value(KPD_PMIC_JUST_PWRKEY_RST);
  173. if (just_rst) {
  174. dprintf(ALWAYS, "Just recover from a reset\n");
  175. pmic_set_register_value(KPD_PMIC_CLR_JUST_RST, 0x01);
  176. return TRUE;
  177. }
  178. return FALSE;
  179. }