uart.c 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617
  1. //*****************************************************************************
  2. //
  3. // uart.c - Driver for the UART.
  4. //
  5. // Copyright (c) 2005-2010 Texas Instruments Incorporated. All rights reserved.
  6. // Software License Agreement
  7. //
  8. // Texas Instruments (TI) is supplying this software for use solely and
  9. // exclusively on TI's microcontroller products. The software is owned by
  10. // TI and/or its suppliers, and is protected under applicable copyright
  11. // laws. You may not combine this software with "viral" open-source
  12. // software in order to form a larger program.
  13. //
  14. // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
  15. // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
  16. // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  17. // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
  18. // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
  19. // DAMAGES, FOR ANY REASON WHATSOEVER.
  20. //
  21. // This is part of revision 6459 of the Stellaris Peripheral Driver Library.
  22. //
  23. //*****************************************************************************
  24. //*****************************************************************************
  25. //
  26. //! \addtogroup uart_api
  27. //! @{
  28. //
  29. //*****************************************************************************
  30. #include "inc/hw_ints.h"
  31. #include "inc/hw_memmap.h"
  32. #include "inc/hw_sysctl.h"
  33. #include "inc/hw_types.h"
  34. #include "inc/hw_uart.h"
  35. #include "driverlib/debug.h"
  36. #include "driverlib/interrupt.h"
  37. #include "driverlib/uart.h"
  38. //*****************************************************************************
  39. //
  40. // The system clock divider defining the maximum baud rate supported by the
  41. // UART.
  42. //
  43. //*****************************************************************************
  44. #define UART_CLK_DIVIDER ((CLASS_IS_SANDSTORM || \
  45. (CLASS_IS_FURY && REVISION_IS_A2) || \
  46. (CLASS_IS_DUSTDEVIL && REVISION_IS_A0)) ? \
  47. 16 : 8)
  48. //*****************************************************************************
  49. //
  50. //! \internal
  51. //! Checks a UART base address.
  52. //!
  53. //! \param ulBase is the base address of the UART port.
  54. //!
  55. //! This function determines if a UART port base address is valid.
  56. //!
  57. //! \return Returns \b true if the base address is valid and \b false
  58. //! otherwise.
  59. //
  60. //*****************************************************************************
  61. #ifdef DEBUG
  62. static tBoolean
  63. UARTBaseValid(unsigned long ulBase)
  64. {
  65. return((ulBase == UART0_BASE) || (ulBase == UART1_BASE) ||
  66. (ulBase == UART2_BASE));
  67. }
  68. #endif
  69. //*****************************************************************************
  70. //
  71. //! Sets the type of parity.
  72. //!
  73. //! \param ulBase is the base address of the UART port.
  74. //! \param ulParity specifies the type of parity to use.
  75. //!
  76. //! Sets the type of parity to use for transmitting and expect when receiving.
  77. //! The \e ulParity parameter must be one of \b UART_CONFIG_PAR_NONE,
  78. //! \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE,
  79. //! or \b UART_CONFIG_PAR_ZERO. The last two allow direct control of the
  80. //! parity bit; it is always either one or zero based on the mode.
  81. //!
  82. //! \return None.
  83. //
  84. //*****************************************************************************
  85. void
  86. UARTParityModeSet(unsigned long ulBase, unsigned long ulParity)
  87. {
  88. //
  89. // Check the arguments.
  90. //
  91. ASSERT(UARTBaseValid(ulBase));
  92. ASSERT((ulParity == UART_CONFIG_PAR_NONE) ||
  93. (ulParity == UART_CONFIG_PAR_EVEN) ||
  94. (ulParity == UART_CONFIG_PAR_ODD) ||
  95. (ulParity == UART_CONFIG_PAR_ONE) ||
  96. (ulParity == UART_CONFIG_PAR_ZERO));
  97. //
  98. // Set the parity mode.
  99. //
  100. HWREG(ulBase + UART_O_LCRH) = ((HWREG(ulBase + UART_O_LCRH) &
  101. ~(UART_LCRH_SPS | UART_LCRH_EPS |
  102. UART_LCRH_PEN)) | ulParity);
  103. }
  104. //*****************************************************************************
  105. //
  106. //! Gets the type of parity currently being used.
  107. //!
  108. //! \param ulBase is the base address of the UART port.
  109. //!
  110. //! This function gets the type of parity used for transmitting data and
  111. //! expected when receiving data.
  112. //!
  113. //! \return Returns the current parity settings, specified as one of
  114. //! \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD,
  115. //! \b UART_CONFIG_PAR_ONE, or \b UART_CONFIG_PAR_ZERO.
  116. //
  117. //*****************************************************************************
  118. unsigned long
  119. UARTParityModeGet(unsigned long ulBase)
  120. {
  121. //
  122. // Check the arguments.
  123. //
  124. ASSERT(UARTBaseValid(ulBase));
  125. //
  126. // Return the current parity setting.
  127. //
  128. return(HWREG(ulBase + UART_O_LCRH) &
  129. (UART_LCRH_SPS | UART_LCRH_EPS | UART_LCRH_PEN));
  130. }
  131. //*****************************************************************************
  132. //
  133. //! Sets the FIFO level at which interrupts are generated.
  134. //!
  135. //! \param ulBase is the base address of the UART port.
  136. //! \param ulTxLevel is the transmit FIFO interrupt level, specified as one of
  137. //! \b UART_FIFO_TX1_8, \b UART_FIFO_TX2_8, \b UART_FIFO_TX4_8,
  138. //! \b UART_FIFO_TX6_8, or \b UART_FIFO_TX7_8.
  139. //! \param ulRxLevel is the receive FIFO interrupt level, specified as one of
  140. //! \b UART_FIFO_RX1_8, \b UART_FIFO_RX2_8, \b UART_FIFO_RX4_8,
  141. //! \b UART_FIFO_RX6_8, or \b UART_FIFO_RX7_8.
  142. //!
  143. //! This function sets the FIFO level at which transmit and receive interrupts
  144. //! are generated.
  145. //!
  146. //! \return None.
  147. //
  148. //*****************************************************************************
  149. void
  150. UARTFIFOLevelSet(unsigned long ulBase, unsigned long ulTxLevel,
  151. unsigned long ulRxLevel)
  152. {
  153. //
  154. // Check the arguments.
  155. //
  156. ASSERT(UARTBaseValid(ulBase));
  157. ASSERT((ulTxLevel == UART_FIFO_TX1_8) ||
  158. (ulTxLevel == UART_FIFO_TX2_8) ||
  159. (ulTxLevel == UART_FIFO_TX4_8) ||
  160. (ulTxLevel == UART_FIFO_TX6_8) ||
  161. (ulTxLevel == UART_FIFO_TX7_8));
  162. ASSERT((ulRxLevel == UART_FIFO_RX1_8) ||
  163. (ulRxLevel == UART_FIFO_RX2_8) ||
  164. (ulRxLevel == UART_FIFO_RX4_8) ||
  165. (ulRxLevel == UART_FIFO_RX6_8) ||
  166. (ulRxLevel == UART_FIFO_RX7_8));
  167. //
  168. // Set the FIFO interrupt levels.
  169. //
  170. HWREG(ulBase + UART_O_IFLS) = ulTxLevel | ulRxLevel;
  171. }
  172. //*****************************************************************************
  173. //
  174. //! Gets the FIFO level at which interrupts are generated.
  175. //!
  176. //! \param ulBase is the base address of the UART port.
  177. //! \param pulTxLevel is a pointer to storage for the transmit FIFO level,
  178. //! returned as one of \b UART_FIFO_TX1_8, \b UART_FIFO_TX2_8,
  179. //! \b UART_FIFO_TX4_8, \b UART_FIFO_TX6_8, or \b UART_FIFO_TX7_8.
  180. //! \param pulRxLevel is a pointer to storage for the receive FIFO level,
  181. //! returned as one of \b UART_FIFO_RX1_8, \b UART_FIFO_RX2_8,
  182. //! \b UART_FIFO_RX4_8, \b UART_FIFO_RX6_8, or \b UART_FIFO_RX7_8.
  183. //!
  184. //! This function gets the FIFO level at which transmit and receive interrupts
  185. //! are xogenerated.
  186. //!
  187. //! \return None.
  188. //
  189. //*****************************************************************************
  190. void
  191. UARTFIFOLevelGet(unsigned long ulBase, unsigned long *pulTxLevel,
  192. unsigned long *pulRxLevel)
  193. {
  194. unsigned long ulTemp;
  195. //
  196. // Check the arguments.
  197. //
  198. ASSERT(UARTBaseValid(ulBase));
  199. //
  200. // Read the FIFO level register.
  201. //
  202. ulTemp = HWREG(ulBase + UART_O_IFLS);
  203. //
  204. // Extract the transmit and receive FIFO levels.
  205. //
  206. *pulTxLevel = ulTemp & UART_IFLS_TX_M;
  207. *pulRxLevel = ulTemp & UART_IFLS_RX_M;
  208. }
  209. //*****************************************************************************
  210. //
  211. //! Sets the configuration of a UART.
  212. //!
  213. //! \param ulBase is the base address of the UART port.
  214. //! \param ulUARTClk is the rate of the clock supplied to the UART module.
  215. //! \param ulBaud is the desired baud rate.
  216. //! \param ulConfig is the data format for the port (number of data bits,
  217. //! number of stop bits, and parity).
  218. //!
  219. //! This function configures the UART for operation in the specified data
  220. //! format. The baud rate is provided in the \e ulBaud parameter and the data
  221. //! format in the \e ulConfig parameter.
  222. //!
  223. //! The \e ulConfig parameter is the logical OR of three values: the number of
  224. //! data bits, the number of stop bits, and the parity. \b UART_CONFIG_WLEN_8,
  225. //! \b UART_CONFIG_WLEN_7, \b UART_CONFIG_WLEN_6, and \b UART_CONFIG_WLEN_5
  226. //! select from eight to five data bits per byte (respectively).
  227. //! \b UART_CONFIG_STOP_ONE and \b UART_CONFIG_STOP_TWO select one or two stop
  228. //! bits (respectively). \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN,
  229. //! \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE, and \b UART_CONFIG_PAR_ZERO
  230. //! select the parity mode (no parity bit, even parity bit, odd parity bit,
  231. //! parity bit always one, and parity bit always zero, respectively).
  232. //!
  233. //! The peripheral clock will be the same as the processor clock. This will be
  234. //! the value returned by SysCtlClockGet(), or it can be explicitly hard coded
  235. //! if it is constant and known (to save the code/execution overhead of a call
  236. //! to SysCtlClockGet()).
  237. //!
  238. //! This function replaces the original UARTConfigSet() API and performs the
  239. //! same actions. A macro is provided in <tt>uart.h</tt> to map the original
  240. //! API to this API.
  241. //!
  242. //! \return None.
  243. //
  244. //*****************************************************************************
  245. void
  246. UARTConfigSetExpClk(unsigned long ulBase, unsigned long ulUARTClk,
  247. unsigned long ulBaud, unsigned long ulConfig)
  248. {
  249. unsigned long ulDiv;
  250. //
  251. // Check the arguments.
  252. //
  253. ASSERT(UARTBaseValid(ulBase));
  254. ASSERT(ulBaud != 0);
  255. ASSERT(ulUARTClk >= (ulBaud * UART_CLK_DIVIDER));
  256. //
  257. // Stop the UART.
  258. //
  259. UARTDisable(ulBase);
  260. //
  261. // Is the required baud rate greater than the maximum rate supported
  262. // without the use of high speed mode?
  263. //
  264. if((ulBaud * 16) > ulUARTClk)
  265. {
  266. //
  267. // Enable high speed mode.
  268. //
  269. HWREG(ulBase + UART_O_CTL) |= UART_CTL_HSE;
  270. //
  271. // Half the supplied baud rate to compensate for enabling high speed
  272. // mode. This allows the following code to be common to both cases.
  273. //
  274. ulBaud /= 2;
  275. }
  276. else
  277. {
  278. //
  279. // Disable high speed mode.
  280. //
  281. HWREG(ulBase + UART_O_CTL) &= ~(UART_CTL_HSE);
  282. }
  283. //
  284. // Compute the fractional baud rate divider.
  285. //
  286. ulDiv = (((ulUARTClk * 8) / ulBaud) + 1) / 2;
  287. //
  288. // Set the baud rate.
  289. //
  290. HWREG(ulBase + UART_O_IBRD) = ulDiv / 64;
  291. HWREG(ulBase + UART_O_FBRD) = ulDiv % 64;
  292. //
  293. // Set parity, data length, and number of stop bits.
  294. //
  295. HWREG(ulBase + UART_O_LCRH) = ulConfig;
  296. //
  297. // Clear the flags register.
  298. //
  299. HWREG(ulBase + UART_O_FR) = 0;
  300. //
  301. // Start the UART.
  302. //
  303. UARTEnable(ulBase);
  304. }
  305. //*****************************************************************************
  306. //
  307. //! Gets the current configuration of a UART.
  308. //!
  309. //! \param ulBase is the base address of the UART port.
  310. //! \param ulUARTClk is the rate of the clock supplied to the UART module.
  311. //! \param pulBaud is a pointer to storage for the baud rate.
  312. //! \param pulConfig is a pointer to storage for the data format.
  313. //!
  314. //! The baud rate and data format for the UART is determined, given an
  315. //! explicitly provided peripheral clock (hence the ExpClk suffix). The
  316. //! returned baud rate is the actual baud rate; it may not be the exact baud
  317. //! rate requested or an ``official'' baud rate. The data format returned in
  318. //! \e pulConfig is enumerated the same as the \e ulConfig parameter of
  319. //! UARTConfigSetExpClk().
  320. //!
  321. //! The peripheral clock will be the same as the processor clock. This will be
  322. //! the value returned by SysCtlClockGet(), or it can be explicitly hard coded
  323. //! if it is constant and known (to save the code/execution overhead of a call
  324. //! to SysCtlClockGet()).
  325. //!
  326. //! This function replaces the original UARTConfigGet() API and performs the
  327. //! same actions. A macro is provided in <tt>uart.h</tt> to map the original
  328. //! API to this API.
  329. //!
  330. //! \return None.
  331. //
  332. //*****************************************************************************
  333. void
  334. UARTConfigGetExpClk(unsigned long ulBase, unsigned long ulUARTClk,
  335. unsigned long *pulBaud, unsigned long *pulConfig)
  336. {
  337. unsigned long ulInt, ulFrac;
  338. //
  339. // Check the arguments.
  340. //
  341. ASSERT(UARTBaseValid(ulBase));
  342. //
  343. // Compute the baud rate.
  344. //
  345. ulInt = HWREG(ulBase + UART_O_IBRD);
  346. ulFrac = HWREG(ulBase + UART_O_FBRD);
  347. *pulBaud = (ulUARTClk * 4) / ((64 * ulInt) + ulFrac);
  348. //
  349. // See if high speed mode enabled.
  350. //
  351. if(HWREG(ulBase + UART_O_CTL) & UART_CTL_HSE)
  352. {
  353. //
  354. // High speed mode is enabled so the actual baud rate is actually
  355. // double what was just calculated.
  356. //
  357. *pulBaud *= 2;
  358. }
  359. //
  360. // Get the parity, data length, and number of stop bits.
  361. //
  362. *pulConfig = (HWREG(ulBase + UART_O_LCRH) &
  363. (UART_LCRH_SPS | UART_LCRH_WLEN_M | UART_LCRH_STP2 |
  364. UART_LCRH_EPS | UART_LCRH_PEN));
  365. }
  366. //*****************************************************************************
  367. //
  368. //! Enables transmitting and receiving.
  369. //!
  370. //! \param ulBase is the base address of the UART port.
  371. //!
  372. //! Sets the UARTEN, TXE, and RXE bits, and enables the transmit and receive
  373. //! FIFOs.
  374. //!
  375. //! \return None.
  376. //
  377. //*****************************************************************************
  378. void
  379. UARTEnable(unsigned long ulBase)
  380. {
  381. //
  382. // Check the arguments.
  383. //
  384. ASSERT(UARTBaseValid(ulBase));
  385. //
  386. // Enable the FIFO.
  387. //
  388. HWREG(ulBase + UART_O_LCRH) |= UART_LCRH_FEN;
  389. //
  390. // Enable RX, TX, and the UART.
  391. //
  392. HWREG(ulBase + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE |
  393. UART_CTL_RXE);
  394. }
  395. //*****************************************************************************
  396. //
  397. //! Disables transmitting and receiving.
  398. //!
  399. //! \param ulBase is the base address of the UART port.
  400. //!
  401. //! Clears the UARTEN, TXE, and RXE bits, then waits for the end of
  402. //! transmission of the current character, and flushes the transmit FIFO.
  403. //!
  404. //! \return None.
  405. //
  406. //*****************************************************************************
  407. void
  408. UARTDisable(unsigned long ulBase)
  409. {
  410. //
  411. // Check the arguments.
  412. //
  413. ASSERT(UARTBaseValid(ulBase));
  414. //
  415. // Wait for end of TX.
  416. //
  417. while(HWREG(ulBase + UART_O_FR) & UART_FR_BUSY)
  418. {
  419. }
  420. //
  421. // Disable the FIFO.
  422. //
  423. HWREG(ulBase + UART_O_LCRH) &= ~(UART_LCRH_FEN);
  424. //
  425. // Disable the UART.
  426. //
  427. HWREG(ulBase + UART_O_CTL) &= ~(UART_CTL_UARTEN | UART_CTL_TXE |
  428. UART_CTL_RXE);
  429. }
  430. //*****************************************************************************
  431. //
  432. //! Enables the transmit and receive FIFOs.
  433. //!
  434. //! \param ulBase is the base address of the UART port.
  435. //!
  436. //! This functions enables the transmit and receive FIFOs in the UART.
  437. //!
  438. //! \return None.
  439. //
  440. //*****************************************************************************
  441. void
  442. UARTFIFOEnable(unsigned long ulBase)
  443. {
  444. //
  445. // Check the arguments.
  446. //
  447. ASSERT(UARTBaseValid(ulBase));
  448. //
  449. // Enable the FIFO.
  450. //
  451. HWREG(ulBase + UART_O_LCRH) |= UART_LCRH_FEN;
  452. }
  453. //*****************************************************************************
  454. //
  455. //! Disables the transmit and receive FIFOs.
  456. //!
  457. //! \param ulBase is the base address of the UART port.
  458. //!
  459. //! This functions disables the transmit and receive FIFOs in the UART.
  460. //!
  461. //! \return None.
  462. //
  463. //*****************************************************************************
  464. void
  465. UARTFIFODisable(unsigned long ulBase)
  466. {
  467. //
  468. // Check the arguments.
  469. //
  470. ASSERT(UARTBaseValid(ulBase));
  471. //
  472. // Disable the FIFO.
  473. //
  474. HWREG(ulBase + UART_O_LCRH) &= ~(UART_LCRH_FEN);
  475. }
  476. //*****************************************************************************
  477. //
  478. //! Enables SIR (IrDA) mode on the specified UART.
  479. //!
  480. //! \param ulBase is the base address of the UART port.
  481. //! \param bLowPower indicates if SIR Low Power Mode is to be used.
  482. //!
  483. //! Enables the SIREN control bit for IrDA mode on the UART. If the
  484. //! \e bLowPower flag is set, then SIRLP bit will also be set.
  485. //!
  486. //! \note SIR (IrDA) operation is not supported on Sandstorm-class devices.
  487. //!
  488. //! \return None.
  489. //
  490. //*****************************************************************************
  491. void
  492. UARTEnableSIR(unsigned long ulBase, tBoolean bLowPower)
  493. {
  494. //
  495. // Check the arguments.
  496. //
  497. ASSERT(UARTBaseValid(ulBase));
  498. //
  499. // Enable SIR and SIRLP (if appropriate).
  500. //
  501. if(bLowPower)
  502. {
  503. HWREG(ulBase + UART_O_CTL) |= (UART_CTL_SIREN | UART_CTL_SIRLP);
  504. }
  505. else
  506. {
  507. HWREG(ulBase + UART_O_CTL) |= (UART_CTL_SIREN);
  508. }
  509. }
  510. //*****************************************************************************
  511. //
  512. //! Disables SIR (IrDA) mode on the specified UART.
  513. //!
  514. //! \param ulBase is the base address of the UART port.
  515. //!
  516. //! Clears the SIREN (IrDA) and SIRLP (Low Power) bits.
  517. //!
  518. //! \note SIR (IrDA) operation is not supported on Sandstorm-class devices.
  519. //!
  520. //! \return None.
  521. //
  522. //*****************************************************************************
  523. void
  524. UARTDisableSIR(unsigned long ulBase)
  525. {
  526. //
  527. // Check the arguments.
  528. //
  529. ASSERT(UARTBaseValid(ulBase));
  530. //
  531. // Disable SIR and SIRLP (if appropriate).
  532. //
  533. HWREG(ulBase + UART_O_CTL) &= ~(UART_CTL_SIREN | UART_CTL_SIRLP);
  534. }
  535. //*****************************************************************************
  536. //
  537. //! Enables ISO 7816 smart card mode on the specified UART.
  538. //!
  539. //! \param ulBase is the base address of the UART port.
  540. //!
  541. //! Enables the SMART control bit for ISO 7816 smart card mode on the UART.
  542. //! This call also sets 8 bit word length and even parity as required by ISO
  543. //! 7816.
  544. //!
  545. //! \note The availability of ISO 7816 smart card mode varies with the
  546. //! Stellaris part and UART in use. Please consult the datasheet for the part
  547. //! you are using to determine whether this support is available.
  548. //!
  549. //! \return None.
  550. //
  551. //*****************************************************************************
  552. void
  553. UARTSmartCardEnable(unsigned long ulBase)
  554. {
  555. unsigned long ulVal;
  556. //
  557. // Check the arguments.
  558. //
  559. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  560. ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE) ||
  561. (ulBase == UART2_BASE));
  562. //
  563. // Set 8 bit word length, even parity, 2 stop bits (even though the STP2
  564. // bit is ignored when in smartcard mode, this lets the caller read back
  565. // the actual setting in use).
  566. //
  567. ulVal = HWREG(ulBase + UART_O_LCRH);
  568. ulVal &= ~(UART_LCRH_SPS | UART_LCRH_EPS | UART_LCRH_PEN |
  569. UART_LCRH_WLEN_M);
  570. ulVal |= UART_LCRH_WLEN_8 | UART_LCRH_PEN | UART_LCRH_EPS | UART_LCRH_STP2;
  571. HWREG(ulBase + UART_O_LCRH) = ulVal;
  572. //
  573. // Enable SMART mode.
  574. //
  575. HWREG(ulBase + UART_O_CTL) |= UART_CTL_SMART;
  576. }
  577. //*****************************************************************************
  578. //
  579. //! Disables ISO 7816 smart card mode on the specified UART.
  580. //!
  581. //! \param ulBase is the base address of the UART port.
  582. //!
  583. //! Clears the SMART (ISO 7816 smart card) bits in the UART control register.
  584. //!
  585. //! \note The availability of ISO 7816 smart card mode varies with the
  586. //! Stellaris part and UART in use. Please consult the datasheet for the part
  587. //! you are using to determine whether this support is available.
  588. //!
  589. //! \return None.
  590. //
  591. //*****************************************************************************
  592. void
  593. UARTSmartCardDisable(unsigned long ulBase)
  594. {
  595. //
  596. // Check the arguments.
  597. //
  598. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  599. ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE) ||
  600. (ulBase == UART2_BASE));
  601. //
  602. // Disable the SMART bit.
  603. //
  604. HWREG(ulBase + UART_O_CTL) &= ~UART_CTL_SMART;
  605. }
  606. //*****************************************************************************
  607. //
  608. //! Sets the states of the DTR and/or RTS modem control signals.
  609. //!
  610. //! \param ulBase is the base address of the UART port.
  611. //! \param ulControl is a bit-mapped flag indicating which modem control bits
  612. //! should be set.
  613. //!
  614. //! Sets the states of the DTR or RTS modem handshake outputs from the UART.
  615. //!
  616. //! The \e ulControl parameter is the logical OR of any of the following:
  617. //!
  618. //! - \b UART_OUTPUT_DTR - The Modem Control DTR signal
  619. //! - \b UART_OUTPUT_RTS - The Modem Control RTS signal
  620. //!
  621. //! \note The availability of hardware modem handshake signals varies with the
  622. //! Stellaris part and UART in use. Please consult the datasheet for the part
  623. //! you are using to determine whether this support is available.
  624. //!
  625. //! \return None.
  626. //
  627. //*****************************************************************************
  628. void
  629. UARTModemControlSet(unsigned long ulBase, unsigned long ulControl)
  630. {
  631. unsigned long ulTemp;
  632. //
  633. // Check the arguments.
  634. //
  635. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  636. ASSERT(ulBase == UART1_BASE);
  637. ASSERT((ulControl & ~(UART_OUTPUT_RTS | UART_OUTPUT_DTR)) == 0);
  638. //
  639. // Set the appropriate modem control output bits.
  640. //
  641. ulTemp = HWREG(ulBase + UART_O_CTL);
  642. ulTemp |= (ulControl & (UART_OUTPUT_RTS | UART_OUTPUT_DTR));
  643. HWREG(ulBase + UART_O_CTL) = ulTemp;
  644. }
  645. //*****************************************************************************
  646. //
  647. //! Clears the states of the DTR and/or RTS modem control signals.
  648. //!
  649. //! \param ulBase is the base address of the UART port.
  650. //! \param ulControl is a bit-mapped flag indicating which modem control bits
  651. //! should be set.
  652. //!
  653. //! Clears the states of the DTR or RTS modem handshake outputs from the UART.
  654. //!
  655. //! The \e ulControl parameter is the logical OR of any of the following:
  656. //!
  657. //! - \b UART_OUTPUT_DTR - The Modem Control DTR signal
  658. //! - \b UART_OUTPUT_RTS - The Modem Control RTS signal
  659. //!
  660. //! \note The availability of hardware modem handshake signals varies with the
  661. //! Stellaris part and UART in use. Please consult the datasheet for the part
  662. //! you are using to determine whether this support is available.
  663. //!
  664. //! \return None.
  665. //
  666. //*****************************************************************************
  667. void
  668. UARTModemControlClear(unsigned long ulBase, unsigned long ulControl)
  669. {
  670. unsigned long ulTemp;
  671. //
  672. // Check the arguments.
  673. //
  674. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  675. ASSERT(ulBase == UART1_BASE);
  676. ASSERT((ulControl & ~(UART_OUTPUT_RTS | UART_OUTPUT_DTR)) == 0);
  677. //
  678. // Set the appropriate modem control output bits.
  679. //
  680. ulTemp = HWREG(ulBase + UART_O_CTL);
  681. ulTemp &= ~(ulControl & (UART_OUTPUT_RTS | UART_OUTPUT_DTR));
  682. HWREG(ulBase + UART_O_CTL) = ulTemp;
  683. }
  684. //*****************************************************************************
  685. //
  686. //! Gets the states of the DTR and RTS modem control signals.
  687. //!
  688. //! \param ulBase is the base address of the UART port.
  689. //!
  690. //! Returns the current states of each of the two UART modem control signals,
  691. //! DTR and RTS.
  692. //!
  693. //! \note The availability of hardware modem handshake signals varies with the
  694. //! Stellaris part and UART in use. Please consult the datasheet for the part
  695. //! you are using to determine whether this support is available.
  696. //!
  697. //! \return Returns the states of the handshake output signals. This will be a
  698. //! logical logical OR combination of values \b UART_OUTPUT_RTS and
  699. //! \b UART_OUTPUT_DTR where the presence of each flag indicates that the
  700. //! associated signal is asserted.
  701. //
  702. //*****************************************************************************
  703. unsigned long
  704. UARTModemControlGet(unsigned long ulBase)
  705. {
  706. //
  707. // Check the arguments.
  708. //
  709. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  710. ASSERT(ulBase == UART1_BASE);
  711. return(HWREG(ulBase + UART_O_CTL) & (UART_OUTPUT_RTS | UART_OUTPUT_DTR));
  712. }
  713. //*****************************************************************************
  714. //
  715. //! Gets the states of the RI, DCD, DSR and CTS modem status signals.
  716. //!
  717. //! \param ulBase is the base address of the UART port.
  718. //!
  719. //! Returns the current states of each of the four UART modem status signals,
  720. //! RI, DCD, DSR and CTS.
  721. //!
  722. //! \note The availability of hardware modem handshake signals varies with the
  723. //! Stellaris part and UART in use. Please consult the datasheet for the part
  724. //! you are using to determine whether this support is available.
  725. //!
  726. //! \return Returns the states of the handshake output signals. This will be a
  727. //! logical logical OR combination of values \b UART_INPUT_RI, \b
  728. //! UART_INPUT_DCD, \b UART_INPUT_CTS and \b UART_INPUT_DSR where the
  729. //! presence of each flag indicates that the associated signal is asserted.
  730. //
  731. //*****************************************************************************
  732. unsigned long
  733. UARTModemStatusGet(unsigned long ulBase)
  734. {
  735. //
  736. // Check the arguments.
  737. //
  738. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  739. ASSERT(ulBase == UART1_BASE);
  740. return(HWREG(ulBase + UART_O_FR) & (UART_INPUT_RI | UART_INPUT_DCD |
  741. UART_INPUT_CTS | UART_INPUT_DSR));
  742. }
  743. //*****************************************************************************
  744. //
  745. //! Sets the UART hardware flow control mode to be used.
  746. //!
  747. //! \param ulBase is the base address of the UART port.
  748. //! \param ulMode indicates the flow control modes to be used. This is a
  749. //! logical OR combination of values \b UART_FLOWCONTROL_TX and \b
  750. //! UART_FLOWCONTROL_RX to enable hardware transmit (CTS) and receive (RTS)
  751. //! flow control or \b UART_FLOWCONTROL_NONE to disable hardware flow control.
  752. //!
  753. //! Sets the required hardware flow control modes. If \e ulMode contains
  754. //! flag \b UART_FLOWCONTROL_TX, data is only transmitted if the incoming CTS
  755. //! signal is asserted. If \e ulMode contains flag \b UART_FLOWCONTROL_RX,
  756. //! the RTS output is controlled by the hardware and is asserted only when
  757. //! there is space available in the receive FIFO. If no hardware flow control
  758. //! is required, UART_FLOWCONTROL_NONE should be passed.
  759. //!
  760. //! \note The availability of hardware flow control varies with the Stellaris
  761. //! part and UART in use. Please consult the datasheet for the part you are
  762. //! using to determine whether this support is available.
  763. //!
  764. //! \return None.
  765. //
  766. //*****************************************************************************
  767. void
  768. UARTFlowControlSet(unsigned long ulBase, unsigned long ulMode)
  769. {
  770. //
  771. // Check the arguments.
  772. //
  773. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  774. ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE) ||
  775. (ulBase == UART2_BASE));
  776. ASSERT((ulMode & ~(UART_FLOWCONTROL_TX | UART_FLOWCONTROL_RX)) == 0);
  777. //
  778. // Set the flow control mode as requested.
  779. //
  780. HWREG(ulBase + UART_O_CTL) = ((HWREG(ulBase + UART_O_CTL) &
  781. ~(UART_FLOWCONTROL_TX |
  782. UART_FLOWCONTROL_RX)) | ulMode);
  783. }
  784. //*****************************************************************************
  785. //
  786. //! Returns the UART hardware flow control mode currently in use.
  787. //!
  788. //! \param ulBase is the base address of the UART port.
  789. //!
  790. //! Returns the current hardware flow control mode.
  791. //!
  792. //! \note The availability of hardware flow control varies with the Stellaris
  793. //! part and UART in use. Please consult the datasheet for the part you are
  794. //! using to determine whether this support is available.
  795. //!
  796. //! \return Returns the current flow control mode in use. This is a
  797. //! logical OR combination of values \b UART_FLOWCONTROL_TX if transmit
  798. //! (CTS) flow control is enabled and \b UART_FLOWCONTROL_RX if receive (RTS)
  799. //! flow control is in use. If hardware flow control is disabled, \b
  800. //! UART_FLOWCONTROL_NONE will be returned.
  801. //
  802. //*****************************************************************************
  803. unsigned long
  804. UARTFlowControlGet(unsigned long ulBase)
  805. {
  806. //
  807. // Check the arguments.
  808. //
  809. ASSERT(!CLASS_IS_SANDSTORM && !CLASS_IS_FURY && !CLASS_IS_DUSTDEVIL);
  810. ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE) ||
  811. (ulBase == UART2_BASE));
  812. return(HWREG(ulBase + UART_O_CTL) & (UART_FLOWCONTROL_TX |
  813. UART_FLOWCONTROL_RX));
  814. }
  815. //*****************************************************************************
  816. //
  817. //! Sets the operating mode for the UART transmit interrupt.
  818. //!
  819. //! \param ulBase is the base address of the UART port.
  820. //! \param ulMode is the operating mode for the transmit interrupt. It may be
  821. //! \b UART_TXINT_MODE_EOT to trigger interrupts when the transmitter is idle
  822. //! or \b UART_TXINT_MODE_FIFO to trigger based on the current transmit FIFO
  823. //! level.
  824. //!
  825. //! This function allows the mode of the UART transmit interrupt to be set. By
  826. //! default, the transmit interrupt is asserted when the FIFO level falls past
  827. //! a threshold set via a call to UARTFIFOLevelSet(). Alternatively, if this
  828. //! function is called with \e ulMode set to \b UART_TXINT_MODE_EOT, the
  829. //! transmit interrupt will only be asserted once the transmitter is completely
  830. //! idle - the transmit FIFO is empty and all bits, including any stop bits,
  831. //! have cleared the transmitter.
  832. //!
  833. //! \note The availability of end-of-transmission mode varies with the
  834. //! Stellaris part in use. Please consult the datasheet for the part you are
  835. //! using to determine whether this support is available.
  836. //!
  837. //! \return None.
  838. //
  839. //*****************************************************************************
  840. void
  841. UARTTxIntModeSet(unsigned long ulBase, unsigned long ulMode)
  842. {
  843. //
  844. // Check the arguments.
  845. //
  846. ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE) ||
  847. (ulBase == UART2_BASE));
  848. ASSERT((ulMode == UART_TXINT_MODE_EOT) ||
  849. (ulMode == UART_TXINT_MODE_FIFO));
  850. //
  851. // Set or clear the EOT bit of the UART control register as appropriate.
  852. //
  853. HWREG(ulBase + UART_O_CTL) = ((HWREG(ulBase + UART_O_CTL) &
  854. ~(UART_TXINT_MODE_EOT |
  855. UART_TXINT_MODE_FIFO)) | ulMode);
  856. }
  857. //*****************************************************************************
  858. //
  859. //! Returns the current operating mode for the UART transmit interrupt.
  860. //!
  861. //! \param ulBase is the base address of the UART port.
  862. //!
  863. //! This function returns the current operating mode for the UART transmit
  864. //! interrupt. The return value will be \b UART_TXINT_MODE_EOT if the
  865. //! transmit interrupt is currently set to be asserted once the transmitter is
  866. //! completely idle - the transmit FIFO is empty and all bits, including any
  867. //! stop bits, have cleared the transmitter. The return value will be \b
  868. //! UART_TXINT_MODE_FIFO if the interrupt is set to be asserted based upon the
  869. //! level of the transmit FIFO.
  870. //!
  871. //! \note The availability of end-of-transmission mode varies with the
  872. //! Stellaris part in use. Please consult the datasheet for the part you are
  873. //! using to determine whether this support is available.
  874. //!
  875. //! \return Returns \b UART_TXINT_MODE_FIFO or \b UART_TXINT_MODE_EOT.
  876. //
  877. //*****************************************************************************
  878. unsigned long
  879. UARTTxIntModeGet(unsigned long ulBase)
  880. {
  881. //
  882. // Check the arguments.
  883. //
  884. ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE) ||
  885. (ulBase == UART2_BASE));
  886. //
  887. // Return the current transmit interrupt mode.
  888. //
  889. return(HWREG(ulBase + UART_O_CTL) & (UART_TXINT_MODE_EOT |
  890. UART_TXINT_MODE_FIFO));
  891. }
  892. //*****************************************************************************
  893. //
  894. //! Determines if there are any characters in the receive FIFO.
  895. //!
  896. //! \param ulBase is the base address of the UART port.
  897. //!
  898. //! This function returns a flag indicating whether or not there is data
  899. //! available in the receive FIFO.
  900. //!
  901. //! \return Returns \b true if there is data in the receive FIFO or \b false
  902. //! if there is no data in the receive FIFO.
  903. //
  904. //*****************************************************************************
  905. tBoolean
  906. UARTCharsAvail(unsigned long ulBase)
  907. {
  908. //
  909. // Check the arguments.
  910. //
  911. ASSERT(UARTBaseValid(ulBase));
  912. //
  913. // Return the availability of characters.
  914. //
  915. return((HWREG(ulBase + UART_O_FR) & UART_FR_RXFE) ? false : true);
  916. }
  917. //*****************************************************************************
  918. //
  919. //! Determines if there is any space in the transmit FIFO.
  920. //!
  921. //! \param ulBase is the base address of the UART port.
  922. //!
  923. //! This function returns a flag indicating whether or not there is space
  924. //! available in the transmit FIFO.
  925. //!
  926. //! \return Returns \b true if there is space available in the transmit FIFO
  927. //! or \b false if there is no space available in the transmit FIFO.
  928. //
  929. //*****************************************************************************
  930. tBoolean
  931. UARTSpaceAvail(unsigned long ulBase)
  932. {
  933. //
  934. // Check the arguments.
  935. //
  936. ASSERT(UARTBaseValid(ulBase));
  937. //
  938. // Return the availability of space.
  939. //
  940. return((HWREG(ulBase + UART_O_FR) & UART_FR_TXFF) ? false : true);
  941. }
  942. //*****************************************************************************
  943. //
  944. //! Receives a character from the specified port.
  945. //!
  946. //! \param ulBase is the base address of the UART port.
  947. //!
  948. //! Gets a character from the receive FIFO for the specified port.
  949. //!
  950. //! This function replaces the original UARTCharNonBlockingGet() API and
  951. //! performs the same actions. A macro is provided in <tt>uart.h</tt> to map
  952. //! the original API to this API.
  953. //!
  954. //! \return Returns the character read from the specified port, cast as a
  955. //! \e long. A \b -1 is returned if there are no characters present in the
  956. //! receive FIFO. The UARTCharsAvail() function should be called before
  957. //! attempting to call this function.
  958. //
  959. //*****************************************************************************
  960. long
  961. UARTCharGetNonBlocking(unsigned long ulBase)
  962. {
  963. //
  964. // Check the arguments.
  965. //
  966. ASSERT(UARTBaseValid(ulBase));
  967. //
  968. // See if there are any characters in the receive FIFO.
  969. //
  970. if(!(HWREG(ulBase + UART_O_FR) & UART_FR_RXFE))
  971. {
  972. //
  973. // Read and return the next character.
  974. //
  975. return(HWREG(ulBase + UART_O_DR));
  976. }
  977. else
  978. {
  979. //
  980. // There are no characters, so return a failure.
  981. //
  982. return(-1);
  983. }
  984. }
  985. //*****************************************************************************
  986. //
  987. //! Waits for a character from the specified port.
  988. //!
  989. //! \param ulBase is the base address of the UART port.
  990. //!
  991. //! Gets a character from the receive FIFO for the specified port. If there
  992. //! are no characters available, this function waits until a character is
  993. //! received before returning.
  994. //!
  995. //! \return Returns the character read from the specified port, cast as a
  996. //! \e long.
  997. //
  998. //*****************************************************************************
  999. long
  1000. UARTCharGet(unsigned long ulBase)
  1001. {
  1002. //
  1003. // Check the arguments.
  1004. //
  1005. ASSERT(UARTBaseValid(ulBase));
  1006. //
  1007. // Wait until a char is available.
  1008. //
  1009. while(HWREG(ulBase + UART_O_FR) & UART_FR_RXFE)
  1010. {
  1011. }
  1012. //
  1013. // Now get the char.
  1014. //
  1015. return(HWREG(ulBase + UART_O_DR));
  1016. }
  1017. //*****************************************************************************
  1018. //
  1019. //! Sends a character to the specified port.
  1020. //!
  1021. //! \param ulBase is the base address of the UART port.
  1022. //! \param ucData is the character to be transmitted.
  1023. //!
  1024. //! Writes the character \e ucData to the transmit FIFO for the specified port.
  1025. //! This function does not block, so if there is no space available, then a
  1026. //! \b false is returned, and the application must retry the function later.
  1027. //!
  1028. //! This function replaces the original UARTCharNonBlockingPut() API and
  1029. //! performs the same actions. A macro is provided in <tt>uart.h</tt> to map
  1030. //! the original API to this API.
  1031. //!
  1032. //! \return Returns \b true if the character was successfully placed in the
  1033. //! transmit FIFO or \b false if there was no space available in the transmit
  1034. //! FIFO.
  1035. //
  1036. //*****************************************************************************
  1037. tBoolean
  1038. UARTCharPutNonBlocking(unsigned long ulBase, unsigned char ucData)
  1039. {
  1040. //
  1041. // Check the arguments.
  1042. //
  1043. ASSERT(UARTBaseValid(ulBase));
  1044. //
  1045. // See if there is space in the transmit FIFO.
  1046. //
  1047. if(!(HWREG(ulBase + UART_O_FR) & UART_FR_TXFF))
  1048. {
  1049. //
  1050. // Write this character to the transmit FIFO.
  1051. //
  1052. HWREG(ulBase + UART_O_DR) = ucData;
  1053. //
  1054. // Success.
  1055. //
  1056. return(true);
  1057. }
  1058. else
  1059. {
  1060. //
  1061. // There is no space in the transmit FIFO, so return a failure.
  1062. //
  1063. return(false);
  1064. }
  1065. }
  1066. //*****************************************************************************
  1067. //
  1068. //! Waits to send a character from the specified port.
  1069. //!
  1070. //! \param ulBase is the base address of the UART port.
  1071. //! \param ucData is the character to be transmitted.
  1072. //!
  1073. //! Sends the character \e ucData to the transmit FIFO for the specified port.
  1074. //! If there is no space available in the transmit FIFO, this function waits
  1075. //! until there is space available before returning.
  1076. //!
  1077. //! \return None.
  1078. //
  1079. //*****************************************************************************
  1080. void
  1081. UARTCharPut(unsigned long ulBase, unsigned char ucData)
  1082. {
  1083. //
  1084. // Check the arguments.
  1085. //
  1086. ASSERT(UARTBaseValid(ulBase));
  1087. //
  1088. // Wait until space is available.
  1089. //
  1090. while(HWREG(ulBase + UART_O_FR) & UART_FR_TXFF)
  1091. {
  1092. }
  1093. //
  1094. // Send the char.
  1095. //
  1096. HWREG(ulBase + UART_O_DR) = ucData;
  1097. }
  1098. //*****************************************************************************
  1099. //
  1100. //! Causes a BREAK to be sent.
  1101. //!
  1102. //! \param ulBase is the base address of the UART port.
  1103. //! \param bBreakState controls the output level.
  1104. //!
  1105. //! Calling this function with \e bBreakState set to \b true asserts a break
  1106. //! condition on the UART. Calling this function with \e bBreakState set to
  1107. //! \b false removes the break condition. For proper transmission of a break
  1108. //! command, the break must be asserted for at least two complete frames.
  1109. //!
  1110. //! \return None.
  1111. //
  1112. //*****************************************************************************
  1113. void
  1114. UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState)
  1115. {
  1116. //
  1117. // Check the arguments.
  1118. //
  1119. ASSERT(UARTBaseValid(ulBase));
  1120. //
  1121. // Set the break condition as requested.
  1122. //
  1123. HWREG(ulBase + UART_O_LCRH) =
  1124. (bBreakState ?
  1125. (HWREG(ulBase + UART_O_LCRH) | UART_LCRH_BRK) :
  1126. (HWREG(ulBase + UART_O_LCRH) & ~(UART_LCRH_BRK)));
  1127. }
  1128. //*****************************************************************************
  1129. //
  1130. //! Determines whether the UART transmitter is busy or not.
  1131. //!
  1132. //! \param ulBase is the base address of the UART port.
  1133. //!
  1134. //! Allows the caller to determine whether all transmitted bytes have cleared
  1135. //! the transmitter hardware. If \b false is returned, the transmit FIFO is
  1136. //! empty and all bits of the last transmitted character, including all stop
  1137. //! bits, have left the hardware shift register.
  1138. //!
  1139. //! \return Returns \b true if the UART is transmitting or \b false if all
  1140. //! transmissions are complete.
  1141. //
  1142. //*****************************************************************************
  1143. tBoolean
  1144. UARTBusy(unsigned long ulBase)
  1145. {
  1146. //
  1147. // Check the argument.
  1148. //
  1149. ASSERT(UARTBaseValid(ulBase));
  1150. //
  1151. // Determine if the UART is busy.
  1152. //
  1153. return((HWREG(ulBase + UART_O_FR) & UART_FR_BUSY) ? true : false);
  1154. }
  1155. //*****************************************************************************
  1156. //
  1157. //! Registers an interrupt handler for a UART interrupt.
  1158. //!
  1159. //! \param ulBase is the base address of the UART port.
  1160. //! \param pfnHandler is a pointer to the function to be called when the
  1161. //! UART interrupt occurs.
  1162. //!
  1163. //! This function does the actual registering of the interrupt handler. This
  1164. //! will enable the global interrupt in the interrupt controller; specific UART
  1165. //! interrupts must be enabled via UARTIntEnable(). It is the interrupt
  1166. //! handler's responsibility to clear the interrupt source.
  1167. //!
  1168. //! \sa IntRegister() for important information about registering interrupt
  1169. //! handlers.
  1170. //!
  1171. //! \return None.
  1172. //
  1173. //*****************************************************************************
  1174. void
  1175. UARTIntRegister(unsigned long ulBase, void (*pfnHandler)(void))
  1176. {
  1177. unsigned long ulInt;
  1178. //
  1179. // Check the arguments.
  1180. //
  1181. ASSERT(UARTBaseValid(ulBase));
  1182. //
  1183. // Determine the interrupt number based on the UART port.
  1184. //
  1185. ulInt = ((ulBase == UART0_BASE) ? INT_UART0 :
  1186. ((ulBase == UART1_BASE) ? INT_UART1 : INT_UART2));
  1187. //
  1188. // Register the interrupt handler.
  1189. //
  1190. IntRegister(ulInt, pfnHandler);
  1191. //
  1192. // Enable the UART interrupt.
  1193. //
  1194. IntEnable(ulInt);
  1195. }
  1196. //*****************************************************************************
  1197. //
  1198. //! Unregisters an interrupt handler for a UART interrupt.
  1199. //!
  1200. //! \param ulBase is the base address of the UART port.
  1201. //!
  1202. //! This function does the actual unregistering of the interrupt handler. It
  1203. //! will clear the handler to be called when a UART interrupt occurs. This
  1204. //! will also mask off the interrupt in the interrupt controller so that the
  1205. //! interrupt handler no longer is called.
  1206. //!
  1207. //! \sa IntRegister() for important information about registering interrupt
  1208. //! handlers.
  1209. //!
  1210. //! \return None.
  1211. //
  1212. //*****************************************************************************
  1213. void
  1214. UARTIntUnregister(unsigned long ulBase)
  1215. {
  1216. unsigned long ulInt;
  1217. //
  1218. // Check the arguments.
  1219. //
  1220. ASSERT(UARTBaseValid(ulBase));
  1221. //
  1222. // Determine the interrupt number based on the UART port.
  1223. //
  1224. ulInt = ((ulBase == UART0_BASE) ? INT_UART0 :
  1225. ((ulBase == UART1_BASE) ? INT_UART1 : INT_UART2));
  1226. //
  1227. // Disable the interrupt.
  1228. //
  1229. IntDisable(ulInt);
  1230. //
  1231. // Unregister the interrupt handler.
  1232. //
  1233. IntUnregister(ulInt);
  1234. }
  1235. //*****************************************************************************
  1236. //
  1237. //! Enables individual UART interrupt sources.
  1238. //!
  1239. //! \param ulBase is the base address of the UART port.
  1240. //! \param ulIntFlags is the bit mask of the interrupt sources to be enabled.
  1241. //!
  1242. //! Enables the indicated UART interrupt sources. Only the sources that are
  1243. //! enabled can be reflected to the processor interrupt; disabled sources have
  1244. //! no effect on the processor.
  1245. //!
  1246. //! The \e ulIntFlags parameter is the logical OR of any of the following:
  1247. //!
  1248. //! - \b UART_INT_OE - Overrun Error interrupt
  1249. //! - \b UART_INT_BE - Break Error interrupt
  1250. //! - \b UART_INT_PE - Parity Error interrupt
  1251. //! - \b UART_INT_FE - Framing Error interrupt
  1252. //! - \b UART_INT_RT - Receive Timeout interrupt
  1253. //! - \b UART_INT_TX - Transmit interrupt
  1254. //! - \b UART_INT_RX - Receive interrupt
  1255. //! - \b UART_INT_DSR - DSR interrupt
  1256. //! - \b UART_INT_DCD - DCD interrupt
  1257. //! - \b UART_INT_CTS - CTS interrupt
  1258. //! - \b UART_INT_RI - RI interrupt
  1259. //!
  1260. //! \return None.
  1261. //
  1262. //*****************************************************************************
  1263. void
  1264. UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags)
  1265. {
  1266. //
  1267. // Check the arguments.
  1268. //
  1269. ASSERT(UARTBaseValid(ulBase));
  1270. //
  1271. // Enable the specified interrupts.
  1272. //
  1273. HWREG(ulBase + UART_O_IM) |= ulIntFlags;
  1274. }
  1275. //*****************************************************************************
  1276. //
  1277. //! Disables individual UART interrupt sources.
  1278. //!
  1279. //! \param ulBase is the base address of the UART port.
  1280. //! \param ulIntFlags is the bit mask of the interrupt sources to be disabled.
  1281. //!
  1282. //! Disables the indicated UART interrupt sources. Only the sources that are
  1283. //! enabled can be reflected to the processor interrupt; disabled sources have
  1284. //! no effect on the processor.
  1285. //!
  1286. //! The \e ulIntFlags parameter has the same definition as the \e ulIntFlags
  1287. //! parameter to UARTIntEnable().
  1288. //!
  1289. //! \return None.
  1290. //
  1291. //*****************************************************************************
  1292. void
  1293. UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags)
  1294. {
  1295. //
  1296. // Check the arguments.
  1297. //
  1298. ASSERT(UARTBaseValid(ulBase));
  1299. //
  1300. // Disable the specified interrupts.
  1301. //
  1302. HWREG(ulBase + UART_O_IM) &= ~(ulIntFlags);
  1303. }
  1304. //*****************************************************************************
  1305. //
  1306. //! Gets the current interrupt status.
  1307. //!
  1308. //! \param ulBase is the base address of the UART port.
  1309. //! \param bMasked is \b false if the raw interrupt status is required and
  1310. //! \b true if the masked interrupt status is required.
  1311. //!
  1312. //! This returns the interrupt status for the specified UART. Either the raw
  1313. //! interrupt status or the status of interrupts that are allowed to reflect to
  1314. //! the processor can be returned.
  1315. //!
  1316. //! \return Returns the current interrupt status, enumerated as a bit field of
  1317. //! values described in UARTIntEnable().
  1318. //
  1319. //*****************************************************************************
  1320. unsigned long
  1321. UARTIntStatus(unsigned long ulBase, tBoolean bMasked)
  1322. {
  1323. //
  1324. // Check the arguments.
  1325. //
  1326. ASSERT(UARTBaseValid(ulBase));
  1327. //
  1328. // Return either the interrupt status or the raw interrupt status as
  1329. // requested.
  1330. //
  1331. if(bMasked)
  1332. {
  1333. return(HWREG(ulBase + UART_O_MIS));
  1334. }
  1335. else
  1336. {
  1337. return(HWREG(ulBase + UART_O_RIS));
  1338. }
  1339. }
  1340. //*****************************************************************************
  1341. //
  1342. //! Clears UART interrupt sources.
  1343. //!
  1344. //! \param ulBase is the base address of the UART port.
  1345. //! \param ulIntFlags is a bit mask of the interrupt sources to be cleared.
  1346. //!
  1347. //! The specified UART interrupt sources are cleared, so that they no longer
  1348. //! assert. This function must be called in the interrupt handler to keep the
  1349. //! interrupt from being recognized again immediately upon exit.
  1350. //!
  1351. //! The \e ulIntFlags parameter has the same definition as the \e ulIntFlags
  1352. //! parameter to UARTIntEnable().
  1353. //!
  1354. //! \note Since there is a write buffer in the Cortex-M3 processor, it may take
  1355. //! several clock cycles before the interrupt source is actually cleared.
  1356. //! Therefore, it is recommended that the interrupt source be cleared early in
  1357. //! the interrupt handler (as opposed to the very last action) to avoid
  1358. //! returning from the interrupt handler before the interrupt source is
  1359. //! actually cleared. Failure to do so may result in the interrupt handler
  1360. //! being immediately reentered (since NVIC still sees the interrupt source
  1361. //! asserted).
  1362. //!
  1363. //! \return None.
  1364. //
  1365. //*****************************************************************************
  1366. void
  1367. UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags)
  1368. {
  1369. //
  1370. // Check the arguments.
  1371. //
  1372. ASSERT(UARTBaseValid(ulBase));
  1373. //
  1374. // Clear the requested interrupt sources.
  1375. //
  1376. HWREG(ulBase + UART_O_ICR) = ulIntFlags;
  1377. }
  1378. //*****************************************************************************
  1379. //
  1380. //! Enable UART DMA operation.
  1381. //!
  1382. //! \param ulBase is the base address of the UART port.
  1383. //! \param ulDMAFlags is a bit mask of the DMA features to enable.
  1384. //!
  1385. //! The specified UART DMA features are enabled. The UART can be
  1386. //! configured to use DMA for transmit or receive, and to disable
  1387. //! receive if an error occurs. The \e ulDMAFlags parameter is the
  1388. //! logical OR of any of the following values:
  1389. //!
  1390. //! - UART_DMA_RX - enable DMA for receive
  1391. //! - UART_DMA_TX - enable DMA for transmit
  1392. //! - UART_DMA_ERR_RXSTOP - disable DMA receive on UART error
  1393. //!
  1394. //! \note The uDMA controller must also be set up before DMA can be used
  1395. //! with the UART.
  1396. //!
  1397. //! \return None.
  1398. //
  1399. //*****************************************************************************
  1400. void
  1401. UARTDMAEnable(unsigned long ulBase, unsigned long ulDMAFlags)
  1402. {
  1403. //
  1404. // Check the arguments.
  1405. //
  1406. ASSERT(UARTBaseValid(ulBase));
  1407. //
  1408. // Set the requested bits in the UART DMA control register.
  1409. //
  1410. HWREG(ulBase + UART_O_DMACTL) |= ulDMAFlags;
  1411. }
  1412. //*****************************************************************************
  1413. //
  1414. //! Disable UART DMA operation.
  1415. //!
  1416. //! \param ulBase is the base address of the UART port.
  1417. //! \param ulDMAFlags is a bit mask of the DMA features to disable.
  1418. //!
  1419. //! This function is used to disable UART DMA features that were enabled
  1420. //! by UARTDMAEnable(). The specified UART DMA features are disabled. The
  1421. //! \e ulDMAFlags parameter is the logical OR of any of the following values:
  1422. //!
  1423. //! - UART_DMA_RX - disable DMA for receive
  1424. //! - UART_DMA_TX - disable DMA for transmit
  1425. //! - UART_DMA_ERR_RXSTOP - do not disable DMA receive on UART error
  1426. //!
  1427. //! \return None.
  1428. //
  1429. //*****************************************************************************
  1430. void
  1431. UARTDMADisable(unsigned long ulBase, unsigned long ulDMAFlags)
  1432. {
  1433. //
  1434. // Check the arguments.
  1435. //
  1436. ASSERT(UARTBaseValid(ulBase));
  1437. //
  1438. // Clear the requested bits in the UART DMA control register.
  1439. //
  1440. HWREG(ulBase + UART_O_DMACTL) &= ~ulDMAFlags;
  1441. }
  1442. //*****************************************************************************
  1443. //
  1444. //! Gets current receiver errors.
  1445. //!
  1446. //! \param ulBase is the base address of the UART port.
  1447. //!
  1448. //! This function returns the current state of each of the 4 receiver error
  1449. //! sources. The returned errors are equivalent to the four error bits
  1450. //! returned via the previous call to UARTCharGet() or UARTCharGetNonBlocking()
  1451. //! with the exception that the overrun error is set immediately the overrun
  1452. //! occurs rather than when a character is next read.
  1453. //!
  1454. //! \return Returns a logical OR combination of the receiver error flags,
  1455. //! \b UART_RXERROR_FRAMING, \b UART_RXERROR_PARITY, \b UART_RXERROR_BREAK
  1456. //! and \b UART_RXERROR_OVERRUN.
  1457. //
  1458. //*****************************************************************************
  1459. unsigned long
  1460. UARTRxErrorGet(unsigned long ulBase)
  1461. {
  1462. //
  1463. // Check the arguments.
  1464. //
  1465. ASSERT(UARTBaseValid(ulBase));
  1466. //
  1467. // Return the current value of the receive status register.
  1468. //
  1469. return(HWREG(ulBase + UART_O_RSR) & 0x0000000F);
  1470. }
  1471. //*****************************************************************************
  1472. //
  1473. //! Clears all reported receiver errors.
  1474. //!
  1475. //! \param ulBase is the base address of the UART port.
  1476. //!
  1477. //! This function is used to clear all receiver error conditions reported via
  1478. //! UARTRxErrorGet(). If using the overrun, framing error, parity error or
  1479. //! break interrupts, this function must be called after clearing the interrupt
  1480. //! to ensure that later errors of the same type trigger another interrupt.
  1481. //!
  1482. //! \return None.
  1483. //
  1484. //*****************************************************************************
  1485. void
  1486. UARTRxErrorClear(unsigned long ulBase)
  1487. {
  1488. //
  1489. // Check the arguments.
  1490. //
  1491. ASSERT(UARTBaseValid(ulBase));
  1492. //
  1493. // Any write to the Error Clear Register will clear all bits which are
  1494. // currently set.
  1495. //
  1496. HWREG(ulBase + UART_O_ECR) = 0;
  1497. }
  1498. //*****************************************************************************
  1499. //
  1500. // Close the Doxygen group.
  1501. //! @}
  1502. //
  1503. //*****************************************************************************