nu_sys.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. /**************************************************************************//**
  2. * @file sys.c
  3. * @brief SYS driver source file
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. * @copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
  7. *****************************************************************************/
  8. #include <stdio.h>
  9. #include "nuc980.h"
  10. #include "nu_sys.h"
  11. /** @addtogroup Standard_Driver Standard Driver
  12. @{
  13. */
  14. /** @addtogroup SYS_Driver SYS Driver
  15. @{
  16. */
  17. /** @addtogroup SYS_EXPORTED_CONSTANTS SYS Exported Constants
  18. @{
  19. */
  20. /// @cond HIDDEN_SYMBOLS
  21. #define SYS_MIN_INT_SOURCE 1
  22. #define SYS_MAX_INT_SOURCE 63
  23. #define SYS_NUM_OF_AICREG 16
  24. /* Global variables */
  25. UINT32 volatile _sys_bIsAICInitial = 0x0;
  26. /* declaration the function prototype */
  27. void SYS_IRQ_Shell(void);
  28. void SYS_FIQ_Shell(void);
  29. /* Interrupt Handler Table */
  30. //typedef void (*sys_pvFunPtr)(); /* function pointer */
  31. sys_pvFunPtr sysIrqHandlerTable[] = { 0, /* 0 */
  32. SYS_IRQ_Shell, /* 1 */
  33. SYS_IRQ_Shell, /* 2 */
  34. SYS_IRQ_Shell, /* 3 */
  35. SYS_IRQ_Shell, /* 4 */
  36. SYS_IRQ_Shell, /* 5 */
  37. SYS_IRQ_Shell, /* 6 */
  38. SYS_IRQ_Shell, /* 7 */
  39. SYS_IRQ_Shell, /* 8 */
  40. SYS_IRQ_Shell, /* 9 */
  41. SYS_IRQ_Shell, /* 10 */
  42. SYS_IRQ_Shell, /* 11 */
  43. SYS_IRQ_Shell, /* 12 */
  44. SYS_IRQ_Shell, /* 13 */
  45. SYS_IRQ_Shell, /* 14 */
  46. SYS_IRQ_Shell, /* 15 */
  47. SYS_IRQ_Shell, /* 16 */
  48. SYS_IRQ_Shell, /* 17 */
  49. SYS_IRQ_Shell, /* 18 */
  50. SYS_IRQ_Shell, /* 19 */
  51. SYS_IRQ_Shell, /* 20 */
  52. SYS_IRQ_Shell, /* 21 */
  53. SYS_IRQ_Shell, /* 22 */
  54. SYS_IRQ_Shell, /* 23 */
  55. SYS_IRQ_Shell, /* 24 */
  56. SYS_IRQ_Shell, /* 25 */
  57. SYS_IRQ_Shell, /* 26 */
  58. SYS_IRQ_Shell, /* 27 */
  59. SYS_IRQ_Shell, /* 28 */
  60. SYS_IRQ_Shell, /* 29 */
  61. SYS_IRQ_Shell, /* 30 */
  62. SYS_IRQ_Shell, /* 31 */
  63. SYS_IRQ_Shell, /* 32 */
  64. SYS_IRQ_Shell, /* 33 */
  65. SYS_IRQ_Shell, /* 34 */
  66. SYS_IRQ_Shell, /* 35 */
  67. SYS_IRQ_Shell, /* 36 */
  68. SYS_IRQ_Shell, /* 37 */
  69. SYS_IRQ_Shell, /* 38 */
  70. SYS_IRQ_Shell, /* 39 */
  71. SYS_IRQ_Shell, /* 40 */
  72. SYS_IRQ_Shell, /* 41 */
  73. SYS_IRQ_Shell, /* 42 */
  74. SYS_IRQ_Shell, /* 43 */
  75. SYS_IRQ_Shell, /* 44 */
  76. SYS_IRQ_Shell, /* 45 */
  77. SYS_IRQ_Shell, /* 46 */
  78. SYS_IRQ_Shell, /* 47 */
  79. SYS_IRQ_Shell, /* 48 */
  80. SYS_IRQ_Shell, /* 49 */
  81. SYS_IRQ_Shell, /* 50 */
  82. SYS_IRQ_Shell, /* 51 */
  83. SYS_IRQ_Shell, /* 52 */
  84. SYS_IRQ_Shell, /* 53 */
  85. SYS_IRQ_Shell, /* 54 */
  86. SYS_IRQ_Shell, /* 55 */
  87. SYS_IRQ_Shell, /* 56 */
  88. SYS_IRQ_Shell, /* 57 */
  89. SYS_IRQ_Shell, /* 58 */
  90. SYS_IRQ_Shell, /* 59 */
  91. SYS_IRQ_Shell, /* 60 */
  92. SYS_IRQ_Shell, /* 61 */
  93. SYS_IRQ_Shell, /* 62 */
  94. SYS_IRQ_Shell /* 63 */
  95. };
  96. sys_pvFunPtr sysFiqHandlerTable[] = { 0,
  97. SYS_FIQ_Shell, /* 1 */
  98. SYS_FIQ_Shell, /* 2 */
  99. SYS_FIQ_Shell, /* 3 */
  100. SYS_FIQ_Shell, /* 4 */
  101. SYS_FIQ_Shell, /* 5 */
  102. SYS_FIQ_Shell, /* 6 */
  103. SYS_FIQ_Shell, /* 7 */
  104. SYS_FIQ_Shell, /* 8 */
  105. SYS_FIQ_Shell, /* 9 */
  106. SYS_FIQ_Shell, /* 10 */
  107. SYS_FIQ_Shell, /* 11 */
  108. SYS_FIQ_Shell, /* 12 */
  109. SYS_FIQ_Shell, /* 13 */
  110. SYS_FIQ_Shell, /* 14 */
  111. SYS_FIQ_Shell, /* 15 */
  112. SYS_FIQ_Shell, /* 16 */
  113. SYS_FIQ_Shell, /* 17 */
  114. SYS_FIQ_Shell, /* 18 */
  115. SYS_FIQ_Shell, /* 19 */
  116. SYS_FIQ_Shell, /* 20 */
  117. SYS_FIQ_Shell, /* 21 */
  118. SYS_FIQ_Shell, /* 22 */
  119. SYS_FIQ_Shell, /* 23 */
  120. SYS_FIQ_Shell, /* 24 */
  121. SYS_FIQ_Shell, /* 25 */
  122. SYS_FIQ_Shell, /* 26 */
  123. SYS_FIQ_Shell, /* 27 */
  124. SYS_FIQ_Shell, /* 28 */
  125. SYS_FIQ_Shell, /* 29 */
  126. SYS_FIQ_Shell, /* 30 */
  127. SYS_FIQ_Shell, /* 31 */
  128. SYS_FIQ_Shell, /* 32 */
  129. SYS_FIQ_Shell, /* 33 */
  130. SYS_FIQ_Shell, /* 34 */
  131. SYS_FIQ_Shell, /* 35 */
  132. SYS_FIQ_Shell, /* 36 */
  133. SYS_FIQ_Shell, /* 37 */
  134. SYS_FIQ_Shell, /* 38 */
  135. SYS_FIQ_Shell, /* 39 */
  136. SYS_FIQ_Shell, /* 40 */
  137. SYS_FIQ_Shell, /* 41 */
  138. SYS_FIQ_Shell, /* 42 */
  139. SYS_FIQ_Shell, /* 43 */
  140. SYS_FIQ_Shell, /* 44 */
  141. SYS_FIQ_Shell, /* 45 */
  142. SYS_FIQ_Shell, /* 46 */
  143. SYS_FIQ_Shell, /* 47 */
  144. SYS_FIQ_Shell, /* 48 */
  145. SYS_FIQ_Shell, /* 49 */
  146. SYS_FIQ_Shell, /* 50 */
  147. SYS_FIQ_Shell, /* 51 */
  148. SYS_FIQ_Shell, /* 52 */
  149. SYS_FIQ_Shell, /* 53 */
  150. SYS_FIQ_Shell, /* 54 */
  151. SYS_FIQ_Shell, /* 55 */
  152. SYS_FIQ_Shell, /* 56 */
  153. SYS_FIQ_Shell, /* 57 */
  154. SYS_FIQ_Shell, /* 58 */
  155. SYS_FIQ_Shell, /* 59 */
  156. SYS_FIQ_Shell, /* 60 */
  157. SYS_FIQ_Shell, /* 61 */
  158. SYS_FIQ_Shell, /* 62 */
  159. SYS_FIQ_Shell /* 63 */
  160. };
  161. /* Interrupt Handler */
  162. #if defined (__GNUC__) && !(__CC_ARM)
  163. static void __attribute__((interrupt("IRQ"))) sysIrqHandler(void)
  164. #else
  165. __irq void sysIrqHandler()
  166. #endif
  167. {
  168. UINT32 volatile num;
  169. num = inpw(REG_AIC_IRQNUM);
  170. if (num != 0)
  171. (*sysIrqHandlerTable[num])();
  172. outpw(REG_AIC_EOIS, 1);
  173. }
  174. #if defined (__GNUC__) && !(__CC_ARM)
  175. static void __attribute__((interrupt("FIQ"))) sysFiqHandler(void)
  176. #else
  177. __irq void sysFiqHandler()
  178. #endif
  179. {
  180. UINT32 volatile num;
  181. num = inpw(REG_AIC_FIQNUM);
  182. if (num != 0)
  183. (*sysIrqHandlerTable[num])();
  184. outpw(REG_AIC_EOFS, 1);
  185. }
  186. void SYS_IRQ_Shell(void)
  187. {
  188. printf("ISR not found! ISNR=%d\n", inpw(REG_AIC_IRQNUM));
  189. }
  190. void SYS_FIQ_Shell(void)
  191. {
  192. printf("ISR not found! ISNR=%d\n", inpw(REG_AIC_FIQNUM));
  193. }
  194. void sysInitializeAIC()
  195. {
  196. #if defined (__GNUC__) && !(__CC_ARM)
  197. *(unsigned int volatile *)0x34 = (unsigned int volatile)sysIrqHandler;
  198. *(unsigned int volatile *)0x38 = (unsigned int volatile)sysFiqHandler;
  199. #else
  200. *(unsigned int volatile *)0x38 = (unsigned int)sysIrqHandler;
  201. *(unsigned int volatile *)0x3C = (unsigned int)sysFiqHandler;
  202. #endif
  203. }
  204. /// @endcond HIDDEN_SYMBOLS
  205. /*@}*/ /* end of group SYS_EXPORTED_CONSTANTS */
  206. /** @addtogroup SYS_EXPORTED_FUNCTIONS SYS Exported Functions
  207. @{
  208. */
  209. /// @cond HIDDEN_SYMBOLS
  210. /* Interrupt library functions */
  211. /**
  212. * @brief system AIC - disable interrupt
  213. *
  214. * @param[in] eIntNo Select interrupt source. \ref IRQn_Type
  215. *
  216. * @return 0
  217. */
  218. INT32 sysDisableInterrupt(IRQn_Type eIntNo)
  219. {
  220. if ((eIntNo > SYS_MAX_INT_SOURCE) || (eIntNo < SYS_MIN_INT_SOURCE))
  221. return Fail;
  222. if (eIntNo < 32)
  223. outpw(REG_AIC_INTDIS0, (1 << eIntNo));
  224. else
  225. outpw(REG_AIC_INTDIS1, (1 << (eIntNo - 32)));
  226. return Successful;
  227. }
  228. /**
  229. * @brief system AIC - enable interrupt
  230. *
  231. * @param[in] eIntNo Select interrupt source. \ref IRQn_Type
  232. *
  233. * @return 0
  234. */
  235. INT32 sysEnableInterrupt(IRQn_Type eIntNo)
  236. {
  237. if ((eIntNo > SYS_MAX_INT_SOURCE) || (eIntNo < SYS_MIN_INT_SOURCE))
  238. return Fail;
  239. if (eIntNo < 32)
  240. outpw(REG_AIC_INTEN0, (1 << eIntNo));
  241. else
  242. outpw(REG_AIC_INTEN1, (1 << (eIntNo - 32)));
  243. return Successful;
  244. }
  245. /**
  246. * @brief system AIC - install exception handler
  247. *
  248. * @param[in] nExceptType exception type. ( \ref SYS_SWI / \ref SYS_D_ABORT / \ref SYS_I_ABORT / \ref SYS_UNDEFINE)
  249. * @param[in] pvNewHandler own exception handler
  250. *
  251. * @return old handler
  252. */
  253. PVOID sysInstallExceptionHandler(INT32 nExceptType, PVOID pvNewHandler)
  254. {
  255. PVOID _mOldVect = NULL;
  256. switch (nExceptType)
  257. {
  258. case SYS_SWI:
  259. _mOldVect = *(PVOID volatile *)0x28;
  260. *(PVOID volatile *)0x28 = pvNewHandler;
  261. break;
  262. case SYS_D_ABORT:
  263. _mOldVect = *(PVOID volatile *)0x30;
  264. *(PVOID volatile *)0x30 = pvNewHandler;
  265. break;
  266. case SYS_I_ABORT:
  267. _mOldVect = *(PVOID volatile *)0x2C;
  268. *(PVOID volatile *)0x2C = pvNewHandler;
  269. break;
  270. case SYS_UNDEFINE:
  271. _mOldVect = *(PVOID volatile *)0x24;
  272. *(PVOID volatile *)0x24 = pvNewHandler;
  273. break;
  274. default:
  275. ;
  276. }
  277. return _mOldVect;
  278. }
  279. /**
  280. * @brief system AIC - install FIQ handler
  281. *
  282. * @param[in] pvNewISR own fiq handler
  283. *
  284. * @return old handler
  285. */
  286. PVOID sysInstallFiqHandler(PVOID pvNewISR)
  287. {
  288. PVOID _mOldVect;
  289. _mOldVect = *(PVOID volatile *)0x3C;
  290. *(PVOID volatile *)0x3C = pvNewISR;
  291. return _mOldVect;
  292. }
  293. /**
  294. * @brief system AIC - install IRQ handler
  295. *
  296. * @param[in] pvNewISR own irq handler
  297. *
  298. * @return old handler
  299. */
  300. PVOID sysInstallIrqHandler(PVOID pvNewISR)
  301. {
  302. PVOID _mOldVect;
  303. _mOldVect = *(PVOID volatile *)0x38;
  304. *(PVOID volatile *)0x38 = pvNewISR;
  305. return _mOldVect;
  306. }
  307. /**
  308. * @brief system AIC - install Own IRQ service routine
  309. *
  310. * @param[in] nIntTypeLevel Interrupt Level. ( \ref FIQ_LEVEL_0 / \ref IRQ_LEVEL_1 / \ref IRQ_LEVEL_2 / \ref IRQ_LEVEL_3 /
  311. * \ref IRQ_LEVEL_4 / \ref IRQ_LEVEL_5 / \ref IRQ_LEVEL_6 / \ref IRQ_LEVEL_7 )
  312. * @param[in] eIntNo Interrupt number. \ref IRQn_Type
  313. * @param[in] pvNewISR own IRQ handler
  314. *
  315. * @return old handler
  316. */
  317. PVOID sysInstallISR(INT32 nIntTypeLevel, IRQn_Type eIntNo, PVOID pvNewISR)
  318. {
  319. PVOID _mOldVect;
  320. UINT32 _mRegAddr;//, _mRegValue;
  321. INT shift;
  322. if (!_sys_bIsAICInitial)
  323. {
  324. sysInitializeAIC();
  325. _sys_bIsAICInitial = TRUE;
  326. }
  327. _mRegAddr = REG_AIC_SRCCTL0 + ((eIntNo / 4) * 4);
  328. shift = (eIntNo % 4) * 8;
  329. nIntTypeLevel &= 0xff;
  330. outpw(_mRegAddr, (inpw(_mRegAddr) & ~(0x0f << shift)) | (nIntTypeLevel << shift));
  331. if ((nIntTypeLevel & 0x7) == FIQ_LEVEL_0)
  332. {
  333. _mOldVect = (PVOID) sysFiqHandlerTable[eIntNo];
  334. sysFiqHandlerTable[eIntNo] = (sys_pvFunPtr)pvNewISR;
  335. }
  336. else
  337. {
  338. _mOldVect = (PVOID) sysIrqHandlerTable[eIntNo];
  339. sysIrqHandlerTable[eIntNo] = (sys_pvFunPtr)pvNewISR;
  340. }
  341. return _mOldVect;
  342. }
  343. INT32 sysSetGlobalInterrupt(INT32 nIntState)
  344. {
  345. switch (nIntState)
  346. {
  347. case ENABLE_ALL_INTERRUPTS:
  348. outpw(REG_AIC_INTEN0, 0xFFFFFFFF);
  349. outpw(REG_AIC_INTEN1, 0xFFFFFFFF);
  350. break;
  351. case DISABLE_ALL_INTERRUPTS:
  352. outpw(REG_AIC_INTDIS0, 0xFFFFFFFF);
  353. outpw(REG_AIC_INTDIS1, 0xFFFFFFFF);
  354. break;
  355. default:
  356. ;
  357. }
  358. return Successful;
  359. }
  360. /**
  361. * @brief system AIC - Change interrupt level
  362. *
  363. * @param[in] eIntNo Interrupt number. \ref IRQn_Type
  364. * @param[in] uIntLevel Interrupt Level. ( \ref FIQ_LEVEL_0 / \ref IRQ_LEVEL_1 / \ref IRQ_LEVEL_2 / \ref IRQ_LEVEL_3 /
  365. * \ref IRQ_LEVEL_4 / \ref IRQ_LEVEL_5 / \ref IRQ_LEVEL_6 / \ref IRQ_LEVEL_7 )
  366. *
  367. * @return 0
  368. */
  369. INT32 sysSetInterruptPriorityLevel(IRQn_Type eIntNo, UINT32 uIntLevel)
  370. {
  371. UINT32 _mRegAddr;
  372. INT shift;
  373. if ((eIntNo > SYS_MAX_INT_SOURCE) || (eIntNo < SYS_MIN_INT_SOURCE))
  374. return 1;
  375. _mRegAddr = REG_AIC_SRCCTL0 + ((eIntNo / 4) * 4);
  376. shift = (eIntNo % 4) * 8;
  377. uIntLevel &= 0x7;
  378. outpw(_mRegAddr, (inpw(_mRegAddr) & ~(0x07 << shift)) | (uIntLevel << shift));
  379. return 0;
  380. }
  381. /**
  382. * @brief system AIC - Set CP15 Interrupt Type
  383. *
  384. * @param[in] nIntState Interrupt state. ( \ref ENABLE_IRQ / \ref ENABLE_FIQ / \ref ENABLE_FIQ_IRQ /
  385. * \ref DISABLE_IRQ / \ref DISABLE_FIQ / \ref DISABLE_FIQ_IRQ)
  386. *
  387. * @return 0
  388. */
  389. INT32 sysSetLocalInterrupt(INT32 nIntState)
  390. {
  391. #if defined (__GNUC__) && !(__CC_ARM)
  392. # else
  393. INT32 temp;
  394. #endif
  395. switch (nIntState)
  396. {
  397. case ENABLE_IRQ:
  398. case ENABLE_FIQ:
  399. case ENABLE_FIQ_IRQ:
  400. #if defined (__GNUC__) && !(__CC_ARM)
  401. __asm__ __volatile__
  402. (
  403. "mrs r0, CPSR \n"
  404. "bic r0, r0, #0x80 \n"
  405. "msr CPSR_c, r0 \n"
  406. );
  407. #else
  408. __asm
  409. {
  410. MRS temp, CPSR
  411. AND temp, temp, nIntState
  412. MSR CPSR_c, temp
  413. }
  414. #endif
  415. break;
  416. case DISABLE_IRQ:
  417. case DISABLE_FIQ:
  418. case DISABLE_FIQ_IRQ:
  419. #if defined ( __GNUC__ ) && !(__CC_ARM)
  420. __asm__ __volatile__
  421. (
  422. "MRS r0, CPSR \n"
  423. "ORR r0, r0, #0x80 \n"
  424. "MSR CPSR_c, r0 \n"
  425. );
  426. #else
  427. __asm
  428. {
  429. MRS temp, CPSR
  430. ORR temp, temp, nIntState
  431. MSR CPSR_c, temp
  432. }
  433. #endif
  434. break;
  435. default:
  436. ;
  437. }
  438. return 0;
  439. }
  440. UINT32 sysGetInterruptEnableStatus(void)
  441. {
  442. return (inpw(REG_AIC_INTMSK0));
  443. }
  444. UINT32 sysGetInterruptEnableStatusH(void)
  445. {
  446. return (inpw(REG_AIC_INTMSK1));
  447. }
  448. /// @endcond HIDDEN_SYMBOLS
  449. /// @cond HIDDEN_SYMBOLS
  450. BOOL sysGetIBitState()
  451. {
  452. INT32 temp;
  453. #if defined (__GNUC__) && !(__CC_ARM)
  454. __asm__ __volatile__
  455. (
  456. "MRS %0, CPSR \n"
  457. :"=r"(temp)
  458. );
  459. #else
  460. __asm
  461. {
  462. MRS temp, CPSR
  463. }
  464. #endif
  465. if (temp & 0x80)
  466. return FALSE;
  467. else
  468. return TRUE;
  469. }
  470. INT32 sysGetPLL(UINT32 reg)
  471. {
  472. UINT32 N, M, P;
  473. N = ((inpw(reg) & 0x007F) >> 0) + 1;
  474. M = ((inpw(reg) & 0x1F80) >> 7) + 1;
  475. P = ((inpw(reg) & 0xE000) >> 13) + 1;
  476. return (12 * N / (M * P)); /* 12MHz HXT */
  477. }
  478. /// @endcond HIDDEN_SYMBOLS
  479. /**
  480. * @brief system Timer - install WDT interrupt handler
  481. *
  482. * @param[in] clk clock source. \ref CLK_Type
  483. *
  484. * @return MHz
  485. */
  486. UINT32 sysGetClock(CLK_Type clk)
  487. {
  488. UINT32 src, divN, reg;
  489. switch (clk)
  490. {
  491. case SYS_UPLL:
  492. return sysGetPLL(REG_CLK_UPLLCON);
  493. case SYS_APLL:
  494. return sysGetPLL(REG_CLK_APLLCON);
  495. case SYS_SYSTEM:
  496. {
  497. reg = inpw(REG_CLK_DIVCTL0);
  498. switch (reg & 0x18)
  499. {
  500. case 0x0:
  501. src = 12; /* HXT */
  502. break;
  503. case 0x10:
  504. src = sysGetPLL(REG_CLK_APLLCON);
  505. break;
  506. case 0x18:
  507. src = sysGetPLL(REG_CLK_UPLLCON);
  508. break;
  509. default:
  510. return 0;
  511. }
  512. divN = ((reg & 0x100) >> 8) + 1;
  513. return (src / divN);
  514. }
  515. case SYS_HCLK:
  516. {
  517. reg = inpw(REG_CLK_DIVCTL0);
  518. switch (reg & 0x18)
  519. {
  520. case 0x0:
  521. src = 12; /* HXT */
  522. break;
  523. case 0x10:
  524. src = sysGetPLL(REG_CLK_APLLCON);
  525. break;
  526. case 0x18:
  527. src = sysGetPLL(REG_CLK_UPLLCON);
  528. break;
  529. default:
  530. return 0;
  531. }
  532. divN = ((reg & 0x100) >> 8) + 1;
  533. return (src / divN / 2);
  534. }
  535. case SYS_PCLK01:
  536. {
  537. reg = inpw(REG_CLK_DIVCTL0);
  538. switch (reg & 0x18)
  539. {
  540. case 0x0:
  541. src = 12; /* HXT */
  542. break;
  543. case 0x10:
  544. src = sysGetPLL(REG_CLK_APLLCON);
  545. break;
  546. case 0x18:
  547. src = sysGetPLL(REG_CLK_UPLLCON);
  548. break;
  549. default:
  550. return 0;
  551. }
  552. divN = ((reg & 0x100) >> 8) + 1;
  553. return (src / divN / 2);
  554. }
  555. case SYS_CPU:
  556. {
  557. reg = inpw(REG_CLK_DIVCTL0);
  558. switch (reg & 0x18)
  559. {
  560. case 0x0:
  561. src = 12; /* HXT */
  562. break;
  563. case 0x10:
  564. src = sysGetPLL(REG_CLK_APLLCON);
  565. break;
  566. case 0x18:
  567. src = sysGetPLL(REG_CLK_UPLLCON);
  568. break;
  569. default:
  570. return 0;
  571. }
  572. divN = ((reg & 0x10000) >> 16) + 1;
  573. return (src / divN);
  574. }
  575. case SYS_PCLK2:
  576. {
  577. reg = inpw(REG_CLK_DIVCTL0);
  578. switch (reg & 0x18)
  579. {
  580. case 0x0:
  581. src = 12; /* HXT */
  582. break;
  583. case 0x10:
  584. src = sysGetPLL(REG_CLK_APLLCON);
  585. break;
  586. case 0x18:
  587. src = sysGetPLL(REG_CLK_UPLLCON);
  588. break;
  589. default:
  590. return 0;
  591. }
  592. divN = ((reg & 0x100) >> 8) + 1;
  593. return (src / divN / 2 / 2);
  594. }
  595. default:
  596. ;
  597. }
  598. return 0; //write me!!
  599. }
  600. INT32 sysGetSdramSizebyMB(void)
  601. {
  602. unsigned int volatile reg, totalsize = 0;
  603. reg = inpw(SDIC_BA + 0x10) & 0x07;
  604. switch (reg)
  605. {
  606. case 1:
  607. totalsize += 2;
  608. break;
  609. case 2:
  610. totalsize += 4;
  611. break;
  612. case 3:
  613. totalsize += 8;
  614. break;
  615. case 4:
  616. totalsize += 16;
  617. break;
  618. case 5:
  619. totalsize += 32;
  620. break;
  621. case 6:
  622. totalsize += 64;
  623. break;
  624. case 7:
  625. totalsize += 128;
  626. break;
  627. }
  628. if ((inpw(SDIC_BA + 0x14) & (0xFF << 21)) != 0)
  629. totalsize += totalsize;
  630. return totalsize;
  631. }
  632. /*@}*/ /* end of group SYS_EXPORTED_FUNCTIONS */
  633. /*@}*/ /* end of group SYS_Driver */
  634. /*@}*/ /* end of group Standard_Driver */
  635. /*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/