1
0

hw_adc.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. /*
  2. * @brief ADC ROM API declarations and functions
  3. *
  4. * @note
  5. * Copyright(C) NXP Semiconductors, 2014
  6. * All rights reserved.
  7. *
  8. * @par
  9. * Software that is described herein is for illustrative purposes only
  10. * which provides customers with programming information regarding the
  11. * LPC products. This software is supplied "AS IS" without any warranties of
  12. * any kind, and NXP Semiconductors and its licensor disclaim any and
  13. * all warranties, express or implied, including all implied warranties of
  14. * merchantability, fitness for a particular purpose and non-infringement of
  15. * intellectual property rights. NXP Semiconductors assumes no responsibility
  16. * or liability for the use of the software, conveys no license or rights under any
  17. * patent, copyright, mask work right, or any other intellectual property rights in
  18. * or to any products. NXP Semiconductors reserves the right to make changes
  19. * in the software without notification. NXP Semiconductors also makes no
  20. * representation or warranty that such application will be suitable for the
  21. * specified use without further testing or modification.
  22. *
  23. * @par
  24. * Permission to use, copy, modify, and distribute this software and its
  25. * documentation is hereby granted, under NXP Semiconductors' and its
  26. * licensor's relevant copyrights in the software, without fee, provided that it
  27. * is used in conjunction with NXP Semiconductors microcontrollers. This
  28. * copyright, permission, and disclaimer notice must appear in all copies of
  29. * this code.
  30. */
  31. #include <string.h>
  32. #include "hw_adc_rom_api.h"
  33. /** @brief ADC ROM Driver Version */
  34. #define ADC_DRIVER_VERSION 0x0100
  35. /* Internal defines */
  36. #define SEQ_A_MASK 0x7C0C5FFF
  37. #define SEQ_B_MASK 0x5C0C5FFF
  38. #define CTRL_MASK 0x00007F00
  39. #define ADC_STATE_INACTIVE 0
  40. #define ADC_STATE_IDLE 1
  41. #define ADC_STATE_ACTIVE 2
  42. /** @brief Channel flags offset */
  43. #define CB_THRES(ch) (1UL << (ch))
  44. #define CB_DATA(ch) (0x10000UL << (ch))
  45. /* ADC Buffer management */
  46. typedef struct {
  47. uint16_t *pCurr; /* ReceiveBuffer Pointer */
  48. size_t szCurr; /* Receive Count */
  49. uint16_t *pNext; /* Ring Buffer Pointer */
  50. size_t szNext; /* Receive Count */
  51. uint32_t idx; /* Current index */
  52. int32_t state; /* State of ADC */
  53. } ADC_BUFFER_T;
  54. /* ADC Driver internal data structure */
  55. typedef struct {
  56. void *pUserData; /* Pointer to user data */
  57. ADC_REGS_T *pREGS; /* Pointer to Registers */
  58. uint32_t valSeq[2]; /* Stored SEQ A/B Values */
  59. ADC_BUFFER_T buffer[2]; /* Buffers to store converted data */
  60. uint32_t flags; /* flags */
  61. uint32_t regThrSel; /* Threshold flags */
  62. uint32_t regInt; /* Interrupt register */
  63. uint32_t flag1; /* Flags Extra */
  64. void(*cbTable[ADC_CBIDX_RESERVED]) (ADC_HANDLE_T, ADC_CBINDEX_T, void *);
  65. } ADC_DRIVER_T;
  66. /* Prototype defines */
  67. static ErrorCode_t ADC_StopConversion(ADC_HANDLE_T hADC, ADC_SEQ_INDEX_T seqIndex);
  68. /* PRIVATE: Invoke a call back function */
  69. static void _ADC_InvokeCallback(ADC_DRIVER_T *pADC, ADC_CBINDEX_T idx, void *param)
  70. {
  71. if (pADC->cbTable[idx]) {
  72. pADC->cbTable[idx]((ADC_HANDLE_T) pADC, idx, param);
  73. }
  74. }
  75. /* PRIVATE: Extract, format data and store into user buffer */
  76. static ErrorCode_t _ADC_GetData(ADC_DRIVER_T *pADC, ADC_SEQ_INDEX_T seqIndex, uint32_t data)
  77. {
  78. uint8_t ch = ADC_DR_CHANNEL(data);
  79. ADC_BUFFER_T *buf = &pADC->buffer[seqIndex];
  80. uint16_t *pDat = &buf->pCurr[buf->idx++];
  81. /* Ignore extra data */
  82. if (!buf->szCurr) {
  83. return LPC_OK;
  84. }
  85. /* If data is not vaild something is wrong! */
  86. if (!(data & ADC_SEQ_GDAT_DATAVALID)) {
  87. return ERR_FAILED;
  88. }
  89. data >>= 4;
  90. if (!(pADC->flag1 & (1UL << ch))) {
  91. data &= 0xFFF;
  92. }
  93. *pDat = data;
  94. /* Invoke the call back for single data read if enabled */
  95. if (pADC->flags & CB_DATA(ch)) {
  96. _ADC_InvokeCallback(pADC, ADC_CHDATA, (void *) ((ch << 16) | data));
  97. }
  98. return LPC_OK;
  99. }
  100. /* PRIVATE: Reads data from the GDAT or DAT register based on mode of operation */
  101. static ErrorCode_t _ADC_ReadData(ADC_DRIVER_T *pADC, ADC_SEQ_INDEX_T seqIndex)
  102. {
  103. ADC_REGS_T *pREGS = pADC->pREGS;
  104. int i;
  105. /* Check if this is End-of-Seq or End-of-SingleConversion */
  106. if (!(pADC->valSeq[seqIndex] & ADC_SEQ_CTRL_MODE_EOS)) {
  107. return _ADC_GetData(pADC, seqIndex, pREGS->SEQ_GDAT[seqIndex]);
  108. }
  109. /* Read channels having conversion data */
  110. for (i = 0; i < sizeof(pREGS->DAT) / sizeof(pREGS->DAT[0]); i++) {
  111. if (pADC->valSeq[seqIndex] & ADC_SEQ_CTRL_CHANSEL(i)) {
  112. if (_ADC_GetData(pADC, seqIndex, pREGS->DAT[i]) != LPC_OK) {
  113. return ERR_FAILED;
  114. }
  115. }
  116. }
  117. return LPC_OK;
  118. }
  119. /* PRIVATE: Overflow handler */
  120. static ErrorCode_t _ADC_Handle_Overflow(ADC_DRIVER_T *pADC, uint32_t flag)
  121. {
  122. _ADC_InvokeCallback(pADC, ADC_OVERFLOW, (void *) ((flag >> 12) & 0x3FFF));
  123. return LPC_OK;
  124. }
  125. /* PRIVATE: ADC Sequence event handler function */
  126. static ErrorCode_t _ADC_Handler_Seq(ADC_DRIVER_T *pADC, ADC_SEQ_INDEX_T seqIndex)
  127. {
  128. ADC_REGS_T *pREGS = pADC->pREGS;
  129. ADC_BUFFER_T *buf = &pADC->buffer[seqIndex];
  130. uint32_t flag = pREGS->FLAGS;
  131. uint32_t tmp;
  132. /* Check if overrun is enabled and got an overrun */
  133. tmp = flag & ADC_FLAGS_SEQN_OVRRUN_MASK(seqIndex);
  134. if (!(flag & ADC_FLAGS_SEQN_INT_MASK(seqIndex))) {
  135. return ERR_ADC_INVALID_SEQUENCE;
  136. }
  137. if (_ADC_ReadData(pADC, seqIndex) != LPC_OK) {
  138. return ERR_FAILED;
  139. }
  140. /* Handle the overflow */
  141. if (tmp) {
  142. _ADC_Handle_Overflow(pADC, flag);
  143. }
  144. /* Clear the interrupt if it is for EOS and not EOC */
  145. if (pADC->valSeq[seqIndex] & ADC_SEQ_CTRL_MODE_EOS) {
  146. pREGS->FLAGS = ADC_FLAGS_SEQN_INT_MASK(seqIndex);
  147. }
  148. /* See if we are done with our buffer */
  149. if (buf->idx >= buf->szCurr) {
  150. _ADC_InvokeCallback(pADC, (ADC_CBINDEX_T) (ADC_BUFFER_DONE + (ADC_CBINDEX_T)seqIndex), buf->pCurr);
  151. if (!buf->pNext || !buf->szNext) {
  152. buf->pCurr = 0;
  153. buf->szCurr = 0;
  154. /* Nothing more to do stop the ADC */
  155. ADC_StopConversion(pADC, seqIndex);
  156. return LPC_OK;
  157. }
  158. buf->pCurr = buf->pNext;
  159. buf->szCurr = buf->szNext;
  160. buf->pNext = 0;
  161. buf->idx = buf->szNext = 0;
  162. }
  163. /* If we are not in burst mode we must trigger next sample */
  164. if (!((pADC->valSeq[seqIndex] >> 12) & 0x1F) && !(pADC->valSeq[seqIndex] & ADC_SEQ_CTRL_BURST)) {
  165. pREGS->SEQ_CTRL[seqIndex] = pADC->valSeq[seqIndex];
  166. }
  167. return LPC_OK;
  168. }
  169. /* PRIVATE: ADC sequence handler polling mode */
  170. static ErrorCode_t _ADC_Handler_SeqPoll(ADC_DRIVER_T *pADC, ADC_SEQ_INDEX_T seqIndex)
  171. {
  172. ADC_REGS_T *pREGS = pADC->pREGS;
  173. ErrorCode_t ret = LPC_OK;
  174. /* Poll as long as the sequence is enabled */
  175. while (pREGS->SEQ_CTRL[seqIndex] & ADC_SEQ_CTRL_SEQ_ENA) {
  176. if (!(pREGS->FLAGS & ADC_FLAGS_SEQN_INT_MASK(seqIndex))) {
  177. continue;
  178. }
  179. ret = _ADC_Handler_Seq(pADC, seqIndex);
  180. if (ret != LPC_OK) {
  181. break;
  182. }
  183. }
  184. return ret;
  185. }
  186. /* PRIVATE: Handler for Overflow event */
  187. static ErrorCode_t _ADC_Handler_Ovr(ADC_DRIVER_T *pADC)
  188. {
  189. uint32_t flags = pADC->pREGS->FLAGS;
  190. /* Invoke Sequence handler to clear-out the data */
  191. if (flags & ADC_FLAGS_SEQA_OVRRUN_MASK) {
  192. return _ADC_Handler_Seq(pADC, ADC_SEQ_A);
  193. }
  194. else if (flags & ADC_FLAGS_SEQB_OVRRUN_MASK) {
  195. return _ADC_Handler_Seq(pADC, ADC_SEQ_B);
  196. }
  197. else {
  198. return ERR_FAILED;
  199. }
  200. }
  201. /* PRIVATE: Threshold event handler */
  202. static ErrorCode_t _ADC_Handler_Thres(ADC_DRIVER_T *pADC)
  203. {
  204. uint32_t flags = pADC->pREGS->FLAGS;
  205. if (!(flags & ADC_FLAGS_THCMP_INT_MASK)) {
  206. return ERR_FAILED;
  207. }
  208. flags &= 0xFFF;
  209. /* Clear out the interrupts */
  210. pADC->pREGS->FLAGS = flags;
  211. _ADC_InvokeCallback(pADC, ADC_THRESHOLD, (void *) flags);
  212. return LPC_OK;
  213. }
  214. /* EXPORTED API: Register a call-back function */
  215. ErrorCode_t ADC_RegisterCallback(ADC_HANDLE_T hADC, ADC_CBINDEX_T idx, void (*cb_func)(ADC_HANDLE_T,
  216. ADC_CBINDEX_T,
  217. void *))
  218. {
  219. if (idx < ADC_CBIDX_RESERVED) {
  220. ((ADC_DRIVER_T *) hADC)->cbTable[idx] = cb_func;
  221. }
  222. else {
  223. return ERR_ADC_PARAM;
  224. }
  225. return LPC_OK;
  226. }
  227. /* EXPORTED API: ADC Initialization function */
  228. ADC_HANDLE_T ADC_Init(void *mem, uint32_t base_addr, void *args)
  229. {
  230. ADC_DRIVER_T *pADC;
  231. /* Check if the memory is word aligned */
  232. if ((uint32_t) mem & 0x3) {
  233. return NULL;
  234. }
  235. /* Assign memory provided by application */
  236. pADC = (ADC_DRIVER_T *) mem;
  237. memset(pADC, 0, sizeof(ADC_DRIVER_T));
  238. /* Assign the base address */
  239. pADC->pREGS = (ADC_REGS_T *) base_addr;
  240. pADC->pUserData = args;
  241. /* To be safe stop the ADC in case it is not stopped */
  242. pADC->pREGS->SEQ_CTRL[0] = 0x00;
  243. pADC->pREGS->SEQ_CTRL[1] = 0x00;
  244. return (ADC_HANDLE_T) pADC;
  245. }
  246. /* EXPORTED API: Setup the ADC threshold registers */
  247. void ADC_SetThreshold(ADC_HANDLE_T hADC, uint32_t valThres0, uint32_t valThres1)
  248. {
  249. ADC_REGS_T *pREGS = ((ADC_DRIVER_T *) hADC)->pREGS;
  250. pREGS->THR0_LOW = (valThres0 << ADC_THR_VAL_POS) & ADC_THR_VAL_MASK;
  251. pREGS->THR1_LOW = (valThres1 << ADC_THR_VAL_POS) & ADC_THR_VAL_MASK;
  252. valThres0 >>= 16;
  253. valThres1 >>= 16;
  254. pREGS->THR0_HIGH = (valThres0 << ADC_THR_VAL_POS) & ADC_THR_VAL_MASK;
  255. pREGS->THR1_HIGH = (valThres1 << ADC_THR_VAL_POS) & ADC_THR_VAL_MASK;
  256. }
  257. /* EXPORTED API: Calibrate the ADC */
  258. ErrorCode_t ADC_Calibrate(ADC_HANDLE_T handle, uint32_t sysclk_freq)
  259. {
  260. ADC_REGS_T *pREGS = ((ADC_DRIVER_T *) handle)->pREGS;
  261. volatile uint32_t i;
  262. pREGS->STARTUP = ADC_STARTUP_ENABLE;
  263. for ( i = 0; i < 0x10; i++ ) {}
  264. if ( !(pREGS->STARTUP & ADC_STARTUP_ENABLE) ) {
  265. return ERR_ADC_NO_POWER;
  266. }
  267. /* If not in by-pass mode do the calibration */
  268. if ( (pREGS->CALIBR & ADC_CALREQD) && !(pREGS->CTRL & ADC_CR_BYPASS) ) {
  269. uint32_t ctrl = pREGS->CTRL & (CTRL_MASK | 0xFF);
  270. uint32_t tmp = ctrl;
  271. /* Set ADC to SYNC mode */
  272. tmp &= ~ADC_CR_ASYNC_MODE;
  273. /* To be safe run calibration at 1MHz UM permits upto 30MHz */
  274. if (sysclk_freq > 1000000UL) {
  275. pREGS->CTRL = tmp | (((sysclk_freq / 1000000UL) - 1) & 0xFF);
  276. }
  277. /* Calibration is needed, do it now. */
  278. pREGS->CALIBR = ADC_CALIB;
  279. i = 0xF0000;
  280. while ( (pREGS->CALIBR & ADC_CALIB) && --i ) {}
  281. pREGS->CTRL = ctrl;
  282. return i ? LPC_OK : ERR_TIME_OUT;
  283. }
  284. /* A dummy conversion cycle will be performed. */
  285. pREGS->STARTUP = (pREGS->STARTUP | ADC_STARTUP_INIT) & 0x03;
  286. i = 0x7FFFF;
  287. while ( (pREGS->STARTUP & ADC_STARTUP_INIT) && --i ) {}
  288. return i ? LPC_OK : ERR_TIME_OUT;
  289. }
  290. /* EXPORTED API: Configure the ADC */
  291. ErrorCode_t ADC_Configure(ADC_HANDLE_T hADC, const ADC_CFG_T *pCfg)
  292. {
  293. ADC_DRIVER_T *pADC = hADC;
  294. ADC_REGS_T *pREGS = pADC->pREGS;
  295. pADC->valSeq[ADC_SEQ_A] = ADC_SEQ_CTRL_SEQ_ENA | ADC_SEQ_CTRL_START | (pCfg->flagSeqA & SEQ_A_MASK);
  296. pADC->valSeq[ADC_SEQ_B] = ADC_SEQ_CTRL_SEQ_ENA | ADC_SEQ_CTRL_START | (pCfg->flagSeqB & SEQ_B_MASK);
  297. /* START is not required for BURST or H/W Trigger */
  298. if ((pCfg->flagSeqA & ADC_SEQ_CTRL_TRIGGER_MASK)) {
  299. pADC->valSeq[ADC_SEQ_A] &= ~ADC_SEQ_CTRL_START;
  300. }
  301. /* START is not required for BURST or H/W Trigger */
  302. if ((pCfg->flagSeqB & ADC_SEQ_CTRL_TRIGGER_MASK)) {
  303. pADC->valSeq[ADC_SEQ_B] &= ~ADC_SEQ_CTRL_START;
  304. }
  305. pREGS->CTRL = (pCfg->flagCfg & CTRL_MASK) | (pCfg->clkDiv & ADC_CR_CLKDIV_MASK);
  306. /* Enable/Disable overflow interrupt */
  307. if (pCfg->flagCfg & ENABLE_OVR) {
  308. pADC->regInt |= ADC_INTEN_OVRRUN_ENABLE;
  309. }
  310. else {
  311. pADC->regInt &= ~ADC_INTEN_OVRRUN_ENABLE;
  312. }
  313. return LPC_OK;
  314. }
  315. /* EXPORTED API: Configure channel specific options */
  316. ErrorCode_t ADC_ConfigureChannel(ADC_HANDLE_T hADC, uint32_t chanNum, uint32_t chanOpts)
  317. {
  318. ADC_DRIVER_T *pADC = hADC;
  319. /* Sanity check */
  320. if (chanNum > ADC_MAX_CHANNEL_NUM) {
  321. return ERR_ADC_PARAM;
  322. }
  323. pADC->regInt &= ~(0x18 << (chanNum * 2));
  324. if (chanOpts & ADC_CH_THRES_SEL1) {
  325. pADC->regThrSel |= 1 << chanNum;
  326. }
  327. else {
  328. pADC->regThrSel &= ~(1 << chanNum);
  329. }
  330. if (chanOpts & ADC_CH_THRES_CROSSING) {
  331. pADC->regInt |= 0x10 << (chanNum * 2);
  332. }
  333. else if (chanOpts & ADC_CH_THRES_OUTSIDE) {
  334. pADC->regInt |= 0x08 << (chanNum * 2);
  335. }
  336. if (chanOpts & ADC_CH_DATA_CALLBACK) {
  337. pADC->flags |= CB_DATA(chanNum);
  338. }
  339. else {
  340. pADC->flags &= ~CB_DATA(chanNum);
  341. }
  342. if (chanOpts & ADC_CH_THRES_CALLBACK) {
  343. pADC->flags |= CB_THRES(chanNum);
  344. }
  345. else {
  346. pADC->flags &= ~CB_THRES(chanNum);
  347. }
  348. if (chanOpts & ADC_CH_THRES_DATA) {
  349. pADC->flag1 |= 1 << chanNum;
  350. }
  351. else {
  352. pADC->flag1 &= ~(1 << chanNum);
  353. }
  354. return LPC_OK;
  355. }
  356. /* EXPORTED API: Start analog to digital conversion on selected sequence */
  357. ErrorCode_t ADC_StartConversion(ADC_HANDLE_T hADC, ADC_SEQ_INDEX_T seqIndex, void *buff, size_t bufCount)
  358. {
  359. ADC_DRIVER_T *pADC = hADC;
  360. ADC_BUFFER_T *buf = &pADC->buffer[seqIndex];
  361. /* Sanity check on parameters */
  362. if ((uint32_t) seqIndex > ADC_SEQ_B) {
  363. return ERR_ADC_INVALID_SEQUENCE;
  364. }
  365. /* If an active conversion is going on set the buffer ptr */
  366. if (buf->state == ADC_STATE_ACTIVE) {
  367. if (buf->szNext) {
  368. return ERR_BUSY;
  369. }
  370. buf->pNext = buff;
  371. buf->szNext = bufCount;
  372. return LPC_OK;
  373. }
  374. /* Assign the buffers */
  375. buf->pCurr = buff;
  376. buf->szCurr = bufCount;
  377. buf->idx = 0;
  378. /* Invoke the call back before start */
  379. _ADC_InvokeCallback(pADC, (ADC_CBINDEX_T) (ADC_START_SEQ + (ADC_CBINDEX_T)seqIndex), (void *) &pADC->pREGS);
  380. buf->state = ADC_STATE_ACTIVE;
  381. pADC->pREGS->SEQ_CTRL[seqIndex] = pADC->valSeq[seqIndex] & ~(ADC_SEQ_CTRL_SEQ_ENA | ADC_SEQ_CTRL_START);
  382. pADC->regInt |= (1 << seqIndex);
  383. pADC->pREGS->INTEN = pADC->regInt;
  384. pADC->pREGS->CHAN_THRSEL = pADC->regThrSel;
  385. pADC->pREGS->SEQ_CTRL[seqIndex] = pADC->valSeq[seqIndex];
  386. return LPC_OK;
  387. }
  388. ErrorCode_t ADC_SwTrigger(ADC_HANDLE_T hADC, ADC_SEQ_INDEX_T seqIndex)
  389. {
  390. ADC_DRIVER_T *pADC = hADC;
  391. /* Sanity check on parameters */
  392. if ((uint32_t) seqIndex > ADC_SEQ_B) {
  393. return ERR_ADC_INVALID_SEQUENCE;
  394. }
  395. pADC->pREGS->SEQ_CTRL[seqIndex] = pADC->valSeq[seqIndex] | ADC_SEQ_CTRL_SEQ_ENA | ADC_SEQ_CTRL_START;
  396. return LPC_OK;
  397. }
  398. /* EXPORTED API: Stop conversion on a given sequence */
  399. ErrorCode_t ADC_StopConversion(ADC_HANDLE_T hADC, ADC_SEQ_INDEX_T seqIndex)
  400. {
  401. ADC_DRIVER_T *pADC = hADC;
  402. /* Sanity check on parameters */
  403. if ((uint32_t) seqIndex > ADC_SEQ_B) {
  404. return ERR_ADC_INVALID_SEQUENCE;
  405. }
  406. pADC->regInt &= ~(1 << seqIndex);
  407. pADC->pREGS->INTEN = pADC->regInt; /* Disable interrupts */
  408. pADC->buffer[seqIndex].state = ADC_STATE_IDLE; /* Set state to IDLE */
  409. /* Stop and disable the sequence */
  410. pADC->pREGS->SEQ_CTRL[seqIndex] = pADC->valSeq[seqIndex] &
  411. ~(ADC_SEQ_CTRL_SEQ_ENA | ADC_SEQ_CTRL_BURST | ADC_SEQ_CTRL_START);
  412. _ADC_InvokeCallback(hADC, (ADC_CBINDEX_T)(ADC_STOP_SEQ + (ADC_CBINDEX_T)seqIndex), 0);
  413. return LPC_OK;
  414. }
  415. /* EXPORTED API: ADC Event handler */
  416. ErrorCode_t ADC_Handler(ADC_HANDLE_T hADC, ADC_HEVENT_T hEvent)
  417. {
  418. ADC_DRIVER_T *pADC = hADC;
  419. switch (hEvent) {
  420. case ADC_EV_SEQ_A_POLL:
  421. return _ADC_Handler_SeqPoll(pADC, ADC_SEQ_A);
  422. case ADC_EV_SEQ_B_POLL:
  423. return _ADC_Handler_SeqPoll(pADC, ADC_SEQ_B);
  424. case ADC_EV_SEQ_A_INT:
  425. return _ADC_Handler_Seq(pADC, ADC_SEQ_A);
  426. case ADC_EV_SEQ_B_INT:
  427. return _ADC_Handler_Seq(pADC, ADC_SEQ_B);
  428. case ADC_EV_SEQ_A_DMA:
  429. if (!(pADC->valSeq[ADC_SEQ_A] & 0x3F000)) {
  430. ADC_SwTrigger(hADC, ADC_SEQ_A);
  431. }
  432. return LPC_OK;
  433. case ADC_EV_SEQ_B_DMA:
  434. if (!(pADC->valSeq[ADC_SEQ_B] & 0x3F000)) {
  435. ADC_SwTrigger(hADC, ADC_SEQ_B);
  436. }
  437. return LPC_OK;
  438. case ADC_EV_OVR_INT:
  439. return _ADC_Handler_Ovr(pADC);
  440. case ADC_EV_THRES_INT:
  441. return _ADC_Handler_Thres(pADC);
  442. default:
  443. return ERR_ADC_PARAM;
  444. }
  445. }
  446. /* EXPROTED API: Returns memory required for ADC driver */
  447. uint32_t ADC_GetMemSize(void)
  448. {
  449. return sizeof(ADC_DRIVER_T);
  450. }
  451. /* EXPORTED API: Function to Get the firmware Version */
  452. uint32_t ADC_GetDriverVersion(void)
  453. {
  454. return ADC_DRIVER_VERSION;
  455. }
  456. /**
  457. * @brief Table of the addresses of all the 12-Bit ADC functions
  458. * @note This table of function pointers is the API interface.
  459. */
  460. const ROM_ADC_API_T adcrom_api = {
  461. ADC_GetMemSize,
  462. ADC_Init,
  463. ADC_Configure,
  464. ADC_ConfigureChannel,
  465. ADC_SetThreshold,
  466. ADC_RegisterCallback,
  467. ADC_Calibrate,
  468. ADC_Handler,
  469. ADC_StartConversion,
  470. ADC_StopConversion,
  471. ADC_SwTrigger,
  472. ADC_GetDriverVersion,
  473. };