169 lines
3.7 KiB
C
169 lines
3.7 KiB
C
/* 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
|