serial.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. ******************************************************************************
  3. * By : parai
  4. * email:parai@foxmail.com
  5. * virtual serial driver
  6. ******************************************************************************
  7. */
  8. #include <rthw.h>
  9. #include <rtthread.h>
  10. #define _DEBUG_SERIAL 0
  11. #include "serial.h"
  12. #include <stdio.h>
  13. struct rt_device serial_device;
  14. //extern struct serial_int_rx serial_rx;
  15. struct serial_int_rx serial_rx;
  16. #if 0
  17. static FILE *fp = RT_NULL;
  18. #endif
  19. /*@{*/
  20. /* RT-Thread Device Interface */
  21. /**
  22. * This function initializes serial
  23. */
  24. static rt_err_t rt_serial_init(rt_device_t dev)
  25. {
  26. if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
  27. {
  28. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  29. {
  30. rt_memset(serial_rx.rx_buffer, 0,
  31. sizeof(serial_rx.rx_buffer));
  32. serial_rx.read_index = 0;
  33. serial_rx.save_index = 0;
  34. }
  35. dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
  36. }
  37. return RT_EOK;
  38. }
  39. static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag)
  40. {
  41. #if _DEBUG_SERIAL==1
  42. printf("in rt_serial_open()\n");
  43. #endif
  44. return RT_EOK;
  45. }
  46. static rt_err_t rt_serial_close(rt_device_t dev)
  47. {
  48. #if _DEBUG_SERIAL==1
  49. printf("in rt_serial_close()\n");
  50. #endif
  51. return RT_EOK;
  52. }
  53. static rt_size_t rt_serial_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
  54. {
  55. rt_uint8_t *ptr;
  56. rt_err_t err_code;
  57. ptr = buffer;
  58. err_code = RT_EOK;
  59. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  60. {
  61. /* interrupt mode Rx */
  62. while (size)
  63. {
  64. rt_base_t level;
  65. /* disable interrupt */
  66. level = rt_hw_interrupt_disable();
  67. if (serial_rx.read_index != serial_rx.save_index)
  68. {
  69. /* read a character */
  70. *ptr++ = serial_rx.rx_buffer[serial_rx.read_index];
  71. size--;
  72. /* move to next position */
  73. serial_rx.read_index ++;
  74. if (serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
  75. serial_rx.read_index = 0;
  76. }
  77. else
  78. {
  79. /* set error code */
  80. err_code = -RT_EEMPTY;
  81. /* enable interrupt */
  82. rt_hw_interrupt_enable(level);
  83. break;
  84. }
  85. /* enable interrupt */
  86. rt_hw_interrupt_enable(level);
  87. }
  88. }
  89. /* set error code */
  90. rt_set_errno(err_code);
  91. return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
  92. }
  93. static rt_size_t rt_serial_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
  94. {
  95. #if _DEBUG_SERIAL==1
  96. printf("in rt_serial_write()\n");
  97. #endif
  98. #if 0
  99. if (fp == NULL)
  100. fp = fopen("log.txt", "wb+");
  101. if (fp != NULL)
  102. fwrite(buffer, size, 1, fp);
  103. #endif
  104. printf("%s", (char *)buffer);
  105. fflush(stdout);
  106. return size;
  107. }
  108. static rt_err_t rt_serial_control(rt_device_t dev, rt_uint8_t cmd, void *args)
  109. {
  110. RT_ASSERT(dev != RT_NULL);
  111. switch (cmd)
  112. {
  113. case RT_DEVICE_CTRL_SUSPEND:
  114. /* suspend device */
  115. dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
  116. break;
  117. case RT_DEVICE_CTRL_RESUME:
  118. /* resume device */
  119. dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
  120. break;
  121. }
  122. return RT_EOK;
  123. }
  124. /*
  125. * serial register
  126. */
  127. static rt_err_t rt_hw_serial_register(rt_device_t device, const char *name, rt_uint32_t flag)
  128. {
  129. RT_ASSERT(device != RT_NULL);
  130. #if _DEBUG_SERIAL==1
  131. printf("in rt_serial_register()\n");
  132. #endif
  133. device->type = RT_Device_Class_Char;
  134. device->rx_indicate = RT_NULL;
  135. device->tx_complete = RT_NULL;
  136. device->init = rt_serial_init;
  137. device->open = rt_serial_open;
  138. device->close = rt_serial_close;
  139. device->read = rt_serial_read;
  140. device->write = rt_serial_write;
  141. device->control = rt_serial_control;
  142. device->user_data = RT_NULL;
  143. /* register a character device */
  144. return rt_device_register(device, name, (rt_uint16_t)(RT_DEVICE_FLAG_RDWR | flag));
  145. }
  146. rt_err_t rt_hw_serial_init(void)
  147. {
  148. return rt_hw_serial_register(&serial_device, RT_CONSOLE_DEVICE_NAME,
  149. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM);
  150. }