hpm_jpeg_drv.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. /*
  2. * Copyright (c) 2021 hpmicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_JPEG_DRV_H
  8. #define HPM_JPEG_DRV_H
  9. #include "hpm_common.h"
  10. #include "hpm_jpeg_regs.h"
  11. /**
  12. * @brief Jpeg driver APIs
  13. * @defgroup Jpeg_interface JPEG driver APIs
  14. * @ingroup io_interfaces
  15. * @{
  16. */
  17. /**
  18. * @brief Define events of the jpeg module
  19. */
  20. #define JPEG_EVENT_BUSY JPEG_STAT_BUSY_MASK
  21. #define JPEG_EVENT_OUT_DMA_FINISH JPEG_STAT_OUT_DMA_TRANSFER_DONE_MASK
  22. #define JPEG_EVENT_IN_DMA_FINISH JPEG_STAT_IN_DMA_TRANSFER_DONE_MASK
  23. #define JPEG_EVENT_ERROR (JPEG_STAT_RESTART_MARKER_ERROR_MASK | (0xF << 7))
  24. /**
  25. * @brief byte order in a word
  26. */
  27. #define JPEG_BYTE_ORDER_3210 (0U) /**< CAN Receive event *//* no order change, {A3, A2, A1, A0} */
  28. #define JPEG_BYTE_ORDER_2301 (1U) /**< order change, {A2, A3, A0, A1} */
  29. #define JPEG_BYTE_ORDER_1032 (2U) /**< order change, {A1, A0, A2, A3} */
  30. #define JPEG_BYTE_ORDER_0123 (3U) /**< order change, {A0, A1, A2, A3} */
  31. /**
  32. * @brief jpeg pixel conversion format
  33. */
  34. #define JPEG_PIXEL_FORMAT_AS_ORIGIN (0U)
  35. #define JPEG_PIXEL_FORMAT_ARGB8888 (1U)
  36. #define JPEG_PIXEL_FORMAT_RGB565 (2U)
  37. #define JPEG_PIXEL_FORMAT_YUV422H1P (3U)
  38. /**
  39. * @brief jpeg data format definition
  40. */
  41. #define JPEG_SUPPORTED_FORMAT_420 (0U) /**< hy=2, vy=2, hc=1, vc=1 */
  42. #define JPEG_SUPPORTED_FORMAT_422H (1U) /**< hy=2, vy=1, hc=1, vc=1 */
  43. #define JPEG_SUPPORTED_FORMAT_422V (2U) /**< hy=1, vy=2, hc=1, vc=1 */
  44. #define JPEG_SUPPORTED_FORMAT_444 (3U) /**< hy=1, vy=1, hc=1, vc=1 */
  45. #define JPEG_SUPPORTED_FORMAT_400 (4U) /**< hy=2, vy=2, hc=0, vc=0 */
  46. /**
  47. * @brief data format definition
  48. */
  49. typedef struct {
  50. uint8_t hy:2; /**< bit: 1-0 --> horizontal y component */
  51. uint8_t vy:2; /**< bit: 3-2 --> Vertical y component */
  52. uint8_t hc:2; /**< bit: bit: 5-4 --> horizontal c component */
  53. uint8_t vc:2; /**< bit: 7-6 --> Vertical c component */
  54. } jpeg_sampling_t;
  55. /**
  56. * @brief jpeg encoding and decoding configuration parameters
  57. * @arg bit: 31-27 --> name
  58. * @arg bit: 26-23 --> WIDTH IN BYTE
  59. * @arg bit: 22-3 --> ELEMENT COUNT
  60. * @arg bit: 2-0 --> TYPE
  61. */
  62. typedef enum jpeg_table {
  63. jpeg_table_qmem = 0x201002, /**< definition Decoder and Encoder Q. values */
  64. jpeg_table_huffenc = 0x201803, /**< definition Huffman Encoder table */
  65. jpeg_table_huffmin = 0x400104, /**< definition Huffman min values */
  66. jpeg_table_huffbase = 0x200405, /**< definition Huffman BASE mem values */
  67. jpeg_table_huffsymb = 0x101506, /**< definition Huffman SYMB mem values */
  68. } jpeg_table_t;
  69. /**
  70. * @brief jpeg encoding and decoding configuration parameters
  71. */
  72. typedef struct {
  73. uint8_t jpeg_format; /**< supported jpeg format */
  74. uint8_t in_pixel_format; /**< input pixel format */
  75. uint8_t out_pixel_format; /**< output pixel format */
  76. uint8_t byte_order; /**< byte order */
  77. bool enable_csc; /**< enable color space covertion */
  78. bool enable_ycbcr; /**< enable YCbCr or YUV */
  79. uint16_t width_in_pixel; /**< Image width register*/
  80. uint16_t height_in_pixel; /**< Image height register*/
  81. uint32_t in_buffer; /**< input buffer */
  82. uint32_t out_buffer; /**< output buffer */
  83. } jpeg_job_config_t;
  84. #ifdef __cplusplus
  85. extern "C" {
  86. #endif
  87. /**
  88. * @brief clear jpeg cfg Register
  89. *
  90. * @param [in] ptr JPEG base address, HPM_JPEG
  91. */
  92. static inline void jpeg_clear_cfg(JPEG_Type *ptr)
  93. {
  94. ptr->CFG = 0;
  95. }
  96. /**
  97. * @brief jpeg function disable
  98. *
  99. * @param [in] ptr JPEG base address, HPM_JPEG
  100. */
  101. static inline void jpeg_disable(JPEG_Type *ptr)
  102. {
  103. ptr->CFG &= ~JPEG_CFG_JPEG_EN_MASK;
  104. }
  105. /**
  106. * @brief jpeg function enable
  107. *
  108. * @param [in] ptr JPEG base address, HPM_JPEG
  109. */
  110. static inline void jpeg_enable(JPEG_Type *ptr)
  111. {
  112. ptr->CFG |= JPEG_CFG_JPEG_EN_MASK;
  113. }
  114. /**
  115. * @brief stop a encoder/decoder conversion
  116. *
  117. * @param [in] ptr JPEG base address, HPM_JPEG
  118. */
  119. static inline void jpeg_stop(JPEG_Type *ptr)
  120. {
  121. ptr->CFG &= ~JPEG_CFG_START_MASK;
  122. }
  123. /**
  124. * @brief start a new encoder/decoder conversion
  125. *
  126. * @param [in] ptr JPEG base address, HPM_JPEG
  127. */
  128. static inline void jpeg_start(JPEG_Type *ptr)
  129. {
  130. ptr->CFG |= JPEG_CFG_START_MASK;
  131. }
  132. /**
  133. * @brief obtain jpeg Status Register
  134. *
  135. * @param [in] ptr JPEG base address, HPM_JPEG
  136. * @retval jpeg register's status
  137. */
  138. static inline uint32_t jpeg_get_status(JPEG_Type *ptr)
  139. {
  140. return ptr->STAT;
  141. }
  142. /**
  143. * @brief clear jpeg Status Register
  144. *
  145. * @param [in] ptr JPEG base address, HPM_JPEG
  146. * @param [in] mask
  147. * @arg JPEG_EVENT_BUSY: the module is busy doing conversion and data transfer
  148. * @arg JPEG_EVENT_OUT_DMA_FINISH: OutDMA process done
  149. * @arg JPEG_EVENT_IN_DMA_FINISH: InDMA process done
  150. * @arg JPEG_EVENT_ERROR: the axi err
  151. *
  152. */
  153. static inline void jpeg_clear_status(JPEG_Type *ptr, uint32_t mask)
  154. {
  155. ptr->STAT |= mask;
  156. }
  157. /**
  158. * @brief Out DMA Bytes Counter
  159. *
  160. * @param [in] ptr JPEG base address, HPM_JPEG
  161. * @retval The out DMA counter
  162. */
  163. static inline uint32_t jpeg_get_encoded_length(JPEG_Type *ptr)
  164. {
  165. return JPEG_OUTDMACNT_VAL_GET(ptr->OUTDMACNT);
  166. }
  167. /**
  168. * @brief jpeg Software Reset
  169. *
  170. * @param [in] ptr JPEG base address, HPM_JPEG
  171. */
  172. static inline void jpeg_software_reset(JPEG_Type *ptr)
  173. {
  174. ptr->CFG |= JPEG_CFG_JPEG_SFTRST_MASK;
  175. ptr->CFG &= ~JPEG_CFG_JPEG_SFTRST_MASK;
  176. }
  177. /**
  178. * @brief stop a encoder/decoder conversion and Software Reset
  179. *
  180. * @param [in] ptr JPEG base address, HPM_JPEG
  181. */
  182. void jpeg_reset(JPEG_Type *ptr);
  183. /**
  184. * @brief jpeg enable interrupt
  185. *
  186. * @param [in] ptr JPEG base address, HPM_JPEG
  187. * @param [in] mask
  188. * @arg JPEG_EVENT_IN_DMA_FINISH: In DMA Done enable
  189. * @arg JPEG_EVENT_OUT_DMA_FINISH: interrupt enable for all interrupt sources of In DMA module
  190. * @arg JPEG_EVENT_ERROR: The jpg endec restart error interrupt enable
  191. *
  192. */
  193. void jpeg_enable_irq(JPEG_Type *ptr, uint32_t mask);
  194. /**
  195. * @brief jpeg disable interrupt
  196. *
  197. * @param [in] ptr JPEG base address, HPM_JPEG
  198. * @param [in] mask
  199. * @arg JPEG_EVENT_IN_DMA_FINISH: In DMA Done disable
  200. * @arg JPEG_EVENT_OUT_DMA_FINISH: interrupt disable for all interrupt sources of In DMA module
  201. * @arg JPEG_EVENT_ERROR: The jpg endec restart error interrupt disable
  202. *
  203. */
  204. void jpeg_disable_irq(JPEG_Type *ptr, uint32_t mask);
  205. /**
  206. * @brief stop a encoder/decoder conversion and Software Reset
  207. *
  208. * @param [in] ptr JPEG base address, HPM_JPEG
  209. */
  210. void jpeg_init(JPEG_Type *ptr);
  211. /**
  212. * @brief fill tables for jpeg controller
  213. *
  214. * @param [in] ptr JPEG base address, HPM_JPEG
  215. * @param [in] table
  216. * @arg jpeg_table_qmem: file describe for Decoder and Encoder Q. values
  217. * @arg jpeg_table_huffenc: file describe for Huffman Encoder table
  218. * @arg jpeg_table_huffmin: file describe for Huffman min values
  219. * @arg jpeg_table_huffbase: file describe for Huffman BASE mem values
  220. * @arg jpeg_table_huffsymb: file describe for Huffman SYMB mem values
  221. * @param [in] data
  222. * @arg huffenc: data for Huffman Encoder table
  223. * @arg huffmin: data for Huffman min values
  224. * @arg huffbase: data for Huffman BASE mem values
  225. * @arg huffsymb: data for Huffman SYMB mem values
  226. * @arg qetable: data for Encoder Q. values
  227. * @arg qdtable: data for Decoder Q. values
  228. * @param [in] count data length
  229. * @retval fill tables's status
  230. *
  231. */
  232. hpm_stat_t jpeg_fill_table(JPEG_Type *ptr, jpeg_table_t table, uint8_t *data, uint32_t count);
  233. /**
  234. * @brief it will start decoding, and the process status needs to be checked by
  235. * querying JPEG_EVENT
  236. *
  237. * @param [in] ptr JPEG base address, HPM_JPEG
  238. * @param [in] config config A pointer to the configuration struct of "jpeg_job_config_t"
  239. * @param [in] length Decoded data length
  240. * @retval jpeg decoding's status
  241. *
  242. */
  243. hpm_stat_t jpeg_start_decode(JPEG_Type *ptr, jpeg_job_config_t *config, uint32_t length);
  244. /**
  245. * @brief * it will start encoding, and the process status needs to be checked by
  246. * querying JPEG_EVENT
  247. *
  248. * @param [in] ptr JPEG base address, HPM_JPEG
  249. * @param [in] config config A pointer to the configuration struct of "jpeg_job_config_t"
  250. * @retval jpeg encoding's status
  251. *
  252. */
  253. hpm_stat_t jpeg_start_encode(JPEG_Type *ptr, jpeg_job_config_t *config);
  254. /**
  255. * @}
  256. *
  257. */
  258. #ifdef __cplusplus
  259. }
  260. #endif
  261. #endif /* HPM_JPEG_DRV_H */