123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- /*
- * Copyright (c) 2021 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
- #ifndef HPM_JPEG_DRV_H
- #define HPM_JPEG_DRV_H
- #include "hpm_common.h"
- #include "hpm_jpeg_regs.h"
- /**
- * @brief Jpeg driver APIs
- * @defgroup Jpeg_interface JPEG driver APIs
- * @ingroup io_interfaces
- * @{
- */
- /**
- * @brief Define events of the jpeg module
- */
- #define JPEG_EVENT_BUSY JPEG_STAT_BUSY_MASK
- #define JPEG_EVENT_OUT_DMA_FINISH JPEG_STAT_OUT_DMA_TRANSFER_DONE_MASK
- #define JPEG_EVENT_IN_DMA_FINISH JPEG_STAT_IN_DMA_TRANSFER_DONE_MASK
- #define JPEG_EVENT_ERROR (JPEG_STAT_RESTART_MARKER_ERROR_MASK | (0xF << 7))
- /**
- * @brief byte order in a word
- */
- #define JPEG_BYTE_ORDER_3210 (0U) /**< no order change, {A3, A2, A1, A0} */
- #define JPEG_BYTE_ORDER_2301 (1U) /**< order change, {A2, A3, A0, A1} */
- #define JPEG_BYTE_ORDER_1032 (2U) /**< order change, {A1, A0, A2, A3} */
- #define JPEG_BYTE_ORDER_0123 (3U) /**< order change, {A0, A1, A2, A3} */
- /**
- * @brief jpeg pixel conversion format
- */
- /**
- * @brief jpeg data format definition
- */
- #define JPEG_SUPPORTED_FORMAT_420 (0U) /**< hy=2, vy=2, hc=1, vc=1 */
- #define JPEG_SUPPORTED_FORMAT_422H (1U) /**< hy=2, vy=1, hc=1, vc=1 */
- #define JPEG_SUPPORTED_FORMAT_422V (2U) /**< hy=1, vy=2, hc=1, vc=1 */
- #define JPEG_SUPPORTED_FORMAT_444 (3U) /**< hy=1, vy=1, hc=1, vc=1 */
- #define JPEG_SUPPORTED_FORMAT_400 (4U) /**< hy=2, vy=2, hc=0, vc=0 */
- /**
- * @brief data format definition
- */
- typedef struct {
- uint8_t hy:2; /**< bit: 1-0 --> horizontal y component */
- uint8_t vy:2; /**< bit: 3-2 --> Vertical y component */
- uint8_t hc:2; /**< bit: bit: 5-4 --> horizontal c component */
- uint8_t vc:2; /**< bit: 7-6 --> Vertical c component */
- } jpeg_sampling_t;
- typedef struct {
- uint8_t pixel_width;
- uint8_t ipath;
- uint8_t opath;
- bool is_rgb;
- } jpeg_pixel_t;
- /**
- * @brief jpeg encoding and decoding configuration parameters
- * @arg bit: 31-27 --> name
- * @arg bit: 26-23 --> WIDTH IN BYTE
- * @arg bit: 22-3 --> ELEMENT COUNT
- * @arg bit: 2-0 --> TYPE
- */
- typedef enum jpeg_table {
- jpeg_table_qmem = 0x201002, /**< definition Decoder and Encoder Q. values */
- jpeg_table_huffenc = 0x201803, /**< definition Huffman Encoder table */
- jpeg_table_huffmin = 0x400104, /**< definition Huffman min values */
- jpeg_table_huffbase = 0x200405, /**< definition Huffman BASE mem values */
- jpeg_table_huffsymb = 0x101506, /**< definition Huffman SYMB mem values */
- } jpeg_table_t;
- typedef enum jpeg_pixel_format {
- jpeg_pixel_format_argb8888 = 0,
- jpeg_pixel_format_rgb565,
- jpeg_pixel_format_yuv422h1p,
- jpeg_pixel_format_yuv422h2p,
- jpeg_pixel_format_yuv420,
- jpeg_pixel_format_y8,
- } jpeg_pixel_format_t;
- /**
- * @brief jpeg encoding and decoding configuration parameters
- */
- typedef struct {
- uint8_t jpeg_format; /**< supported jpeg format */
- jpeg_pixel_format_t in_pixel_format;
- jpeg_pixel_format_t out_pixel_format;
- uint8_t in_byte_order; /**< byte order */
- uint8_t out_byte_order; /**< byte order */
- bool enable_ycbcr; /**< enable YCbCr or YUV */
- uint16_t width_in_pixel; /**< Image width register*/
- uint16_t height_in_pixel; /**< Image height register*/
- uint32_t in_buffer; /**< input buffer */
- uint32_t out_buffer; /**< output buffer */
- } jpeg_job_config_t;
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * @brief clear jpeg cfg Register
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- static inline void jpeg_clear_cfg(JPEG_Type *ptr)
- {
- ptr->CFG = 0;
- }
- /**
- * @brief jpeg function disable
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- static inline void jpeg_disable(JPEG_Type *ptr)
- {
- ptr->CFG &= ~JPEG_CFG_JPEG_EN_MASK;
- }
- /**
- * @brief jpeg function enable
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- static inline void jpeg_enable(JPEG_Type *ptr)
- {
- ptr->CFG |= JPEG_CFG_JPEG_EN_MASK;
- }
- /**
- * @brief stop a encoder/decoder conversion
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- static inline void jpeg_stop(JPEG_Type *ptr)
- {
- ptr->CFG &= ~JPEG_CFG_START_MASK;
- }
- /**
- * @brief start a new encoder/decoder conversion
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- static inline void jpeg_start(JPEG_Type *ptr)
- {
- ptr->CFG |= JPEG_CFG_START_MASK;
- }
- /**
- * @brief obtain jpeg Status Register
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @retval jpeg register's status
- */
- static inline uint32_t jpeg_get_status(JPEG_Type *ptr)
- {
- return ptr->STAT;
- }
- /**
- * @brief clear jpeg Status Register
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @param [in] mask
- * @arg JPEG_EVENT_BUSY: the module is busy doing conversion and data transfer
- * @arg JPEG_EVENT_OUT_DMA_FINISH: OutDMA process done
- * @arg JPEG_EVENT_IN_DMA_FINISH: InDMA process done
- * @arg JPEG_EVENT_ERROR: the axi err
- *
- */
- static inline void jpeg_clear_status(JPEG_Type *ptr, uint32_t mask)
- {
- ptr->STAT |= mask;
- }
- /**
- * @brief Out DMA Bytes Counter
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @retval The out DMA counter
- */
- static inline uint32_t jpeg_get_encoded_length(JPEG_Type *ptr)
- {
- return JPEG_OUTDMACNT_VAL_GET(ptr->OUTDMACNT);
- }
- /**
- * @brief jpeg Software Reset
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- static inline void jpeg_software_reset(JPEG_Type *ptr)
- {
- ptr->CFG |= JPEG_CFG_JPEG_SFTRST_MASK;
- ptr->CFG &= ~JPEG_CFG_JPEG_SFTRST_MASK;
- }
- /**
- * @brief stop a encoder/decoder conversion and Software Reset
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- void jpeg_reset(JPEG_Type *ptr);
- /**
- * @brief jpeg enable interrupt
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @param [in] mask
- * @arg JPEG_EVENT_IN_DMA_FINISH: In DMA Done enable
- * @arg JPEG_EVENT_OUT_DMA_FINISH: interrupt enable for all interrupt sources of In DMA module
- * @arg JPEG_EVENT_ERROR: The jpg endec restart error interrupt enable
- *
- */
- void jpeg_enable_irq(JPEG_Type *ptr, uint32_t mask);
- /**
- * @brief jpeg disable interrupt
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @param [in] mask
- * @arg JPEG_EVENT_IN_DMA_FINISH: In DMA Done disable
- * @arg JPEG_EVENT_OUT_DMA_FINISH: interrupt disable for all interrupt sources of In DMA module
- * @arg JPEG_EVENT_ERROR: The jpg endec restart error interrupt disable
- *
- */
- void jpeg_disable_irq(JPEG_Type *ptr, uint32_t mask);
- /**
- * @brief stop a encoder/decoder conversion and Software Reset
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- */
- void jpeg_init(JPEG_Type *ptr);
- /**
- * @brief fill tables for jpeg controller
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @param [in] table
- * @arg jpeg_table_qmem: file describe for Decoder and Encoder Q. values
- * @arg jpeg_table_huffenc: file describe for Huffman Encoder table
- * @arg jpeg_table_huffmin: file describe for Huffman min values
- * @arg jpeg_table_huffbase: file describe for Huffman BASE mem values
- * @arg jpeg_table_huffsymb: file describe for Huffman SYMB mem values
- * @param [in] data
- * @arg huffenc: data for Huffman Encoder table
- * @arg huffmin: data for Huffman min values
- * @arg huffbase: data for Huffman BASE mem values
- * @arg huffsymb: data for Huffman SYMB mem values
- * @arg qetable: data for Encoder Q. values
- * @arg qdtable: data for Decoder Q. values
- * @param [in] count data length
- * @retval fill tables's status
- *
- */
- hpm_stat_t jpeg_fill_table(JPEG_Type *ptr, jpeg_table_t table, uint8_t *data, uint32_t count);
- /**
- * @brief it will start decoding, and the process status needs to be checked by
- * querying JPEG_EVENT
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @param [in] config config A pointer to the configuration struct of "jpeg_job_config_t"
- * @param [in] length Decoded data length
- * @retval jpeg decoding's status
- *
- */
- hpm_stat_t jpeg_start_decode(JPEG_Type *ptr, jpeg_job_config_t *config, uint32_t length);
- /**
- * @brief * it will start encoding, and the process status needs to be checked by
- * querying JPEG_EVENT
- *
- * @param [in] ptr JPEG base address, HPM_JPEG
- * @param [in] config config A pointer to the configuration struct of "jpeg_job_config_t"
- * @retval jpeg encoding's status
- *
- */
- hpm_stat_t jpeg_start_encode(JPEG_Type *ptr, jpeg_job_config_t *config);
- /**
- * @}
- *
- */
- #ifdef __cplusplus
- }
- #endif
- #endif /* HPM_JPEG_DRV_H */
|