drv_uart.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. #include <rtdevice.h>
  2. #include "gtypes.h"
  3. #include "gh_uart.h"
  4. #include "gh_debug_rct.h"
  5. #include "gd_uart.h"
  6. #include "gd_int.h"
  7. /*---------------------------------------------------------------------------*/
  8. /* local defines */
  9. /*---------------------------------------------------------------------------*/
  10. #define UART_IRQ_CLEAR_ALL 0x3 /* IRQ CLR Register: rx_IRQ, rx_parity_IRQ */
  11. #define UART_RISING_TXE_RXE 0x3 /* for UART_control register: */
  12. /* clock edge polarity = rising, */
  13. /* TX = enable, RX = enable */
  14. /* UART[x]_FC_REG */
  15. #define UART_FC_RX_ONECHAR 0x0 /* RCVR_Trigger: FIFO has 1 char */
  16. #define UART_FC_RX_QUARTER_FULL 0x1 /* RCVR_Trigger: FIFO is one-fourth to full */
  17. #define UART_FC_RX_HALF_FULL 0x2 /* RCVR_Trigger: FIFO is half to full */
  18. #define UART_FC_RX_2_TO_FULL 0x3 /* RCVR_Trigger: FIFO is 2 char to full */
  19. #define UART_FC_TX_EMPTY 0x0 /* TX_Empty_Trigger: FIFO is empty */
  20. #define UART_FC_TX_2_IN_FIFO 0x1 /* TX_Empty_Trigger: FIFO has 2 char */
  21. #define UART_FC_TX_QUATER_IN_FIFO 0x2 /* TX_Empty_Trigger: FIFO is one-fourth to full */
  22. #define UART_FC_TX_HALF_IN_FIFO 0x3 /* TX_Empty_Trigger: FIFO is half to full */
  23. /* UART[x]_II_REG */
  24. #define UART_II_MODEM_STATUS_CHANGED 0x0
  25. #define UART_II_NO_INT_PENDING 0x1
  26. #define UART_II_THR_EMPTY 0x2
  27. #define UART_II_RCV_DATA_AVAIL 0x4
  28. #define UART_II_RCV_STATUS 0x6
  29. #define UART_II_CHAR_TIMEOUT 0xc
  30. #define MAX_UART_CNT (3)
  31. /*---------------------------------------------------------------------------*/
  32. /* local data types */
  33. /*---------------------------------------------------------------------------*/
  34. struct gk_uart
  35. {
  36. u8 index;
  37. };
  38. /*---------------------------------------------------------------------------*/
  39. /* local data */
  40. /*---------------------------------------------------------------------------*/
  41. static struct gk_uart uart[MAX_UART_CNT] =
  42. {
  43. {0},{1},{2}
  44. };
  45. static GD_HANDLE intHandle[MAX_UART_CNT];
  46. static struct rt_serial_device serial[MAX_UART_CNT];
  47. /*---------------------------------------------------------------------------*/
  48. /* local functions */
  49. /*---------------------------------------------------------------------------*/
  50. static void uartSetBaudrate(U32 index, U32 baudRate)
  51. {
  52. U32 brdi;
  53. GH_PLL_set_SCALER_UART(0x01);
  54. brdi = (48000000/2) * 10 / baudRate / 16;
  55. if (brdi % 10 >= 5)
  56. brdi = (brdi / 10) + 1;
  57. else
  58. brdi = (brdi / 10);
  59. GH_UART_set_LCR_dlab(index, 1);
  60. GH_UART_set_DLL_BaudDivint_L(index, brdi & 0xff);
  61. GH_UART_set_DLH_BaudDivint_H(index, (brdi >> 8) & 0xff);
  62. GH_UART_set_LCR_dlab(index, 0);
  63. }
  64. static void uartSetDataBits(U32 index, U32 dataBits)
  65. {
  66. U32 data_bits = dataBits;
  67. // 0 = use 5 data bits
  68. // 1 = use 6 data bits
  69. // 2 = use 7 data bits
  70. // 3 = use 8 data bits
  71. //data_bits -= GD_UART_5_DATATBITS;
  72. if(GH_UART_get_LCR_cls(index) != data_bits)
  73. {
  74. GH_UART_set_LCR_cls(index, data_bits);
  75. }
  76. }
  77. static void uartSetStopBits(U32 index, U32 stopBits)
  78. {
  79. // 0 = use 1 stop bit
  80. // 1 = use 2 stop bits
  81. if(GH_UART_get_LCR_stop(index) != stopBits)
  82. {
  83. GH_UART_set_LCR_stop(index, stopBits);
  84. }
  85. }
  86. static void uartSetParity(U32 index, U32 parity)
  87. {
  88. switch(parity)
  89. {
  90. case GD_UART_NO_PARITY:
  91. if(GH_UART_get_LCR_pen(index))
  92. {
  93. GH_UART_set_LCR_pen(index, 0);
  94. }
  95. break;
  96. case GD_UART_ODD_PARITY:
  97. if(!GH_UART_get_LCR_pen(index))
  98. {
  99. GH_UART_set_LCR_pen(index, 1);
  100. }
  101. if(GH_UART_get_LCR_eps(index))
  102. {
  103. GH_UART_set_LCR_eps(index, 0);
  104. }
  105. break;
  106. case GD_UART_EVEN_PARITY:
  107. if(!GH_UART_get_LCR_pen(index))
  108. {
  109. GH_UART_set_LCR_pen(index, 1);
  110. }
  111. if(!GH_UART_get_LCR_eps(index))
  112. {
  113. GH_UART_set_LCR_eps(index, 1);
  114. }
  115. break;
  116. default:
  117. break;
  118. }
  119. }
  120. static void uartSetFlowControl(U32 index, U32 flowCtrl)
  121. {
  122. if(index == 0)
  123. {
  124. // In UART0, only the Loopback bit is used and flow control is not supported.
  125. // In UART1, all the bits are used.
  126. if((flowCtrl == 0) || (flowCtrl == 0x10))
  127. {
  128. if(GH_UART_get_MCR(index) != flowCtrl)
  129. {
  130. GH_UART_set_MCR(index, flowCtrl);
  131. }
  132. }
  133. return;
  134. }
  135. if(GH_UART_get_MCR(index) != flowCtrl)
  136. {
  137. GH_UART_set_MCR(index, flowCtrl);
  138. }
  139. }
  140. static void uartISR(void)
  141. {
  142. U8 interruptID;
  143. interruptID = GH_UART_get_IIR_interrupt_id(0);
  144. switch (interruptID)
  145. {
  146. case UART_II_MODEM_STATUS_CHANGED:
  147. case UART_II_NO_INT_PENDING:
  148. break;
  149. case UART_II_THR_EMPTY:
  150. rt_hw_serial_isr(&serial[0], RT_SERIAL_EVENT_TX_DONE);
  151. break;
  152. case UART_II_RCV_DATA_AVAIL:
  153. case UART_II_RCV_STATUS:
  154. rt_hw_serial_isr(&serial[0], RT_SERIAL_EVENT_RX_IND);
  155. break;
  156. case UART_II_CHAR_TIMEOUT:
  157. GH_UART_get_RBR_Data(0);
  158. rt_hw_serial_isr(&serial[0], RT_SERIAL_EVENT_RX_TIMEOUT);
  159. break;
  160. default:
  161. break;
  162. }
  163. }
  164. static void uartISR1(void)
  165. {
  166. U8 interruptID;
  167. interruptID = GH_UART_get_IIR_interrupt_id(1);
  168. switch (interruptID)
  169. {
  170. case UART_II_MODEM_STATUS_CHANGED:
  171. case UART_II_NO_INT_PENDING:
  172. break;
  173. case UART_II_THR_EMPTY:
  174. rt_hw_serial_isr(&serial[1], RT_SERIAL_EVENT_TX_DONE);
  175. break;
  176. case UART_II_RCV_DATA_AVAIL:
  177. case UART_II_RCV_STATUS:
  178. rt_hw_serial_isr(&serial[1], RT_SERIAL_EVENT_RX_IND);
  179. break;
  180. case UART_II_CHAR_TIMEOUT:
  181. GH_UART_get_RBR_Data(1);
  182. rt_hw_serial_isr(&serial[1], RT_SERIAL_EVENT_RX_TIMEOUT);
  183. break;
  184. default:
  185. break;
  186. }
  187. }
  188. static void uartISR2(void)
  189. {
  190. U8 interruptID;
  191. interruptID = GH_UART_get_IIR_interrupt_id(2);
  192. switch (interruptID)
  193. {
  194. case UART_II_MODEM_STATUS_CHANGED:
  195. case UART_II_NO_INT_PENDING:
  196. break;
  197. case UART_II_THR_EMPTY:
  198. rt_hw_serial_isr(&serial[2], RT_SERIAL_EVENT_TX_DONE);
  199. break;
  200. case UART_II_RCV_DATA_AVAIL:
  201. case UART_II_RCV_STATUS:
  202. rt_hw_serial_isr(&serial[2], RT_SERIAL_EVENT_RX_IND);
  203. break;
  204. case UART_II_CHAR_TIMEOUT:
  205. GH_UART_get_RBR_Data(2);
  206. rt_hw_serial_isr(&serial[2], RT_SERIAL_EVENT_RX_TIMEOUT);
  207. break;
  208. default:
  209. break;
  210. }
  211. }
  212. static GERR uartSetIntMode(U8 channel)
  213. {
  214. GD_UART_STATE_MACHINE_S* uart_handle_ptr = NULL;
  215. GD_INT_OPEN_PARAMS_S intParams;
  216. GERR ret = GD_OK;
  217. intParams.sensitivity = GD_INT_LEVEL_HIGH; //hhl note: check this value.
  218. intParams.active = GD_INT_INVERT_IRQ;
  219. intParams.priority = GD_INT_MID_PRIORITY;
  220. if(channel == 0)
  221. {
  222. intParams.type = (S8)GD_INT_UART_IRQ;
  223. intParams.isrFct.lowPrio = uartISR;
  224. ret = GD_INT_Open(&intParams, &intHandle[0]);
  225. }
  226. else if(channel == 1)
  227. {
  228. intParams.type = (S8)GD_INT_UART1_IRQ;
  229. intParams.isrFct.lowPrio = uartISR1;
  230. ret = GD_INT_Open(&intParams, &intHandle[1]);
  231. }
  232. else
  233. {
  234. intParams.type = (S8)GD_INT_UART2_IRQ;
  235. intParams.isrFct.lowPrio = uartISR2;
  236. ret = GD_INT_Open(&intParams, &intHandle[2]);
  237. }
  238. return ret;
  239. }
  240. /**
  241. * UART device in RT-Thread
  242. */
  243. static rt_err_t gk_uart_configure(struct rt_serial_device *serial,
  244. struct serial_configure *cfg)
  245. {
  246. int div;
  247. GD_UART_DATABITS_E data_mode;
  248. GD_UART_STOPBITS_E stop_mode;
  249. GD_UART_PARITY_E parity_mode;
  250. struct gk_uart *uart;
  251. RT_ASSERT(serial != RT_NULL);
  252. RT_ASSERT(cfg != RT_NULL);
  253. uart = (struct gk_uart *)serial->parent.user_data;
  254. switch (cfg->data_bits)
  255. {
  256. case DATA_BITS_8:
  257. data_mode = GD_UART_8_DATATBITS;
  258. break;
  259. case DATA_BITS_7:
  260. data_mode = GD_UART_7_DATATBITS;
  261. break;
  262. case DATA_BITS_6:
  263. data_mode = GD_UART_6_DATATBITS;
  264. break;
  265. case DATA_BITS_5:
  266. data_mode = GD_UART_5_DATATBITS;
  267. break;
  268. default:
  269. data_mode = GD_UART_8_DATATBITS;
  270. break;
  271. }
  272. switch (cfg->stop_bits)
  273. {
  274. case STOP_BITS_2:
  275. stop_mode = GD_UART_20_STOPBITS;//UART_STOP_BIT2;
  276. break;
  277. case STOP_BITS_1:
  278. default:
  279. stop_mode = GD_UART_10_STOPBITS;
  280. break;
  281. }
  282. switch (cfg->parity)
  283. {
  284. case PARITY_ODD:
  285. parity_mode = GD_UART_ODD_PARITY;
  286. break;
  287. case PARITY_EVEN:
  288. parity_mode = GD_UART_EVEN_PARITY;
  289. break;
  290. case PARITY_NONE:
  291. default:
  292. parity_mode = GD_UART_NO_PARITY;
  293. break;
  294. }
  295. uartSetBaudrate(uart->index,cfg->baud_rate);
  296. uartSetDataBits(uart->index, data_mode);
  297. uartSetParity(uart->index, parity_mode);
  298. uartSetStopBits(uart->index, stop_mode);
  299. uartSetFlowControl(uart->index,0);
  300. return RT_EOK;
  301. }
  302. #define RT_DEVICE_CTRL_GET_CONFIG 0xFF
  303. static rt_err_t gk_uart_control(struct rt_serial_device *serial,
  304. int cmd, void *arg)
  305. {
  306. struct gk_uart* uart;
  307. RT_ASSERT(serial != RT_NULL);
  308. uart = (struct gk_uart *)serial->parent.user_data;
  309. switch (cmd)
  310. {
  311. case RT_DEVICE_CTRL_CLR_INT:
  312. /* disable rx irq */
  313. GD_INT_Enable(&intHandle[uart->index],0);
  314. GH_UART_set_IER_erbfi(uart->index, 0);
  315. break;
  316. case RT_DEVICE_CTRL_SET_INT:
  317. /* enable rx irq */
  318. GH_UART_set_FCR_FIFO_Enable(uart->index, 1);
  319. GH_UART_set_FCR_RCVR_Trigger(uart->index, UART_FC_RX_ONECHAR);
  320. GH_UART_set_FCR_TX_Empty_Trigger(uart->index, UART_FC_TX_EMPTY);
  321. GH_UART_set_FCR_XMIT_FIFO_Reset(uart->index, 1);
  322. GH_UART_set_FCR_RCVR_FIFO_Reset(uart->index, 1);
  323. GH_UART_set_IER_etbei(uart->index, 0); //Turn off THRE interrupt
  324. uartSetIntMode(uart->index);
  325. GD_INT_Enable(&intHandle[uart->index],1);
  326. GH_UART_set_IER_erbfi(uart->index,1);
  327. GH_UART_set_IER_elsi(uart->index,1);
  328. break;
  329. case RT_DEVICE_CTRL_GET_CONFIG:
  330. if(!arg)
  331. {
  332. rt_kprintf("%s,line=%d,param is NULL!\n",__FUNCTION__,__LINE__);
  333. return RT_ERROR;
  334. }
  335. *((struct serial_configure *)arg) = serial->config;
  336. break;
  337. default:
  338. break;
  339. }
  340. return RT_EOK;
  341. }
  342. static int gk_uart_putc(struct rt_serial_device *serial, char c)
  343. {
  344. struct gk_uart *uart = serial->parent.user_data;
  345. unsigned int ret;
  346. ret = GH_UART_get_LSR_temt(uart->index);
  347. if(serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX){
  348. GH_UART_set_THR_Data(uart->index, c);
  349. if (GH_UART_get_IER_etbei(uart->index) == 0)
  350. {
  351. GH_UART_set_IER_etbei(uart->index, 1); //Turn on THRE interrupt
  352. }
  353. return 1;
  354. }
  355. else
  356. {
  357. while(!GH_UART_get_LSR_temt(uart->index));
  358. GH_UART_set_THR_Data(uart->index, c);
  359. return 1;
  360. }
  361. }
  362. static int gk_uart_getc(struct rt_serial_device *serial)
  363. {
  364. struct gk_uart *uart = serial->parent.user_data;
  365. if(!GH_UART_get_LSR_dr(uart->index))
  366. return -1;
  367. return GH_UART_get_RBR_Data(uart->index);
  368. }
  369. static const struct rt_uart_ops gk_uart_ops =
  370. {
  371. gk_uart_configure,
  372. gk_uart_control,
  373. gk_uart_putc,
  374. gk_uart_getc,
  375. };
  376. /**
  377. * This function will handle init uart
  378. */
  379. void rt_hw_uart_init(void)
  380. {
  381. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  382. int i;
  383. char devname[6];
  384. for(i=0; i<MAX_UART_CNT; i++)
  385. {
  386. serial[i].ops = &gk_uart_ops;
  387. serial[i].config = config;
  388. rt_sprintf(devname,"uart%d",i);
  389. rt_hw_serial_register(&serial[i], devname,
  390. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_STREAM ,
  391. &uart[i]);
  392. }
  393. }
  394. int GM_Printf(const char *__format, ...)
  395. {
  396. rt_kprintf(__format);
  397. return 0;
  398. }