uart.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /*
  2. * File : board.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2009 RT-Thread Develop Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2010-03-08 Bernard The first version for LPC17xx
  13. * 2010-04-10 fify Modified for M16C
  14. */
  15. #include <rthw.h>
  16. #include <rtthread.h>
  17. #include "iom16c62p.h"
  18. #include "bsp.h"
  19. #include "uart.h"
  20. #if defined(RT_USING_UART0) && defined(RT_USING_DEVICE)
  21. struct rt_uart_m16c
  22. {
  23. struct rt_device parent;
  24. /* buffer for reception */
  25. rt_uint8_t read_index, save_index;
  26. rt_uint8_t rx_buffer[RT_UART_RX_BUFFER_SIZE];
  27. }uart_device;
  28. void u0rec_handler(void)
  29. {
  30. rt_ubase_t level;
  31. rt_uint8_t c;
  32. struct rt_uart_m16c* uart = &uart_device;
  33. while(ri_u0c1 == 0)
  34. ;
  35. c = (char) u0rb;
  36. /* Receive Data Available */
  37. uart->rx_buffer[uart->save_index] = c;
  38. level = rt_hw_interrupt_disable();
  39. uart->save_index ++;
  40. if (uart->save_index >= RT_UART_RX_BUFFER_SIZE)
  41. uart->save_index = 0;
  42. rt_hw_interrupt_enable(level);
  43. /* invoke callback */
  44. if(uart->parent.rx_indicate != RT_NULL)
  45. {
  46. rt_size_t length;
  47. if (uart->read_index > uart->save_index)
  48. length = RT_UART_RX_BUFFER_SIZE - uart->read_index + uart->save_index;
  49. else
  50. length = uart->save_index - uart->read_index;
  51. uart->parent.rx_indicate(&uart->parent, length);
  52. }
  53. }
  54. static rt_err_t rt_uart_init (rt_device_t dev)
  55. {
  56. rt_uint32_t level;
  57. /* set UART0 bit rate generator bit rate can be calculated by:
  58. bit rate = ((BRG count source / 16)/baud rate) - 1
  59. Baud rate is based on main crystal or PLL not CPU core clock */
  60. //pclk1 = 1; /// seleck F1SIO
  61. u0brg = (unsigned char)(((CPU_CLK_FREQ/16)/BAUD_RATE)-1); //(N+1)
  62. /* UART Transmit/Receive Control Register 2 */
  63. ucon = 0x00;
  64. /* 00000000
  65. b0 U0IRS UART0 transmit irq cause select bit, 0 = transmit buffer empty
  66. b1 U1IRS UART1 transmit irq cause select bit, 0 = transmit buffer empty
  67. b2 U0RRM UART0 continuous receive mode enable bit, set to 0 in UART mode
  68. b3 U1RRM UART1 continuous receive mode enable bit, set to 0 in UART mode
  69. b4 CLKMD0 CLK/CLKS select bit 0, set to 0 in UART mode
  70. b5 CLKMD1 CLK/CLKS select bit 1, set to 0 in UART mode
  71. b6 RCSP Separate CTS/RTS bit,
  72. b7 Reserved, set to 0 */
  73. /* UART0 transmit/receive control register 0 */
  74. /* f1 count source, CTS/RTS disabled, CMOS output */
  75. u0c0 = 0x10;
  76. /* 00010000
  77. b1:b0 CLK01:CLK0 BRG count source select bits //01 F8SIO
  78. b2 CRS CTS/RTS function select bit
  79. b3 TXEPT Transmit register empty flag
  80. b4 CRD CTS/RTS disable bit
  81. b5 NCH Data output select bit
  82. b6 CKPOL CLK polarity select bit,set to 0 in UART mode
  83. b7 UFORM Transfer format select bit,set to 0 in UART mode */
  84. /* UART0 transmit/receive control register 1 */
  85. /* disable transmit and receive, no error output pin, data not inverted */
  86. u0c1 = 0x00;
  87. /* 00000000
  88. b0 TE Transmit enable bit
  89. b1 TI Transmit buffer empty flag
  90. b2 RE Receive enable bit
  91. b3 RI Receive complete flag
  92. b5:b4 Reserved, set to 0
  93. b6 UOLCH Data logic select bit
  94. b7 UOERE Error signal output enable bit */
  95. /* UART0 transmit/receive mode register */
  96. /* 8-bit data,asynch mode, internal clock, 1 stop bit, no parity */
  97. u0mr = 0x05;
  98. /* 00000101
  99. b2:b0 SMD12:SMD1 Serial I/O Mode select bits
  100. b3 CKDIR Internal/External clock select bit, CKDIR
  101. b4 STPS Stop bit length select bit, STPS
  102. b5 PRY Odd/even parity select bit, PRY
  103. b6 PRYE Parity enable bit, PRYE
  104. b7 IOPOL TxD, RxD I/O polarity reverse bit */
  105. /* clear UART0 receive buffer by reading */
  106. u0tb = u0rb;
  107. /* clear UART0 transmit buffer */
  108. u0tb = 0;
  109. /* disable irqs before setting irq registers */
  110. level = rt_hw_interrupt_disable();
  111. /* Enable UART0 receive interrupt, priority level 4 */
  112. s0ric = 0x04;
  113. /* Enable all interrupts */
  114. rt_hw_interrupt_enable(level);
  115. /* UART0 transmit/receive control register 1 */
  116. /* enable transmit and receive */
  117. u0c1 = 0x05;
  118. /* 00000101 enable transmit and receive
  119. b0 TE Transmit enable bit
  120. b1 TI Transmit buffer empty flag
  121. b2 RE Receive enable bit
  122. b3 RI Receive complete flag
  123. b5:b4 Reserved, set to 0
  124. b6 UOLCH Data logic select bit
  125. b7 UOERE Error signal output enable bit */
  126. return RT_EOK;
  127. }
  128. static rt_err_t rt_uart_open(rt_device_t dev, rt_uint16_t oflag)
  129. {
  130. RT_ASSERT(dev != RT_NULL);
  131. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  132. {
  133. /* Enable the UART Interrupt */
  134. }
  135. return RT_EOK;
  136. }
  137. static rt_err_t rt_uart_close(rt_device_t dev)
  138. {
  139. RT_ASSERT(dev != RT_NULL);
  140. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  141. {
  142. /* Disable the UART Interrupt */
  143. }
  144. return RT_EOK;
  145. }
  146. static rt_size_t rt_uart_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  147. {
  148. rt_uint8_t* ptr;
  149. struct rt_uart_m16c *uart = (struct rt_uart_m16c*)dev;
  150. RT_ASSERT(uart != RT_NULL);
  151. /* point to buffer */
  152. ptr = (rt_uint8_t*) buffer;
  153. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  154. {
  155. while (size)
  156. {
  157. /* interrupt receive */
  158. rt_base_t level;
  159. /* disable interrupt */
  160. level = rt_hw_interrupt_disable();
  161. if (uart->read_index != uart->save_index)
  162. {
  163. *ptr = uart->rx_buffer[uart->read_index];
  164. uart->read_index ++;
  165. if (uart->read_index >= RT_UART_RX_BUFFER_SIZE)
  166. uart->read_index = 0;
  167. }
  168. else
  169. {
  170. /* no data in rx buffer */
  171. /* enable interrupt */
  172. rt_hw_interrupt_enable(level);
  173. break;
  174. }
  175. /* enable interrupt */
  176. rt_hw_interrupt_enable(level);
  177. ptr ++;
  178. size --;
  179. }
  180. return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
  181. }
  182. return 0;
  183. }
  184. static rt_size_t rt_uart_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  185. {
  186. char *ptr;
  187. ptr = (char*)buffer;
  188. if (dev->flag & RT_DEVICE_FLAG_STREAM)
  189. {
  190. /* stream mode */
  191. while (size)
  192. {
  193. if (*ptr == '\n')
  194. {
  195. while(ti_u0c1 == 0)
  196. ;
  197. u0tb = '\r';
  198. }
  199. /* THRE status, contain valid data */
  200. while(ti_u0c1 == 0)
  201. ;
  202. u0tb = *ptr;
  203. ptr ++;
  204. size --;
  205. }
  206. }
  207. else
  208. {
  209. while ( size != 0 )
  210. {
  211. /* THRE status, contain valid data */
  212. while(ti_u0c1 == 0)
  213. ;
  214. u0tb = *ptr;
  215. ptr++;
  216. size--;
  217. }
  218. }
  219. return (rt_size_t) ptr - (rt_size_t) buffer;
  220. }
  221. void rt_hw_uart_init(void)
  222. {
  223. struct rt_uart_m16c* uart;
  224. /* get uart device */
  225. uart = &uart_device;
  226. /* device initialization */
  227. uart->parent.type = RT_Device_Class_Char;
  228. rt_memset(uart->rx_buffer, 0, sizeof(uart->rx_buffer));
  229. uart->read_index = uart->save_index = 0;
  230. /* device interface */
  231. uart->parent.init = rt_uart_init;
  232. uart->parent.open = rt_uart_open;
  233. uart->parent.close = rt_uart_close;
  234. uart->parent.read = rt_uart_read;
  235. uart->parent.write = rt_uart_write;
  236. uart->parent.control = RT_NULL;
  237. uart->parent.private = RT_NULL;
  238. rt_device_register(&uart->parent,
  239. "uart0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STREAM | RT_DEVICE_FLAG_INT_RX);
  240. }
  241. #endif /* end of UART */
  242. /*@}*/