Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | /* SPDX-License-Identifier: GPL-2.0 */ /* * i.MX8QXP/i.MX8QM JPEG encoder/decoder v4l2 driver * * Copyright 2018-2019 NXP */ #include <media/v4l2-ctrls.h> #include <media/v4l2-device.h> #include <media/v4l2-fh.h> #ifndef _MXC_JPEG_CORE_H #define _MXC_JPEG_CORE_H #define MXC_JPEG_NAME "mxc-jpeg" #define MXC_JPEG_FMT_TYPE_ENC 0 #define MXC_JPEG_FMT_TYPE_RAW 1 #define MXC_JPEG_DEFAULT_WIDTH 1280 #define MXC_JPEG_DEFAULT_HEIGHT 720 #define MXC_JPEG_DEFAULT_PFMT V4L2_PIX_FMT_BGR24 #define MXC_JPEG_MIN_WIDTH 64 #define MXC_JPEG_MIN_HEIGHT 64 #define MXC_JPEG_MAX_WIDTH 0x2000 #define MXC_JPEG_MAX_HEIGHT 0x2000 #define MXC_JPEG_MAX_CFG_STREAM 0x1000 #define MXC_JPEG_H_ALIGN 3 #define MXC_JPEG_W_ALIGN 3 #define MXC_JPEG_MAX_SIZEIMAGE 0xFFFFFC00 #define MXC_JPEG_MAX_PLANES 2 enum mxc_jpeg_enc_state { MXC_JPEG_ENCODING = 0, /* jpeg encode phase */ MXC_JPEG_ENC_CONF = 1, /* jpeg encoder config phase */ }; enum mxc_jpeg_mode { MXC_JPEG_DECODE = 0, /* jpeg decode mode */ MXC_JPEG_ENCODE = 1, /* jpeg encode mode */ }; /** * struct mxc_jpeg_fmt - driver's internal color format data * @name: format description * @fourcc: fourcc code, 0 if not applicable * @subsampling: subsampling of jpeg components * @nc: number of color components * @depth: number of bits per pixel * @mem_planes: number of memory planes (1 for packed formats) * @comp_planes:number of component planes, which includes the alpha plane (1 to 4). * @h_align: horizontal alignment order (align to 2^h_align) * @v_align: vertical alignment order (align to 2^v_align) * @flags: flags describing format applicability * @precision: jpeg sample precision * @is_rgb: is an RGB pixel format */ struct mxc_jpeg_fmt { const char *name; u32 fourcc; enum v4l2_jpeg_chroma_subsampling subsampling; int nc; int depth; int mem_planes; int comp_planes; int h_align; int v_align; u32 flags; u8 precision; u8 is_rgb; }; struct mxc_jpeg_desc { u32 next_descpt_ptr; u32 buf_base0; u32 buf_base1; u32 line_pitch; u32 stm_bufbase; u32 stm_bufsize; u32 imgsize; u32 stm_ctrl; } __packed; struct mxc_jpeg_q_data { const struct mxc_jpeg_fmt *fmt; u32 sizeimage[MXC_JPEG_MAX_PLANES]; u32 bytesperline[MXC_JPEG_MAX_PLANES]; int w; int w_adjusted; int h; int h_adjusted; unsigned int sequence; struct v4l2_rect crop; }; struct mxc_jpeg_ctx { struct mxc_jpeg_dev *mxc_jpeg; struct mxc_jpeg_q_data out_q; struct mxc_jpeg_q_data cap_q; struct v4l2_fh fh; enum mxc_jpeg_enc_state enc_state; int slot; unsigned int source_change; bool need_initial_source_change_evt; bool header_parsed; struct v4l2_ctrl_handler ctrl_handler; u8 jpeg_quality; struct delayed_work task_timer; }; struct mxc_jpeg_slot_data { int slot; bool used; struct mxc_jpeg_desc *desc; // enc/dec descriptor struct mxc_jpeg_desc *cfg_desc; // configuration descriptor void *cfg_stream_vaddr; // configuration bitstream virtual address unsigned int cfg_stream_size; dma_addr_t desc_handle; dma_addr_t cfg_desc_handle; // configuration descriptor dma address dma_addr_t cfg_stream_handle; // configuration bitstream dma address }; struct mxc_jpeg_dev { spinlock_t hw_lock; /* hardware access lock */ unsigned int mode; struct mutex lock; /* v4l2 ioctls serialization */ struct clk_bulk_data *clks; int num_clks; struct platform_device *pdev; struct device *dev; void __iomem *base_reg; struct v4l2_device v4l2_dev; struct v4l2_m2m_dev *m2m_dev; struct video_device *dec_vdev; struct mxc_jpeg_slot_data slot_data; int num_domains; struct device **pd_dev; struct device_link **pd_link; }; /** * struct mxc_jpeg_sof_comp - JPEG Start Of Frame component fields * @id: component id * @v: vertical sampling * @h: horizontal sampling * @quantization_table_no: id of quantization table */ struct mxc_jpeg_sof_comp { u8 id; u8 v :4; u8 h :4; u8 quantization_table_no; } __packed; #define MXC_JPEG_MAX_COMPONENTS 4 /** * struct mxc_jpeg_sof - JPEG Start Of Frame marker fields * @length: Start of Frame length * @precision: precision (bits per pixel per color component) * @height: image height * @width: image width * @components_no: number of color components * @comp: component fields for each color component */ struct mxc_jpeg_sof { u16 length; u8 precision; u16 height, width; u8 components_no; struct mxc_jpeg_sof_comp comp[MXC_JPEG_MAX_COMPONENTS]; } __packed; /** * struct mxc_jpeg_sos_comp - JPEG Start Of Scan component fields * @id: component id * @huffman_table_no: id of the Huffman table */ struct mxc_jpeg_sos_comp { u8 id; /*component id*/ u8 huffman_table_no; } __packed; /** * struct mxc_jpeg_sos - JPEG Start Of Scan marker fields * @length: Start of Frame length * @components_no: number of color components * @comp: SOS component fields for each color component * @ignorable_bytes: ignorable bytes */ struct mxc_jpeg_sos { u16 length; u8 components_no; struct mxc_jpeg_sos_comp comp[MXC_JPEG_MAX_COMPONENTS]; u8 ignorable_bytes[3]; } __packed; #endif |