| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* |
| * Imagination E5010 JPEG Encoder driver. |
| * |
| * Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/ |
| * |
| * Author: David Huang <d-huang@ti.com> |
| * Author: Devarsh Thakkar <devarsht@ti.com> |
| */ |
| |
| #include <media/v4l2-ctrls.h> |
| #include <media/v4l2-device.h> |
| #include <media/v4l2-fh.h> |
| |
| #ifndef _E5010_JPEG_ENC_H |
| #define _E5010_JPEG_ENC_H |
| |
| #define MAX_PLANES 2 |
| #define HEADER_SIZE 0x025D |
| #define MIN_DIMENSION 64 |
| #define MAX_DIMENSION 8192 |
| #define DEFAULT_WIDTH 640 |
| #define DEFAULT_HEIGHT 480 |
| #define E5010_MODULE_NAME "e5010" |
| #define JPEG_MAX_BYTES_PER_PIXEL 2 |
| |
| /* JPEG marker definitions */ |
| #define START_OF_IMAGE 0xFFD8 |
| #define SOF_BASELINE_DCT 0xFFC0 |
| #define END_OF_IMAGE 0xFFD9 |
| #define START_OF_SCAN 0xFFDA |
| |
| /* Definitions for the huffman table specification in the Marker segment */ |
| #define DHT_MARKER 0xFFC4 |
| #define LH_DC 0x001F |
| #define LH_AC 0x00B5 |
| |
| /* Definitions for the quantization table specification in the Marker segment */ |
| #define DQT_MARKER 0xFFDB |
| #define ACMAX 0x03FF |
| #define DCMAX 0x07FF |
| |
| /* Length and precision of the quantization table parameters */ |
| #define LQPQ 0x00430 |
| #define QMAX 255 |
| |
| /* Misc JPEG header definitions */ |
| #define UC_NUM_COMP 3 |
| #define PRECISION 8 |
| #define HORZ_SAMPLING_FACTOR (2 << 4) |
| #define VERT_SAMPLING_FACTOR_422 1 |
| #define VERT_SAMPLING_FACTOR_420 2 |
| #define COMPONENTS_IN_SCAN 3 |
| #define PELS_IN_BLOCK 64 |
| |
| /* Used for Qp table generation */ |
| #define LUMINOSITY 10 |
| #define CONTRAST 1 |
| #define INCREASE 2 |
| #define QP_TABLE_SIZE (8 * 8) |
| #define QP_TABLE_FIELD_OFFSET 0x04 |
| |
| /* |
| * vb2 queue structure |
| * contains queue data information |
| * |
| * @fmt: format info |
| * @width: frame width |
| * @height: frame height |
| * @bytesperline: bytes per line in memory |
| * @size_image: image size in memory |
| */ |
| struct e5010_q_data { |
| struct e5010_fmt *fmt; |
| u32 width; |
| u32 height; |
| u32 width_adjusted; |
| u32 height_adjusted; |
| u32 sizeimage[MAX_PLANES]; |
| u32 bytesperline[MAX_PLANES]; |
| u32 sequence; |
| struct v4l2_rect crop; |
| bool crop_set; |
| }; |
| |
| /* |
| * Driver device structure |
| * Holds all memory handles and global parameters |
| * Shared by all instances |
| */ |
| struct e5010_dev { |
| struct device *dev; |
| struct v4l2_device v4l2_dev; |
| struct v4l2_m2m_dev *m2m_dev; |
| struct video_device *vdev; |
| void __iomem *core_base; |
| void __iomem *mmu_base; |
| struct clk *clk; |
| struct e5010_context *last_context_run; |
| /* Protect access to device data */ |
| struct mutex mutex; |
| /* Protect access to hardware*/ |
| spinlock_t hw_lock; |
| }; |
| |
| /* |
| * Driver context structure |
| * One of these exists for every m2m context |
| * Holds context specific data |
| */ |
| struct e5010_context { |
| struct v4l2_fh fh; |
| struct e5010_dev *e5010; |
| struct e5010_q_data out_queue; |
| struct e5010_q_data cap_queue; |
| int quality; |
| bool update_qp; |
| struct v4l2_ctrl_handler ctrl_handler; |
| u8 luma_qp[QP_TABLE_SIZE]; |
| u8 chroma_qp[QP_TABLE_SIZE]; |
| }; |
| |
| /* |
| * Buffer structure |
| * Contains info for all buffers |
| */ |
| struct e5010_buffer { |
| struct v4l2_m2m_buffer buffer; |
| }; |
| |
| enum { |
| CHROMA_ORDER_CB_CR = 0, //UV ordering |
| CHROMA_ORDER_CR_CB = 1, //VU ordering |
| }; |
| |
| enum { |
| SUBSAMPLING_420 = 1, |
| SUBSAMPLING_422 = 2, |
| }; |
| |
| /* |
| * e5010 format structure |
| * contains format information |
| */ |
| struct e5010_fmt { |
| u32 fourcc; |
| unsigned int num_planes; |
| unsigned int type; |
| u32 subsampling; |
| u32 chroma_order; |
| const struct v4l2_frmsize_stepwise frmsize; |
| }; |
| |
| /* |
| * struct e5010_ctrl - contains info for each supported v4l2 control |
| */ |
| struct e5010_ctrl { |
| unsigned int cid; |
| enum v4l2_ctrl_type type; |
| unsigned char name[32]; |
| int minimum; |
| int maximum; |
| int step; |
| int default_value; |
| unsigned char compound; |
| }; |
| |
| #endif |