serial.c 4.3 KB

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