adkey.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "include.h"
  2. #if USER_ADKEY_MUX_SDCLK
  3. typedef struct {
  4. uint8_t sdclk_val;
  5. uint8_t sdclk_convert : 1, //ADC转换标志
  6. sdclk_valid : 1; //ADC转换数据有效
  7. } adkey_t;
  8. static adkey_t adkey;
  9. #endif
  10. void adkey_init(void)
  11. {
  12. uint16_t adc_ch = 0;
  13. #if USER_ADKEY
  14. if (xcfg_cb.user_adkey_en) {
  15. adc_ch |= BIT(ADKEY_CH);
  16. #if ADKEY_PU10K_EN
  17. adcch_io_pu10k_enable(ADKEY_CH); //开内部10K上拉
  18. #endif // ADKEY_PU10K_EN
  19. }
  20. #endif // USER_ADKEY
  21. #if USER_ADKEY2
  22. if (xcfg_cb.user_adkey2_en) {
  23. adc_ch |= BIT(ADKEY2_CH);
  24. }
  25. #endif // USER_ADKEY2
  26. #if USER_ADKEY_MUX_SDCLK
  27. if (xcfg_cb.user_adkey_mux_sdclk_en) {
  28. adc_ch |= BIT(SDCLK_AD_CH);
  29. }
  30. memset(&adkey, 0x00, sizeof(adkey));
  31. #endif // USER_ADKEY_MUX_SDCLK
  32. #if USER_NTC
  33. if (xcfg_cb.ntc_user_inner_pu) {
  34. adcch_io_pu10k_enable(ADCCH_NTC); //开内部10K上拉
  35. }
  36. if (xcfg_cb.ntc_en) {
  37. adc_ch |= BIT(ADCCH_NTC);
  38. }
  39. #endif
  40. saradc_set_channel(adc_ch);
  41. }
  42. #if (USER_ADKEY || USER_ADKEY_MUX_SDCLK)
  43. AT(.com_text.port.key)
  44. static uint8_t adkey_get_key_do(uint8_t key_val)
  45. {
  46. uint8_t num = 0;
  47. uint8_t *ptr;
  48. // printf("%s adkey_val:0x%x\n",__func__,key_val);
  49. while (key_val > adkey_table[num].adc_val) {
  50. num++;
  51. }
  52. //工具配置了第一组ADKEY的按键定义?
  53. ptr = get_adkey_configure(num);
  54. if (ptr != NULL) {
  55. if ((num > 11) || (adkey_table[num].adc_val == 0xff)) {
  56. return NO_KEY;
  57. }
  58. return key_config_table[*(ptr+num)];
  59. }
  60. return adkey_table[num].usage_id;
  61. }
  62. #endif
  63. #if USER_ADKEY
  64. AT(.com_text.port.adkey)
  65. static uint8_t adkey_get_key(void)
  66. {
  67. return adkey_get_key_do(saradc_get_value8(ADKEY_CH));
  68. }
  69. #endif
  70. #if USER_ADKEY2
  71. AT(.com_text.port.key)
  72. static uint8_t adkey2_get_key(void)
  73. {
  74. uint8_t num = 0;
  75. uint8_t *ptr;
  76. //配置工具是否使能了第二组ADKEY2?
  77. if (!xcfg_cb.user_adkey2_en) {
  78. return NO_KEY;
  79. }
  80. while (saradc_get_value8(ADKEY2_CH) > adkey2_table[num].adc_val) {
  81. num++;
  82. }
  83. return adkey2_table[num].usage_id;
  84. }
  85. #endif // USER_ADKEY2
  86. #if USER_ADKEY_MUX_SDCLK
  87. AT(.com_text.key.adkey)
  88. void adkey_mux_convert_done(void)
  89. {
  90. if (xcfg_cb.user_adkey_mux_sdclk_en) {
  91. if (adkey.sdclk_convert) {
  92. adkey.sdclk_valid = 1;
  93. } else {
  94. adkey.sdclk_valid = 0;
  95. }
  96. if (sdcard_detect_is_busy()) {
  97. saradc_clr_channel(BIT(SDCLK_AD_CH));
  98. adkey.sdclk_convert = 0;
  99. } else {
  100. saradc_set_channel(BIT(SDCLK_AD_CH));
  101. adkey.sdclk_convert = 1;
  102. }
  103. }
  104. }
  105. AT(.com_text.port.key)
  106. void adkey_mux_sdclk_w4_convert(void)
  107. {
  108. if ((xcfg_cb.user_adkey_mux_sdclk_en) && (adkey.sdclk_convert)) {
  109. while (!saradc_is_finish()) {
  110. WDT_CLR();
  111. }
  112. }
  113. }
  114. AT(.com_text.port.adkey)
  115. static uint8_t adkey_mux_get_key(void)
  116. {
  117. if (!adkey.sdclk_valid) {
  118. return NO_KEY;
  119. }
  120. return adkey_get_key_do(saradc_get_value8(SDCLK_AD_CH));
  121. }
  122. #endif // USER_ADKEY_MUX_SDCLK
  123. AT(.com_text.adkey.get)
  124. uint8_t adkey_get_val(void)
  125. {
  126. uint8_t key_val = NO_KEY;
  127. #if USER_ADKEY
  128. if (key_val == NO_KEY && xcfg_cb.user_adkey_en) {
  129. key_val = adkey_get_key();
  130. }
  131. #endif // USER_ADKEY
  132. #if USER_ADKEY2
  133. if (key_val == NO_KEY) {
  134. key_val = adkey2_get_key();
  135. }
  136. #endif // USER_ADKEY2
  137. #if USER_ADKEY_MUX_SDCLK
  138. //需要放到最后处理,当没进行adc convert需要返回
  139. if (key_val == NO_KEY && xcfg_cb.user_adkey_mux_sdclk_en) {
  140. key_val = adkey_mux_get_key();
  141. }
  142. #endif // USER_ADKEY_MUX_SDCLK
  143. return key_val;
  144. }