serial.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. ******************************************************************************
  3. * By : parai
  4. * email:parai@foxmail.com
  5. * 这并不是一个真的串口设备,只是为了能够让内核打印信息而创建
  6. ******************************************************************************
  7. */
  8. #include "rtthread.h"
  9. //#ifdef RT_USING_SERIAL
  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. /*@{*/
  16. /* RT-Thread Device Interface */
  17. /**
  18. * This function initializes serial
  19. */
  20. static rt_err_t rt_serial_init (rt_device_t dev)
  21. {
  22. if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
  23. {
  24. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  25. {
  26. rt_memset(serial_rx.rx_buffer, 0,
  27. sizeof(serial_rx.rx_buffer));
  28. serial_rx.read_index = 0;
  29. serial_rx.save_index = 0;
  30. }
  31. dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
  32. }
  33. return RT_EOK;
  34. }
  35. static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag){
  36. #if _DEBUG_SERIAL==1
  37. printf("in rt_serial_open()\n");
  38. #endif
  39. return RT_EOK;
  40. }
  41. static rt_err_t rt_serial_close(rt_device_t dev)
  42. {
  43. #if _DEBUG_SERIAL==1
  44. printf("in rt_serial_close()\n");
  45. #endif
  46. return RT_EOK;
  47. }
  48. static rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  49. {
  50. rt_uint8_t* ptr;
  51. rt_err_t err_code;
  52. #if 1
  53. ptr = buffer;
  54. err_code = RT_EOK;
  55. if (dev->flag & RT_DEVICE_FLAG_INT_RX)
  56. {
  57. /* interrupt mode Rx */
  58. while (size)
  59. {
  60. rt_base_t level;
  61. /* disable interrupt */
  62. level = rt_hw_interrupt_disable();
  63. if (serial_rx.read_index != serial_rx.save_index)
  64. {
  65. /* read a character */
  66. *ptr++ = serial_rx.rx_buffer[serial_rx.read_index];
  67. size--;
  68. /* move to next position */
  69. serial_rx.read_index ++;
  70. if (serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
  71. serial_rx.read_index = 0;
  72. }
  73. else
  74. {
  75. /* set error code */
  76. err_code = -RT_EEMPTY;
  77. /* enable interrupt */
  78. rt_hw_interrupt_enable(level);
  79. break;
  80. }
  81. /* enable interrupt */
  82. rt_hw_interrupt_enable(level);
  83. }
  84. }
  85. /* set error code */
  86. rt_set_errno(err_code);
  87. return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
  88. #endif
  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. printf("%s",(char*)buffer);
  96. return size;
  97. }
  98. static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args)
  99. {
  100. RT_ASSERT(dev != RT_NULL);
  101. switch (cmd){
  102. case RT_DEVICE_CTRL_SUSPEND:
  103. /* suspend device */
  104. dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
  105. break;
  106. case RT_DEVICE_CTRL_RESUME:
  107. /* resume device */
  108. dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
  109. break;
  110. }
  111. return RT_EOK;
  112. }
  113. /*
  114. * serial register
  115. */
  116. static rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag)
  117. {
  118. RT_ASSERT(device != RT_NULL);
  119. #if _DEBUG_SERIAL==1
  120. printf("in rt_serial_register()\n");
  121. #endif
  122. device->type = RT_Device_Class_Char;
  123. device->rx_indicate = RT_NULL;
  124. device->tx_complete = RT_NULL;
  125. device->init = rt_serial_init;
  126. device->open = rt_serial_open;
  127. device->close = rt_serial_close;
  128. device->read = rt_serial_read;
  129. device->write = rt_serial_write;
  130. device->control = rt_serial_control;
  131. device->user_data = RT_NULL;
  132. /* register a character device */
  133. return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
  134. }
  135. rt_err_t rt_hw_serial_init(void)
  136. {
  137. return rt_hw_serial_register(&serial_device,"sci0",
  138. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM);
  139. }
  140. //#endif