hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
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
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
 
#ifndef _RKISP_ISPP_H
#define _RKISP_ISPP_H
 
#include <linux/platform_device.h>
#include <media/v4l2-subdev.h>
#include <media/videobuf2-v4l2.h>
#include <linux/rk-isp1-config.h>
#include <linux/rk-ispp-config.h>
 
#define RKISP_BUF_MAX 2
#define RKISPP_BUF_MAX 2
#define RKISP_ISPP_BUF_MAX (RKISP_BUF_MAX + RKISPP_BUF_MAX + (2 * (DEV_MAX - 1)))
 
#define RKISP_ISPP_REGBUF_NUM        RKISPP_BUF_POOL_MAX
#define RKISP_ISP_SW_REG_SIZE        0x6000
#define RKISP_ISP_SW_MAX_SIZE        (RKISP_ISP_SW_REG_SIZE * 2)
#define RKISP_ISPP_SW_REG_SIZE        0x0d00
#define RKISP_ISPP_SW_MAX_SIZE        (RKISP_ISPP_SW_REG_SIZE * 2)
 
#define RKISP_ISPP_CMD_SET_MODE \
   _IOW('V', BASE_VIDIOC_PRIVATE + 0, struct rkisp_ispp_mode)
#define RKISP_ISPP_CMD_SET_FMT \
   _IOW('V', BASE_VIDIOC_PRIVATE + 1, struct max_input)
#define RKISP_ISPP_CMD_REQUEST_REGBUF    \
   _IOW('V', BASE_VIDIOC_PRIVATE + 2, struct rkisp_ispp_reg *)
#define RKISP_ISPP_CMD_GET_REG_WITHSTREAM    \
   _IOW('V', BASE_VIDIOC_PRIVATE + 3, bool)
 
enum frame_end_state {
   FRAME_INIT,
   FRAME_IRQ,
   FRAME_WORK,
};
 
enum rkisp_ispp_dev {
   DEV_ID0 = 0,
   DEV_ID1,
   DEV_ID2,
   DEV_ID3,
   DEV_MAX,
};
 
enum rkisp_ispp_sw_reg {
   SW_REG_CACHE = 0xffffffff,
   SW_REG_CACHE_SYNC = 0xeeeeeeee,
};
 
enum rkisp_ispp_buf_group {
   GROUP_BUF_PIC = 0,
   GROUP_BUF_GAIN,
   GROUP_BUF_MAX,
};
 
enum rkisp_ispp_work_mode {
   ISP_ISPP_FBC = BIT(0),
   ISP_ISPP_422 = BIT(1),
   ISP_ISPP_QUICK = BIT(2),
   ISP_ISPP_INIT_FAIL = BIT(7),
};
 
enum rkisp_ispp_reg_stat {
   ISP_ISPP_FREE = 0,
   ISP_ISPP_INUSE,
};
 
struct frame_debug_info {
   u64 timestamp;
   u32 interval;
   u32 delay;
   u32 id;
   u32 frameloss;
};
 
struct max_input {
   u32 w;
   u32 h;
   u32 fps;
   bool is_fix;
};
 
struct rkisp_ispp_mode {
   u8 work_mode;
   u8 buf_num;
};
 
struct rkisp_ispp_reg {
   enum rkisp_ispp_reg_stat stat;
   u32 dev_id;
   u32 frame_id;
   u32 reg_size;
   s32 isp_offset[ISP2X_ID_MAX];
   s32 ispp_offset[ISPP_ID_MAX];
   u32 isp_size[ISP2X_ID_MAX];
   u32 isp_stats_size[ISP2X_ID_MAX];
   u32 ispp_size[ISPP_ID_MAX];
   u64 sof_timestamp;
   u64 frame_timestamp;
   struct sensor_exposure_cfg exposure;
   u8 reg[RKISP_ISP_SW_REG_SIZE + RKISP_ISPP_SW_REG_SIZE];
};
 
struct rkisp_ispp_buf {
   struct list_head list;
   struct dma_buf *dbuf[GROUP_BUF_MAX];
   int dfd[GROUP_BUF_MAX];
   u32 didx[GROUP_BUF_MAX];
   /* timestamp in ns */
   u64 frame_timestamp;
   u32 frame_id;
   u32 index;
   bool is_isp;
   bool is_move_judge;
   u32 buf_idx;
   u32 gain_dmaidx;
   u32 mfbc_dmaidx;
   u32 gain_size;
   u32 mfbc_size;
   void *priv;
};
 
int __init rkispp_hw_drv_init(void);
 
#if IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V20) || IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_ISP_VERSION_V30)
void rkisp_get_bridge_sd(struct platform_device *dev,
            struct v4l2_subdev **sd);
#else
static inline void rkisp_get_bridge_sd(struct platform_device *dev,
                      struct v4l2_subdev **sd)
{
   *sd = NULL;
}
#endif
 
#endif