yc11xx_ks.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include "yc11xx_ks.h"
  2. #include "yc11xx_gpio.h"
  3. #define KS_KEY_MAP_LEN 158
  4. #define KS_SEL_MAP_LEN 20
  5. #define KS_RAW_MAX 8
  6. #define KB_KSCAN_COL_NUM 20
  7. #define KB_KSCAN_ROW_NUM 7
  8. #define KB_DELAY_COUNT 5
  9. #define GET_RAW_KEY_SEL(y, n) HWRITE(CORE_GPIO_CONF + n, GPCFG_OUTPUT_LOW); \
  10. hw_delay();\
  11. y = ~ HREAD(CORE_GPIO_IN); \
  12. hw_delay();\
  13. HWRITE(CORE_GPIO_CONF + n, GPCFG_PULLUP);\
  14. hw_delay();
  15. tKSEVENT ksEvtPool = {0};
  16. uint8_t *ksMap;
  17. uint8_t kscurrmult;
  18. uint8_t ksSelMapOld[KS_SEL_MAP_LEN] = {0};
  19. uint8_t ksSelMapCheck[KS_SEL_MAP_LEN] = {0};
  20. uint8_t ksSelMapCurr[KS_SEL_MAP_LEN] = {0};
  21. uint8_t *col;
  22. uint8_t ghost = 0;
  23. uint8_t gRowSize = 0;
  24. uint8_t gColSize = 0;
  25. #define MAX(a,b) ((a)>(b)?(a):(b))
  26. static uint8_t bit_count(uint8_t v)
  27. {
  28. unsigned char c;
  29. for (c = 0; v; c++) {
  30. v &= v - 1;
  31. }
  32. return c;
  33. }
  34. static void keyIn(uint8_t key)
  35. {
  36. uint8_t i = 0;
  37. for (i=0 ; i<KS_BUFF_POLL_LEN ; i++) {
  38. if (ksEvtPool.ksPool[i] == key)
  39. break;
  40. if (ksEvtPool.ksPool[i] == 0) {
  41. ksEvtPool.ksPool[i] = key;
  42. break;
  43. }
  44. }
  45. }
  46. static void keyOut(uint8_t key)
  47. {
  48. uint8_t i = 0 ;
  49. uint8_t found = 0;
  50. for (i=0 ; i<KS_BUFF_POLL_LEN ; i++) {
  51. if (found == 0) {
  52. if (ksEvtPool.ksPool[i] == key) {
  53. if (i == KS_BUFF_POLL_LEN-1) {
  54. ksEvtPool.ksPool[i] = 0;
  55. }
  56. found = 1;
  57. }
  58. }
  59. else {
  60. ksEvtPool.ksPool[i-1] = ksEvtPool.ksPool[i];
  61. if (ksEvtPool.ksPool[i] == 0)
  62. break;
  63. if (i == KS_BUFF_POLL_LEN-1) {
  64. ksEvtPool.ksPool[i] = 0;
  65. }
  66. }
  67. }
  68. }
  69. static void ksRawInitialize(uint8_t RowSize)
  70. {
  71. uint8_t i = 0;
  72. for (i=0; i<RowSize; i++) {
  73. GPIO_SetInput(i, 0);
  74. }
  75. }
  76. static void ksColInitialize(uint8_t Col[],
  77. uint8_t ColSize)
  78. {
  79. uint8_t i = 0;
  80. for (i=0; i < ColSize; i++) {
  81. GPIO_SetInput(col[i], 0);
  82. }
  83. }
  84. void KS_Initialize(uint8_t Col[],
  85. uint8_t RowSize,
  86. uint8_t ColSize,
  87. uint8_t KsData[])
  88. {
  89. _ASSERT(RowSize <= KS_RAW_MAX);
  90. _ASSERT(ColSize <= KS_SEL_MAP_LEN);
  91. ksMap = KsData;
  92. col = Col;
  93. gRowSize = RowSize;
  94. gColSize = ColSize;
  95. ksRawInitialize(RowSize);
  96. ksColInitialize(Col, ColSize);
  97. }
  98. /*
  99. void KS_Unistall()
  100. {
  101. uint8_t i = 0;
  102. uint8_t temp = 0;
  103. uint8_t tgroup = 0;
  104. uint8_t tgpionum = 0;
  105. for (i=0; col[i]!=0; i++) {
  106. tgroup = col[i] >> 3;
  107. tgpionum = 1 << (col[i] & 7);
  108. REG_GPIO_PUP (tgroup) &= ~tgpionum;
  109. REG_GPIO_OE(tgroup) |= tgpionum;
  110. REG_GPIO_OUT(tgroup) &= ~tgpionum;
  111. }
  112. temp = REG_GPIO_IN(0);
  113. YC_GPIOWakeupL[0] = temp;
  114. YC_GPIOWakeupH[0] = ~temp;
  115. }
  116. */
  117. void KS_ScanMatrix()
  118. {
  119. uint8_t i = 0;
  120. uint8_t j = 0;
  121. uint8_t temp = 0;
  122. uint8_t check = 0;
  123. uint8_t rawSel = 0;
  124. for (i=0; i<gColSize; i++) {
  125. GET_RAW_KEY_SEL(ksSelMapCurr[i], col[i]);
  126. }
  127. return;
  128. for (i=0; i<gColSize; i++) {
  129. GET_RAW_KEY_SEL(ksSelMapCheck[i], col[i]);
  130. }
  131. for (i=0; i<gColSize; i++) {
  132. if (ksSelMapCheck[i]!=ksSelMapCurr[i]) {
  133. ksSelMapCurr[i] &= ksSelMapCheck[i];
  134. }
  135. }
  136. }
  137. tKSEVENT *KS_GetCurrentEvt()
  138. {
  139. //
  140. uint8_t i = 0;
  141. uint8_t j = 0;
  142. uint8_t temp = 0;
  143. uint8_t flag = 0;
  144. uint8_t offset = 0;
  145. uint8_t state = 0;
  146. uint8_t colCounttemp = 0;
  147. uint8_t rawSel =0;
  148. uint8_t keyCounttemp = 0;
  149. uint8_t rawCount = 0;
  150. uint8_t colCount = 0;
  151. uint8_t keyCount = 0;
  152. uint8_t keyinCount = 0;
  153. uint8_t keyoutCount = 0;
  154. KS_ScanMatrix();
  155. for (i=0; i<gColSize; i++) {
  156. temp = ksSelMapCurr[i];
  157. if (temp!=0) {
  158. colCounttemp++;
  159. rawSel = temp|rawSel;
  160. keyCounttemp += bit_count(temp);
  161. }
  162. }
  163. keyCount = keyCounttemp;
  164. colCount = colCounttemp;
  165. rawCount = bit_count(rawSel);
  166. if (keyCount >2 && keyCount > MAX(colCount, rawCount)) {
  167. ghost = 1;
  168. }
  169. else {
  170. ghost = 0;
  171. }
  172. for (i=0; i<gColSize; i++) {
  173. temp = ksSelMapCurr[i] ^ ksSelMapOld[i];
  174. state = ksSelMapCurr[i];
  175. if (temp == 0) {
  176. continue;
  177. }
  178. else {
  179. if (ghost)
  180. return NULL;
  181. ksSelMapOld[i] = ksSelMapCurr[i];
  182. for (j = 0 ; j<gRowSize ; j++) {
  183. if (temp&1) {
  184. offset = i<<3 |j;
  185. if (state & 1) {
  186. keyinCount++;
  187. keyIn(ksMap[offset]);
  188. }
  189. else {
  190. keyoutCount++;
  191. keyOut(ksMap[offset]);
  192. }
  193. }
  194. temp = temp >>1;
  195. state = state>>1;
  196. }
  197. flag = 1;
  198. }
  199. }
  200. if (ksEvtPool.ksPool[0] ==0) {
  201. //scan for same row
  202. }
  203. else {
  204. //scan for same row
  205. }
  206. if (flag) {
  207. return &ksEvtPool;
  208. }
  209. else {
  210. return NULL;
  211. }
  212. }