keycontrol.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #include "core/config.h"
  2. #if CONFIG_KEYSW
  3. #error outdated, 20/11/2020, not compatible with ACM2543, use keycontrol_ll.c instead
  4. #include "drivers/keycontrol/keycontrol.h"
  5. #include "core/gpio.h"
  6. #include "core/csect.h"
  7. #include "core/config_pins.h"
  8. // KeySwitch version SC3v4_UPC2163, SC3v4, v3(UPC2163), NEC
  9. // PLS HEADER (o) (o) (o) (o) (o) (o) | PCB HOLE
  10. // __________ GND VCC | Common Pin
  11. // __________ 64 63 62 61 | LPC1758 Pin
  12. // __________ P0.9 P0.8 P0.7 P0.6 | LPC1758 port
  13. // __________ [1] [2] [3] [4] | Logic Port Desc
  14. // __________ PA0 PA1 PA2 PA3 | STM32L151CB version
  15. static bool KeySwitch_Init();
  16. static bool KeySwitch_SetKeyState( tKeySwitchState_t state );
  17. static bool KeySwitch_GetKeyState( tKeySwitchState_t * pstate );
  18. static bool KeySwitch_GetKeyCode( tKeySwitchCode_t * pcode );
  19. static void KeySwitch_DeInit();
  20. static tKeySwitchState_t keyState = KEYCONTROL_STATE_INVALID;
  21. static tKeySwitchCode_t keyCode = 0;
  22. static bool bInitialized = false;
  23. typedef enum
  24. {
  25. eLLKeySw_StaticPort_1,
  26. eLLKeySw_StaticPort_2,
  27. eLLKeySw_StaticPort_3,
  28. eLLKeySw_StaticPort_4,
  29. }
  30. e_LLKeySwitch_StaticPorts_t;
  31. static void LL_KeySwitch_SetStaticPort( e_LLKeySwitch_StaticPorts_t port, bool state );
  32. const sKeySwitchControl_t KeySwitchHandle =
  33. {
  34. .Init = KeySwitch_Init,
  35. .SetKeyState = KeySwitch_SetKeyState,
  36. .GetKeyState = KeySwitch_GetKeyState,
  37. .GetKeyCode = KeySwitch_GetKeyCode,
  38. .DeInit = KeySwitch_DeInit
  39. };
  40. static bool KeySwitch_Init()
  41. {
  42. DI();
  43. // Configure GPIO pins for KeySwitch control : PA0...PA3
  44. #if CONFIG_PORT__SINGLEPORTINIT
  45. {
  46. GPIO_InitTypeDef GPIO_InitStruct = {0};
  47. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L1|CONFIG_PIN__SWKEYPP_L2|CONFIG_PIN__SWKEYPP_L3|CONFIG_PIN__SWKEYPP_L4;
  48. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  49. GPIO_InitStruct.Pull = GPIO_NOPULL;
  50. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  51. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L1, &GPIO_InitStruct);
  52. }
  53. #else
  54. {
  55. GPIO_InitTypeDef GPIO_InitStruct = {0};
  56. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L1;
  57. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  58. GPIO_InitStruct.Pull = GPIO_NOPULL;
  59. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  60. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L1, &GPIO_InitStruct);
  61. }
  62. {
  63. GPIO_InitTypeDef GPIO_InitStruct = {0};
  64. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L2;
  65. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  66. GPIO_InitStruct.Pull = GPIO_NOPULL;
  67. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  68. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L2, &GPIO_InitStruct);
  69. }
  70. {
  71. GPIO_InitTypeDef GPIO_InitStruct = {0};
  72. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L3;
  73. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  74. GPIO_InitStruct.Pull = GPIO_NOPULL;
  75. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  76. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L3, &GPIO_InitStruct);
  77. }
  78. {
  79. GPIO_InitTypeDef GPIO_InitStruct = {0};
  80. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L4;
  81. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  82. GPIO_InitStruct.Pull = GPIO_NOPULL;
  83. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  84. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L4, &GPIO_InitStruct);
  85. }
  86. #endif
  87. bInitialized = true;
  88. EI();
  89. if( ! KeySwitch_SetKeyState( KEYCONTROL_STATE_DEFAULT ) )
  90. {
  91. KeySwitch_DeInit();
  92. return false;
  93. }
  94. return true;
  95. }
  96. static bool KeySwitch_SetKeyState( tKeySwitchState_t state )
  97. {
  98. bool set = true;
  99. DI();
  100. if( !bInitialized )
  101. {
  102. set = false;
  103. }
  104. else
  105. {
  106. switch( state )
  107. {
  108. case KEYCONTROL_STATE_INVALID:
  109. keyState = KEYCONTROL_STATE_INVALID;
  110. break;
  111. case KEYCONTROL_STATE_SHORTALL: keyCode=0x00000340; // Short A / Short B // 0b0000 0000 0000 0000 0000 0011 0100 0000 1101
  112. break;
  113. case KEYCONTROL_STATE_OPENALL: keyCode=0x000003c0; // Open A / Open B // 0b0000 0000 0000 0000 0000 0011 1100 0000 1111
  114. break;
  115. case KEYCONTROL_STATE_LOADALL: keyCode=0x00000080; // Load A / Load B // 0b0000 0000 0000 0000 0000 0000 1000 0000 0010
  116. break;
  117. case KEYCONTROL_STATE_THRUAB: keyCode=0x000002C0; // Thru // 0b0000 0000 0000 0000 0000 0010 1100 0000 1011
  118. break;
  119. case KEYCONTROL_STATE_LDASHALL: keyCode=0x00000140; // Load A / Short B // 0b0000 0000 0000 0000 0000 0001 0100 0000 0101
  120. break;
  121. case KEYCONTROL_STATE_LDBSHALL: keyCode=0x00000300; // Load B / Short A // 0b0000 0000 0000 0000 0000 0011 0000 0000 1100
  122. break;
  123. case KEYCONTROL_STATE_CHECK: keyCode=0x00000240; // Thru Atten // 0b0000 0000 0000 0000 0000 0010 0100 0000 1001
  124. break;
  125. default:
  126. set = false;
  127. }
  128. }
  129. if( set )
  130. {
  131. LL_KeySwitch_SetStaticPort( eLLKeySw_StaticPort_1, (keyCode & (1ul<<6)) );
  132. LL_KeySwitch_SetStaticPort( eLLKeySw_StaticPort_2, (keyCode & (1ul<<7)) );
  133. LL_KeySwitch_SetStaticPort( eLLKeySw_StaticPort_3, (keyCode & (1ul<<8)) );
  134. LL_KeySwitch_SetStaticPort( eLLKeySw_StaticPort_4, (keyCode & (1ul<<9)) );
  135. keyState = state;
  136. }
  137. EI();
  138. return set;
  139. }
  140. static void LL_KeySwitch_SetStaticPort( e_LLKeySwitch_StaticPorts_t port, bool state )
  141. {
  142. switch( port )
  143. {
  144. // LogicPort #1 = PA0
  145. case eLLKeySw_StaticPort_1: HAL_GPIO_WritePin( CONFIG_PORT__SWKEYPP_L1, CONFIG_PIN__SWKEYPP_L1, ((state)?GPIO_PIN_SET:GPIO_PIN_RESET) );
  146. break;
  147. // LogicPort #2 = PA1
  148. case eLLKeySw_StaticPort_2: HAL_GPIO_WritePin( CONFIG_PORT__SWKEYPP_L2, CONFIG_PIN__SWKEYPP_L2, ((state)?GPIO_PIN_SET:GPIO_PIN_RESET) );
  149. break;
  150. // LogicPort #3 = PA2
  151. case eLLKeySw_StaticPort_3: HAL_GPIO_WritePin( CONFIG_PORT__SWKEYPP_L3, CONFIG_PIN__SWKEYPP_L3, ((state)?GPIO_PIN_SET:GPIO_PIN_RESET) );
  152. break;
  153. // LogicPort #4 = PA3
  154. case eLLKeySw_StaticPort_4: HAL_GPIO_WritePin( CONFIG_PORT__SWKEYPP_L4, CONFIG_PIN__SWKEYPP_L4, ((state)?GPIO_PIN_SET:GPIO_PIN_RESET) );
  155. break;
  156. }
  157. }
  158. static bool KeySwitch_GetKeyState( tKeySwitchState_t * pstate )
  159. {
  160. if( pstate )
  161. {
  162. DI();
  163. if( bInitialized )
  164. *pstate = keyState;
  165. else
  166. *pstate = KEYCONTROL_STATE_INVALID;
  167. EI();
  168. return true;
  169. }
  170. return false;
  171. }
  172. static bool KeySwitch_GetKeyCode( tKeySwitchCode_t * pcode )
  173. {
  174. if( pcode )
  175. {
  176. __DI__ *pcode = keyCode; __EI__
  177. return true;
  178. }
  179. return false;
  180. }
  181. static void KeySwitch_DeInit()
  182. {
  183. DI();
  184. bInitialized = false;
  185. #if CONFIG_PORT__SINGLEPORTINIT
  186. {
  187. GPIO_InitTypeDef GPIO_InitStruct = {0};
  188. // Configure GPIO pins for KeySwitch control : PA0...PA3
  189. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L1|CONFIG_PIN__SWKEYPP_L2|CONFIG_PIN__SWKEYPP_L3|CONFIG_PIN__SWKEYPP_L4;
  190. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  191. GPIO_InitStruct.Pull = GPIO_NOPULL;
  192. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  193. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L1, &GPIO_InitStruct);
  194. }
  195. #else
  196. {
  197. GPIO_InitTypeDef GPIO_InitStruct = {0};
  198. // Configure GPIO pins for KeySwitch control : PA0...PA3
  199. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L1;
  200. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  201. GPIO_InitStruct.Pull = GPIO_NOPULL;
  202. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  203. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L1, &GPIO_InitStruct);
  204. }
  205. {
  206. GPIO_InitTypeDef GPIO_InitStruct = {0};
  207. // Configure GPIO pins for KeySwitch control : PA0...PA3
  208. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L2;
  209. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  210. GPIO_InitStruct.Pull = GPIO_NOPULL;
  211. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  212. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L2, &GPIO_InitStruct);
  213. }
  214. {
  215. GPIO_InitTypeDef GPIO_InitStruct = {0};
  216. // Configure GPIO pins for KeySwitch control : PA0...PA3
  217. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L3;
  218. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  219. GPIO_InitStruct.Pull = GPIO_NOPULL;
  220. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  221. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L3, &GPIO_InitStruct);
  222. }
  223. {
  224. GPIO_InitTypeDef GPIO_InitStruct = {0};
  225. // Configure GPIO pins for KeySwitch control : PA0...PA3
  226. GPIO_InitStruct.Pin = CONFIG_PIN__SWKEYPP_L4;
  227. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  228. GPIO_InitStruct.Pull = GPIO_NOPULL;
  229. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  230. HAL_GPIO_Init(CONFIG_PORT__SWKEYPP_L4, &GPIO_InitStruct);
  231. }
  232. #endif
  233. EI();
  234. }
  235. #endif