app_drv_fifo.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : app_drv_fifo.c
  3. * Author : WCH
  4. * Version : V1.1
  5. * Date : 2022/01/19
  6. * Description :
  7. *********************************************************************************
  8. * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
  9. * Attention: This software (modified or not) and binary are used for
  10. * microcontroller manufactured by Nanjing Qinheng Microelectronics.
  11. *******************************************************************************/
  12. #include "app_drv_fifo.h"
  13. static __inline uint16_t fifo_length(app_drv_fifo_t *fifo)
  14. {
  15. uint16_t tmp = fifo->begin;
  16. return fifo->end - tmp;
  17. }
  18. uint16_t app_drv_fifo_length(app_drv_fifo_t *fifo)
  19. {
  20. return fifo_length(fifo);
  21. }
  22. app_drv_fifo_result_t
  23. app_drv_fifo_init(app_drv_fifo_t *fifo, uint8_t *buffer, uint16_t buffer_size)
  24. {
  25. if(buffer_size == 0)
  26. {
  27. return APP_DRV_FIFO_RESULT_LENGTH_ERROR;
  28. }
  29. if(0 != ((buffer_size) & (buffer_size - 1)))
  30. {
  31. return APP_DRV_FIFO_RESULT_LENGTH_ERROR;
  32. }
  33. fifo->begin = 0;
  34. fifo->end = 0;
  35. fifo->data = buffer;
  36. fifo->size = buffer_size;
  37. fifo->size_mask = buffer_size - 1;
  38. return APP_DRV_FIFO_RESULT_SUCCESS;
  39. }
  40. void app_drv_fifo_push(app_drv_fifo_t *fifo, uint8_t data)
  41. {
  42. fifo->data[fifo->end & fifo->size_mask] = data;
  43. fifo->end++;
  44. }
  45. uint8_t app_drv_fifo_pop(app_drv_fifo_t *fifo)
  46. {
  47. uint8_t data = fifo->data[fifo->begin & fifo->size_mask];
  48. fifo->begin++;
  49. return data;
  50. }
  51. void app_drv_fifo_flush(app_drv_fifo_t *fifo)
  52. {
  53. fifo->begin = 0;
  54. fifo->end = 0;
  55. }
  56. bool app_drv_fifo_is_empty(app_drv_fifo_t *fifo)
  57. {
  58. return (fifo->begin == fifo->end);
  59. }
  60. bool app_drv_fifo_is_full(app_drv_fifo_t *fifo)
  61. {
  62. return (fifo_length(fifo) == fifo->size);
  63. }
  64. app_drv_fifo_result_t
  65. app_drv_fifo_write(app_drv_fifo_t *fifo, uint8_t *data, uint16_t *p_write_length)
  66. {
  67. if(fifo == NULL)
  68. {
  69. return APP_DRV_FIFO_RESULT_NULL;
  70. }
  71. if(p_write_length == NULL)
  72. {
  73. return APP_DRV_FIFO_RESULT_NULL;
  74. }
  75. //PRINT("fifo_length = %d\r\n",fifo_length(fifo));
  76. const uint16_t available_count = fifo->size - fifo_length(fifo);
  77. const uint16_t requested_len = (*p_write_length);
  78. uint16_t index = 0;
  79. uint16_t write_size = MIN(requested_len, available_count);
  80. //PRINT("available_count %d\r\n",available_count);
  81. // Check if the FIFO is FULL.
  82. if(available_count == 0)
  83. {
  84. return APP_DRV_FIFO_RESULT_NOT_MEM;
  85. }
  86. // Check if application has requested only the size.
  87. if(data == NULL)
  88. {
  89. return APP_DRV_FIFO_RESULT_SUCCESS;
  90. }
  91. for(index = 0; index < write_size; index++)
  92. {
  93. //push
  94. fifo->data[fifo->end & fifo->size_mask] = data[index];
  95. fifo->end++;
  96. }
  97. (*p_write_length) = write_size;
  98. return APP_DRV_FIFO_RESULT_SUCCESS;
  99. }
  100. app_drv_fifo_result_t
  101. app_drv_fifo_write_from_same_addr(app_drv_fifo_t *fifo, uint8_t *data, uint16_t write_length)
  102. {
  103. if(fifo == NULL)
  104. {
  105. return APP_DRV_FIFO_RESULT_NULL;
  106. }
  107. const uint16_t available_count = fifo->size_mask - fifo_length(fifo) + 1;
  108. const uint16_t requested_len = (write_length);
  109. uint16_t index = 0;
  110. uint16_t write_size = MIN(requested_len, available_count);
  111. // Check if the FIFO is FULL.
  112. if(available_count == 0)
  113. {
  114. return APP_DRV_FIFO_RESULT_NOT_MEM;
  115. }
  116. for(index = 0; index < write_size; index++)
  117. {
  118. //push
  119. fifo->data[fifo->end & fifo->size_mask] = data[0];
  120. fifo->end++;
  121. }
  122. return APP_DRV_FIFO_RESULT_SUCCESS;
  123. }
  124. app_drv_fifo_result_t
  125. app_drv_fifo_read(app_drv_fifo_t *fifo, uint8_t *data, uint16_t *p_read_length)
  126. {
  127. if(fifo == NULL)
  128. {
  129. return APP_DRV_FIFO_RESULT_NULL;
  130. }
  131. if(p_read_length == NULL)
  132. {
  133. return APP_DRV_FIFO_RESULT_NULL;
  134. }
  135. const uint16_t byte_count = fifo_length(fifo);
  136. const uint16_t requested_len = (*p_read_length);
  137. uint32_t index = 0;
  138. uint32_t read_size = MIN(requested_len, byte_count);
  139. if(byte_count == 0)
  140. {
  141. return APP_DRV_FIFO_RESULT_NOT_FOUND;
  142. }
  143. //PRINT("read size = %d,byte_count = %d\r\n",read_size,byte_count);
  144. for(index = 0; index < read_size; index++)
  145. {
  146. //pop
  147. data[index] = fifo->data[fifo->begin & fifo->size_mask];
  148. fifo->begin++;
  149. }
  150. (*p_read_length) = read_size;
  151. return APP_DRV_FIFO_RESULT_SUCCESS;
  152. }
  153. app_drv_fifo_result_t
  154. app_drv_fifo_read_to_same_addr(app_drv_fifo_t *fifo, uint8_t *data, uint16_t read_length)
  155. {
  156. if(fifo == NULL)
  157. {
  158. return APP_DRV_FIFO_RESULT_NULL;
  159. }
  160. const uint16_t byte_count = fifo_length(fifo);
  161. const uint16_t requested_len = (read_length);
  162. uint32_t index = 0;
  163. uint32_t read_size = MIN(requested_len, byte_count);
  164. for(index = 0; index < read_size; index++)
  165. {
  166. //pop
  167. data[0] = fifo->data[fifo->begin & fifo->size_mask];
  168. fifo->begin++;
  169. }
  170. return APP_DRV_FIFO_RESULT_SUCCESS;
  171. }