1*4882a593Smuzhiyun #include "CamHwIsp20.h"
2*4882a593Smuzhiyun #include "rk_aiq_comm.h"
3*4882a593Smuzhiyun #include "fake_v4l2_device.h"
4*4882a593Smuzhiyun #include "rkcif-config.h"
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun namespace RkCam {
7*4882a593Smuzhiyun
CifSclStream()8*4882a593Smuzhiyun CifSclStream::CifSclStream()
9*4882a593Smuzhiyun : _working_mode(0)
10*4882a593Smuzhiyun , _bpp(0)
11*4882a593Smuzhiyun , index(0)
12*4882a593Smuzhiyun , _width(0)
13*4882a593Smuzhiyun , _height(0)
14*4882a593Smuzhiyun , _sns_v4l_pix_fmt(0)
15*4882a593Smuzhiyun , _ratio(0)
16*4882a593Smuzhiyun , _first_start(true)
17*4882a593Smuzhiyun {}
18*4882a593Smuzhiyun
~CifSclStream()19*4882a593Smuzhiyun CifSclStream::~CifSclStream() {}
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun bool
setPollCallback(PollCallback * callback)22*4882a593Smuzhiyun CifSclStream::setPollCallback (PollCallback *callback)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun for (int i = 0; i < index; i++) {
25*4882a593Smuzhiyun _stream[i]->setPollCallback(callback);
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun return true;
28*4882a593Smuzhiyun }
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun XCamReturn
set_format(const struct v4l2_subdev_format & sns_sd_fmt,uint32_t sns_v4l_pix_fmt,int bpp)31*4882a593Smuzhiyun CifSclStream::set_format(const struct v4l2_subdev_format& sns_sd_fmt,
32*4882a593Smuzhiyun uint32_t sns_v4l_pix_fmt, int bpp)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun _width = sns_sd_fmt.format.width;
37*4882a593Smuzhiyun _height = sns_sd_fmt.format.height;
38*4882a593Smuzhiyun _bpp = bpp;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun switch (sns_v4l_pix_fmt)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR8:
43*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR10:
44*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR12:
45*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR14:
46*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR16:
47*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SBGGR16;
48*4882a593Smuzhiyun break;
49*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG8:
50*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG10:
51*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG12:
52*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG14:
53*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG16:
54*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SGBRG16;
55*4882a593Smuzhiyun break;
56*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG8:
57*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG10:
58*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG12:
59*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG14:
60*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG16:
61*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SGRBG16;
62*4882a593Smuzhiyun break;
63*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB8:
64*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB10:
65*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB12:
66*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB14:
67*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB16:
68*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SRGGB16;
69*4882a593Smuzhiyun break;
70*4882a593Smuzhiyun default:
71*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "unknown format");
72*4882a593Smuzhiyun return XCAM_RETURN_ERROR_PARAM;
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun return ret;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun XCamReturn
set_format(const struct v4l2_subdev_selection & sns_sd_sel,uint32_t sns_v4l_pix_fmt,int bpp)79*4882a593Smuzhiyun CifSclStream::set_format(const struct v4l2_subdev_selection& sns_sd_sel,
80*4882a593Smuzhiyun uint32_t sns_v4l_pix_fmt, int bpp)
81*4882a593Smuzhiyun {
82*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun _width = sns_sd_sel.r.width;
85*4882a593Smuzhiyun _height = sns_sd_sel.r.height;
86*4882a593Smuzhiyun _bpp = bpp;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun switch (sns_v4l_pix_fmt)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR8:
91*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR10:
92*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR12:
93*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR14:
94*4882a593Smuzhiyun case V4L2_PIX_FMT_SBGGR16:
95*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SBGGR16;
96*4882a593Smuzhiyun break;
97*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG8:
98*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG10:
99*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG12:
100*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG14:
101*4882a593Smuzhiyun case V4L2_PIX_FMT_SGBRG16:
102*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SGBRG16;
103*4882a593Smuzhiyun break;
104*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG8:
105*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG10:
106*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG12:
107*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG14:
108*4882a593Smuzhiyun case V4L2_PIX_FMT_SGRBG16:
109*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SGRBG16;
110*4882a593Smuzhiyun break;
111*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB8:
112*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB10:
113*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB12:
114*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB14:
115*4882a593Smuzhiyun case V4L2_PIX_FMT_SRGGB16:
116*4882a593Smuzhiyun _sns_v4l_pix_fmt = V4L2_PIX_FMT_SRGGB16;
117*4882a593Smuzhiyun break;
118*4882a593Smuzhiyun default:
119*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "unknown format");
120*4882a593Smuzhiyun return XCAM_RETURN_ERROR_PARAM;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun return ret;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun void
set_working_mode(int mode)126*4882a593Smuzhiyun CifSclStream::set_working_mode(int mode)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun _working_mode = mode;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
start()131*4882a593Smuzhiyun XCamReturn CifSclStream::start()
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun if (_init && !_active) {
134*4882a593Smuzhiyun for (int i = 0; i < index; i++) {
135*4882a593Smuzhiyun if (_stream[i].ptr())
136*4882a593Smuzhiyun _stream[i]->start();
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun _active = true;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
stop()143*4882a593Smuzhiyun XCamReturn CifSclStream::stop()
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun for (int i = 0; i < index; i++) {
146*4882a593Smuzhiyun if (_stream[i].ptr())
147*4882a593Smuzhiyun _stream[i]->stop();
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun _active = false;
150*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun XCamReturn
restart(const rk_sensor_full_info_t * s_info,int ratio,PollCallback * callback,int mode)154*4882a593Smuzhiyun CifSclStream::restart(const rk_sensor_full_info_t *s_info, int ratio, PollCallback *callback, int mode)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun if (mode) {
159*4882a593Smuzhiyun if (!_init)
160*4882a593Smuzhiyun ret = init(s_info, callback);
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun if (ratio != _ratio) {
163*4882a593Smuzhiyun if (_active) {
164*4882a593Smuzhiyun stop();
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun ret = set_ratio_fmt(ratio);
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun if (!_active && _init) {
170*4882a593Smuzhiyun ret = prepare();
171*4882a593Smuzhiyun ret = start();
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun } else {
174*4882a593Smuzhiyun if (_active)
175*4882a593Smuzhiyun ret = stop();
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun return ret;
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun XCamReturn
init(const rk_sensor_full_info_t * s_info,PollCallback * callback)181*4882a593Smuzhiyun CifSclStream::init(const rk_sensor_full_info_t *s_info, PollCallback *callback)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun if (!s_info->cif_info) {
186*4882a593Smuzhiyun LOGD_CAMHW("no link to vicap\n");
187*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun switch (_working_mode)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun case 0x0:
193*4882a593Smuzhiyun index = 1;
194*4882a593Smuzhiyun break;
195*4882a593Smuzhiyun case 0x11:
196*4882a593Smuzhiyun case 0x12:
197*4882a593Smuzhiyun index = 2;
198*4882a593Smuzhiyun break;
199*4882a593Smuzhiyun case 0x21:
200*4882a593Smuzhiyun case 0x22:
201*4882a593Smuzhiyun index = 3;
202*4882a593Smuzhiyun break;
203*4882a593Smuzhiyun default:
204*4882a593Smuzhiyun index = 0;
205*4882a593Smuzhiyun break;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun if (index >= 1) {
210*4882a593Smuzhiyun if (strlen(s_info->cif_info->mipi_scl0)) {
211*4882a593Smuzhiyun _dev[0] = new V4l2Device(s_info->cif_info->mipi_scl0);
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun if (_dev[0].ptr())
214*4882a593Smuzhiyun _dev[0]->open();
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun if (index >= 2) {
217*4882a593Smuzhiyun if (strlen(s_info->cif_info->mipi_scl1)) {
218*4882a593Smuzhiyun _dev[1] = new V4l2Device(s_info->cif_info->mipi_scl1);
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun if (_dev[1].ptr())
221*4882a593Smuzhiyun _dev[1]->open();
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun if (index == 3) {
224*4882a593Smuzhiyun if (strlen(s_info->cif_info->mipi_scl2)) {
225*4882a593Smuzhiyun _dev[2] = new V4l2Device(s_info->cif_info->mipi_scl2);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun if (_dev[2].ptr())
228*4882a593Smuzhiyun _dev[2]->open();
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun for (int i = 0; i < index; i++) {
231*4882a593Smuzhiyun if (_dev[i].ptr()) {
232*4882a593Smuzhiyun _stream[i] = new RKRawStream(_dev[i], i, VICAP_POLL_SCL);
233*4882a593Smuzhiyun _stream[i]->setPollCallback(callback);
234*4882a593Smuzhiyun SmartPtr<RKRawStream> stream = _stream[i].dynamic_cast_ptr<RKRawStream>();
235*4882a593Smuzhiyun stream->set_reserved_data(_bpp);
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun _init = true;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun return ret;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun XCamReturn
set_ratio_fmt(int ratio)245*4882a593Smuzhiyun CifSclStream::set_ratio_fmt(int ratio)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun if (ratio > 0 && ratio <= 8) {
250*4882a593Smuzhiyun _ratio = 8;
251*4882a593Smuzhiyun } else if (ratio > 8 && ratio <= 16) {
252*4882a593Smuzhiyun _ratio = 16;
253*4882a593Smuzhiyun } else {
254*4882a593Smuzhiyun _ratio = 32;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun uint32_t dst_width = _width / _ratio;
258*4882a593Smuzhiyun if ((dst_width % 2) != 0)
259*4882a593Smuzhiyun dst_width -= 1;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun uint32_t dst_height = _height / _ratio;
262*4882a593Smuzhiyun if ((dst_height % 2) != 0)
263*4882a593Smuzhiyun dst_height -= 1;
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun for (int i = 0; i < index; i++) {
266*4882a593Smuzhiyun ret = _dev[i]->set_format(dst_width,
267*4882a593Smuzhiyun dst_height,
268*4882a593Smuzhiyun _sns_v4l_pix_fmt,
269*4882a593Smuzhiyun V4L2_FIELD_NONE,
270*4882a593Smuzhiyun 0);
271*4882a593Smuzhiyun if (ret < 0) {
272*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) set format failed", _dev[i]->get_device_name());
273*4882a593Smuzhiyun } else {
274*4882a593Smuzhiyun LOGD_CAMHW_SUBM(ISP20HW_SUBM, "device(%s) set fmt info: fmt 0x%x, %dx%d !",
275*4882a593Smuzhiyun _dev[i]->get_device_name(), _sns_v4l_pix_fmt,
276*4882a593Smuzhiyun dst_width, dst_height);
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun return ret;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun XCamReturn
prepare()284*4882a593Smuzhiyun CifSclStream::prepare()
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun XCamReturn ret = XCAM_RETURN_NO_ERROR;
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun if (!_init || _active)
289*4882a593Smuzhiyun return XCAM_RETURN_NO_ERROR;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun for (int i = 0; i < index; i++) {
292*4882a593Smuzhiyun ret = _dev[i]->prepare();
293*4882a593Smuzhiyun if (ret < 0)
294*4882a593Smuzhiyun LOGE_CAMHW_SUBM(ISP20HW_SUBM, "mipi tx:%d prepare err: %d\n", ret);
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun _stream[i]->set_device_prepared(true);
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun return ret;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun bool
getIsActive()303*4882a593Smuzhiyun CifSclStream::getIsActive()
304*4882a593Smuzhiyun {
305*4882a593Smuzhiyun return _active;
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun }