nu_uart.c 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200
  1. /**************************************************************************//**
  2. * @file uart.c
  3. * @version V1.00
  4. * @brief N9H30 UART driver source file
  5. *
  6. * SPDX-License-Identifier: Apache-2.0
  7. * @copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
  8. *****************************************************************************/
  9. #if 0
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include "N9H30.h"
  14. #include "nu_sys.h"
  15. #include "nu_uart.h"
  16. /** @addtogroup N9H30_Device_Driver N9H30 Device Driver
  17. @{
  18. */
  19. /** @addtogroup N9H30_UART_Driver UART Driver
  20. @{
  21. */
  22. /** @addtogroup N9H30_UART_EXPORTED_CONSTANTS UART Exported Constants
  23. @{
  24. */
  25. /*@}*/ /* end of group N9H30_UART_EXPORTED_CONSTANTS */
  26. /// @cond HIDDEN_SYMBOLS
  27. /*-----------------------------------------*/
  28. /* marco, type and constant definitions */
  29. /*-----------------------------------------*/
  30. /*
  31. Define debug level
  32. */
  33. //#define UART_DEBUG
  34. //#define UART_FLOWCONTROL_DEBUG
  35. //#define UART1_DEBUG
  36. //#define UART2_DEBUG
  37. #ifdef UART_DEBUG
  38. #define UDEBUG sysprintf
  39. #else
  40. #define UDEBUG(...)
  41. #endif /* UART_DEBUG */
  42. #ifdef UART_FLOWCONTROL_DEBUG
  43. #define FDEBUG sysprintf
  44. #else
  45. #define FDEBUG(...)
  46. #endif /* UART_FLOWCONTROL_DEBUG */
  47. #ifdef UART1_DEBUG
  48. #define U1DEBUG sysprintf
  49. #else
  50. #define U1DEBUG(...)
  51. #endif /* UART1_DEBUG */
  52. #ifdef UART2_DEBUG
  53. #define U2DEBUG sysprintf
  54. #else
  55. #define U2DEBUG(...)
  56. #endif /* UART1_DEBUG */
  57. /*-----------------------------------------*/
  58. /* global file scope (static) variables */
  59. /*-----------------------------------------*/
  60. static UART_BUFFER_T UART_DEV[UART_NUM];
  61. static UINT32 UARTTXBUFSIZE[UART_NUM] = {500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500}; /* UART0~10 Tx buffer size */
  62. static UINT32 UARTRXBUFSIZE[UART_NUM] = {500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500}; /* UART0~10 Rx buffer size */
  63. /*
  64. UART flag declarations.
  65. */
  66. static volatile CHAR _uart_cDSRState0 = 0; /* set 1, state change */
  67. static volatile CHAR _uart_cDSRState1 = 0; /* set 1, state change */
  68. static volatile CHAR _uart_cDSRState2 = 0; /* set 1, state change */
  69. static volatile CHAR _uart_cDSRState3 = 0; /* set 1, state change */
  70. static volatile CHAR _uart_cDSRState4 = 0; /* set 1, state change */
  71. static volatile CHAR _uart_cDSRState5 = 0; /* set 1, state change */
  72. static volatile CHAR _uart_cDSRState6 = 0; /* set 1, state change */
  73. static volatile CHAR _uart_cDSRState7 = 0; /* set 1, state change */
  74. static volatile CHAR _uart_cDSRState8 = 0; /* set 1, state change */
  75. static volatile CHAR _uart_cDSRState9 = 0; /* set 1, state change */
  76. static volatile CHAR _uart_cDSRState10 = 0; /* set 1, state change */
  77. static volatile CHAR _uart_cBIIState_0 = 0; /* set 1, UART channel 0 break interrupt occur */
  78. static volatile CHAR _uart_cBIIState_1 = 0; /* set 1, UART channel 1 break interrupt occur */
  79. static volatile CHAR _uart_cBIIState_2 = 0; /* set 1, UART channel 2 break interrupt occur */
  80. static volatile CHAR _uart_cBIIState_3 = 0; /* set 1, UART channel 3 break interrupt occur */
  81. static volatile CHAR _uart_cBIIState_4 = 0; /* set 1, UART channel 4 break interrupt occur */
  82. static volatile CHAR _uart_cBIIState_5 = 0; /* set 1, UART channel 0 break interrupt occur */
  83. static volatile CHAR _uart_cBIIState_6 = 0; /* set 1, UART channel 1 break interrupt occur */
  84. static volatile CHAR _uart_cBIIState_7 = 0; /* set 1, UART channel 2 break interrupt occur */
  85. static volatile CHAR _uart_cBIIState_8 = 0; /* set 1, UART channel 3 break interrupt occur */
  86. static volatile CHAR _uart_cBIIState_9 = 0; /* set 1, UART channel 4 break interrupt occur */
  87. static volatile CHAR _uart_cBIIState_10 = 0; /* set 1, UART channel 4 break interrupt occur */
  88. static volatile CHAR _uart_cCTSState0 = 0; /* set 1, state change */
  89. static volatile CHAR _uart_cCTSState1 = 0; /* set 1, state change */
  90. static volatile CHAR _uart_cCTSState2 = 0; /* set 1, state change */
  91. static volatile CHAR _uart_cCTSState3 = 0; /* set 1, state change */
  92. static volatile CHAR _uart_cCTSState4 = 0; /* set 1, state change */
  93. static volatile CHAR _uart_cCTSState5 = 0; /* set 1, state change */
  94. static volatile CHAR _uart_cCTSState6 = 0; /* set 1, state change */
  95. static volatile CHAR _uart_cCTSState7 = 0; /* set 1, state change */
  96. static volatile CHAR _uart_cCTSState8 = 0; /* set 1, state change */
  97. static volatile CHAR _uart_cCTSState9 = 0; /* set 1, state change */
  98. static volatile CHAR _uart_cCTSState10 = 0; /* set 1, state change */
  99. /*
  100. Define flow control flags & parameters.
  101. */
  102. #define HWFLOWCONTROL 1
  103. #define SWFLOWCONTROL 2
  104. static volatile CHAR _uart_cFlowControlMode = 0; /* default no flow control */
  105. static volatile CHAR _uart_cHWTXStopped = 0; /* Use for H/W flow control. Set 1, stop TX. Set 0, start TX. */
  106. static volatile CHAR _uart_cHWRXStopped = 0; /* Use for H/W flow control. Set 1, stop RX. Set 0, start RX. */
  107. static volatile CHAR _uart_cSWTXStopped = 0; /* Use for S/W flow control. Set 1, rec Xoff. Set 0, rec Xon. */
  108. static volatile CHAR _uart_cSWRXStopped = 0; /* Use for S/W flow control. Set 1, send Xoff. Set 0, send Xon. */
  109. //static INT _uart_nMaxRxBuf = 0; /* used in uartReceiveChars() */
  110. //static INT _uart_nMinRxBuf = 0; /* used in uartReadRxBuf() */
  111. /*-----------------------------------------*/
  112. /* prototypes of static functions */
  113. /*-----------------------------------------*/
  114. static UINT32 _uartTxBufGetNextOne(INT nNum, UINT32 uPointer);
  115. static UINT32 _uartRxBufGetNextOne(INT nNum, UINT32 uPointer);
  116. static void _uartEnableInterrupt(INT nNum, UINT32 uVal);
  117. static void _uartDisableInterrupt(INT nNum, UINT32 uVal);
  118. static void _uartReceiveChars(INT nNum);
  119. static void _uartTransmitChars(INT nNum);
  120. static void _uartCheckModemStatus(INT nNum);
  121. static INT _uartSetBaudRate(INT nNum, UART_T *val);
  122. static void _uartInstallISR(UINT8 ucNum);
  123. static BOOL _uartBUFSpaceAlloc(INT nNum);
  124. static BOOL _uartCheckTxBufSpace(INT nNum, UINT32 uHead, UINT32 uTail, UINT32 uLen);
  125. static INT32 _uartReadRxBuf(INT nNum, PUINT8 pucBuf, UINT32 uLen);
  126. static void _uartWriteTxBuf(INT nNum, PUINT8 pucBuf, UINT32 uLen);
  127. static INT _uartConfigureUART(PVOID pvParam);
  128. static INT _uartPerformIrDA(INT nNum, UINT32 uCmd, UINT32 uCmd1);
  129. static INT _uartGetRegisterValue(INT nNum, PVOID pvReg);
  130. void RS485_HANDLE(INT nNum)
  131. {
  132. UINT32 volatile uRegISR, uRegFSR, uRegALT_CSR;
  133. uRegISR = inpw(REG_UART0_ISR + (nNum * UARTOFFSET));
  134. uRegFSR = inpw(REG_UART0_FSR + (nNum * UARTOFFSET));
  135. if ((uRegISR & UART_ISR_RLS_IF_Msk) && (uRegISR & UART_ISR_RDA_IF_Msk)) /* RLS INT & RDA INT */ //For RS485 Detect Address
  136. {
  137. if (uRegFSR & UART_FSR_RS485_ADD_DETF_Msk) /* ADD_IF, RS485 mode */
  138. {
  139. _uartReceiveChars(nNum);
  140. outpw((REG_UART0_FSR + (nNum * UARTOFFSET)), UART_FSR_RS485_ADD_DETF_Msk); /* clear ADD_IF flag */
  141. }
  142. }
  143. else if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Rx Ready or Time-out INT*/
  144. {
  145. /* Handle received data */
  146. _uartReceiveChars(nNum);
  147. }
  148. if (uRegISR & UART_ISR_RLS_IF_Msk)
  149. {
  150. uRegFSR = inpw(REG_UART0_FSR + (nNum * UARTOFFSET));
  151. if (uRegFSR & UART_FSR_BIF_Msk)
  152. _uart_cBIIState_0 = 1;
  153. }
  154. }
  155. void uart0ISR(void)
  156. {
  157. UINT32 volatile uRegISR, uRegFSR;
  158. uRegISR = inpw(REG_UART0_ISR) & 0xff;
  159. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  160. _uartTransmitChars(UART0);
  161. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  162. _uartReceiveChars(UART0);
  163. if (uRegISR & UART_ISR_RLS_IF_Msk)
  164. {
  165. uRegFSR = inpw(REG_UART0_FSR);
  166. if (uRegFSR & UART_FSR_BIF_Msk)
  167. _uart_cBIIState_0 = 1;
  168. }
  169. }
  170. void uart1ISR(void)
  171. {
  172. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  173. uRegISR = inpw(REG_UART1_ISR) & 0xff;
  174. uRegFUN_SEL = inpw(REG_UART1_FUN_SEL);
  175. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  176. _uartTransmitChars(UART1);
  177. if (uRegFUN_SEL == 0x3)
  178. {
  179. RS485_HANDLE(UART1);
  180. }
  181. else
  182. {
  183. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  184. _uartReceiveChars(UART1);
  185. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  186. {
  187. if (_uart_cFlowControlMode == 0)
  188. {
  189. uRegMSR = inpw(REG_UART1_MSR);
  190. if (uRegMSR & 0x01)
  191. _uart_cCTSState1 = 1;
  192. }
  193. else
  194. _uartCheckModemStatus(UART1); /* H/W flow control */
  195. }
  196. if (uRegISR & UART_ISR_RLS_IF_Msk)
  197. {
  198. uRegFSR = inpw(REG_UART1_FSR);
  199. U1DEBUG("U1 Irpt_RLS [0x%x]!\n", uRegFSR);
  200. if (uRegFSR & UART_FSR_BIF_Msk)
  201. _uart_cBIIState_1 = 1;
  202. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  203. U1DEBUG("U1 OEI!\n");
  204. }
  205. }
  206. }
  207. void uart2ISR(void)
  208. {
  209. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  210. uRegISR = inpw(REG_UART2_ISR) & 0xff;
  211. uRegFUN_SEL = inpw(REG_UART2_FUN_SEL);
  212. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  213. _uartTransmitChars(UART2);
  214. if (uRegFUN_SEL == 0x3)
  215. {
  216. RS485_HANDLE(UART2);
  217. }
  218. else
  219. {
  220. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  221. _uartReceiveChars(UART2);
  222. if (uRegISR & UART_ISR_RLS_IF_Msk)
  223. {
  224. uRegFSR = inpw(REG_UART2_FSR);
  225. if (uRegFSR & UART_FSR_BIF_Msk)
  226. _uart_cBIIState_2 = 1;
  227. }
  228. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  229. {
  230. if (_uart_cFlowControlMode == 0)
  231. {
  232. uRegMSR = inpw(REG_UART2_MSR);
  233. if (uRegMSR & 0x01)
  234. _uart_cCTSState2 = 1;
  235. }
  236. else
  237. _uartCheckModemStatus(UART2); /* H/W flow control */
  238. }
  239. if (uRegISR & UART_ISR_RLS_IF_Msk)
  240. {
  241. uRegFSR = inpw(REG_UART2_FSR);
  242. U1DEBUG("U2 Irpt_RLS [0x%x]!\n", uRegFSR);
  243. if (uRegFSR & UART_FSR_BIF_Msk)
  244. _uart_cBIIState_2 = 1;
  245. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  246. U1DEBUG("U2 OEI!\n");
  247. }
  248. }
  249. }
  250. void uart3ISR(void)
  251. {
  252. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  253. uRegISR = inpw(REG_UART3_ISR) & 0xff;
  254. uRegFUN_SEL = inpw(REG_UART3_FUN_SEL);
  255. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  256. _uartTransmitChars(UART3);
  257. if (uRegFUN_SEL == 0x3)
  258. {
  259. RS485_HANDLE(UART3);
  260. }
  261. else
  262. {
  263. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk))
  264. _uartReceiveChars(UART3);
  265. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  266. {
  267. if (_uart_cFlowControlMode == 0)
  268. {
  269. uRegMSR = inpw(REG_UART3_MSR);
  270. if (uRegMSR & 0x01)
  271. _uart_cCTSState3 = 1;
  272. }
  273. else
  274. _uartCheckModemStatus(UART3); /* H/W flow control */
  275. }
  276. if (uRegISR & UART_ISR_RLS_IF_Msk)
  277. {
  278. uRegFSR = inpw(REG_UART3_FSR);
  279. U1DEBUG("U3 Irpt_RLS [0x%x]!\n", uRegFSR);
  280. if (uRegFSR & UART_FSR_BIF_Msk)
  281. _uart_cBIIState_3 = 1;
  282. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  283. U1DEBUG("U3 OEI!\n");
  284. }
  285. }
  286. }
  287. void uart4ISR(void)
  288. {
  289. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  290. uRegISR = inpw(REG_UART4_ISR) & 0xff;
  291. uRegFUN_SEL = inpw(REG_UART4_FUN_SEL);
  292. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  293. _uartTransmitChars(UART4);
  294. if (uRegFUN_SEL == 0x3)
  295. {
  296. RS485_HANDLE(UART4);
  297. }
  298. else
  299. {
  300. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  301. _uartReceiveChars(UART4);
  302. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  303. {
  304. if (_uart_cFlowControlMode == 0)
  305. {
  306. uRegMSR = inpw(REG_UART4_MSR);
  307. if (uRegMSR & 0x01)
  308. _uart_cCTSState4 = 1;
  309. }
  310. else
  311. _uartCheckModemStatus(UART4); /* H/W flow control */
  312. }
  313. if (uRegISR & UART_ISR_RLS_IF_Msk)
  314. {
  315. uRegFSR = inpw(REG_UART4_FSR);
  316. U1DEBUG("U4 Irpt_RLS [0x%x]!\n", uRegFSR);
  317. if (uRegFSR & UART_FSR_BIF_Msk)
  318. _uart_cBIIState_4 = 1;
  319. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  320. U1DEBUG("U4 OEI!\n");
  321. }
  322. }
  323. }
  324. void uart5ISR(void)
  325. {
  326. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  327. uRegISR = inpw(REG_UART5_ISR) & 0xff;
  328. uRegFUN_SEL = inpw(REG_UART5_FUN_SEL);
  329. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  330. _uartTransmitChars(UART5);
  331. if (uRegFUN_SEL == 0x3)
  332. {
  333. RS485_HANDLE(UART5);
  334. }
  335. else
  336. {
  337. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  338. _uartReceiveChars(UART5);
  339. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  340. {
  341. if (_uart_cFlowControlMode == 0)
  342. {
  343. uRegMSR = inpw(REG_UART5_MSR);
  344. if (uRegMSR & 0x01)
  345. _uart_cCTSState5 = 1;
  346. }
  347. else
  348. _uartCheckModemStatus(UART5); /* H/W flow control */
  349. }
  350. if (uRegISR & UART_ISR_RLS_IF_Msk)
  351. {
  352. uRegFSR = inpw(REG_UART5_FSR);
  353. U1DEBUG("U5 Irpt_RLS [0x%x]!\n", uRegFSR);
  354. if (uRegFSR & UART_FSR_BIF_Msk)
  355. _uart_cBIIState_5 = 1;
  356. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  357. U1DEBUG("U5 OEI!\n");
  358. }
  359. }
  360. }
  361. void uart6ISR(void)
  362. {
  363. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  364. uRegISR = inpw(REG_UART6_ISR) & 0xff;
  365. uRegFUN_SEL = inpw(REG_UART6_FUN_SEL);
  366. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  367. _uartTransmitChars(UART6);
  368. if (uRegFUN_SEL == 0x3)
  369. {
  370. RS485_HANDLE(UART6);
  371. }
  372. else
  373. {
  374. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  375. _uartReceiveChars(UART6);
  376. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  377. {
  378. if (_uart_cFlowControlMode == 0)
  379. {
  380. uRegMSR = inpw(REG_UART6_MSR);
  381. if (uRegMSR & 0x01)
  382. _uart_cCTSState6 = 1;
  383. }
  384. else
  385. _uartCheckModemStatus(UART6); /* H/W flow control */
  386. }
  387. if (uRegISR & UART_ISR_RLS_IF_Msk)
  388. {
  389. uRegFSR = inpw(REG_UART6_FSR);
  390. U1DEBUG("U6 Irpt_RLS [0x%x]!\n", uRegFSR);
  391. if (uRegFSR & UART_FSR_BIF_Msk)
  392. _uart_cBIIState_6 = 1;
  393. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  394. U1DEBUG("U6 OEI!\n");
  395. }
  396. }
  397. }
  398. void uart7ISR(void)
  399. {
  400. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  401. uRegISR = inpw(REG_UART7_ISR) & 0xff;
  402. uRegFUN_SEL = inpw(REG_UART7_FUN_SEL);
  403. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  404. _uartTransmitChars(UART7);
  405. if (uRegFUN_SEL == 0x3)
  406. {
  407. RS485_HANDLE(UART7);
  408. }
  409. else
  410. {
  411. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  412. _uartReceiveChars(UART7);
  413. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  414. {
  415. if (_uart_cFlowControlMode == 0)
  416. {
  417. uRegMSR = inpw(REG_UART7_MSR);
  418. if (uRegMSR & 0x01)
  419. _uart_cCTSState7 = 1;
  420. }
  421. else
  422. _uartCheckModemStatus(UART7); /* H/W flow control */
  423. }
  424. if (uRegISR & UART_ISR_RLS_IF_Msk)
  425. {
  426. uRegFSR = inpw(REG_UART7_FSR);
  427. U1DEBUG("U7 Irpt_RLS [0x%x]!\n", uRegFSR);
  428. if (uRegFSR & UART_FSR_BIF_Msk)
  429. _uart_cBIIState_7 = 1;
  430. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  431. U1DEBUG("U7 OEI!\n");
  432. }
  433. }
  434. }
  435. void uart8ISR(void)
  436. {
  437. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  438. uRegISR = inpw(REG_UART8_ISR) & 0xff;
  439. uRegFUN_SEL = inpw(REG_UART8_FUN_SEL);
  440. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  441. _uartTransmitChars(UART8);
  442. if (uRegFUN_SEL == 0x3)
  443. {
  444. RS485_HANDLE(UART8);
  445. }
  446. else
  447. {
  448. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  449. _uartReceiveChars(UART8);
  450. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  451. {
  452. if (_uart_cFlowControlMode == 0)
  453. {
  454. uRegMSR = inpw(REG_UART8_MSR);
  455. if (uRegMSR & 0x01)
  456. _uart_cCTSState8 = 1;
  457. }
  458. else
  459. _uartCheckModemStatus(UART8); /* H/W flow control */
  460. }
  461. if (uRegISR & UART_ISR_RLS_IF_Msk)
  462. {
  463. uRegFSR = inpw(REG_UART8_FSR);
  464. U1DEBUG("U8 Irpt_RLS [0x%x]!\n", uRegFSR);
  465. if (uRegFSR & UART_FSR_BIF_Msk)
  466. _uart_cBIIState_8 = 1;
  467. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  468. U1DEBUG("U8 OEI!\n");
  469. }
  470. }
  471. }
  472. void uart9ISR(void)
  473. {
  474. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  475. uRegISR = inpw(REG_UART9_ISR) & 0xff;
  476. uRegFUN_SEL = inpw(REG_UART9_FUN_SEL);
  477. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  478. _uartTransmitChars(UART9);
  479. if (uRegFUN_SEL == 0x3)
  480. {
  481. RS485_HANDLE(UART9);
  482. }
  483. else
  484. {
  485. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  486. _uartReceiveChars(UART9);
  487. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  488. {
  489. if (_uart_cFlowControlMode == 0)
  490. {
  491. uRegMSR = inpw(REG_UART9_MSR);
  492. if (uRegMSR & 0x01)
  493. _uart_cCTSState9 = 1;
  494. }
  495. else
  496. _uartCheckModemStatus(UART9); /* H/W flow control */
  497. }
  498. if (uRegISR & UART_ISR_RLS_IF_Msk)
  499. {
  500. uRegFSR = inpw(REG_UART9_FSR);
  501. U1DEBUG("U9 Irpt_RLS [0x%x]!\n", uRegFSR);
  502. if (uRegFSR & UART_FSR_BIF_Msk)
  503. _uart_cBIIState_9 = 1;
  504. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  505. U1DEBUG("U9 OEI!\n");
  506. }
  507. }
  508. }
  509. void uart10ISR(void)
  510. {
  511. UINT32 volatile uRegISR, uRegFSR, uRegMSR, uRegFUN_SEL;
  512. uRegISR = inpw(REG_UARTA_ISR) & 0xff;
  513. uRegFUN_SEL = inpw(REG_UARTA_FUN_SEL);
  514. if (uRegISR & UART_ISR_THRE_IF_Msk) /* TX empty interrupt, check LSR 4 kinds of error further */
  515. _uartTransmitChars(UARTA);
  516. if (uRegFUN_SEL == 0x3)
  517. {
  518. RS485_HANDLE(UARTA);
  519. }
  520. else
  521. {
  522. if (uRegISR & (UART_ISR_RDA_IF_Msk | UART_ISR_TOUT_IF_Msk)) /* Received Data Available interrupt */
  523. _uartReceiveChars(UARTA);
  524. if (uRegISR & UART_ISR_MODEM_IF_Msk)
  525. {
  526. if (_uart_cFlowControlMode == 0)
  527. {
  528. uRegMSR = inpw(REG_UARTA_MSR);
  529. if (uRegMSR & 0x01)
  530. _uart_cCTSState10 = 1;
  531. }
  532. else
  533. _uartCheckModemStatus(UARTA); /* H/W flow control */
  534. }
  535. if (uRegISR & UART_ISR_RLS_IF_Msk)
  536. {
  537. uRegFSR = inpw(REG_UARTA_FSR);
  538. U1DEBUG("U10 Irpt_RLS [0x%x]!\n", uRegFSR);
  539. if (uRegFSR & UART_FSR_BIF_Msk)
  540. _uart_cBIIState_10 = 1;
  541. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  542. U1DEBUG("U10 OEI!\n");
  543. }
  544. }
  545. }
  546. static UINT32 _uartTxBufGetNextOne(INT nNum, UINT32 uPointer)
  547. {
  548. if ((uPointer + 1) == UARTTXBUFSIZE[nNum])
  549. return (UINT32)NULL;
  550. else
  551. return (uPointer + 1);
  552. }
  553. static UINT32 _uartRxBufGetNextOne(INT nNum, UINT32 uPointer)
  554. {
  555. if ((uPointer + 1) == UARTRXBUFSIZE[nNum])
  556. return (UINT32)NULL;
  557. else
  558. return (uPointer + 1);
  559. }
  560. static void _uartEnableInterrupt(INT nNum, UINT32 uVal)
  561. {
  562. UINT32 uReg = 0;
  563. uReg = inpw(REG_UART0_IER + (nNum * UARTOFFSET));
  564. uReg |= uVal;
  565. outpw(REG_UART0_IER + (nNum * UARTOFFSET), uReg);
  566. }
  567. static void _uartDisableInterrupt(INT nNum, UINT32 uVal)
  568. {
  569. UINT32 uReg = 0;
  570. if (uVal == DISABLEALLIER)
  571. outpw(REG_UART0_IER + (nNum * UARTOFFSET), 0);
  572. else
  573. {
  574. uReg = inpw(REG_UART0_IER + (nNum * UARTOFFSET));
  575. uReg &= ~uVal;
  576. outpw(REG_UART0_IER + (nNum * UARTOFFSET), uReg);
  577. }
  578. }
  579. static void _uartReceiveChars(INT nNum)
  580. {
  581. //UINT32 volatile uRegLSR, uBuf = 0;
  582. UINT32 volatile uRegFSR, uRegALT_CSR, uRegFUN_SEL, uRegFCR, uRegLINSR, uRegISR;
  583. UINT32 volatile uBuf = 0;
  584. UINT32 volatile uOffset = nNum * UARTOFFSET;
  585. INT nMaxCount = 256;
  586. UCHAR ucChar;
  587. UART_BUFFER_T *dev;
  588. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  589. //uRegFSR = inpw(REG_UART0_FSR+(nNum * UARTOFFSET));
  590. uRegFUN_SEL = inpw(REG_UART0_FUN_SEL + uOffset);
  591. do
  592. {
  593. uRegFSR = inpw(REG_UART0_FSR + uOffset);
  594. uRegLINSR = inpw(REG_UART0_LIN_SR + uOffset);
  595. uRegISR = inpw(REG_UART0_ISR + uOffset);
  596. ucChar = inpb(REG_UART0_RBR + uOffset);
  597. if ((uRegFSR & UART_FSR_RS485_ADD_DETF_Msk) && (uRegFUN_SEL == 0x3))
  598. {
  599. uRegALT_CSR = inpw(REG_UART0_ALT_CSR + (nNum * UARTOFFSET));
  600. uRegFCR = inpw(REG_UART0_FCR + (nNum * UARTOFFSET));
  601. if (uRegALT_CSR & UART_ALT_CSR_RS485_NMM_Msk)
  602. {
  603. if (ucChar == (uRegALT_CSR >> UART_ALT_CSR_ADDR_MATCH_Pos))
  604. {
  605. uRegFCR &= ~UART_FCR_RX_DIS_Msk; /* Enable RS485 RX */
  606. outpw((REG_UART0_FCR + (nNum * UARTOFFSET)), uRegFCR);
  607. }
  608. else
  609. {
  610. uRegFCR |= UART_FCR_RX_DIS_Msk; /* Disable RS485 RX */
  611. uRegFCR |= UART_FCR_RFR_Msk; /* Clear data from RX FIFO */
  612. outpw((REG_UART0_FCR + (nNum * UARTOFFSET)), uRegFCR);
  613. break;
  614. }
  615. }
  616. }
  617. uBuf = _uartRxBufGetNextOne(nNum, dev->uUartRxTail);
  618. if (uBuf == dev->uUartRxHead) /* Rx buffer full */
  619. {
  620. //ucChar = inpb(REG_UART0_RBR+(nNum * UARTOFFSET));
  621. if (_uart_cHWRXStopped)
  622. U1DEBUG("[%d] buf full!\n", nNum);
  623. break;
  624. }
  625. //ucChar = inpb(REG_UART0_RBR+(nNum * UARTOFFSET));
  626. dev->pucUartRxBuf[dev->uUartRxTail] = ucChar;
  627. /* Check LSR for BII, FEI, PEI, OEI */
  628. dev->pucUARTFlag[dev->uUartRxTail] = 0;
  629. if (uRegFSR & UART_FSR_BIF_Msk)
  630. {
  631. dev->pucUARTFlag[dev->uUartRxTail] = UART_FSR_BIF_Msk;
  632. U1DEBUG("BIF!\n");
  633. }
  634. else if (uRegFSR & UART_FSR_FEF_Msk)
  635. {
  636. dev->pucUARTFlag[dev->uUartRxTail] = UART_FSR_FEF_Msk;
  637. U1DEBUG("FEF!\n");
  638. }
  639. else if (uRegFSR & UART_FSR_PEF_Msk)
  640. {
  641. dev->pucUARTFlag[dev->uUartRxTail] = UART_FSR_PEF_Msk;
  642. U1DEBUG("PEF!\n");
  643. }
  644. else if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  645. {
  646. dev->pucUARTFlag[dev->uUartRxTail] = UART_FSR_RX_OVER_IF_Msk;
  647. U1DEBUG("OVER_IF!\n");
  648. }
  649. else if (uRegFSR & UART_FSR_RS485_ADD_DETF_Msk)
  650. {
  651. dev->pucUARTFlag[dev->uUartRxTail] = UART_FSR_RS485_ADD_DETF_Msk;
  652. U1DEBUG("RS485_ADD_DET_IF!\n");
  653. }
  654. if (uRegFUN_SEL == 0x1)
  655. {
  656. if (uRegISR & UART_ISR_LIN_RX_BREAK_IF_Msk)
  657. {
  658. dev->pucLINFlag[dev->uUartRxTail] = uRegLINSR;
  659. // Clear ISR and LIN Status
  660. outpw(REG_UART0_ISR, UART_ISR_LIN_RX_BREAK_IF_Msk);
  661. outpw(REG_UART0_LIN_SR, 0x30F);
  662. }
  663. }
  664. dev->uUartRxTail = _uartRxBufGetNextOne(nNum, dev->uUartRxTail);
  665. /* overrun error is special case, H/W ignore the character */
  666. if (uRegFSR & UART_FSR_RX_OVER_IF_Msk)
  667. {
  668. dev->pucUARTFlag[dev->uUartRxTail] = UART_FSR_RX_OVER_IF_Msk;
  669. dev->uUartRxTail = _uartRxBufGetNextOne(nNum, dev->uUartRxTail);
  670. }
  671. uRegFSR = inpw(REG_UART0_FSR + (nNum * UARTOFFSET));
  672. }
  673. while ((!(uRegFSR & UART_FSR_RX_EMPTY_Msk)) && (nMaxCount-- > 0));
  674. }
  675. static void _uartTransmitChars(INT nNum)
  676. {
  677. UINT32 volatile i;
  678. UART_BUFFER_T *dev;
  679. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  680. if (dev->uUartTxHead != dev->uUartTxTail) /* buffer is not empty */
  681. {
  682. for (i = 0; i < 8; i++)
  683. {
  684. outpw(REG_UART0_THR + (nNum * UARTOFFSET), dev->pucUartTxBuf[dev->uUartTxHead]);
  685. dev->uUartTxHead = _uartTxBufGetNextOne(nNum, dev->uUartTxHead);
  686. if (dev->uUartTxHead == dev->uUartTxTail) /* buffer empty */
  687. {
  688. _uartDisableInterrupt(nNum, UART_IER_THRE_IEN_Msk);
  689. break;
  690. }
  691. }
  692. }
  693. }
  694. /*
  695. Call by uart1ISR().
  696. */
  697. static void _uartCheckModemStatus(INT nNum)
  698. {
  699. UINT32 volatile uRegMSR;
  700. UINT32 uOffset = nNum * UARTOFFSET;
  701. UART_BUFFER_T *dev;
  702. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  703. FDEBUG("\n Modem INT\n");
  704. uRegMSR = inpw(REG_UART0_MSR + uOffset);
  705. if (_uart_cHWTXStopped)
  706. {
  707. if (!(uRegMSR & 0x10)) /* CTS high, external signal is low */
  708. {
  709. _uart_cHWTXStopped = 0;
  710. FDEBUG("H/W flow control ...\n");
  711. /* 2007.11.12 modify, PT23 HHWu */
  712. if (dev->uUartTxHead != dev->uUartTxTail) /* buffer is not empty */
  713. {
  714. _uartEnableInterrupt(nNum, UART_IER_THRE_IEN_Msk); /* enable TX empty interrupt */
  715. FDEBUG("buf not empty, TX continued\n");
  716. }
  717. }
  718. }
  719. else
  720. {
  721. if (!(uRegMSR & 0x10)) /* CTS low, external signal is high */
  722. {
  723. _uart_cHWTXStopped = 1;
  724. _uartDisableInterrupt(nNum, UART_IER_THRE_IEN_Msk); /* disable TX empty interrupt */
  725. FDEBUG("H/W flow control, TX stopped\n");
  726. }
  727. }
  728. }
  729. static INT _uartSetBaudRate(INT nNum, UART_T *val)
  730. {
  731. UINT32 u32Reg;
  732. UINT32 uOffset = nNum * UARTOFFSET;
  733. UINT32 u32Baud_Div;
  734. UINT32 u32Clk = val->uFreq;
  735. UINT32 u32baudrate = val->uBaudRate;
  736. //if (val->uFreq > 200000000) /* Max frequency 200MHz */
  737. // return -1;
  738. u32Baud_Div = UART_BAUD_MODE2_DIVIDER(u32Clk, u32baudrate);
  739. if (u32Baud_Div > 0xFFFF)
  740. u32Reg = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER(u32Clk, u32baudrate));
  741. else
  742. u32Reg = (UART_BAUD_MODE2 | u32Baud_Div);
  743. outpw(REG_UART0_BAUD + uOffset, u32Reg);
  744. return 0;
  745. }
  746. static void _uartInstallISR(UINT8 ucNum)
  747. {
  748. UART_BUFFER_T *dev;
  749. IRQn_Type IRQ;
  750. dev = (UART_BUFFER_T *) &UART_DEV[ucNum];
  751. if (ucNum == UART0)
  752. {
  753. IRQ = UART0_IRQn;
  754. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart0ISR);
  755. }
  756. else if (ucNum == UART1)
  757. {
  758. IRQ = UART1_IRQn;
  759. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart1ISR);
  760. }
  761. else if (ucNum == UART2)
  762. {
  763. IRQ = UART2_IRQn;
  764. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart2ISR);
  765. }
  766. else if (ucNum == UART3)
  767. {
  768. IRQ = UART3_IRQn;
  769. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart3ISR);
  770. }
  771. else if (ucNum == UART4)
  772. {
  773. IRQ = UART4_IRQn;
  774. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart4ISR);
  775. }
  776. else if (ucNum == UART5)
  777. {
  778. IRQ = UART5_IRQn;
  779. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart5ISR);
  780. }
  781. else if (ucNum == UART6)
  782. {
  783. IRQ = UART6_IRQn;
  784. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart6ISR);
  785. }
  786. else if (ucNum == UART7)
  787. {
  788. IRQ = UART7_IRQn;
  789. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart7ISR);
  790. }
  791. else if (ucNum == UART8)
  792. {
  793. IRQ = UART8_IRQn;
  794. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart8ISR);
  795. }
  796. else if (ucNum == UART9)
  797. {
  798. IRQ = UART9_IRQn;
  799. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart9ISR);
  800. }
  801. else if (ucNum == UARTA)
  802. {
  803. IRQ = UART10_IRQn;
  804. dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)uart10ISR);
  805. }
  806. else
  807. {
  808. return;
  809. }
  810. //dev->pvUartVector = sysInstallISR((IRQ_LEVEL_1 | HIGH_LEVEL_SENSITIVE), IRQ, (PVOID)pvNewISR);
  811. sysSetLocalInterrupt(ENABLE_IRQ); /* enable CPSR I bit */
  812. sysEnableInterrupt(IRQ);
  813. //DrvUART_EnableInt(TEST_PORT,(DRVUART_RLSINT|DRVUART_THREINT|DRVUART_RDAINT));
  814. }
  815. static BOOL _uartBUFSpaceAlloc(INT nNum)
  816. {
  817. UART_BUFFER_T *dev;
  818. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  819. /* Memory allocate Tx buffer */
  820. dev->pucUartTxBuf = (PUINT8) malloc(UARTTXBUFSIZE[nNum] * sizeof(UINT8));
  821. if (dev->pucUartTxBuf == NULL)
  822. return FALSE;
  823. /* Memory allocate Rx buffer */
  824. dev->pucUartRxBuf = (PUINT8) malloc(UARTRXBUFSIZE[nNum] * sizeof(UINT8));
  825. if (dev->pucUartRxBuf == NULL)
  826. {
  827. free(dev->pucUartTxBuf);
  828. return FALSE;
  829. }
  830. /* Memory allocate Rx character flag */
  831. dev->pucUARTFlag = (PINT) malloc(UARTRXBUFSIZE[nNum] * sizeof(INT));
  832. if (dev->pucUARTFlag == NULL)
  833. {
  834. free(dev->pucUartTxBuf);
  835. free(dev->pucUartRxBuf);
  836. return FALSE;
  837. }
  838. /* initial memory */
  839. memset(dev->pucUartTxBuf, 0, UARTTXBUFSIZE[nNum] * sizeof(UINT8));
  840. memset(dev->pucUartRxBuf, 0, UARTRXBUFSIZE[nNum] * sizeof(UINT8));
  841. memset(dev->pucUARTFlag, 0, UARTRXBUFSIZE[nNum] * sizeof(INT));
  842. /* inital struct UART_BUFFER_STRUCT, uUartTxHead, uUartTxTail, uUartRxHead, uUartRxTail */
  843. dev->uUartTxHead = dev->uUartTxTail = (UINT32)NULL;
  844. dev->uUartRxHead = dev->uUartRxTail = (UINT32)NULL;
  845. return TRUE;
  846. }
  847. static BOOL _uartCheckTxBufSpace(INT nNum, UINT32 uHead, UINT32 uTail, UINT32 uLen)
  848. {
  849. UINT32 uBuf;
  850. uBuf = _uartTxBufGetNextOne(nNum, uTail);
  851. if (uBuf == uHead) /* Tx buffer full */
  852. return FALSE;
  853. if (uHead == uTail) /* Tx buffer empty */
  854. return TRUE;
  855. if (uTail > uHead)
  856. {
  857. if (uLen >= (UARTTXBUFSIZE[nNum] - (uTail - uHead))) /* 2007.10.29 fix pointer bug, PT23 HHWu */
  858. return FALSE; /* Tx buffer space isn't enough */
  859. else
  860. return TRUE;
  861. }
  862. else
  863. {
  864. /* case: uTail < uHead */
  865. if (uLen >= (uHead - uTail)) /* 2007.10.29 fix pointer bug, PT23 HHWu */
  866. return FALSE; /* Tx buffer space isn't enough */
  867. else
  868. return TRUE;
  869. }
  870. //return TRUE;
  871. }
  872. static INT32 _uartReadRxBuf(INT nNum, PUINT8 pucBuf, UINT32 uLen)
  873. {
  874. UINT32 i;
  875. UINT32 uOffset = nNum * UARTOFFSET;
  876. UART_BUFFER_T *dev;
  877. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  878. if (dev->bIsUseUARTRxInt == TRUE)
  879. {
  880. // disable Rx interrupt ...
  881. if (dev->uUartRxHead == dev->uUartRxTail)
  882. return 0;
  883. for (i = uLen ; i > 0 ; i--)
  884. {
  885. *pucBuf++ = dev->pucUartRxBuf[dev->uUartRxHead];
  886. dev->uUartRxHead = _uartRxBufGetNextOne(nNum, dev->uUartRxHead);
  887. if (dev->uUartRxHead == dev->uUartRxTail)
  888. break;
  889. }
  890. uLen = uLen - i + 1;
  891. }
  892. else /* pooling mode */
  893. {
  894. for (i = 0 ; i < uLen; i++)
  895. {
  896. while (!(inpw(REG_UART0_FSR + uOffset) & UART_FSR_RX_EMPTY_Msk));
  897. *pucBuf++ = inpb(REG_UART0_RBR + uOffset);
  898. }
  899. }
  900. return (uLen);
  901. }
  902. static void _uartWriteTxBuf(INT nNum, PUINT8 pucBuf, UINT32 uLen)
  903. {
  904. UINT32 i;
  905. UINT32 uOffset = nNum * UARTOFFSET;
  906. UART_BUFFER_T *dev;
  907. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  908. /* Check interrupt or polling mode first */
  909. if (dev->bIsUseUARTTxInt == TRUE)
  910. {
  911. while (uLen--)
  912. {
  913. dev->pucUartTxBuf[dev->uUartTxTail] = *pucBuf++;
  914. dev->uUartTxTail = _uartTxBufGetNextOne(nNum, dev->uUartTxTail);
  915. }
  916. if (!(inpw(REG_UART0_IER + uOffset) & UART_IER_THRE_IEN_Msk)) /* Enable Tx empty interrupt */
  917. _uartEnableInterrupt(nNum, UART_IER_THRE_IEN_Msk);
  918. }
  919. else /* pooling mode */
  920. {
  921. for (i = 0 ; i < uLen ; i++)
  922. {
  923. /* Wait until the transmitter buffer is empty */
  924. while (!(inpw(REG_UART0_FSR + uOffset) & UART_FSR_TE_FLAG_Msk));
  925. outpw(REG_UART0_THR + uOffset, *pucBuf++);
  926. }
  927. }
  928. }
  929. static INT _uartConfigureUART(PVOID pvParam)
  930. {
  931. INT retval;
  932. BOOL bIsMemoryAllocOk;
  933. UINT32 u32Reg;
  934. UINT32 uOffset;
  935. UINT32 uNum = 0;
  936. UART_T *param = (UART_T *) pvParam;
  937. uOffset = param->ucUartNo * UARTOFFSET;
  938. uNum = param->ucUartNo;
  939. /* Check UART channel */
  940. if (uNum > UARTA)
  941. return UART_ERR_CHANNEL_INVALID;
  942. /* Check the supplied parity */
  943. if ((param->ucParity != NU_PARITY_NONE) &&
  944. (param->ucParity != NU_PARITY_EVEN) &&
  945. (param->ucParity != NU_PARITY_ODD) &&
  946. (param->ucParity != (NU_PARITY_ODD | NU_PARITY_STICK)) &&
  947. (param->ucParity != (NU_PARITY_EVEN | NU_PARITY_STICK)))
  948. return UART_ERR_PARITY_INVALID;
  949. /* Check the supplied number of data bits */
  950. if ((param->ucDataBits != NU_DATA_BITS_5) &&
  951. (param->ucDataBits != NU_DATA_BITS_6) &&
  952. (param->ucDataBits != NU_DATA_BITS_7) &&
  953. (param->ucDataBits != NU_DATA_BITS_8))
  954. return UART_ERR_DATA_BITS_INVALID;
  955. /* Check the supplied number of stop bits */
  956. if ((param->ucStopBits != NU_STOP_BITS_1) &&
  957. (param->ucStopBits != NU_STOP_BITS_2))
  958. return UART_ERR_STOP_BITS_INVALID;
  959. /* Check the supplied number of trigger level bytes */
  960. if ((param -> ucUartNo == UART1) || (param -> ucUartNo == UART2) || (param -> ucUartNo == UART4) ||
  961. (param -> ucUartNo == UART6) || (param -> ucUartNo == UART8) || (param -> ucUartNo == UARTA))
  962. {
  963. /* UART1,2,4,6,8,A */
  964. if ((param->ucRxTriggerLevel != UART_FCR_RFITL_1BYTE) &&
  965. (param->ucRxTriggerLevel != UART_FCR_RFITL_4BYTES) &&
  966. (param->ucRxTriggerLevel != UART_FCR_RFITL_8BYTES) &&
  967. (param->ucRxTriggerLevel != UART_FCR_RFITL_14BYTES) &&
  968. (param->ucRxTriggerLevel != UART_FCR_RFITL_30BYTES) &&
  969. (param->ucRxTriggerLevel != UART_FCR_RFITL_46BYTES) &&
  970. (param->ucRxTriggerLevel != UART_FCR_RFITL_62BYTES))
  971. return UART_ERR_TRIGGERLEVEL_INVALID;
  972. }
  973. else
  974. {
  975. /* UART0,3,5,7,9 */
  976. if ((param->ucRxTriggerLevel != UART_FCR_RFITL_1BYTE) &&
  977. (param->ucRxTriggerLevel != UART_FCR_RFITL_4BYTES) &&
  978. (param->ucRxTriggerLevel != UART_FCR_RFITL_8BYTES) &&
  979. (param->ucRxTriggerLevel != UART_FCR_RFITL_30BYTES))
  980. return UART_ERR_TRIGGERLEVEL_INVALID;
  981. }
  982. /* Enable UART clock */
  983. if (param->ucUartNo < ALLCHANNEL)
  984. {
  985. outpw(REG_CLK_PCLKEN0, inpw(REG_CLK_PCLKEN0) | (1 << (16 + param->ucUartNo)));
  986. }
  987. /* Reset TX/RX FIFOs */
  988. u32Reg = inpw(REG_UART0_FCR + uOffset);
  989. outpw(REG_UART0_FCR + uOffset, (u32Reg | (0x03 << 1)));
  990. /* Setup baud rate */
  991. retval = _uartSetBaudRate(param->ucUartNo, param);
  992. if (retval < 0)
  993. return UART_ERR_SET_BAUDRATE_FAIL;
  994. /* Setup parity, data bits, and stop bits */
  995. outpw(REG_UART0_LCR + uOffset, (param->ucParity | param->ucDataBits | param->ucStopBits));
  996. /* Setup Rx time out value */
  997. outpw(REG_UART0_TOR + uOffset, 0x80 + 0x20);
  998. /* Setup FIFO trigger level */
  999. outpw(REG_UART0_FCR + uOffset, param->ucRxTriggerLevel);
  1000. /* only exec once unless call uartClose() */
  1001. if (UART_DEV[param->ucUartNo].bIsUARTInitial == FALSE)
  1002. {
  1003. /* Configure GPIO function */
  1004. //_uartConfigureGPIO(param->ucUartNo);
  1005. /* Allocate Tx, Rx buffer */
  1006. bIsMemoryAllocOk = _uartBUFSpaceAlloc(param->ucUartNo);
  1007. if (bIsMemoryAllocOk == FALSE)
  1008. return UART_ERR_ALLOC_MEMORY_FAIL;
  1009. /* Hook UART interrupt service routine */
  1010. _uartInstallISR(param->ucUartNo);
  1011. /* Enable Rx interrupt */
  1012. if (UART_DEV[param->ucUartNo].bIsUseUARTRxInt == TRUE)
  1013. _uartEnableInterrupt(param->ucUartNo, UART_IER_RDA_IEN_Msk);
  1014. }
  1015. UART_DEV[param->ucUartNo].bIsUARTInitial = TRUE; /* it's important to set TRUE */
  1016. return 0;
  1017. }
  1018. static INT _uartPerformIrDA(INT nNum, UINT32 uCmd, UINT32 uCmd1) /* UART2 only */
  1019. {
  1020. UINT32 uOffset = nNum * UARTOFFSET;
  1021. UINT32 baud;
  1022. switch (uCmd)
  1023. {
  1024. case ENABLEIrDA:
  1025. //_uart_bIsPerformIrDA = TRUE;
  1026. baud = inpw(REG_UART0_BAUD + uOffset);
  1027. baud = baud & (0x0000ffff);
  1028. baud = baud + 2;
  1029. baud = baud / 16;
  1030. baud = baud - 2;
  1031. outpw(REG_UART0_BAUD + uOffset, baud);
  1032. if (uCmd1 == IrDA_TX)
  1033. outpw(REG_UART0_IRCR + uOffset, UART_IRCR_TX_SELECT_Msk);
  1034. else if (uCmd1 == IrDA_RX)
  1035. outpw(REG_UART0_IRCR + uOffset, 0x0);
  1036. else
  1037. return UART_ERR_IrDA_COMMAND_INVALID;
  1038. outpw(REG_UART0_FUN_SEL + uOffset, 0x2); // Select IrDA mode
  1039. break;
  1040. case DISABLEIrDA:
  1041. //_uart_bIsPerformIrDA = FALSE;
  1042. outpw(REG_UART0_IRCR + uOffset, 0x40); /* Set default value, INV_TX set 0, INV_RX set 1 */
  1043. outpw(REG_UART0_FUN_SEL + uOffset, 0x0); // Select UART mode
  1044. break;
  1045. default:
  1046. return UART_ERR_IrDA_COMMAND_INVALID;
  1047. }
  1048. return 0;
  1049. }
  1050. /*
  1051. Remark:
  1052. 1. LCR & LSR aren't support yet.
  1053. */
  1054. static INT _uartGetRegisterValue(INT nNum, PVOID pvReg)
  1055. {
  1056. INT nCnt = 0;
  1057. UINT32 uOffset = nNum * UARTOFFSET;
  1058. UART_REGISTER_T *reg = (UART_REGISTER_T *) pvReg;
  1059. memset(reg, 0, sizeof(UART_REGISTER_T));
  1060. /* Read IER */
  1061. reg->uUartReg[nCnt][0] = REG_UART0_IER + uOffset;
  1062. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_IER + uOffset);
  1063. /* Read FCR */
  1064. reg->uUartReg[nCnt][0] = REG_UART0_FCR + uOffset;
  1065. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_FCR + uOffset);
  1066. /* Read LCR */
  1067. reg->uUartReg[nCnt][0] = REG_UART0_LCR + uOffset;
  1068. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_LCR + uOffset);
  1069. /* Read MCR, MSR */
  1070. reg->uUartReg[nCnt][0] = REG_UART0_MCR + uOffset;
  1071. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_MCR + uOffset);
  1072. reg->uUartReg[nCnt][0] = REG_UART0_MSR + uOffset;
  1073. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_MSR + uOffset);
  1074. /* Read FSR */
  1075. reg->uUartReg[nCnt][0] = REG_UART0_FSR + uOffset;
  1076. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_FSR + uOffset);
  1077. /* Read ISR */
  1078. reg->uUartReg[nCnt][0] = REG_UART0_ISR + uOffset;
  1079. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_ISR + uOffset);
  1080. /* Read TOR */
  1081. reg->uUartReg[nCnt][0] = REG_UART0_TOR + uOffset;
  1082. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_TOR + uOffset);
  1083. /* Read BAUD */
  1084. reg->uUartReg[nCnt][0] = REG_UART0_BAUD + uOffset;
  1085. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_BAUD + uOffset);
  1086. /* Read IRCR */
  1087. reg->uUartReg[nCnt][0] = REG_UART0_IRCR + uOffset;
  1088. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_IRCR + uOffset);
  1089. /* Read ALT_CSR */
  1090. reg->uUartReg[nCnt][0] = REG_UART0_ALT_CSR + uOffset;
  1091. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_ALT_CSR + uOffset);
  1092. /* Read FUN_SEL */
  1093. reg->uUartReg[nCnt][0] = REG_UART0_FUN_SEL + uOffset;
  1094. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_FUN_SEL + uOffset);
  1095. /* Read LIN_CTL */
  1096. reg->uUartReg[nCnt][0] = REG_UART0_LIN_CTL + uOffset;
  1097. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_LIN_CTL + uOffset);
  1098. /* Read LIN_SR */
  1099. reg->uUartReg[nCnt][0] = REG_UART0_LIN_SR + uOffset;
  1100. reg->uUartReg[nCnt++][1] = inpw(REG_UART0_LIN_SR + uOffset);
  1101. return (nCnt);
  1102. }
  1103. /// @endcond HIDDEN_SYMBOLS
  1104. /** @addtogroup N9H30_UART_EXPORTED_FUNCTIONS UART Exported Functions
  1105. @{
  1106. */
  1107. /**
  1108. * @brief The function is used to initial device struct parameters.
  1109. *
  1110. * @return 0
  1111. */
  1112. INT uartInit(void)
  1113. {
  1114. INT i;
  1115. /* Initial UART_BUFFER_T struct */
  1116. for (i = 0; i < UART_NUM ; i++)
  1117. UART_DEV[i].bIsUARTInitial = FALSE;
  1118. for (i = 0; i < UART_NUM ; i++)
  1119. UART_DEV[i].bIsUseUARTTxInt = TRUE;
  1120. for (i = 0; i < UART_NUM ; i++)
  1121. UART_DEV[i].bIsUseUARTRxInt = TRUE;
  1122. return 0;
  1123. }
  1124. /**
  1125. * @brief The function is used to config UART channel.
  1126. *
  1127. * @param[in] uart: UART Port. ( UART0 / UART1 / UART2 / UART3 / UART 4 /UART 5 /
  1128. * UART6 / UART7 / UART8 / UART9 / UARTA )
  1129. *
  1130. * @return UART_EIO: UART config Fail
  1131. * Successful: UART config success
  1132. */
  1133. INT uartOpen(PVOID uart)
  1134. {
  1135. INT nValue = 0;
  1136. UART_T *dev = (UART_T *) uart;
  1137. if ((nValue = _uartConfigureUART(uart)) < 0)
  1138. {
  1139. if (nValue != UART_ERR_CHANNEL_INVALID)
  1140. UART_DEV[dev->ucUartNo].nErrno = nValue;
  1141. return UART_EIO;
  1142. }
  1143. else
  1144. UART_DEV[dev->ucUartNo].nErrno = 0;
  1145. return Successful;
  1146. }
  1147. /**
  1148. * @brief The function is used to read RX FIFO returned data or RX driver buffer.
  1149. *
  1150. * @param[in] nNum: UART Port. ( UART0 / UART1 / UART2 / UART3 / UART 4 /UART 5 /
  1151. * UART6 / UART7 / UART8 / UART9 / UARTA )
  1152. * @param[out] pucBuf: The buffer to receive.
  1153. *
  1154. * @param[in] uLen: The the read bytes number of data.
  1155. *
  1156. * @return UART_EIO: UART read Fail
  1157. * DataLength: Receive byte count
  1158. */
  1159. INT32 uartRead(INT nNum, PUINT8 pucBuf, UINT32 uLen)
  1160. {
  1161. UART_BUFFER_T *dev;
  1162. INT32 DataLength;
  1163. //if((nNum < UART0) || (nNum > UART4))
  1164. // return UART_ENODEV;
  1165. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  1166. /* Check UART initial status */
  1167. if (dev->bIsUARTInitial == FALSE)
  1168. return UART_EIO;
  1169. /* Check uLen value */
  1170. if ((uLen > UARTRXBUFSIZE[nNum]) || (uLen == 0))
  1171. return UART_EIO;
  1172. DataLength = _uartReadRxBuf(nNum, pucBuf, uLen);
  1173. return (DataLength);
  1174. }
  1175. /**
  1176. * @brief The function is used to write data to TX FIFO directly or TX driver buffer.
  1177. *
  1178. * @param[in] nNum: UART channel. ( UART0 / UART1 / UART2 / UART3 / UART 4 /UART 5 /
  1179. * UART6 / UART7 / UART8 / UART9 / UARTA )
  1180. * @param[out] pucBuf: Transmit buffer pointer.
  1181. *
  1182. * @param[in] uLen: Transmit buffer length.
  1183. *
  1184. * @return UART_EIO: UART transmit Fail
  1185. * uLen: write length on success
  1186. */
  1187. INT32 uartWrite(INT nNum, PUINT8 pucBuf, UINT32 uLen)
  1188. {
  1189. BOOL bIsTxBufEnough;
  1190. UART_BUFFER_T *dev;
  1191. //if((nNum < UART0) || (nNum > UART4))
  1192. // return UART_ENODEV;
  1193. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  1194. dev->nErrno = 0;
  1195. /* Check UART initial status */
  1196. if (dev->bIsUARTInitial == FALSE)
  1197. return UART_EIO;
  1198. /* Check uLen value */
  1199. if ((uLen > UARTWRITESIZE) || (uLen == 0))
  1200. return UART_EIO;
  1201. /* Check UART Tx buffer */
  1202. if (dev->bIsUseUARTTxInt == TRUE)
  1203. {
  1204. bIsTxBufEnough = _uartCheckTxBufSpace(nNum, dev->uUartTxHead, dev->uUartTxTail, uLen);
  1205. if (bIsTxBufEnough == FALSE)
  1206. {
  1207. //sysprintf("Tx buf not enough\n");
  1208. dev->nErrno = UART_ERR_TX_BUF_NOT_ENOUGH;
  1209. return UART_EIO;
  1210. }
  1211. }
  1212. /* Move data to UART Tx buffer then transmit */
  1213. _uartWriteTxBuf(nNum, pucBuf, uLen);
  1214. return (uLen);
  1215. }
  1216. /**
  1217. * @brief Support some UART driver commands for application.
  1218. *
  1219. * @param[in] nNum: UART channel. ( UART0 / UART1 / UART2 / UART3 / UART 4 /UART 5 /
  1220. * UART6 / UART7 / UART8 / UART9 / UARTA )
  1221. *
  1222. * @param[in] uCmd: Command.
  1223. *
  1224. * @param[in] uArg0: Arguments for the command.
  1225. *
  1226. * @param[in] uArg1: Arguments for the command.
  1227. *
  1228. * @return UART_ENODEV: UART channel out of range
  1229. * UART_EIO: No activated or argument error or configure UART fail
  1230. * Successful: Success
  1231. */
  1232. INT uartIoctl(INT nNum, UINT32 uCmd, UINT32 uArg0, UINT32 uArg1)
  1233. {
  1234. INT32 retval;
  1235. UINT32 uReg;
  1236. UINT32 uOffset = nNum * UARTOFFSET;
  1237. UART_BUFFER_T *dev;
  1238. if ((nNum < UART0) || (nNum > UARTA))
  1239. return UART_ENODEV;
  1240. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  1241. /* Check UART initial status */
  1242. if (dev->bIsUARTInitial == FALSE)
  1243. {
  1244. if ((uCmd != UART_IOC_GETERRNO) &&
  1245. (uCmd != UART_IOC_GETUARTREGISTERVALUE))
  1246. return UART_EIO;
  1247. }
  1248. switch (uCmd)
  1249. {
  1250. case UART_IOC_SETTXMODE:
  1251. if (uArg0 == UARTINTMODE)
  1252. dev->bIsUseUARTTxInt = TRUE;
  1253. else if (uArg0 == UARTPOLLMODE)
  1254. dev->bIsUseUARTTxInt = FALSE;
  1255. else
  1256. {
  1257. dev->nErrno = UART_ERR_OPERATE_MODE_INVALID;
  1258. return UART_EIO;
  1259. }
  1260. break;
  1261. case UART_IOC_SETRXMODE:
  1262. if (uArg0 == UARTINTMODE)
  1263. {
  1264. dev->bIsUseUARTRxInt = TRUE;
  1265. _uartEnableInterrupt(nNum, UART_IER_RDA_IEN_Msk);
  1266. }
  1267. else if (uArg0 == UARTPOLLMODE)
  1268. {
  1269. dev->bIsUseUARTRxInt = FALSE;
  1270. _uartDisableInterrupt(nNum, UART_IER_RDA_IEN_Msk);
  1271. }
  1272. else
  1273. {
  1274. dev->nErrno = UART_ERR_OPERATE_MODE_INVALID;
  1275. return UART_EIO;
  1276. }
  1277. break;
  1278. case UART_IOC_GETRECCHARINFO: // ..... not test yet
  1279. memcpy((PVOID) uArg0, (PVOID) dev, sizeof(struct UART_BUFFER_STRUCT));
  1280. break;
  1281. case UART_IOC_SETUARTPARAMETER: // ..... not test yet
  1282. if ((retval = _uartConfigureUART((PVOID) uArg0)) < 0)
  1283. {
  1284. dev->nErrno = retval;
  1285. return UART_EIO;
  1286. }
  1287. break;
  1288. case UART_IOC_PERFORMIrDA:
  1289. if ((retval = _uartPerformIrDA(nNum, uArg0, uArg1)) < 0)
  1290. {
  1291. dev->nErrno = retval;
  1292. return UART_EIO;
  1293. }
  1294. break;
  1295. case UART_IOC_GETUARTREGISTERVALUE:
  1296. return (_uartGetRegisterValue(nNum, (PVOID) uArg0));
  1297. //break;
  1298. case UART_IOC_GETERRNO:
  1299. *(PUINT32)uArg0 = dev->nErrno;
  1300. break;
  1301. case UART_IOC_SETMODEMINTERRUPT:
  1302. if (uArg0 == UART_ENABLE_MODEM_INT)
  1303. _uartEnableInterrupt(nNum, UART_IER_MODEM_IEN_Msk);
  1304. else if (uArg0 == UART_DISABLE_MODEM_INT)
  1305. _uartDisableInterrupt(nNum, UART_IER_MODEM_IEN_Msk);
  1306. else
  1307. return UART_EIO;
  1308. break;
  1309. case UART_IOC_GETCTSSTATE:
  1310. if (nNum == UART1)
  1311. {
  1312. *(PUINT32)uArg0 = _uart_cCTSState1; /* CTS state */
  1313. _uart_cCTSState1 = 0;
  1314. }
  1315. else if (nNum == UART2)
  1316. {
  1317. *(PUINT32)uArg0 = _uart_cCTSState2; /* CTS state */
  1318. _uart_cCTSState2 = 0;
  1319. }
  1320. else if (nNum == UART3)
  1321. {
  1322. *(PUINT32)uArg0 = _uart_cCTSState3; /* CTS state */
  1323. _uart_cCTSState3 = 0;
  1324. }
  1325. else if (nNum == UART4)
  1326. {
  1327. *(PUINT32)uArg0 = _uart_cCTSState4; /* CTS state */
  1328. _uart_cCTSState4 = 0;
  1329. }
  1330. else if (nNum == UART5)
  1331. {
  1332. *(PUINT32)uArg0 = _uart_cCTSState5; /* CTS state */
  1333. _uart_cCTSState5 = 0;
  1334. }
  1335. else if (nNum == UART6)
  1336. {
  1337. *(PUINT32)uArg0 = _uart_cCTSState6; /* CTS state */
  1338. _uart_cCTSState6 = 0;
  1339. }
  1340. else if (nNum == UART7)
  1341. {
  1342. *(PUINT32)uArg0 = _uart_cCTSState7; /* CTS state */
  1343. _uart_cCTSState7 = 0;
  1344. }
  1345. else if (nNum == UART8)
  1346. {
  1347. *(PUINT32)uArg0 = _uart_cCTSState8; /* CTS state */
  1348. _uart_cCTSState8 = 0;
  1349. }
  1350. else if (nNum == UART9)
  1351. {
  1352. *(PUINT32)uArg0 = _uart_cCTSState9; /* CTS state */
  1353. _uart_cCTSState9 = 0;
  1354. }
  1355. else if (nNum == UARTA)
  1356. {
  1357. *(PUINT32)uArg0 = _uart_cCTSState10; /* CTS state */
  1358. _uart_cCTSState10 = 0;
  1359. }
  1360. *(PUINT32)uArg1 = (inpw(REG_UART0_MSR + uOffset) & (1 << 4)) >> 4; /* get CTS# value */
  1361. break;
  1362. case UART_IOC_SETRTSSIGNAL:
  1363. if (uArg0 == UART_RTS_HIGH) /* set RTS signal high */
  1364. outpw(REG_UART0_MCR + uOffset, inpw(REG_UART0_MCR + uOffset) & ~0x02);
  1365. else if (uArg0 == UART_RTS_LOW) /* set RTS signal low */
  1366. outpw(REG_UART0_MCR + uOffset, inpw(REG_UART0_MCR + uOffset) | 0x02);
  1367. else
  1368. return UART_EIO;
  1369. break;
  1370. case UART_IOC_SETINTERRUPT:
  1371. if (uArg0 == 1) /* enable interrupt */
  1372. _uartEnableInterrupt(nNum, uArg1);
  1373. else if (uArg0 == 0) /* disable interrupt */
  1374. _uartDisableInterrupt(nNum, uArg1);
  1375. else
  1376. return UART_EIO;
  1377. break;
  1378. case UART_IOC_SETBREAKCONTROL:
  1379. uReg = inpw(REG_UART0_LCR + uOffset);
  1380. if (uArg0 == 1) /* set break contorl bit */
  1381. {
  1382. uReg |= UART_LCR_BCB_Msk;
  1383. outpw(REG_UART0_LCR + uOffset, uReg);
  1384. }
  1385. else if (uArg0 == 0) /* clear break contorl bit */
  1386. {
  1387. uReg &= ~UART_LCR_BCB_Msk;
  1388. outpw(REG_UART0_LCR + uOffset, uReg);
  1389. }
  1390. else
  1391. return UART_EIO;
  1392. break;
  1393. case UART_IOC_GETBIISTATE:
  1394. switch (nNum)
  1395. {
  1396. case UART0:
  1397. *(PUINT32)uArg0 = _uart_cBIIState_0;
  1398. break;
  1399. case UART1:
  1400. *(PUINT32)uArg0 = _uart_cBIIState_1;
  1401. break;
  1402. case UART2:
  1403. *(PUINT32)uArg0 = _uart_cBIIState_2;
  1404. break;
  1405. case UART3:
  1406. *(PUINT32)uArg0 = _uart_cBIIState_3;
  1407. break;
  1408. case UART4:
  1409. *(PUINT32)uArg0 = _uart_cBIIState_4;
  1410. break;
  1411. case UART5:
  1412. *(PUINT32)uArg0 = _uart_cBIIState_5;
  1413. break;
  1414. case UART6:
  1415. *(PUINT32)uArg0 = _uart_cBIIState_6;
  1416. break;
  1417. case UART7:
  1418. *(PUINT32)uArg0 = _uart_cBIIState_7;
  1419. break;
  1420. case UART8:
  1421. *(PUINT32)uArg0 = _uart_cBIIState_8;
  1422. break;
  1423. case UART9:
  1424. *(PUINT32)uArg0 = _uart_cBIIState_9;
  1425. break;
  1426. case UARTA:
  1427. *(PUINT32)uArg0 = _uart_cBIIState_10;
  1428. break;
  1429. default:
  1430. break;
  1431. }
  1432. break;
  1433. /* H/W S/W flow control function */
  1434. case UART_IOC_ENABLEHWFLOWCONTROL:
  1435. /* H/W & S/W are alternative */
  1436. if (_uart_cFlowControlMode == SWFLOWCONTROL)
  1437. return UART_EIO;
  1438. _uart_cFlowControlMode = HWFLOWCONTROL;
  1439. /* Implement H/W flow control on TX & RX interrupt mode. */
  1440. //dev->bIsUseUARTTxInt = TRUE;
  1441. //dev->bIsUseUARTRxInt = TRUE;
  1442. _uartEnableInterrupt(nNum, UART_IER_RDA_IEN_Msk);
  1443. /*
  1444. Set up RTS mechanism.
  1445. In uartReceiveChars(), if uRecCnt >= _uart_nMaxRxBuf then set RTS high to stop RX.
  1446. In uartReadRxBuf(), if uRecCnt <= _uart_nMinRxBuf then set RTS low to re-start RX.
  1447. */
  1448. //_uart_nMaxRxBuf = (UARTRXBUFSIZE[nNum] * 3) / 4;
  1449. //_uart_nMinRxBuf = UARTRXBUFSIZE[nNum] / 2;
  1450. //FDEBUG("max[%d] min[%d]\n", _uart_nMaxRxBuf, _uart_nMinRxBuf);
  1451. /* Set RTS high level trigger */
  1452. outpw(REG_UART0_MCR + uOffset, (inpw(REG_UART0_MCR + uOffset) | UART_RTS_IS_HIGH_LEV_TRG));
  1453. /* Set RTS high level trigger */
  1454. outpw(REG_UART0_MSR + uOffset, (inpw(REG_UART0_MSR + uOffset) | UART_CTS_IS_HIGH_LEV_TRG));
  1455. /* Set Auto CTS/RTS */
  1456. outpw(REG_UART0_IER + uOffset, inpw(REG_UART0_IER + uOffset) | (0x3 << 12));
  1457. /* Enable MODEM status interrupt */
  1458. //_uartEnableInterrupt(nNum, UART_IER_MODEM_IEN_Msk);
  1459. /*
  1460. Maintain H/W flow control flag by read Modem Status Register.
  1461. If CTS high, stop TX.
  1462. If CTS low, start TX.
  1463. */
  1464. //if( inpw(REG_UART0_MSR+uOffset) & 0x10 ) /* CTS external signal is low */
  1465. // _uart_cHWTXStopped = 0; /* TX started */
  1466. //else /* CTS external signal is high */
  1467. // _uart_cHWTXStopped = 1; /* TX stopped */
  1468. /* Set RTS as logic 0, RX re-start */
  1469. //outpb(REG_UART0_MCR+uOffset, inpb(REG_UART0_MCR+uOffset) | 0x02); /* set RTS signal low */
  1470. //_uart_cHWRXStopped = 0; // RX started
  1471. break;
  1472. case UART_IOC_DISABLEHWFLOWCONTROL:
  1473. /* Disable MODEM status interrupt */
  1474. _uartDisableInterrupt(nNum, UART_IER_MODEM_IEN_Msk);
  1475. _uart_cFlowControlMode = 0;
  1476. _uart_cHWTXStopped = 0;
  1477. _uart_cHWRXStopped = 0;
  1478. break;
  1479. case UART_IOC_FLUSH_TX_BUFFER:
  1480. dev->uUartTxTail = 0;
  1481. dev->uUartTxHead = 0;
  1482. break;
  1483. case UART_IOC_FLUSH_RX_BUFFER:
  1484. dev->uUartRxTail = 0;
  1485. dev->uUartRxHead = 0;
  1486. break;
  1487. case UART_IOC_SET_RS485_MODE:
  1488. outpw((REG_UART0_FUN_SEL + uOffset), 0x3);
  1489. outpw((REG_UART0_MCR + uOffset), 0x0);
  1490. outpw((REG_UART0_LCR + uOffset), (UART_LCR_SPE_Msk | UART_LCR_EPE_Msk | UART_LCR_PBE_Msk | (0x3 << UART_LCR_WLS_Pos)));
  1491. outpw((REG_UART0_ALT_CSR + uOffset), uArg0 | (uArg1 << UART_ALT_CSR_ADDR_MATCH_Pos));
  1492. break;
  1493. case UART_IOC_SEND_RS485_ADDRESS:
  1494. while (!((inpw(REG_UART0_FSR + uOffset)) & UART_FSR_TE_FLAG_Msk));
  1495. uReg = inpw(REG_UART0_LCR + uOffset);
  1496. outpw((REG_UART0_LCR + uOffset), (UART_LCR_SPE_Msk | UART_LCR_PBE_Msk | (0x3 << UART_LCR_WLS_Pos)));
  1497. outpw((REG_UART0_THR + uOffset), uArg0);
  1498. while (!((inpw(REG_UART0_FSR + uOffset)) & UART_FSR_TE_FLAG_Msk));
  1499. outpw((REG_UART0_LCR + uOffset), uReg);
  1500. break;
  1501. case UART_IOC_SET_RS485_RXOFF:
  1502. uReg = inpw(REG_UART0_FCR + uOffset);
  1503. if (uArg0 == 1)
  1504. uReg |= UART_FCR_RX_DIS_Msk;
  1505. else
  1506. uReg &= ~UART_FCR_RX_DIS_Msk;
  1507. outpw((REG_UART0_FCR + uOffset), uReg);
  1508. break;
  1509. case UART_IOC_SET_ALTCTL_REG:
  1510. outpw((REG_UART0_ALT_CSR + uOffset), uArg0);
  1511. break;
  1512. case UART_IOC_GET_ALTCTL_REG:
  1513. *(PUINT32)uArg0 = inpw(REG_UART0_ALT_CSR + uOffset);
  1514. break;
  1515. case UART_IOC_SET_LIN_MODE:
  1516. outpw((REG_UART0_FUN_SEL + uOffset), 0x1); // Select LIN function
  1517. /* Select LIN function setting : Tx enable, Rx enable and break field length */
  1518. uReg = inpw(REG_UART0_ALT_CSR + uOffset);
  1519. uReg &= ~(UART_ALT_CSR_LIN_TX_EN_Msk | UART_ALT_CSR_LIN_RX_EN_Msk | UART_ALT_CSR_UA_LIN_BKFL_Msk);
  1520. uReg |= (uArg0 | (uArg1 << UART_ALT_CSR_UA_LIN_BKFL_Pos));
  1521. outpw((REG_UART0_ALT_CSR + uOffset), uReg);
  1522. break;
  1523. default:
  1524. return UART_ENOTTY;
  1525. }
  1526. return Successful;
  1527. }
  1528. /**
  1529. * @brief Release memory resource, disable interrupt.
  1530. *
  1531. * @param[in] nNum: UART channel. ( UART0 / UART1 / UART2 / UART3 / UART 4 /UART 5 /
  1532. * UART6 / UART7 / UART8 / UART9 / UARTA )
  1533. *
  1534. * @return UART_ENODEV: UART channel out of range
  1535. * UART_EIO: No activated
  1536. * Successful: Success
  1537. */
  1538. INT32 uartRelease(INT nNum)
  1539. {
  1540. UART_BUFFER_T *dev;
  1541. if ((nNum < UART0) || (nNum > UARTA))
  1542. return UART_ENODEV;
  1543. dev = (UART_BUFFER_T *) &UART_DEV[nNum];
  1544. /* Check UART initial status */
  1545. if (dev->bIsUARTInitial == FALSE)
  1546. return UART_EIO;
  1547. /* Disable all interrupt of the specific UART */
  1548. _uartDisableInterrupt(nNum, DISABLEALLIER);
  1549. /* Free memory */
  1550. free(dev->pucUartTxBuf);
  1551. free(dev->pucUartRxBuf);
  1552. free(dev->pucUARTFlag);
  1553. /* Initial parameter */
  1554. dev->bIsUARTInitial = FALSE; /* it's important */
  1555. return Successful;
  1556. }
  1557. /*@}*/ /* end of group N9H30_UART_EXPORTED_FUNCTIONS */
  1558. /*@}*/ /* end of group N9H30_UART_Driver */
  1559. /*@}*/ /* end of group N9H30_Device_Driver */
  1560. #else
  1561. #include "N9H30.h"
  1562. #include "nu_sys.h"
  1563. #include "nu_uart.h"
  1564. /**
  1565. * @brief Open and set UART function
  1566. *
  1567. * @param[in] uart The pointer of the specified UART module.
  1568. * @param[in] u32baudrate The baudrate of UART module.
  1569. *
  1570. * @return None
  1571. *
  1572. * @details This function use to enable UART function and set baud-rate.
  1573. */
  1574. void UART_Open(UART_T *uart, uint32_t u32baudrate)
  1575. {
  1576. uint32_t u32UartClkSrcSel = 0ul, u32UartClkDivNum = 0ul;
  1577. //uint32_t u32ClkTbl[4] = {XIN, LXT, ACLK, UCLK};
  1578. uint32_t u32ClkTbl[4] = {12000000, 0, 75000000, 150000000};
  1579. uint32_t u32Baud_Div = 0ul;
  1580. if ((uint32_t)uart == UART0_BA)
  1581. {
  1582. /* Get UART clock source selection */
  1583. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 3)) >> 3;
  1584. /* Get UART clock divider number */
  1585. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 5)) >> 5;
  1586. }
  1587. else if ((uint32_t)uart == UART1_BA)
  1588. {
  1589. /* Get UART clock source selection */
  1590. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 11)) >> 11;
  1591. /* Get UART clock divider number */
  1592. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 13)) >> 13;
  1593. }
  1594. else if ((uint32_t)uart == UART2_BA)
  1595. {
  1596. /* Get UART clock source selection */
  1597. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 19)) >> 19;
  1598. /* Get UART clock divider number */
  1599. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 21)) >> 21;
  1600. }
  1601. else if ((uint32_t)uart == UART3_BA)
  1602. {
  1603. /* Get UART clock source selection */
  1604. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 27)) >> 27;
  1605. /* Get UART clock divider number */
  1606. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 29)) >> 29;
  1607. }
  1608. else if ((uint32_t)uart == UART4_BA)
  1609. {
  1610. /* Get UART clock source selection */
  1611. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 3)) >> 3;
  1612. /* Get UART clock divider number */
  1613. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 5)) >> 5;
  1614. }
  1615. else if ((uint32_t)uart == UART5_BA)
  1616. {
  1617. /* Get UART clock source selection */
  1618. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 11)) >> 11;
  1619. /* Get UART clock divider number */
  1620. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 13)) >> 13;
  1621. }
  1622. else if ((uint32_t)uart == UART6_BA)
  1623. {
  1624. /* Get UART clock source selection */
  1625. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 19)) >> 19;
  1626. /* Get UART clock divider number */
  1627. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 21)) >> 21;
  1628. }
  1629. else if ((uint32_t)uart == UART7_BA)
  1630. {
  1631. /* Get UART clock source selection */
  1632. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 27)) >> 27;
  1633. /* Get UART clock divider number */
  1634. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 29)) >> 29;
  1635. }
  1636. else if ((uint32_t)uart == UART8_BA)
  1637. {
  1638. /* Get UART clock source selection */
  1639. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL6) & (0x3ul << 3)) >> 3;
  1640. /* Get UART clock divider number */
  1641. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL6) & (0x7ul << 5)) >> 5;
  1642. }
  1643. else if ((uint32_t)uart == UART9_BA)
  1644. {
  1645. /* Get UART clock source selection */
  1646. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL6) & (0x3ul << 11)) >> 11;
  1647. /* Get UART clock divider number */
  1648. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL6) & (0x7ul << 13)) >> 13;
  1649. }
  1650. else if ((uint32_t)uart == UARTA_BA)
  1651. {
  1652. /* Get UART clock source selection */
  1653. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL6) & (0x3ul << 19)) >> 19;
  1654. /* Get UART clock divider number */
  1655. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL6) & (0x7ul << 21)) >> 21;
  1656. }
  1657. /* Select UART function */
  1658. uart->FUNCSEL = UART_FUNCSEL_UART;
  1659. /* Set UART line configuration */
  1660. uart->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
  1661. /* Set UART Rx and RTS trigger level */
  1662. uart->FIFO &= ~(UART_FIFO_RFITL_Msk | UART_FIFO_RTSTRGLV_Msk);
  1663. /* Get PLL clock frequency if UART clock source selection is PLL */
  1664. if (u32UartClkSrcSel == 2ul) // ACLK
  1665. {
  1666. //u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
  1667. }
  1668. if (u32UartClkSrcSel == 3ul) // PCLK
  1669. {
  1670. //u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
  1671. }
  1672. /* Set UART baud rate */
  1673. if (u32baudrate != 0ul)
  1674. {
  1675. u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);
  1676. if (u32Baud_Div > 0xFFFFul)
  1677. {
  1678. uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
  1679. }
  1680. else
  1681. {
  1682. uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
  1683. }
  1684. }
  1685. }
  1686. void UART_Close(UART_T *uart)
  1687. {
  1688. uart->INTEN = 0ul;
  1689. }
  1690. /**
  1691. * @brief Set UART line configuration
  1692. *
  1693. * @param[in] uart The pointer of the specified UART module.
  1694. * @param[in] u32baudrate The register value of baudrate of UART module.
  1695. * If u32baudrate = 0, UART baudrate will not change.
  1696. * @param[in] u32data_width The data length of UART module.
  1697. * - \ref UART_WORD_LEN_5
  1698. * - \ref UART_WORD_LEN_6
  1699. * - \ref UART_WORD_LEN_7
  1700. * - \ref UART_WORD_LEN_8
  1701. * @param[in] u32parity The parity setting (none/odd/even/mark/space) of UART module.
  1702. * - \ref UART_PARITY_NONE
  1703. * - \ref UART_PARITY_ODD
  1704. * - \ref UART_PARITY_EVEN
  1705. * - \ref UART_PARITY_MARK
  1706. * - \ref UART_PARITY_SPACE
  1707. * @param[in] u32stop_bits The stop bit length (1/1.5/2 bit) of UART module.
  1708. * - \ref UART_STOP_BIT_1
  1709. * - \ref UART_STOP_BIT_1_5
  1710. * - \ref UART_STOP_BIT_2
  1711. *
  1712. * @return None
  1713. *
  1714. * @details This function use to config UART line setting.
  1715. */
  1716. void UART_SetLineConfig(UART_T *uart, uint32_t u32baudrate, uint32_t u32data_width, uint32_t u32parity, uint32_t u32stop_bits)
  1717. {
  1718. uint32_t u32UartClkSrcSel = 0ul, u32UartClkDivNum = 0ul;
  1719. //uint32_t u32ClkTbl[4] = {XIN, LXT, ACLK, UCLK};
  1720. uint32_t u32ClkTbl[4] = {12000000, 32768, 75000000, 150000000};
  1721. uint32_t u32Baud_Div = 0ul;
  1722. if ((uint32_t)uart == UART0_BA)
  1723. {
  1724. /* Get UART clock source selection */
  1725. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 3)) >> 3;
  1726. /* Get UART clock divider number */
  1727. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 5)) >> 5;
  1728. }
  1729. else if ((uint32_t)uart == UART1_BA)
  1730. {
  1731. /* Get UART clock source selection */
  1732. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 11)) >> 11;
  1733. /* Get UART clock divider number */
  1734. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 13)) >> 13;
  1735. }
  1736. else if ((uint32_t)uart == UART2_BA)
  1737. {
  1738. /* Get UART clock source selection */
  1739. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 19)) >> 19;
  1740. /* Get UART clock divider number */
  1741. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 21)) >> 21;
  1742. }
  1743. else if ((uint32_t)uart == UART3_BA)
  1744. {
  1745. /* Get UART clock source selection */
  1746. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL4) & (0x3ul << 27)) >> 27;
  1747. /* Get UART clock divider number */
  1748. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL4) & (0x7ul << 29)) >> 29;
  1749. }
  1750. else if ((uint32_t)uart == UART4_BA)
  1751. {
  1752. /* Get UART clock source selection */
  1753. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 3)) >> 3;
  1754. /* Get UART clock divider number */
  1755. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 5)) >> 5;
  1756. }
  1757. else if ((uint32_t)uart == UART5_BA)
  1758. {
  1759. /* Get UART clock source selection */
  1760. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 11)) >> 11;
  1761. /* Get UART clock divider number */
  1762. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 13)) >> 13;
  1763. }
  1764. else if ((uint32_t)uart == UART6_BA)
  1765. {
  1766. /* Get UART clock source selection */
  1767. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 19)) >> 19;
  1768. /* Get UART clock divider number */
  1769. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 21)) >> 21;
  1770. }
  1771. else if ((uint32_t)uart == UART7_BA)
  1772. {
  1773. /* Get UART clock source selection */
  1774. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL5) & (0x3ul << 27)) >> 27;
  1775. /* Get UART clock divider number */
  1776. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL5) & (0x7ul << 29)) >> 29;
  1777. }
  1778. else if ((uint32_t)uart == UART8_BA)
  1779. {
  1780. /* Get UART clock source selection */
  1781. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL6) & (0x3ul << 3)) >> 3;
  1782. /* Get UART clock divider number */
  1783. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL6) & (0x7ul << 5)) >> 5;
  1784. }
  1785. else if ((uint32_t)uart == UART9_BA)
  1786. {
  1787. /* Get UART clock source selection */
  1788. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL6) & (0x3ul << 11)) >> 11;
  1789. /* Get UART clock divider number */
  1790. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL6) & (0x7ul << 13)) >> 13;
  1791. }
  1792. else if ((uint32_t)uart == UARTA_BA)
  1793. {
  1794. /* Get UART clock source selection */
  1795. u32UartClkSrcSel = (inp32(REG_CLK_DIVCTL6) & (0x3ul << 19)) >> 19;
  1796. /* Get UART clock divider number */
  1797. u32UartClkDivNum = (inp32(REG_CLK_DIVCTL6) & (0x7ul << 21)) >> 21;
  1798. }
  1799. /* Get PLL clock frequency if UART clock source selection is PLL */
  1800. if (u32UartClkSrcSel == 2ul) // ACLK
  1801. {
  1802. //u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
  1803. }
  1804. if (u32UartClkSrcSel == 3ul) // PCLK
  1805. {
  1806. //u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
  1807. }
  1808. /* Set UART baud rate */
  1809. if (u32baudrate != 0ul)
  1810. {
  1811. u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);
  1812. if (u32Baud_Div > 0xFFFFul)
  1813. {
  1814. uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
  1815. }
  1816. else
  1817. {
  1818. uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
  1819. }
  1820. }
  1821. /* Set UART line configuration */
  1822. uart->LINE = u32data_width | u32parity | u32stop_bits;
  1823. }
  1824. #endif