isp_common.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include <string.h>
  2. #include "isp_common.h"
  3. #include "dsp_ps_debug.h"
  4. int32_t ispc_base_info_update(Sisp_control_info *base_info, uint16_t hor_res,
  5. uint16_t ver_res, csi_dsp_img_fmt_e raw_type,
  6. uint16_t line_value, uint64_t buffer_addr,
  7. uint32_t buffer_size,uint16_t line_size) {
  8. // uint16_t line_size = ispc_get_line_size(raw_type,
  9. // hor_res); // size_per_px * hor_res;
  10. if ((hor_res > MAX_HORIZONTAL) || (ver_res > MAX_VERTICAL) ||
  11. (line_value > LINES_MASK) || ((buffer_size % line_size) != 0) ||
  12. (buffer_addr == 0)) {
  13. return EHW_ERROR_PARMA_INVALID;
  14. }
  15. /*should check if there is issue if not the last N
  16. line cross the buffer bottom*/
  17. uint16_t fragment_line = ver_res % line_value;
  18. base_info->line_num_per_entry = line_value;
  19. base_info->line_num_per_frame = ver_res;
  20. base_info->line_num_in_last_entry =
  21. fragment_line == 0 ? line_value : fragment_line;
  22. base_info->size_per_line = line_size;
  23. base_info->line_num_per_buffer = buffer_size / line_size;
  24. base_info->frame_buffer_addr = buffer_addr;
  25. base_info->format = raw_type;
  26. base_info->pixel_per_line = hor_res;
  27. return EHW_OK;
  28. }
  29. uint32_t ispc_check_exeptional(Sisp_handler *handler) {
  30. uint8_t ping_pong_side = handler->customer_ping_pong_flag;
  31. Sfifo *fifo = &handler->fifo[ping_pong_side];
  32. if (is_overflow_fifo(fifo)) {
  33. // printf("Err ISP input is ovetflow");
  34. return EHW_ERROR_OVER_FLOW;
  35. }
  36. return EHW_OK;
  37. }
  38. Eisp_bool ispc_get_entry_to_pop(const Sisp_handler *handler,const uint16_t line_num,Sisp_buffer buffer_list[MAX_BUFFER_BLOCK]){
  39. uint8_t ping_pong_side = handler->customer_ping_pong_flag;
  40. const Sisp_control_info *info = &handler->info[ping_pong_side];
  41. const Sfifo *fifo = &handler->fifo[ping_pong_side];
  42. uint16_t start_offset;
  43. // if (is_overflow_fifo(fifo)) {
  44. //// printf("Err ISP input is overflow");
  45. // return EISP_BOOL_FASE;
  46. // }
  47. if (is_empty_fifo(fifo)) {
  48. return EISP_BOOL_FASE;
  49. }
  50. if(line_num>fifo->depth|| line_num >get_element_num_fifo(fifo)){
  51. return EISP_BOOL_FASE;
  52. }
  53. start_offset= get_head_fifo(fifo);
  54. if(get_depth_fifo(fifo)>=start_offset+line_num)
  55. {
  56. buffer_list[0].line_num = line_num;
  57. buffer_list[0].line_size = info->size_per_line;
  58. buffer_list[0].start_addr = info->frame_buffer_addr + get_head_fifo(fifo) * info->size_per_line;
  59. buffer_list[0].size = buffer_list[0].line_num*info->size_per_line;
  60. buffer_list[0].fmt = info->format;
  61. buffer_list[0].width = info->pixel_per_line;
  62. buffer_list[1].line_num =0;
  63. buffer_list[1].start_addr = 0;
  64. buffer_list[1].size = 0;
  65. }
  66. else
  67. {
  68. buffer_list[0].line_num = get_depth_fifo(fifo) - start_offset;
  69. buffer_list[0].start_addr = info->frame_buffer_addr + get_head_fifo(fifo) * info->size_per_line;
  70. buffer_list[0].size = buffer_list[0].line_num*info->size_per_line;
  71. buffer_list[0].line_size = info->size_per_line;
  72. buffer_list[0].fmt = info->format;
  73. buffer_list[0].width = info->pixel_per_line;
  74. buffer_list[1].line_num = line_num - buffer_list[0].line_num;
  75. buffer_list[1].start_addr = info->frame_buffer_addr;
  76. buffer_list[1].size = buffer_list[1].line_num *info->size_per_line;
  77. buffer_list[1].line_size = info->size_per_line;
  78. buffer_list[1].fmt = info->format;
  79. buffer_list[1].width = info->pixel_per_line;
  80. }
  81. return EISP_BOOL_TRUE;
  82. }
  83. Eisp_bool ispc_pop_new_line(Sisp_handler *handler,uint16_t line_num) {
  84. uint8_t ping_pong_side = handler->customer_ping_pong_flag;
  85. Sisp_control_info *info = &handler->info[ping_pong_side];
  86. Sfifo *fifo = &handler->fifo[ping_pong_side];
  87. if (handler->status != EHW_OK) {
  88. return EISP_BOOL_FASE;
  89. }
  90. if (is_empty_fifo(fifo)) {
  91. // handler->status=EHW_INPUT_EMPRY;
  92. return EISP_BOOL_FASE;
  93. }
  94. if (pop_fifo(fifo,line_num) < 0) {
  95. handler->status=EHW_ERROR_POP_FAIL;
  96. return EISP_BOOL_FASE;
  97. }
  98. if(get_head_index_fifo(fifo)>info->line_num_per_frame)
  99. {
  100. handler->status=EHW_ERROR_POP_FAIL;
  101. return EISP_BOOL_FASE;
  102. }
  103. ping_pong_side = ping_pong_side ^ 0x01;
  104. if (is_last_entry_pop_fifo(fifo)) {
  105. handler->customer_ping_pong_flag = ping_pong_side;
  106. if (handler->customer_ping_pong_flag !=
  107. handler->produce_ping_pong_flag) {
  108. ps_err("ERR pingpong flag mismatch\n");
  109. handler->status=EHW_ERROR_FRAME_SWITCH_FAIL;
  110. return EISP_BOOL_FASE;
  111. }
  112. }
  113. return EISP_BOOL_TRUE;
  114. }
  115. Eisp_bool ispc_push_new_line(Sisp_handler *handler,uint16_t element) {
  116. int16_t base_index;
  117. uint8_t ping_pong_side = handler->produce_ping_pong_flag;
  118. Sisp_control_info *info = &handler->info[ping_pong_side];
  119. Sfifo *fifo = &handler->fifo[ping_pong_side];
  120. uint16_t offset=0;
  121. if (handler->status !=EHW_OK) {
  122. return EISP_BOOL_FASE;
  123. }
  124. if(element<info->line_num_per_entry ||element>info->line_num_per_entry*2 )
  125. {
  126. if(!is_last_entry_to_push_fifo(fifo,info->line_num_per_entry))
  127. {
  128. handler->status=EHW_ERROR_PARMA_INVALID;
  129. ps_err("new entry size:%d not meet expect\n",element);
  130. return EISP_BOOL_FASE;
  131. }
  132. }
  133. if((handler->produce_ping_pong_flag != handler->customer_ping_pong_flag) &&
  134. (handler->info[ping_pong_side].frame_buffer_addr==handler->info[handler->customer_ping_pong_flag].frame_buffer_addr))
  135. {
  136. offset = get_element_num_fifo(&handler->fifo[handler->customer_ping_pong_flag]);
  137. }
  138. if (push_fifo(fifo,info->line_num_per_entry ,offset) == EISP_BOOL_FASE) {
  139. handler->status=EHW_ERROR_OVER_FLOW;
  140. ps_err("push fail\n");
  141. return EISP_BOOL_FASE;
  142. }
  143. if (is_last_entry_push_fifo(fifo)) {
  144. if (ispc_switch_buffer(info, &handler->base)) {
  145. base_index = 0;
  146. } else {
  147. base_index =
  148. (fifo->offset + info->line_num_used_per_frame) % fifo->depth;
  149. }
  150. ping_pong_side = ping_pong_side ^ 0x1;
  151. memcpy((void *)&handler->info[ping_pong_side], (void *)&handler->base,
  152. sizeof(Sisp_control_info));
  153. handler->interact_counter = 0;
  154. handler->produce_ping_pong_flag = ping_pong_side;
  155. reset_fifo(&handler->fifo[ping_pong_side],
  156. handler->base.line_num_per_buffer,base_index,handler->base.line_num_per_frame);
  157. }
  158. return EISP_BOOL_TRUE;
  159. }
  160. Eisp_bool ispc_switch_buffer(Sisp_control_info *isp_info,
  161. Sisp_control_info *base) {
  162. return (isp_info->frame_buffer_addr != base->frame_buffer_addr) ||
  163. (isp_info->line_num_per_frame != base->line_num_per_frame) ||
  164. (isp_info->line_num_in_last_entry != base->line_num_in_last_entry);
  165. }
  166. int16_t ispc_get_pushed_line_num(Sisp_handler *handler)
  167. {
  168. uint8_t ping_pong_side = handler->produce_ping_pong_flag;
  169. Sfifo *fifo = &(handler->fifo[ping_pong_side]);
  170. return get_tail_index_fifo(fifo);
  171. }
  172. int16_t ispc_get_poped_line_num(Sisp_handler *handler)
  173. {
  174. uint8_t ping_pong_side = handler->customer_ping_pong_flag;
  175. Sfifo *fifo = &(handler->fifo[ping_pong_side]);
  176. return get_head_index_fifo(fifo);
  177. }
  178. //int32_t ispc_get_line_size(csi_dsp_img_fmt_e data_format,
  179. // uint16_t pexs_per_hor) {
  180. // int32_t size = 0;
  181. // switch (data_format) {
  182. // case EISP_RAW12_FORMAT_UNALGIN:
  183. // size = (pexs_per_hor * 12 + 7) / 8;
  184. // break;
  185. // case EISP_RAW12_FORMAT_ALGIN0:
  186. // size = (pexs_per_hor * 12 + 7) / 8;
  187. // break;
  188. // case EISP_RAW12_FORMAT_ALGIN1:
  189. // size = pexs_per_hor * 16 / 8;
  190. // break;
  191. // case EISP_RAW8_FORMAT :
  192. // size = pexs_per_hor ;
  193. // break;
  194. // default:
  195. // ps_err("ERR invalid data format\n");
  196. // return -1;
  197. // }
  198. // return size;
  199. //}