sys_vim.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. /** @file sys_vim.c
  2. * @brief VIM Driver Inmplmentation File
  3. * @date
  4. * @version 03.05.02
  5. *
  6. */
  7. /* (c) Texas Instruments 2009-2013, All rights reserved. */
  8. #include "sys_vim.h"
  9. #include "system.h"
  10. /* Vim Ram Definition */
  11. /** @struct vimRam
  12. * @brief Vim Ram Definition
  13. *
  14. * This type is used to access the Vim Ram.
  15. */
  16. /** @typedef vimRAM_t
  17. * @brief Vim Ram Type Definition
  18. *
  19. * This type is used to access the Vim Ram.
  20. */
  21. typedef volatile struct vimRam
  22. {
  23. t_isrFuncPTR ISR[VIM_CHANNELS + 1U];
  24. } vimRAM_t;
  25. #define vimRAM ((vimRAM_t *)0xFFF82000U)
  26. /** @fn void vimInit(void)
  27. * @brief Initializes VIM module
  28. *
  29. * This function initializes VIM RAM and registers
  30. */
  31. void vimInit(void)
  32. {
  33. /* Set Fall-Back Address Parity Error Register */
  34. /*VIM_FBPARERR = (uint32)&vimParityErrorHandler;*/
  35. /* set IRQ/FIQ priorities */
  36. vimREG->FIRQPR0 = SYS_FIQ
  37. | (SYS_FIQ << 1U)
  38. | (SYS_IRQ << 2U)
  39. | (SYS_IRQ << 3U)
  40. | (SYS_IRQ << 4U)
  41. | (SYS_IRQ << 5U)
  42. | (SYS_IRQ << 6U)
  43. | (SYS_IRQ << 7U)
  44. | (SYS_IRQ << 8U)
  45. | (SYS_IRQ << 9U)
  46. | (SYS_IRQ << 10U)
  47. | (SYS_IRQ << 11U)
  48. | (SYS_IRQ << 12U)
  49. | (SYS_IRQ << 13U)
  50. | (SYS_IRQ << 14U)
  51. | (SYS_IRQ << 15U)
  52. | (SYS_IRQ << 16U)
  53. | (SYS_IRQ << 17U)
  54. | (SYS_IRQ << 18U)
  55. | (SYS_IRQ << 19U)
  56. | (SYS_IRQ << 20U)
  57. | (SYS_IRQ << 21U)
  58. | (SYS_IRQ << 22U)
  59. | (SYS_IRQ << 23U)
  60. | (SYS_IRQ << 24U)
  61. | (SYS_IRQ << 25U)
  62. | (SYS_IRQ << 26U)
  63. | (SYS_IRQ << 27U)
  64. | (SYS_IRQ << 28U)
  65. | (SYS_IRQ << 29U)
  66. | (SYS_IRQ << 30U)
  67. | (SYS_IRQ << 31U);
  68. vimREG->FIRQPR1 = SYS_IRQ
  69. | (SYS_IRQ << 1U)
  70. | (SYS_IRQ << 2U)
  71. | (SYS_IRQ << 3U)
  72. | (SYS_IRQ << 4U)
  73. | (SYS_IRQ << 5U)
  74. | (SYS_IRQ << 6U)
  75. | (SYS_IRQ << 7U)
  76. | (SYS_IRQ << 8U)
  77. | (SYS_IRQ << 9U)
  78. | (SYS_IRQ << 10U)
  79. | (SYS_IRQ << 11U)
  80. | (SYS_IRQ << 12U)
  81. | (SYS_IRQ << 13U)
  82. | (SYS_IRQ << 14U)
  83. | (SYS_IRQ << 15U)
  84. | (SYS_IRQ << 16U)
  85. | (SYS_IRQ << 17U)
  86. | (SYS_IRQ << 18U)
  87. | (SYS_IRQ << 19U)
  88. | (SYS_IRQ << 20U)
  89. | (SYS_IRQ << 21U)
  90. | (SYS_IRQ << 22U)
  91. | (SYS_IRQ << 23U)
  92. | (SYS_IRQ << 24U)
  93. | (SYS_IRQ << 25U)
  94. | (SYS_IRQ << 26U)
  95. | (SYS_IRQ << 27U)
  96. | (SYS_IRQ << 28U)
  97. | (SYS_IRQ << 29U)
  98. | (SYS_IRQ << 30U)
  99. | (SYS_IRQ << 31U);
  100. vimREG->FIRQPR2 = SYS_IRQ
  101. | (SYS_IRQ << 1U)
  102. | (SYS_IRQ << 2U)
  103. | (SYS_IRQ << 3U)
  104. | (SYS_IRQ << 4U)
  105. | (SYS_IRQ << 5U)
  106. | (SYS_IRQ << 6U)
  107. | (SYS_IRQ << 7U)
  108. | (SYS_IRQ << 8U)
  109. | (SYS_IRQ << 9U)
  110. | (SYS_IRQ << 10U)
  111. | (SYS_IRQ << 11U)
  112. | (SYS_IRQ << 12U)
  113. | (SYS_IRQ << 13U)
  114. | (SYS_IRQ << 14U)
  115. | (SYS_IRQ << 15U)
  116. | (SYS_IRQ << 16U)
  117. | (SYS_IRQ << 17U)
  118. | (SYS_IRQ << 18U)
  119. | (SYS_IRQ << 19U)
  120. | (SYS_IRQ << 20U)
  121. | (SYS_IRQ << 21U)
  122. | (SYS_IRQ << 22U)
  123. | (SYS_IRQ << 23U)
  124. | (SYS_IRQ << 24U)
  125. | (SYS_IRQ << 25U)
  126. | (SYS_IRQ << 26U)
  127. | (SYS_IRQ << 27U)
  128. | (SYS_IRQ << 28U)
  129. | (SYS_IRQ << 29U)
  130. | (SYS_IRQ << 30U)
  131. | (SYS_IRQ << 31U);
  132. vimREG->FIRQPR3 = SYS_IRQ
  133. | (SYS_IRQ << 1U)
  134. | (SYS_IRQ << 2U)
  135. | (SYS_IRQ << 3U)
  136. | (SYS_IRQ << 4U)
  137. | (SYS_IRQ << 5U)
  138. | (SYS_IRQ << 6U)
  139. | (SYS_IRQ << 7U)
  140. | (SYS_IRQ << 8U)
  141. | (SYS_IRQ << 9U)
  142. | (SYS_IRQ << 10U)
  143. | (SYS_IRQ << 11U)
  144. | (SYS_IRQ << 12U)
  145. | (SYS_IRQ << 13U)
  146. | (SYS_IRQ << 14U)
  147. | (SYS_IRQ << 15U)
  148. | (SYS_IRQ << 16U)
  149. | (SYS_IRQ << 17U)
  150. | (SYS_IRQ << 18U)
  151. | (SYS_IRQ << 19U)
  152. | (SYS_IRQ << 20U)
  153. | (SYS_IRQ << 21U)
  154. | (SYS_IRQ << 22U)
  155. | (SYS_IRQ << 23U)
  156. | (SYS_IRQ << 24U)
  157. | (SYS_IRQ << 25U)
  158. | (SYS_IRQ << 26U)
  159. | (SYS_IRQ << 27U)
  160. | (SYS_IRQ << 28U)
  161. | (SYS_IRQ << 29U)
  162. | (SYS_IRQ << 30U)
  163. | (SYS_IRQ << 31U);
  164. /* enable interrupts */
  165. vimREG->REQMASKSET0 = 1U
  166. | (1U << 1U)
  167. | (0U << 2U)
  168. | (0U << 3U)
  169. | (0U << 4U)
  170. | (1U << 5U)
  171. | (0U << 6U)
  172. | (0U << 7U)
  173. | (0U << 8U)
  174. | (0U << 9U)
  175. | (0U << 10U)
  176. | (0U << 11U)
  177. | (0U << 12U)
  178. | (1U << 13U)
  179. | (0U << 14U)
  180. | (0U << 15U)
  181. | (0U << 16U)
  182. | (0U << 17U)
  183. | (0U << 18U)
  184. | (0U << 19U)
  185. | (0U << 20U)
  186. | (0U << 21U)
  187. | (0U << 22U)
  188. | (0U << 23U)
  189. | (0U << 24U)
  190. | (0U << 25U)
  191. | (0U << 26U)
  192. | (0U << 27U)
  193. | (0U << 28U)
  194. | (0U << 29U)
  195. | (0U << 30U)
  196. | (0U << 31U);
  197. vimREG->REQMASKSET1 = 0U
  198. | (0U << 1U)
  199. | (0U << 2U)
  200. | (0U << 3U)
  201. | (0U << 4U)
  202. | (0U << 5U)
  203. | (0U << 6U)
  204. | (0U << 7U)
  205. | (0U << 8U)
  206. | (0U << 9U)
  207. | (0U << 10U)
  208. | (0U << 11U)
  209. | (0U << 12U)
  210. | (0U << 13U)
  211. | (0U << 14U)
  212. | (0U << 15U)
  213. | (0U << 16U)
  214. | (0U << 17U)
  215. | (0U << 18U)
  216. | (0U << 19U)
  217. | (0U << 20U)
  218. | (0U << 21U)
  219. | (0U << 22U)
  220. | (0U << 23U)
  221. | (0U << 24U)
  222. | (0U << 25U)
  223. | (0U << 26U)
  224. | (0U << 27U)
  225. | (0U << 28U)
  226. | (0U << 29U)
  227. | (0U << 30U)
  228. | (0U << 31U);
  229. vimREG->REQMASKSET2 = 0U
  230. | (0U << 1U)
  231. | (0U << 2U)
  232. | (0U << 3U)
  233. | (0U << 4U)
  234. | (0U << 5U)
  235. | (0U << 6U)
  236. | (0U << 7U)
  237. | (0U << 8U)
  238. | (0U << 9U)
  239. | (0U << 10U)
  240. | (0U << 11U)
  241. | (0U << 12U)
  242. | (0U << 13U)
  243. | (0U << 14U)
  244. | (0U << 15U)
  245. | (0U << 16U)
  246. | (0U << 17U)
  247. | (0U << 18U)
  248. | (0U << 19U)
  249. | (0U << 20U)
  250. | (0U << 21U)
  251. | (0U << 22U)
  252. | (0U << 23U)
  253. | (0U << 24U)
  254. | (0U << 25U)
  255. | (0U << 26U)
  256. | (0U << 27U)
  257. | (0U << 28U)
  258. | (0U << 29U)
  259. | (0U << 30U)
  260. | (0U << 31U);
  261. vimREG->REQMASKSET3 = 0U
  262. | (0U << 1U)
  263. | (0U << 2U)
  264. | (0U << 3U)
  265. | (0U << 4U)
  266. | (0U << 5U)
  267. | (0U << 6U)
  268. | (0U << 7U)
  269. | (0U << 8U)
  270. | (0U << 9U)
  271. | (0U << 10U)
  272. | (0U << 11U)
  273. | (0U << 12U)
  274. | (0U << 13U)
  275. | (0U << 14U)
  276. | (0U << 15U)
  277. | (0U << 16U)
  278. | (0U << 17U)
  279. | (0U << 18U)
  280. | (0U << 19U)
  281. | (0U << 20U)
  282. | (0U << 21U)
  283. | (0U << 22U)
  284. | (0U << 23U)
  285. | (0U << 24U)
  286. | (0U << 25U)
  287. | (0U << 26U)
  288. | (0U << 27U)
  289. | (0U << 28U)
  290. | (0U << 29U)
  291. | (0U << 30U)
  292. | (0U << 31U);
  293. }
  294. /** @fn void vimChannelMap(uint32 request, uint32 channel, t_isrFuncPTR handler)
  295. * @brief Map selected interrupt request to the selected channel
  296. *
  297. * @param[in] request: Interrupt request number 2..95
  298. * @param[in] channel: VIM Channel number 2..95
  299. * @param[in] handler: Address of the interrupt handler
  300. *
  301. * This function will map selected interrupt request to the selected channel.
  302. *
  303. */
  304. void vimChannelMap(uint32 request, uint32 channel, t_isrFuncPTR handler)
  305. {
  306. uint32 i,j;
  307. i = channel >> 2U; /* Find the register to configure */
  308. j = channel -(i<<2U); /* Find the offset of the type */
  309. j = 3U-j; /* reverse the byte order */
  310. j = j<<3U; /* find the bit location */
  311. /*Mapping the required interrupt request to the required channel*/
  312. vimREG->CHANCTRL[i] &= ~(0xFFU << j);
  313. vimREG->CHANCTRL[i] |= (request << j);
  314. /*Updating VIMRAM*/
  315. vimRAM->ISR[channel+1] = handler;
  316. }
  317. /** @fn void vimEnableInterrupt(uint32 channel, boolean inttype)
  318. * @brief Enable interrupt for the the selected channel
  319. *
  320. * @param[in] channel: VIM Channel number 2..95
  321. * @param[in] handler: Interrupt type
  322. * - SYS_IRQ: Selected channel will be enabled as IRQ
  323. * - SYS_FIQ: Selected channel will be enabled as FIQ
  324. *
  325. * This function will enable interrupt for the selected channel.
  326. *
  327. */
  328. void vimEnableInterrupt(uint32 channel, boolean inttype)
  329. {
  330. if (channel >= 64)
  331. {
  332. if(inttype == SYS_IRQ)
  333. {
  334. vimREG->FIRQPR2 &= ~(1 << (channel-64));
  335. }
  336. else
  337. {
  338. vimREG->FIRQPR2 |= 1 << (channel-64);
  339. }
  340. vimREG->REQMASKSET2 = 1 << (channel-64);
  341. }
  342. else if (channel >= 32)
  343. {
  344. if(inttype == SYS_IRQ)
  345. {
  346. vimREG->FIRQPR1 &= ~(1 << (channel-32));
  347. }
  348. else
  349. {
  350. vimREG->FIRQPR1 |= 1 << (channel-32);
  351. }
  352. vimREG->REQMASKSET1 = 1 << (channel-32);
  353. }
  354. else if (channel >= 2)
  355. {
  356. if(inttype == SYS_IRQ)
  357. {
  358. vimREG->FIRQPR0 &= ~(1 << channel);
  359. }
  360. else
  361. {
  362. vimREG->FIRQPR0 |= 1 << channel;
  363. }
  364. vimREG->REQMASKSET0 = 1 << channel;
  365. }
  366. else
  367. {
  368. }
  369. }
  370. /** @fn void vimDisableInterrupt(uint32 channel)
  371. * @brief Disable interrupt for the the selected channel
  372. *
  373. * @param[in] channel: VIM Channel number 2..95
  374. *
  375. * This function will disable interrupt for the selected channel.
  376. *
  377. */
  378. void vimDisableInterrupt(uint32 channel)
  379. {
  380. if (channel >= 64)
  381. {
  382. vimREG->REQMASKCLR2 = 1 << (channel-64);
  383. }
  384. else if (channel >=32)
  385. {
  386. vimREG->REQMASKCLR1 = 1 << (channel-32);
  387. }
  388. else if (channel >= 2)
  389. {
  390. vimREG->REQMASKCLR0 = 1 << channel;
  391. }
  392. else
  393. {
  394. }
  395. }
  396. /** @fn void vimGetConfigValue(vim_config_reg_t *config_reg, config_value_type_t type)
  397. * @brief Get the initial or current values of the configuration registers
  398. *
  399. * @param[in] *config_reg: pointer to the struct to which the initial or current value of the configuration registers need to be stored
  400. * @param[in] type: whether initial or current value of the configuration registers need to be stored
  401. * - InitialValue: initial value of the configuration registers will be stored in the struct pointed by config_reg
  402. * - CurrentValue: initial value of the configuration registers will be stored in the struct pointed by config_reg
  403. *
  404. * This function will copy the initial or current value (depending on the parameter 'type') of the configuration registers to the struct pointed by config_reg
  405. *
  406. */
  407. void vimGetConfigValue(vim_config_reg_t *config_reg, config_value_type_t type)
  408. {
  409. uint32 temp[24U] = VIM_CHANCTRL_CONFIGVALUE;
  410. uint32 i;
  411. if (type == InitialValue)
  412. {
  413. config_reg->CONFIG_FIRQPR0 = VIM_FIRQPR0_CONFIGVALUE;
  414. config_reg->CONFIG_FIRQPR1 = VIM_FIRQPR1_CONFIGVALUE;
  415. config_reg->CONFIG_FIRQPR2 = VIM_FIRQPR2_CONFIGVALUE;
  416. config_reg->CONFIG_FIRQPR3 = VIM_FIRQPR3_CONFIGVALUE;
  417. config_reg->CONFIG_REQMASKSET0 = VIM_REQMASKSET0_CONFIGVALUE;
  418. config_reg->CONFIG_REQMASKSET1 = VIM_REQMASKSET1_CONFIGVALUE;
  419. config_reg->CONFIG_REQMASKSET2 = VIM_REQMASKSET2_CONFIGVALUE;
  420. config_reg->CONFIG_REQMASKSET3 = VIM_REQMASKSET3_CONFIGVALUE;
  421. config_reg->CONFIG_WAKEMASKSET0 = VIM_WAKEMASKSET0_CONFIGVALUE;
  422. config_reg->CONFIG_WAKEMASKSET1 = VIM_WAKEMASKSET1_CONFIGVALUE;
  423. config_reg->CONFIG_WAKEMASKSET2 = VIM_WAKEMASKSET2_CONFIGVALUE;
  424. config_reg->CONFIG_WAKEMASKSET3 = VIM_WAKEMASKSET3_CONFIGVALUE;
  425. config_reg->CONFIG_CAPEVT = VIM_CAPEVT_CONFIGVALUE;
  426. for (i=0U; i<24U;i++)
  427. {
  428. config_reg->CONFIG_CHANCTRL[i] = temp[i];
  429. }
  430. }
  431. else
  432. {
  433. config_reg->CONFIG_FIRQPR0 = vimREG->FIRQPR0;
  434. config_reg->CONFIG_FIRQPR1 = vimREG->FIRQPR1;
  435. config_reg->CONFIG_FIRQPR2 = vimREG->FIRQPR2;
  436. config_reg->CONFIG_FIRQPR3 = vimREG->FIRQPR3;
  437. config_reg->CONFIG_REQMASKSET0 = vimREG->REQMASKSET0;
  438. config_reg->CONFIG_REQMASKSET1 = vimREG->REQMASKSET1;
  439. config_reg->CONFIG_REQMASKSET2 = vimREG->REQMASKSET2;
  440. config_reg->CONFIG_REQMASKSET3 = vimREG->REQMASKSET3;
  441. config_reg->CONFIG_WAKEMASKSET0 = vimREG->WAKEMASKSET0;
  442. config_reg->CONFIG_WAKEMASKSET1 = vimREG->WAKEMASKSET1;
  443. config_reg->CONFIG_WAKEMASKSET2 = vimREG->WAKEMASKSET2;
  444. config_reg->CONFIG_WAKEMASKSET3 = vimREG->WAKEMASKSET3;
  445. config_reg->CONFIG_CAPEVT = vimREG->CAPEVT;
  446. for (i=0U; i<24U; i++)
  447. {
  448. config_reg->CONFIG_CHANCTRL[i] = vimREG->CHANCTRL[i];
  449. }
  450. }
  451. }
  452. #if 0
  453. #pragma CODE_STATE(vimParityErrorHandler, 32)
  454. #pragma INTERRUPT(vimParityErrorHandler, IRQ)
  455. void vimParityErrorHandler(void)
  456. {
  457. /* Identify the corrupted address */
  458. uint32 error_addr = VIM_ADDERR;
  459. /* Identify the channel number */
  460. uint32 error_channel = ((error_addr & 0x1FF) >> 2) - 1;
  461. /* Correct the corrupted location */
  462. vimRAM->ISR[error_channel + 1] = s_vim_init[error_channel + 1];
  463. /* Clear Parity Error Flag */
  464. VIM_PARFLG = 1;
  465. /* Disable and enable the highest priority pending channel */
  466. sint32 channel;
  467. channel = vimREG->FIQINDEX - 1;
  468. if (vimREG->FIQINDEX != 0)
  469. {
  470. channel = vimREG->FIQINDEX - 1;
  471. }
  472. else
  473. {
  474. channel = vimREG->IRQINDEX - 1;
  475. }
  476. if (channel >= 0)
  477. {
  478. if (channel < 32)
  479. {
  480. vimREG->REQMASKCLR0 = 1 << channel;
  481. vimREG->REQMASKSET0 = 1 << channel;
  482. }
  483. else if (channel < 64)
  484. {
  485. vimREG->REQMASKCLR1 = 1 << (channel-32);
  486. vimREG->REQMASKSET1 = 1 << (channel-32);
  487. }
  488. else
  489. {
  490. vimREG->REQMASKCLR2 = 1 << (channel-64);
  491. vimREG->REQMASKSET2 = 1 << (channel-64);
  492. }
  493. }
  494. }
  495. #endif