mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
4.6 KiB
180 lines
4.6 KiB
/* 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_RGB24 |
|
#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 |
|
* @colplanes: number of color planes (1 for packed formats) |
|
* @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 |
|
*/ |
|
struct mxc_jpeg_fmt { |
|
char *name; |
|
u32 fourcc; |
|
enum v4l2_jpeg_chroma_subsampling subsampling; |
|
int nc; |
|
int depth; |
|
int colplanes; |
|
int h_align; |
|
int v_align; |
|
u32 flags; |
|
}; |
|
|
|
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 { |
|
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 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; |
|
unsigned int stopping; |
|
unsigned int slot; |
|
}; |
|
|
|
struct mxc_jpeg_slot_data { |
|
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 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[MXC_MAX_SLOTS]; |
|
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
|
|
|