rtdevice.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * File : rtdevice.h
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2012, RT-Thread Development 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. * 2012-01-08 bernard first version.
  13. */
  14. #ifndef __RT_DEVICE_H__
  15. #define __RT_DEVICE_H__
  16. #include <rtthread.h>
  17. #define RT_DEVICE(device) ((rt_device_t)device)
  18. /* completion flag */
  19. struct rt_completion
  20. {
  21. rt_uint32_t flag;
  22. /* suspended list */
  23. rt_list_t suspended_list;
  24. };
  25. #define RT_RINGBUFFER_SIZE(rb) ((rb)->write_index - (rb)->read_index)
  26. #define RT_RINGBUFFER_EMPTY(rb) ((rb)->buffer_size - RT_RINGBUFFER_SIZE(rb))
  27. /* ring buffer */
  28. struct rt_ringbuffer
  29. {
  30. rt_uint16_t read_index, write_index;
  31. rt_uint8_t *buffer_ptr;
  32. rt_uint16_t buffer_size;
  33. };
  34. /* pipe device */
  35. #define PIPE_DEVICE(device) ((struct rt_pipe_device*)(device))
  36. struct rt_pipe_device
  37. {
  38. struct rt_device parent;
  39. /* ring buffer in pipe device */
  40. struct rt_ringbuffer ringbuffer;
  41. /* suspended list */
  42. rt_list_t suspended_read_list;
  43. rt_list_t suspended_write_list;
  44. };
  45. #define RT_DATAQUEUE_EVENT_UNKNOWN 0x00
  46. #define RT_DATAQUEUE_EVENT_POP 0x01
  47. #define RT_DATAQUEUE_EVENT_PUSH 0x02
  48. #define RT_DATAQUEUE_EVENT_LWM 0x03
  49. struct rt_data_item;
  50. #define RT_DATAQUEUE_SIZE(dq) ((dq)->put_index - (dq)->get_index)
  51. #define RT_DATAQUEUE_EMPTY(dq) ((dq)->size - RT_DATAQUEUE_SIZE(dq))
  52. /* data queue implementation */
  53. struct rt_data_queue
  54. {
  55. rt_uint16_t size;
  56. rt_uint16_t lwm;
  57. rt_bool_t waiting_lwm;
  58. rt_uint16_t get_index;
  59. rt_uint16_t put_index;
  60. struct rt_data_item *queue;
  61. rt_list_t suspended_push_list;
  62. rt_list_t suspended_pop_list;
  63. /* event notify */
  64. void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event);
  65. };
  66. /**
  67. * Completion
  68. */
  69. void rt_completion_init(struct rt_completion *completion);
  70. rt_err_t rt_completion_wait(struct rt_completion *completion,
  71. rt_int32_t timeout);
  72. void rt_completion_done(struct rt_completion *completion);
  73. /**
  74. * RingBuffer for DeviceDriver
  75. *
  76. * Please note that the ring buffer implementation of RT-Thread
  77. * has no thread wait or resume feature.
  78. */
  79. void rt_ringbuffer_init(struct rt_ringbuffer *rb,
  80. rt_uint8_t *pool,
  81. rt_uint16_t size);
  82. rt_size_t rt_ringbuffer_put(struct rt_ringbuffer *rb,
  83. const rt_uint8_t *ptr,
  84. rt_uint16_t length);
  85. rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer *rb,
  86. const rt_uint8_t ch);
  87. rt_size_t rt_ringbuffer_get(struct rt_ringbuffer *rb,
  88. rt_uint8_t *ptr,
  89. rt_uint16_t length);
  90. rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer *rb, rt_uint8_t *ch);
  91. rt_inline rt_uint16_t rt_ringbuffer_get_size(struct rt_ringbuffer *rb)
  92. {
  93. RT_ASSERT(rb != RT_NULL);
  94. return rb->buffer_size;
  95. }
  96. /**
  97. * Pipe Device
  98. */
  99. rt_err_t rt_pipe_create(const char *name, rt_size_t size);
  100. void rt_pipe_destroy(struct rt_pipe_device *pipe);
  101. /**
  102. * DataQueue for DeviceDriver
  103. */
  104. rt_err_t rt_data_queue_init(struct rt_data_queue *queue,
  105. rt_uint16_t size,
  106. rt_uint16_t lwm,
  107. void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event));
  108. rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
  109. const void *data_ptr,
  110. rt_size_t data_size,
  111. rt_int32_t timeout);
  112. rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
  113. const void **data_ptr,
  114. rt_size_t *size,
  115. rt_int32_t timeout);
  116. rt_err_t rt_data_queue_peak(struct rt_data_queue *queue,
  117. const void **data_ptr,
  118. rt_size_t *size);
  119. void rt_data_queue_reset(struct rt_data_queue *queue);
  120. #ifdef RT_USING_RTC
  121. #include "drivers/rtc.h"
  122. #ifdef RT_USING_ALARM
  123. #include "drivers/alarm.h"
  124. #endif
  125. #endif /* RT_USING_RTC */
  126. #ifdef RT_USING_SPI
  127. #include "drivers/spi.h"
  128. #endif /* RT_USING_SPI */
  129. #ifdef RT_USING_MTD_NOR
  130. #include "drivers/mtd_nor.h"
  131. #endif /* RT_USING_MTD_NOR */
  132. #ifdef RT_USING_MTD_NAND
  133. #include "drivers/mtd_nand.h"
  134. #endif /* RT_USING_MTD_NAND */
  135. #ifdef RT_USING_USB_DEVICE
  136. #include "drivers/usb_device.h"
  137. #endif /* RT_USING_USB_DEVICE */
  138. #ifdef RT_USING_USB_HOST
  139. #include "drivers/usb_host.h"
  140. #endif /* RT_USING_USB_HOST */
  141. #ifdef RT_USING_SERIAL
  142. #include "drivers/serial.h"
  143. #endif /* RT_USING_SERIAL */
  144. #ifdef RT_USING_I2C
  145. #include "drivers/i2c.h"
  146. #include "drivers/i2c_dev.h"
  147. #ifdef RT_USING_I2C_BITOPS
  148. #include "drivers/i2c-bit-ops.h"
  149. #endif /* RT_USING_I2C_BITOPS */
  150. #endif /* RT_USING_I2C */
  151. #ifdef RT_USING_SDIO
  152. #include "drivers/mmcsd_core.h"
  153. #include "drivers/sd.h"
  154. #include "drivers/sdio.h"
  155. #endif
  156. #endif /* __RT_DEVICE_H__ */