driver_touch_key.h 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /**
  2. ******************************************************************************************************************************
  3. *
  4. *@file driver_touch_key.h
  5. *
  6. *@brief Header file for Touch Key Driver
  7. *
  8. *@Create date: 2023-03-23
  9. *
  10. *
  11. *Copyright (c) 2023, BLUETRUM
  12. ******************************************************************************************************************************
  13. **/
  14. #ifndef _TOUCH_KEY_H_
  15. #define _TOUCH_KEY_H_
  16. #ifdef __cpluscplus
  17. extern "C" {
  18. #endif
  19. /*
  20. * INCLUDE FILES
  21. ***************************************************************************
  22. */
  23. #include "driver_com.h"
  24. /*
  25. * VARIABLE DEFINITION
  26. ***************************************************************************
  27. */
  28. #define SUPPORT_TOUCH_KEY_NUM 4
  29. typedef struct {
  30. u16 cdpr;
  31. u8 type; //0: disable channel, 1: touch key channel, 2: touch ear channel
  32. u8 ctrim; //cur channel ctrim select
  33. u8 itrim; //cur channel itrim select
  34. u16 tkpthd; // TK Press Threshold
  35. u16 tkrthd; // TK Release Threshold
  36. } tkey_ch_t;
  37. typedef struct {
  38. const tkey_ch_t *key[SUPPORT_TOUCH_KEY_NUM];
  39. union {
  40. struct {
  41. u32 fil_low : 4; //touch key state low state filter length, fil_low + 1
  42. u32 fil_high : 4; //touch key state high state filter length, fil_high + 1
  43. u32 fil_except : 8; //touch key state exception filter length, fil_except + 1
  44. u32 fil_val : 4; //touch key base_cnt valid filter length, fil_val + 1
  45. u32 to_except : 12; //touch key state high timeout length
  46. };
  47. u32 reg_tktmr;
  48. };
  49. union {
  50. struct {
  51. u32 tkpthd : 12; //touch key press threshold
  52. u32 resv0 : 4;
  53. u32 tkrthd : 12; //touch key release threshold
  54. u32 pto_except : 4; //touch key press time out length. (pto_except << 8)
  55. };
  56. u32 reg_tkpthd;
  57. };
  58. union {
  59. struct {
  60. u32 tksthd : 12; //touch key smaller threshold
  61. u32 resv1 : 4;
  62. u32 tklthd : 12; //touch key larger threshold
  63. u32 resv2 : 4;
  64. };
  65. u32 reg_tkethd;
  66. };
  67. union {
  68. struct {
  69. u32 tkvthd : 16; //touch key variance threshold
  70. u32 val : 16; //touch key variance
  71. };
  72. u32 reg_tkvari;
  73. };
  74. union {
  75. struct {
  76. u32 tkarthd : 12; //touch key average range threshold
  77. u32 tkaethd : 4; //touch key average equal threshold
  78. u32 tkvfil : 8; //touch key variance filter count
  79. u32 tkbadd : 8; //touch key base counter adder value
  80. };
  81. u32 reg_tkvarithd;
  82. };
  83. union {
  84. struct {
  85. u32 press_vari_en : 1; //press variance enable bit
  86. u32 rels_vari_en : 1; //release variance enable bit
  87. u32 press_fil_sel : 1; //press variance after filter
  88. u32 rels_fil_sel : 1; //release variance after filter
  89. u32 press_vari_thd : 12; //press variance threshold
  90. u32 rels_vari_thd : 12; //release variance threshold
  91. u32 to_bcnt_thd : 4; //time out base counter threshold
  92. };
  93. u32 reg_tkcon2;
  94. };
  95. //in ear
  96. union {
  97. struct {
  98. u32 ear_fil_low : 4;
  99. u32 ear_fil_high : 4;
  100. u32 ear_fil_except : 8;
  101. u32 ear_fil_val : 4;
  102. u32 tkpwup : 6;
  103. };
  104. u32 reg_tetmr;
  105. };
  106. union {
  107. struct {
  108. u32 tepthd : 12; //touch ear press threshold
  109. u32 resv3 : 4;
  110. u32 terthd : 12; //touch ear release threshold
  111. u32 tefathd : 4;
  112. };
  113. u32 reg_tepthd;
  114. };
  115. union {
  116. struct {
  117. u32 testhd : 12; //touch ear smaller threshold
  118. u32 resv5 : 4;
  119. u32 telthd : 12; //touch ear larger threshold
  120. u32 resv6 : 4;
  121. };
  122. u32 reg_teethd;
  123. };
  124. } tkey_cfg_t;
  125. typedef struct {
  126. u8 ch; //channel index
  127. u8 cnt;
  128. u8 limit; //方差阈值
  129. u8 stable_cnt;
  130. u8 te_flag; //是否为入耳检测
  131. u8 range_thresh; //rang校准的上限阈值
  132. u16 avg; //平均值
  133. u16 buf[8];
  134. u32 anov_cnt; //满足方差条件计数
  135. psfr_t bcnt_sfr; //BCNT寄存器
  136. u8 fil_except;
  137. u8 range_en;
  138. u16 temp_tkcnt;
  139. u32 tick;
  140. u16 to_cnt; //定时校准时间
  141. u8 resv[6];
  142. u8 touch_key_sta[SUPPORT_TOUCH_KEY_NUM];
  143. } tk_cb_t;
  144. /*
  145. * REGISTER DEFINITION
  146. ***************************************************************************
  147. */
  148. // Touch Key Control Register 0
  149. #define ADDR_REG_TKCON *(volatile unsigned long*) (SFR10_BASE + 0x02*4)
  150. // Touch Key base_cnt Valid
  151. #define POS_REG_TKCON_TKBCNTVAL 27
  152. #define BIT_REG_TKCON_TKBCNTVAL 0x8000000
  153. #define SETF_REG_TKCON_TKBCNTVAL() ADDR_REG_TKCON |= BIT_REG_TKCON_TKBCNTVAL
  154. #define CLRF_REG_TKCON_TKBCNTVAL() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKBCNTVAL
  155. #define GETF_REG_TKCON_TKBCNTVAL() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKBCNTVAL) >> POS_REG_TKCON_TKBCNTVAL)
  156. // Touch Key Timeout Pending Update base_cnt Enable
  157. #define POS_REG_TKCON_TKTOUPDBEN 26
  158. #define BIT_REG_TKCON_TKTOUPDBEN 0x4000000
  159. #define SETF_REG_TKCON_TKTOUPDBEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKTOUPDBEN
  160. #define CLRF_REG_TKCON_TKTOUPDBEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKTOUPDBEN
  161. #define GETF_REG_TKCON_TKTOUPDBEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKTOUPDBEN) >> POS_REG_TKCON_TKTOUPDBEN)
  162. // Touch Key Range Pending Update base_cnt Enable
  163. #define POS_REG_TKCON_TKRUPDBEN 25
  164. #define BIT_REG_TKCON_TKRUPDBEN 0x2000000
  165. #define SETF_REG_TKCON_TKRUPDBEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKRUPDBEN
  166. #define CLRF_REG_TKCON_TKRUPDBEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKRUPDBEN
  167. #define GETF_REG_TKCON_TKRUPDBEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKRUPDBEN) >> POS_REG_TKCON_TKRUPDBEN)
  168. // Touch Key Large Pending Update base_cnt Enable
  169. #define POS_REG_TKCON_TKLUPDBEN 24
  170. #define BIT_REG_TKCON_TKLUPDBEN 0x1000000
  171. #define SETF_REG_TKCON_TKLUPDBEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKLUPDBEN
  172. #define CLRF_REG_TKCON_TKLUPDBEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKLUPDBEN
  173. #define GETF_REG_TKCON_TKLUPDBEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKLUPDBEN) >> POS_REG_TKCON_TKLUPDBEN)
  174. // Touch Key Small Pending Update base_cnt Enable
  175. #define POS_REG_TKCON_TKSUPDBEN 23
  176. #define BIT_REG_TKCON_TKSUPDBEN 0x800000
  177. #define SETF_REG_TKCON_TKSUPDBEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKSUPDBEN
  178. #define CLRF_REG_TKCON_TKSUPDBEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKSUPDBEN
  179. #define GETF_REG_TKCON_TKSUPDBEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKSUPDBEN) >> POS_REG_TKCON_TKSUPDBEN)
  180. // Touch Key State Wakeup Enable
  181. #define POS_REG_TKCON_TKSTAWKEN 21
  182. #define BIT_REG_TKCON_TKSTAWKEN 0x200000
  183. #define SETF_REG_TKCON_TKSTAWKEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKSTAWKEN
  184. #define CLRF_REG_TKCON_TKSTAWKEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKSTAWKEN
  185. #define GETF_REG_TKCON_TKSTAWKEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKSTAWKEN) >> POS_REG_TKCON_TKSTAWKEN)
  186. // Touch Key Pending Wakeup Enable
  187. #define POS_REG_TKCON_TKPNDWKEN 20
  188. #define BIT_REG_TKCON_TKPNDWKEN 0x100000
  189. #define SETF_REG_TKCON_TKPNDWKEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKPNDWKEN
  190. #define CLRF_REG_TKCON_TKPNDWKEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKPNDWKEN
  191. #define GETF_REG_TKCON_TKPNDWKEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKPNDWKEN) >> POS_REG_TKCON_TKPNDWKEN)
  192. // Touch Key Press Timeout Pending Update base_cnt Enable
  193. #define POS_REG_TKCON_TKPTOUPDBEN 19
  194. #define BIT_REG_TKCON_TKPTOUPDBEN 0x80000
  195. #define SETF_REG_TKCON_TKPTOUPDBEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKPTOUPDBEN
  196. #define CLRF_REG_TKCON_TKPTOUPDBEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKPTOUPDBEN
  197. #define GETF_REG_TKCON_TKPTOUPDBEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKPTOUPDBEN) >> POS_REG_TKCON_TKPTOUPDBEN)
  198. // Touch Key Mode Select
  199. #define POS_REG_TKCON_TK_MODE 18
  200. #define BIT_REG_TKCON_TK_MODE 0x40000
  201. #define SETF_REG_TKCON_TK_MODE() ADDR_REG_TKCON |= BIT_REG_TKCON_TK_MODE
  202. #define CLRF_REG_TKCON_TK_MODE() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TK_MODE
  203. #define GETF_REG_TKCON_TK_MODE() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK_MODE) >> POS_REG_TKCON_TK_MODE)
  204. // Touch Key Software Control Select
  205. #define POS_REG_TKCON_TKSWSEL 17
  206. #define BIT_REG_TKCON_TKSWSEL 0x20000
  207. #define SETF_REG_TKCON_TKSWSEL() ADDR_REG_TKCON |= BIT_REG_TKCON_TKSWSEL
  208. #define CLRF_REG_TKCON_TKSWSEL() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKSWSEL
  209. #define GETF_REG_TKCON_TKSWSEL() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKSWSEL) >> POS_REG_TKCON_TKSWSEL)
  210. // Touch Key Analog Fix Channel Enable
  211. #define POS_REG_TKCON_TKCH_FIX 16
  212. #define BIT_REG_TKCON_TKCH_FIX 0x10000
  213. #define SETF_REG_TKCON_TKCH_FIX() ADDR_REG_TKCON |= BIT_REG_TKCON_TKCH_FIX
  214. #define CLRF_REG_TKCON_TKCH_FIX() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKCH_FIX
  215. #define GETF_REG_TKCON_TKCH_FIX() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKCH_FIX) >> POS_REG_TKCON_TKCH_FIX)
  216. // Touch Key Analog Reset Disable
  217. #define POS_REG_TKCON_TKRST_DIS 15
  218. #define BIT_REG_TKCON_TKRST_DIS 0x8000
  219. #define SETF_REG_TKCON_TKRST_DIS() ADDR_REG_TKCON |= BIT_REG_TKCON_TKRST_DIS
  220. #define CLRF_REG_TKCON_TKRST_DIS() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKRST_DIS
  221. #define GETF_REG_TKCON_TKRST_DIS() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKRST_DIS) >> POS_REG_TKCON_TKRST_DIS)
  222. // Touch Key Analog Hardware Auto Enable Select
  223. #define POS_REG_TKCON_TKAEN_ATSEL 14
  224. #define BIT_REG_TKCON_TKAEN_ATSEL 0x4000
  225. #define SETF_REG_TKCON_TKAEN_ATSEL() ADDR_REG_TKCON |= BIT_REG_TKCON_TKAEN_ATSEL
  226. #define CLRF_REG_TKCON_TKAEN_ATSEL() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKAEN_ATSEL
  227. #define GETF_REG_TKCON_TKAEN_ATSEL() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKAEN_ATSEL) >> POS_REG_TKCON_TKAEN_ATSEL)
  228. // Touch Key Internal Channel 3 Enable
  229. #define POS_REG_TKCON_TK3_EN 13
  230. #define BIT_REG_TKCON_TK3_EN 0x2000
  231. #define SETF_REG_TKCON_TK3_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK3_EN
  232. #define CLRF_REG_TKCON_TK3_EN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TK3_EN
  233. #define GETF_REG_TKCON_TK3_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK3_EN) >> POS_REG_TKCON_TK3_EN)
  234. // Touch Key Internal Channel 2 Enable
  235. #define POS_REG_TKCON_TK2_EN 12
  236. #define BIT_REG_TKCON_TK2_EN 0x1000
  237. #define SETF_REG_TKCON_TK2_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK2_EN
  238. #define CLRF_REG_TKCON_TK2_EN() ADDR_REG_TKCON &=~BIT_REG_TKCON_TK2_EN
  239. #define GETF_REG_TKCON_TK2_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK2_EN) >> POS_REG_TKCON_TK2_EN)
  240. // Touch Key Internal Channel 1 Enable
  241. #define POS_REG_TKCON_TK1_EN 11
  242. #define BIT_REG_TKCON_TK1_EN 0x800
  243. #define SETF_REG_TKCON_TK1_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK1_EN
  244. #define CLRF_REG_TKCON_TK1_EN() ADDR_REG_TKCON &=~BIT_REG_TKCON_TK1_EN
  245. #define GETF_REG_TKCON_TK1_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK1_EN) >> POS_REG_TKCON_TK1_EN)
  246. // Touch Key Internal Channel 0 Enable
  247. #define POS_REG_TKCON_TK0_EN 10
  248. #define BIT_REG_TKCON_TK0_EN 0x400
  249. #define SETF_REG_TKCON_TK0_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK0_EN
  250. #define CLRF_REG_TKCON_TK0_EN() ADDR_REG_TKCON &=~BIT_REG_TKCON_TK0_EN
  251. #define GETF_REG_TKCON_TK0_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK0_EN) >> POS_REG_TKCON_TK0_EN)
  252. // Touch Key 3 Pending Enable
  253. #define POS_REG_TKCON_TK3_PND_EN 9
  254. #define BIT_REG_TKCON_TK3_PND_EN 0x200
  255. #define SETF_REG_TKCON_TK3_PND_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK3_PND_EN
  256. #define CLRF_REG_TKCON_TK3_PND_EN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TK3_PND_EN
  257. #define GETF_REG_TKCON_TK3_PND_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK3_PND_EN) >> POS_REG_TKCON_TK3_PND_EN)
  258. // Touch Key 2 Pending Enable
  259. #define POS_REG_TKCON_TK2_PND_EN 8
  260. #define BIT_REG_TKCON_TK2_PND_EN 0x100
  261. #define SETF_REG_TKCON_TK2_PND_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK2_PND_EN
  262. #define CLRF_REG_TKCON_TK2_PND_EN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TK2_PND_EN
  263. #define GETF_REG_TKCON_TK2_PND_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK2_PND_EN) >> POS_REG_TKCON_TK2_PND_EN)
  264. // Touch Key 1 Pending Enable
  265. #define POS_REG_TKCON_TK1_PND_EN 7
  266. #define BIT_REG_TKCON_TK1_PND_EN 0x80
  267. #define SETF_REG_TKCON_TK1_PND_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK1_PND_EN
  268. #define CLRF_REG_TKCON_TK1_PND_EN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TK1_PND_EN
  269. #define GETF_REG_TKCON_TK1_PND_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK1_PND_EN) >> POS_REG_TKCON_TK1_PND_EN)
  270. // Touch Key 0 Pending Enable
  271. #define POS_REG_TKCON_TK0_PND_EN 6
  272. #define BIT_REG_TKCON_TK0_PND_EN 0x40
  273. #define SETF_REG_TKCON_TK0_PND_EN() ADDR_REG_TKCON |= BIT_REG_TKCON_TK0_PND_EN
  274. #define CLRF_REG_TKCON_TK0_PND_EN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TK0_PND_EN
  275. #define GETF_REG_TKCON_TK0_PND_EN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TK0_PND_EN) >> POS_REG_TKCON_TK0_PND_EN)
  276. // Touch Key Pin Select
  277. #define POS_REG_TKCON_TKSEL 4
  278. #define BIT_REG_TKCON_TKSEL 0x30
  279. #define SET_REG_TKCON_TKSEL(val) ADDR_REG_TKCON = ((ADDR_REG_TKCON & (~BIT_REG_TKCON_TKSEL)) | ((val) << POS_REG_TKCON_TKSEL))
  280. #define GET_REG_TKCON_TKSEL() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKSEL) >> POS_REG_TKCON_TKSEL)
  281. // Touch Key Or Touch Ear New base_cnt Select BIT For Small Update
  282. #define POS_REG_TKCON_BCNTSEL 1
  283. #define BIT_REG_TKCON_BCNTSEL 0x2
  284. #define SETF_REG_TKCON_BCNTSEL() ADDR_REG_TKCON |= BIT_REG_TKCON_BCNTSEL
  285. #define CLRF_REG_TKCON_BCNTSEL() ADDR_REG_TKCON &= ~BIT_REG_TKCON_BCNTSEL
  286. #define GETF_REG_TKCON_BCNTSEL() ((ADDR_REG_TKCON & BIT_REG_TKCON_BCNTSEL) >> POS_REG_TKCON_BCNTSEL)
  287. // Touch Key Enable
  288. #define POS_REG_TKCON_TKEN 0
  289. #define BIT_REG_TKCON_TKEN 0x1
  290. #define SETF_REG_TKCON_TKEN() ADDR_REG_TKCON |= BIT_REG_TKCON_TKEN
  291. #define CLRF_REG_TKCON_TKEN() ADDR_REG_TKCON &= ~BIT_REG_TKCON_TKEN
  292. #define GETF_REG_TKCON_TKEN() ((ADDR_REG_TKCON & BIT_REG_TKCON_TKEN) >> POS_REG_TKCON_TKEN)
  293. // Touch Key Control Register 1
  294. #define ADDR_REG_TKCON1 *(volatile unsigned long*) (SFR10_BASE + 0x03*4)
  295. // Touch Key CLK2M Divide 2 Select
  296. #define POS_REG_TKCON1_DIV2SEL 25
  297. #define BIT_REG_TKCON1_DIV2SEL 0x2000000
  298. #define SETF_REG_TKCON1_DIV2SEL() ADDR_REG_TKCON1 |= BIT_REG_TKCON1_DIV2SEL
  299. #define CLRF_REG_TKCON1_DIV2SEL() ADDR_REG_TKCON1 &= ~BIT_REG_TKCON1_DIV2SEL
  300. #define GETF_REG_TKCON1_DIV2SEL() ((ADDR_REG_TKCON1 & BIT_REG_TKCON1_DIV2SEL) >> POS_REG_TKCON1_DIV2SEL)
  301. // Touch Key Clock Enable
  302. #define POS_REG_TKCON1_TKCEN 23
  303. #define BIT_REG_TKCON1_TKCEN 0x800000
  304. #define SETF_REG_TKCON1_TKCEN() ADDR_REG_TKCON1 |= BIT_REG_TKCON1_TKCEN
  305. #define CLRF_REG_TKCON1_TKCEN() ADDR_REG_TKCON1 &= ~BIT_REG_TKCON1_TKCEN
  306. #define GETF_REG_TKCON1_TKCEN() ((ADDR_REG_TKCON1 & BIT_REG_TKCON1_TKCEN) >> POS_REG_TKCON1_TKCEN)
  307. // Touch Key Variance Clock Enable
  308. #define POS_REG_TKCON1_TKVCEN 22
  309. #define BIT_REG_TKCON1_TKVCEN 0x400000
  310. #define SETF_REG_TKCON1_TKVCEN() ADDR_REG_TKCON1 |= BIT_REG_TKCON1_TKVCEN
  311. #define CLRF_REG_TKCON1_TKVCEN() ADDR_REG_TKCON1 &= ~BIT_REG_TKCON1_TKVCEN
  312. #define GETF_REG_TKCON1_TKVCEN() ((ADDR_REG_TKCON1 & BIT_REG_TKCON1_TKVCEN) >> POS_REG_TKCON1_TKVCEN)
  313. // Touch Key Each Channel Time. Counter Clock Is 256 Divider From CLK2M.
  314. #define POS_REG_TKCON1_TKCLK2MDIV 16
  315. #define BIT_REG_TKCON1_TKCLK2MDIV 0x1F0000
  316. #define SET_REG_TKCON1_TKCLK2MDIV(val) ADDR_REG_TKCON1 = ((ADDR_REG_TKCON1 & (~BIT_REG_TKCON1_TKCLK2MDIV)) | ((val) << POS_REG_TKCON1_TKCLK2MDIV))
  317. #define GET_REG_TKCON1_TKCLK2MDIV() ((ADDR_REG_TKCON1 & BIT_REG_TKCON1_TKCLK2MDIV) >> POS_REG_TKCON1_TKCLK2MDIV)
  318. // Touch Key Analog Enable
  319. #define POS_REG_TKCON1_TKAEN 13
  320. #define BIT_REG_TKCON1_TKAEN 0x2000
  321. #define SETF_REG_TKCON1_TKAEN() ADDR_REG_TKCON1 |= BIT_REG_TKCON1_TKAEN
  322. #define CLRF_REG_TKCON1_TKAEN() ADDR_REG_TKCON1 &= ~BIT_REG_TKCON1_TKAEN
  323. #define GETF_REG_TKCON1_TKAEN() ((ADDR_REG_TKCON1 & BIT_REG_TKCON1_TKAEN) >> POS_REG_TKCON1_TKAEN)
  324. // Touch Key---Reference to pinlist, TK Reference Voltage Select Bit, 0x00/0x01/0x10/0x11-1.0/1.1/1.2/1.3
  325. #define POS_REG_TKCON1_TKARTRIM 0
  326. #define BIT_REG_TKCON1_TKARTRIM 0x3
  327. #define SET_REG_TKCON1_TKARTRIM(val) ADDR_REG_TKCON1 = ((ADDR_REG_TKCON1 & (~BIT_REG_TKCON1_TKARTRIM)) | ((val) << POS_REG_TKCON1_TKARTRIM))
  328. #define GET_REG_TKCON1_TKARTRIM() ((ADDR_REG_TKCON1 & BIT_REG_TKCON1_TKARTRIM) >> POS_REG_TKCON1_TKARTRIM)
  329. // Touch Key Charge And Discharge Period Register 0, ###Read only
  330. #define ADDR_REG_TKCDPR0 *(volatile unsigned long*) (SFR10_BASE + 0x05*4)
  331. // Touch Key Channel 1 Charge And Discharge Period, Can't Be Longer Than 500Hz
  332. // (TKCDPR + 1) * (One Cycle TKCNT) * (CLK2M_TK Frequency)
  333. #define POS_REG_TKCDPR0_TKCDPR1 16
  334. #define BIT_REG_TKCDPR0_TKCDPR1 0x3FF0000
  335. //#define SET_REG_TKCDPR0_TKCDPR1(val) ADDR_REG_TKCDPR0 = ((ADDR_REG_TKCDPR0 & (~BIT_REG_TKCDPR0_TKCDPR1)) | ((val) << POS_REG_TKCDPR0_TKCDPR1))
  336. //#define GET_REG_TKCDPR0_TKCDPR1() ((ADDR_REG_TKCDPR0 & BIT_REG_TKCDPR0_TKCDPR1) >> POS_REG_TKCDPR0_TKCDPR1)
  337. // Touch Key Channel 0 Charge And Discharge Period, Can't Be Longer Than 500Hz
  338. // (TKCDPR + 1) * (One Cycle TKCNT) * (CLK2M_TK Frequency)
  339. #define POS_REG_TKCDPR0_TKCDPR0 0
  340. #define BIT_REG_TKCDPR0_TKCDPR0 0x3FF
  341. //#define SET_REG_TKCDPR0_TKCDPR0(val) ADDR_REG_TKCDPR0 = ((ADDR_REG_TKCDPR0 & (~BIT_REG_TKCDPR0_TKCDPR0)) | ((val) << POS_REG_TKCDPR0_TKCDPR0))
  342. //#define GET_REG_TKCDPR0_TKCDPR0() ((ADDR_REG_TKCDPR0 & BIT_REG_TKCDPR0_TKCDPR0) >> POS_REG_TKCDPR0_TKCDPR0)
  343. // Touch Key Charge And Discharge Period Register 1, ###Read only
  344. #define ADDR_REG_TKCDPR1 *(volatile unsigned long*) (SFR10_BASE + 0x06*4)
  345. // Touch Key Channel 3 Charge And Discharge Period, Can't Be Longer Than 500Hz
  346. // (TKCDPR + 1) * (One Cycle TKCNT) * (CLK2M_TK Frequency)
  347. #define POS_REG_TKCDPR1_TKCDPR3 16
  348. #define BIT_REG_TKCDPR1_TKCDPR3 0x3FF0000
  349. //#define SET_REG_TKCDPR1_TKCDPR3(val) ADDR_REG_TKCDPR1 = ((ADDR_REG_TKCDPR1 & (~BIT_REG_TKCDPR1_TKCDPR3)) | ((val) << POS_REG_TKCDPR1_TKCDPR3))
  350. //#define GET_REG_TKCDPR1_TKCDPR3() ((ADDR_REG_TKCDPR1 & BIT_REG_TKCDPR1_TKCDPR3) >> POS_REG_TKCDPR1_TKCDPR3)
  351. // Touch Key Channel 2 Charge And Discharge Period, Can't Be Longer Than 500Hz
  352. // (TKCDPR + 1) * (One Cycle TKCNT) * (CLK2M_TK Frequency)
  353. #define POS_REG_TKCDPR1_TKCDPR2 0
  354. #define BIT_REG_TKCDPR1_TKCDPR2 0x3FF
  355. //#define SET_REG_TKCDPR1_TKCDPR2(val) ADDR_REG_TKCDPR1 = ((ADDR_REG_TKCDPR1 & (~BIT_REG_TKCDPR1_TKCDPR2)) | ((val) << POS_REG_TKCDPR1_TKCDPR2))
  356. //#define GET_REG_TKCDPR1_TKCDPR2() ((ADDR_REG_TKCDPR1 & BIT_REG_TKCDPR1_TKCDPR2) >> POS_REG_TKCDPR1_TKCDPR2)
  357. // Touch Key Base Counter Register
  358. #define ADDR_REG_TKBCNT *(volatile unsigned long*) (SFR10_BASE + 0x09*4)
  359. // Touch Key Base Counter Average Value
  360. #define POS_REG_TKBCNT_TKBCNT_AVG 12
  361. #define BIT_REG_TKBCNT_TKBCNT_AVG 0xFFF000
  362. #define SET_REG_TKBCNT_TKBCNT_AVG(val) ADDR_REG_TKBCNT = ((ADDR_REG_TKBCNT & (~BIT_REG_TKBCNT_TKBCNT_AVG)) | ((val) << POS_REG_TKBCNT_TKBCNT_AVG))
  363. #define GET_REG_TKBCNT_TKBCNT_AVG() ((ADDR_REG_TKBCNT & BIT_REG_TKBCNT_TKBCNT_AVG) >> POS_REG_TKBCNT_TKBCNT_AVG)
  364. // Touch Key Base Counter
  365. #define POS_REG_TKBCNT_TKBCNT 0
  366. #define BIT_REG_TKBCNT_TKBCNT 0xFFF
  367. #define SET_REG_TKBCNT_TKBCNT(val) ADDR_REG_TKBCNT = ((ADDR_REG_TKBCNT & (~BIT_REG_TKBCNT_TKBCNT)) | ((val) << POS_REG_TKBCNT_TKBCNT))
  368. #define GET_REG_TKBCNT_TKBCNT() ((ADDR_REG_TKBCNT & BIT_REG_TKBCNT_TKBCNT) >> POS_REG_TKBCNT_TKBCNT)
  369. // Touch Key Press Threshold Register
  370. #define ADDR_REG_TKPTHD *(volatile unsigned long*) (SFR10_BASE + 0x0a*4)
  371. // Touch Key Press Time Out
  372. #define POS_REG_TKPTHD_PTO 28
  373. #define BIT_REG_TKPTHD_PTO 0xF0000000
  374. #define SET_REG_TKPTHD_PTO(val) ADDR_REG_TKPTHD = ((ADDR_REG_TKPTHD & (~BIT_REG_TKPTHD_PTO)) | ((val) << POS_REG_TKPTHD_PTO))
  375. #define GET_REG_TKPTHD_PTO() ((ADDR_REG_TKPTHD & BIT_REG_TKPTHD_PTO) >> POS_REG_TKPTHD_PTO)
  376. // Touch Key Release Thresohld
  377. #define POS_REG_TKPTHD_RTHD 16
  378. #define BIT_REG_TKPTHD_RTHD 0xFFF0000
  379. #define SET_REG_TKPTHD_RTHD(val) ADDR_REG_TKPTHD = ((ADDR_REG_TKPTHD & (~BIT_REG_TKPTHD_RTHD)) | ((val) << POS_REG_TKPTHD_RTHD))
  380. #define GET_REG_TKPTHD_RTHD() ((ADDR_REG_TKPTHD & BIT_REG_TKPTHD_RTHD) >> POS_REG_TKPTHD_RTHD)
  381. // Touch Key Press Thresohld
  382. #define POS_REG_TKPTHD_PTHD 0
  383. #define BIT_REG_TKPTHD_PTHD 0xFFF
  384. #define SET_REG_TKPTHD_PTHD(val) ADDR_REG_TKPTHD = ((ADDR_REG_TKPTHD & (~BIT_REG_TKPTHD_PTHD)) | ((val) << POS_REG_TKPTHD_PTHD))
  385. #define GET_REG_TKPTHD_PTHD() ((ADDR_REG_TKPTHD & BIT_REG_TKPTHD_PTHD) >> POS_REG_TKPTHD_PTHD)
  386. // Touch Key Exception Threshold Register
  387. #define ADDR_REG_TKETHD *(volatile unsigned long*) (SFR10_BASE + 0x0b*4)
  388. // Touch Key Larger Threshold
  389. #define POS_REG_TKETHD_LTHD 16
  390. #define BIT_REG_TKETHD_LTHD 0xFFF0000
  391. #define SET_REG_TKETHD_LTHD(val) ADDR_REG_TKETHD = ((ADDR_REG_TKETHD & (~BIT_REG_TKETHD_LTHD)) | ((val) << POS_REG_TKETHD_LTHD))
  392. #define GET_REG_TKETHD_LTHD() ((ADDR_REG_TKETHD & BIT_REG_TKETHD_LTHD) >> POS_REG_TKETHD_LTHD)
  393. // Touch Key Smaller Threshold
  394. #define POS_REG_TKETHD_STHD 0
  395. #define BIT_REG_TKETHD_STHD 0xFFF
  396. #define SET_REG_TKETHD_STHD(val) ADDR_REG_TKETHD = ((ADDR_REG_TKETHD & (~BIT_REG_TKETHD_STHD)) | ((val) << POS_REG_TKETHD_STHD))
  397. #define GET_REG_TKETHD_STHD() ((ADDR_REG_TKETHD & BIT_REG_TKETHD_STHD) >> POS_REG_TKETHD_STHD)
  398. // Touch Key Analog Control Register 0
  399. #define ADDR_REG_TKACON0 *(volatile unsigned long*) (SFR10_BASE + 0x12*4)
  400. // Touch Key Channel 1 ENCHN
  401. #define POS_REG_TKACON0_ENCHN1 23
  402. #define BIT_REG_TKACON0_ENCHN1 0x800000
  403. #define SETF_REG_TKACON0_ENCHN1() ADDR_REG_TKACON0 |= BIT_REG_TKACON0_ENCHN1
  404. #define CLRF_REG_TKACON0_ENCHN1() ADDR_REG_TKACON0 &= ~BIT_REG_TKACON0_ENCHN1
  405. #define GETF_REG_TKACON0_ENCHN1() ((ADDR_REG_TKACON0 & BIT_REG_TKACON0_ENCHN1) >> POS_REG_TKACON0_ENCHN1)
  406. // Touch Key Channel 1 ITRIM Select, TK Charge Current Select Signal, 3.84u/1.92u/0.96u/0.48u/0.24u
  407. #define POS_REG_TKACON0_ITRIM1 18
  408. #define BIT_REG_TKACON0_ITRIM1 0x7C0000
  409. #define SET_REG_TKACON0_ITRIM1(val) ADDR_REG_TKACON0 = ((ADDR_REG_TKACON0 & (~BIT_REG_TKACON0_ITRIM1)) | ((val) << POS_REG_TKACON0_ITRIM1))
  410. #define GET_REG_TKACON0_ITRIM1() ((ADDR_REG_TKACON0 & BIT_REG_TKACON0_ITRIM1) >> POS_REG_TKACON0_ITRIM1)
  411. // Touch Key Channel 1 CTRIM Select, TK Internal Capacitance Select, 3.2p/1.6p/800f/400f/200f/200f
  412. #define POS_REG_TKACON0_CTRIM1 12
  413. #define BIT_REG_TKACON0_CTRIM1 0x3F000
  414. #define SET_REG_TKACON0_CTRIM1(val) ADDR_REG_TKACON0 = ((ADDR_REG_TKACON0 & (~BIT_REG_TKACON0_CTRIM1)) | ((val) << POS_REG_TKACON0_CTRIM1))
  415. #define GET_REG_TKACON0_CTRIM1() ((ADDR_REG_TKACON0 & BIT_REG_TKACON0_CTRIM1) >> POS_REG_TKACON0_CTRIM1)
  416. // Touch Key Channel 0 ENCHN
  417. #define POS_REG_TKACON0_ENCHN0 11
  418. #define BIT_REG_TKACON0_ENCHN0 0x800
  419. #define SETF_REG_TKACON0_ENCHN0() ADDR_REG_TKACON0 |= BIT_REG_TKACON0_ENCHN0
  420. #define CLRF_REG_TKACON0_ENCHN0() ADDR_REG_TKACON0 &= ~BIT_REG_TKACON0_ENCHN0
  421. #define GETF_REG_TKACON0_ENCHN0() ((ADDR_REG_TKACON0 & BIT_REG_TKACON0_ENCHN0) >> POS_REG_TKACON0_ENCHN0)
  422. // Touch Key Channel 0 ITRIM Select, TK Charge Current Select Signal, 3.84u/1.92u/0.96u/0.48u/0.24u
  423. #define POS_REG_TKACON0_ITRIM0 6
  424. #define BIT_REG_TKACON0_ITRIM0 0x7C0
  425. #define SET_REG_TKACON0_ITRIM0(val) ADDR_REG_TKACON0 = ((ADDR_REG_TKACON0 & (~BIT_REG_TKACON0_ITRIM0)) | ((val) << POS_REG_TKACON0_ITRIM0))
  426. #define GET_REG_TKACON0_ITRIM0() ((ADDR_REG_TKACON0 & BIT_REG_TKACON0_ITRIM0) >> POS_REG_TKACON0_ITRIM0)
  427. // Touch Key Channel 0 CTRIM Select, 3.2p/1.6p/800f/400f/200f/200f
  428. #define POS_REG_TKACON0_CTRIM0 0
  429. #define BIT_REG_TKACON0_CTRIM0 0x3F
  430. #define SET_REG_TKACON0_CTRIM0(val) ADDR_REG_TKACON0 = ((ADDR_REG_TKACON0 & (~BIT_REG_TKACON0_CTRIM0)) | ((val) << POS_REG_TKACON0_CTRIM0))
  431. #define GET_REG_TKACON0_CTRIM0() ((ADDR_REG_TKACON0 & BIT_REG_TKACON0_CTRIM0) >> POS_REG_TKACON0_CTRIM0)
  432. // Touch Key Analog Control Register 1
  433. #define ADDR_REG_TKACON1 *(volatile unsigned long*) (SFR10_BASE + 0x13*4)
  434. // Touch Key Channel 3 ENCHN
  435. #define POS_REG_TKACON1_ENCHN3 23
  436. #define BIT_REG_TKACON1_ENCHN3 0x800000
  437. #define SETF_REG_TKACON1_ENCHN3() ADDR_REG_TKACON1 |= BIT_REG_TKACON1_ENCHN3
  438. #define CLRF_REG_TKACON1_ENCHN3() ADDR_REG_TKACON1 &= ~BIT_REG_TKACON1_ENCHN3
  439. #define GETF_REG_TKACON1_ENCHN3() ((ADDR_REG_TKACON1 & BIT_REG_TKACON1_ENCHN3) >> POS_REG_TKACON1_ENCHN3)
  440. // Touch Key Channel 3 ITRIM Select, TK Charge Current Select Signal, 3.84u/1.92u/0.96u/0.48u/0.24u
  441. #define POS_REG_TKACON1_ITRIM3 18
  442. #define BIT_REG_TKACON1_ITRIM3 0x7C0000
  443. #define SET_REG_TKACON1_ITRIM3(val) ADDR_REG_TKACON1 = ((ADDR_REG_TKACON1 & (~BIT_REG_TKACON1_ITRIM3)) | ((val) << POS_REG_TKACON1_ITRIM3))
  444. #define GET_REG_TKACON1_ITRIM3() ((ADDR_REG_TKACON1 & BIT_REG_TKACON1_ITRIM3) >> POS_REG_TKACON1_ITRIM3)
  445. // Touch Key Channel 3 CTRIM Select, 3.2p/1.6p/800f/400f/200f/200f
  446. #define POS_REG_TKACON1_CTRIM3 12
  447. #define BIT_REG_TKACON1_CTRIM3 0x3F000
  448. #define SET_REG_TKACON1_CTRIM3(val) ADDR_REG_TKACON1 = ((ADDR_REG_TKACON1 & (~BIT_REG_TKACON1_CTRIM3)) | ((val) << POS_REG_TKACON1_CTRIM3))
  449. #define GET_REG_TKACON1_CTRIM3() ((ADDR_REG_TKACON1 & BIT_REG_TKACON1_CTRIM3) >> POS_REG_TKACON1_CTRIM3)
  450. // Touch Key Channel 2 ENCHN
  451. #define POS_REG_TKACON1_ENCHN2 11
  452. #define BIT_REG_TKACON1_ENCHN2 0x800
  453. #define SETF_REG_TKACON1_ENCHN2() ADDR_REG_TKACON1 |= BIT_REG_TKACON1_ENCHN2
  454. #define CLRF_REG_TKACON1_ENCHN2() ADDR_REG_TKACON1 &= ~BIT_REG_TKACON1_ENCHN2
  455. #define GETF_REG_TKACON1_ENCHN2() ((ADDR_REG_TKACON1 & BIT_REG_TKACON1_ENCHN2) >> POS_REG_TKACON1_ENCHN2)
  456. // Touch Key Channel 2 ITRIM Select, TK Charge Current Select Signal, 3.84u/1.92u/0.96u/0.48u/0.24u
  457. #define POS_REG_TKACON1_ITRIM2 6
  458. #define BIT_REG_TKACON1_ITRIM2 0x7C0
  459. #define SET_REG_TKACON1_ITRIM2(val) ADDR_REG_TKACON1 = ((ADDR_REG_TKACON1 & (~BIT_REG_TKACON1_ITRIM2)) | ((val) << POS_REG_TKACON1_ITRIM2))
  460. #define GET_REG_TKACON1_ITRIM2() ((ADDR_REG_TKACON1 & BIT_REG_TKACON1_ITRIM2) >> POS_REG_TKACON1_ITRIM2)
  461. // Touch Key Channel 2 CTRIM Select, 3.2p/1.6p/800f/400f/200f/200f
  462. #define POS_REG_TKACON1_CTRIM2 0
  463. #define BIT_REG_TKACON1_CTRIM2 0x3F
  464. #define SET_REG_TKACON1_CTRIM2(val) ADDR_REG_TKACON1 = ((ADDR_REG_TKACON1 & (~BIT_REG_TKACON1_CTRIM2)) | ((val) << POS_REG_TKACON1_CTRIM2))
  465. #define GET_REG_TKACON1_CTRIM2() ((ADDR_REG_TKACON1 & BIT_REG_TKACON1_CTRIM2) >> POS_REG_TKACON1_CTRIM2)
  466. /*
  467. * FUNCTION DECLARATION
  468. ***************************************************************************
  469. */
  470. int touch_key_init(touch_key_typedef *touch_key_reg, void *tkey_cfg, u32 first_pwron, \
  471. CLK_TOUCH_KEY_TYPEDEF clk_sel, uint8_t tkclk_div2_enable);
  472. void touch_key_tkcnt_isr(u32 tk_ch, u16 tkcnt);
  473. void touch_key_range_isr(u32 tk_ch, u16 tkcnt);
  474. u8 touch_key_get_key(void);
  475. void tkey_bcnt_range_exception(tk_cb_t *s, u16 tkcnt);
  476. void touch_key_sw_reset(void);
  477. #ifdef __cpluscplus
  478. }
  479. #endif
  480. #endif