mtk_key.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include <printf.h>
  2. #include <platform/mt_typedefs.h>
  3. #include <platform/mtk_key.h>
  4. #include <platform/boot_mode.h>
  5. #include <platform/mt_pmic.h>
  6. #include <platform/mt_gpio.h>
  7. #include <platform/mt_pmic_wrap_init.h>
  8. #include <platform/sync_write.h>
  9. #include <platform/upmu_common.h>
  10. #include <target/cust_key.h>
  11. #include <libfdt.h>
  12. #include <lk_builtin_dtb.h>
  13. extern int pmic_detect_powerkey(void);
  14. extern int pmic_detect_homekey(void);
  15. extern kal_uint16 pmic_get_register_value(PMU_FLAGS_LIST_ENUM flagname);
  16. extern kal_uint16 pmic_set_register_value(PMU_FLAGS_LIST_ENUM flagname,kal_uint32 val);
  17. struct keypad_dts_data kpd_dts_data;
  18. static int kpd_dts_init_done = 0;
  19. static unsigned int kpd_fdt_getprop_u32(const void *fdt, int nodeoffset, const char *name)
  20. {
  21. const void *data = NULL;
  22. int len = 0;
  23. data = fdt_getprop(fdt, nodeoffset, name, &len);
  24. if (len > 0 && data)
  25. return fdt32_to_cpu(*(unsigned int *)data);
  26. else
  27. return 0;
  28. }
  29. static void kpd_fdt_getprop_u32_array(const void *fdt, int nodeoffset,
  30. const char *name, char *out_value, int maxlen)
  31. {
  32. const void *data = NULL;
  33. int len = 0;
  34. data = fdt_getprop(fdt, nodeoffset, name, &len);
  35. if (len > 0 && data)
  36. memcpy(out_value, data, len > maxlen ? maxlen : len);
  37. else
  38. memset(out_value, 0, len > maxlen ? maxlen: len);
  39. }
  40. void get_kpd_dts_info(void)
  41. {
  42. int offset;
  43. if (kpd_dts_init_done)
  44. return;
  45. memset(&kpd_dts_data, 0, sizeof(kpd_dts_data));
  46. offset = fdt_path_offset(get_lk_overlayed_dtb(), "/kp@10010000");
  47. if (offset >= 0) {
  48. kpd_dts_data.kpd_sw_pwrkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-sw-pwrkey");
  49. kpd_dts_data.kpd_hw_pwrkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-pwrkey");
  50. kpd_dts_data.kpd_sw_rstkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-sw-rstkey");
  51. kpd_dts_data.kpd_hw_rstkey = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-rstkey");
  52. kpd_dts_data.kpd_use_extend_type = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-use-extend-type");
  53. kpd_dts_data.kpd_hw_recovery_key = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-recovery-key");
  54. kpd_dts_data.kpd_hw_factory_key = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-factory-key");
  55. dprintf(INFO, "kpd_sw_pwrkey = %d, kpd_hw_pwrkey = %d, kpd_sw_rstkey = %d, kpd_hw_rstkey = %d\n",
  56. kpd_dts_data.kpd_sw_pwrkey, kpd_dts_data.kpd_hw_pwrkey, kpd_dts_data.kpd_sw_rstkey, kpd_dts_data.kpd_hw_rstkey);
  57. dprintf(INFO, "kpd_use_extend_type = %d, kpd_hw_recovery_key = %d, kpd_hw_factory_key = %d\n",
  58. kpd_dts_data.kpd_use_extend_type, kpd_dts_data.kpd_hw_recovery_key, kpd_dts_data.kpd_hw_factory_key);
  59. kpd_dts_data.kpd_hw_map_num = kpd_fdt_getprop_u32(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-map-num");
  60. kpd_fdt_getprop_u32_array(get_lk_overlayed_dtb(), offset, "mediatek,kpd-hw-init-map", (char *)kpd_dts_data.kpd_hw_init_map, KPD_NUM_KEYS * 4);
  61. kpd_dts_init_done = 1;
  62. } else {
  63. /* default setting when dts not found: recovery key = pmic home key, factory key = vol down key */
  64. dprintf(CRITICAL, "keypad dts not found, using default setting\n");
  65. kpd_dts_data.kpd_hw_pwrkey = 8;
  66. kpd_dts_data.kpd_hw_rstkey = 17;
  67. kpd_dts_data.kpd_hw_recovery_key = kpd_dts_data.kpd_hw_rstkey;
  68. kpd_dts_data.kpd_hw_factory_key = 0;
  69. }
  70. #ifdef MT65XX_FACTORY_KEY
  71. dprintf(CRITICAL, "MT65XX_FACTORY_KEY 0x%x\n",MT65XX_FACTORY_KEY);
  72. #endif
  73. #ifdef MT65XX_BOOT_MENU_KEY
  74. dprintf(CRITICAL, "MT65XX_BOOT_MENU_KEY 0x%x\n",MT65XX_BOOT_MENU_KEY);
  75. #endif
  76. #ifdef MT65XX_RECOVERY_KEY
  77. dprintf(CRITICAL, "MT65XX_RECOVERY_KEY 0x%x\n",MT65XX_RECOVERY_KEY);
  78. #endif
  79. }
  80. void set_kpd_pmic_mode(void)
  81. {
  82. return;
  83. }
  84. void disable_PMIC_kpd_clock(void)
  85. {
  86. return;
  87. }
  88. void enable_PMIC_kpd_clock(void)
  89. {
  90. return;
  91. }
  92. BOOL mtk_detect_key(unsigned short key) /* key: HW keycode */
  93. {
  94. #ifdef MACH_FPGA
  95. return FALSE;
  96. #else
  97. //dprintf(ALWAYS, "mtk detect key function key = %d\n", key);
  98. unsigned short idx, bit, din;
  99. get_kpd_dts_info();
  100. if (key >= KPD_NUM_KEYS)
  101. return FALSE;
  102. #if 0
  103. if (key % 9 == 8)
  104. key = 8;
  105. #endif
  106. if (key == MTK_PMIC_PWR_KEY) {
  107. /* Power key */
  108. if (1 == pmic_detect_powerkey()) {
  109. dprintf(ALWAYS, "power key is pressed\n");
  110. return TRUE;
  111. }
  112. return FALSE;
  113. }
  114. #ifdef MTK_PMIC_RST_KEY
  115. if (key == MTK_PMIC_RST_KEY) {
  116. //dprintf(INFO, "mtk detect key function pmic_detect_homekey MTK_PMIC_RST_KEY = %d\n", MTK_PMIC_RST_KEY);
  117. if (1 == pmic_detect_homekey()) {
  118. dprintf(ALWAYS, "mtk detect key function pmic_detect_homekey pressed\n");
  119. return TRUE;
  120. }
  121. return FALSE;
  122. }
  123. #endif
  124. idx = key / 16;
  125. bit = key % 16;
  126. din = DRV_Reg16(KP_MEM1 + (idx << 2)) & (1U << bit);
  127. if (!din) {
  128. dprintf(ALWAYS, "key %d is pressed\n", key);
  129. return TRUE;
  130. }
  131. return FALSE;
  132. #endif
  133. }
  134. BOOL mtk_detect_pmic_just_rst(void)
  135. {
  136. kal_uint32 just_rst = 0;
  137. dprintf(ALWAYS, "detecting pmic just reset\n");
  138. just_rst = pmic_get_register_value(PMIC_JUST_PWRKEY_RST);
  139. if (just_rst) {
  140. dprintf(ALWAYS, "Just recover from a reset\n");
  141. pmic_set_register_value(PMIC_CLR_JUST_RST, 0x01);
  142. return TRUE;
  143. }
  144. return FALSE;
  145. }