pwrkey.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "include.h"
  2. extern uint8_t pwr_usage_id;
  3. AT(.com_text.bsp.key)
  4. void pwrkey10s_counter_clr(void)
  5. {
  6. if (POWKEY_10S_RESET) {
  7. RTCCON10 = BIT(10); //clear pwrkey10s pending and counter
  8. }
  9. }
  10. void pwrkey_off(void)
  11. {
  12. GPIOBDE &= ~BIT(5);
  13. GPIOBDIR |= BIT(5);
  14. GPIOBPU &= ~BIT(5);
  15. GPIOBPD &= ~BIT(5);
  16. RTCCON13 &= ~(BIT(0) | BIT(4) | BIT(8) | BIT(12)); //wk pin0 disable
  17. }
  18. void pwrkey_init(void)
  19. {
  20. #if USER_PWRKEY
  21. if (sys_cb.wko_pwrkey_en) {
  22. adcch_io_pu10k_enable(ADCCH_WKO);
  23. pwr_usage_id = pwrkey_table[0].usage_id;
  24. if (xcfg_cb.pwrkey_config_en) {
  25. pwr_usage_id = key_config_table[xcfg_cb.pwrkey_num0];
  26. }
  27. RTCCON13 |= BIT(0) | BIT(4) | BIT(12); //wk pin0 wakeup, input, pullup10k enable
  28. saradc_set_channel(BIT(ADCCH_WKO));
  29. } else
  30. #endif // USER_PWRKEY
  31. {
  32. pwrkey_off();
  33. }
  34. }
  35. #if USER_PWRKEY
  36. AT(.com_text.port.key)
  37. uint8_t pwrkey_get_val(void)
  38. {
  39. uint8_t num = 0;
  40. uint8_t *ptr;
  41. // //配置工具是否使能了PWRKEY?
  42. if ((!xcfg_cb.user_pwrkey_en) && (!PWRKEY_2_HW_PWRON)) {
  43. return NO_KEY;
  44. }
  45. while (saradc_get_value8(ADCCH_WKO) > pwrkey_table[num].adc_val) {
  46. num++;
  47. }
  48. //工具配置了PWRKEY的按键定义?
  49. ptr = get_pwrkey_configure(num);
  50. if (ptr != NULL) {
  51. if (num > 4) {
  52. return NO_KEY;
  53. }
  54. return key_config_table[*(ptr+num)];
  55. }
  56. return pwrkey_table[num].usage_id;
  57. }
  58. AT(.text.bsp.power)
  59. bool pwrkey_get_status(void)
  60. {
  61. u32 delay = 20;
  62. u32 pre_sta = 0;
  63. u32 sta_cnt = 0;
  64. while(delay--) {
  65. u32 tmp_sta = (RTCCON & BIT(19));
  66. if(pre_sta == tmp_sta) {
  67. sta_cnt++;
  68. } else {
  69. pre_sta = tmp_sta;
  70. sta_cnt = 0;
  71. }
  72. delay_ms(1);
  73. if(sta_cnt > 4) {
  74. break;
  75. }
  76. }
  77. return (pre_sta == 0)? true : false;
  78. }
  79. #endif