Lines Matching +full:- +full:f
1 // SPDX-License-Identifier: GPL-2.0-only
3 * vivid-touch-cap.c - touch support functions.
6 #include "vivid-core.h"
7 #include "vivid-kthread-touch.h"
8 #include "vivid-vid-common.h"
9 #include "vivid-touch-cap.h"
17 struct v4l2_pix_format *f = &dev->tch_format; in touch_cap_queue_setup() local
18 unsigned int size = f->sizeimage; in touch_cap_queue_setup()
22 return -EINVAL; in touch_cap_queue_setup()
28 *nbuffers = 2 - q_num_bufs; in touch_cap_queue_setup()
36 struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue); in touch_cap_buf_prepare()
37 struct v4l2_pix_format *f = &dev->tch_format; in touch_cap_buf_prepare() local
38 unsigned int size = f->sizeimage; in touch_cap_buf_prepare()
40 if (dev->buf_prepare_error) { in touch_cap_buf_prepare()
45 dev->buf_prepare_error = false; in touch_cap_buf_prepare()
46 return -EINVAL; in touch_cap_buf_prepare()
51 return -EINVAL; in touch_cap_buf_prepare()
61 struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue); in touch_cap_buf_queue()
64 vbuf->field = V4L2_FIELD_NONE; in touch_cap_buf_queue()
65 spin_lock(&dev->slock); in touch_cap_buf_queue()
66 list_add_tail(&buf->list, &dev->touch_cap_active); in touch_cap_buf_queue()
67 spin_unlock(&dev->slock); in touch_cap_buf_queue()
75 dev->touch_cap_seq_count = 0; in touch_cap_start_streaming()
76 if (dev->start_streaming_error) { in touch_cap_start_streaming()
77 dev->start_streaming_error = false; in touch_cap_start_streaming()
78 err = -EINVAL; in touch_cap_start_streaming()
86 &dev->touch_cap_active, list) { in touch_cap_start_streaming()
87 list_del(&buf->list); in touch_cap_start_streaming()
88 vb2_buffer_done(&buf->vb.vb2_buf, in touch_cap_start_streaming()
105 struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue); in touch_cap_buf_request_complete()
107 v4l2_ctrl_request_complete(vb->req_obj.req, &dev->ctrl_hdl_touch_cap); in touch_cap_buf_request_complete()
121 int vivid_enum_fmt_tch(struct file *file, void *priv, struct v4l2_fmtdesc *f) in vivid_enum_fmt_tch() argument
123 if (f->index) in vivid_enum_fmt_tch()
124 return -EINVAL; in vivid_enum_fmt_tch()
126 f->pixelformat = V4L2_TCH_FMT_DELTA_TD16; in vivid_enum_fmt_tch()
130 int vivid_g_fmt_tch(struct file *file, void *priv, struct v4l2_format *f) in vivid_g_fmt_tch() argument
134 if (dev->multiplanar) in vivid_g_fmt_tch()
135 return -ENOTTY; in vivid_g_fmt_tch()
136 f->fmt.pix = dev->tch_format; in vivid_g_fmt_tch()
140 int vivid_g_fmt_tch_mplane(struct file *file, void *priv, struct v4l2_format *f) in vivid_g_fmt_tch_mplane() argument
145 if (!dev->multiplanar) in vivid_g_fmt_tch_mplane()
146 return -ENOTTY; in vivid_g_fmt_tch_mplane()
148 sp_fmt.fmt.pix = dev->tch_format; in vivid_g_fmt_tch_mplane()
149 fmt_sp2mp(&sp_fmt, f); in vivid_g_fmt_tch_mplane()
158 if (parm->type != (dev->multiplanar ? in vivid_g_parm_tch()
161 return -EINVAL; in vivid_g_parm_tch()
163 parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; in vivid_g_parm_tch()
164 parm->parm.capture.timeperframe = dev->timeperframe_tch_cap; in vivid_g_parm_tch()
165 parm->parm.capture.readbuffers = 1; in vivid_g_parm_tch()
171 if (inp->index) in vivid_enum_input_tch()
172 return -EINVAL; in vivid_enum_input_tch()
174 inp->type = V4L2_INPUT_TYPE_TOUCH; in vivid_enum_input_tch()
175 strscpy(inp->name, "Vivid Touch", sizeof(inp->name)); in vivid_enum_input_tch()
176 inp->capabilities = 0; in vivid_enum_input_tch()
188 struct v4l2_pix_format *f = &dev->tch_format; in vivid_set_touch() local
191 return -EINVAL; in vivid_set_touch()
193 f->pixelformat = V4L2_TCH_FMT_DELTA_TD16; in vivid_set_touch()
194 f->width = VIVID_TCH_WIDTH; in vivid_set_touch()
195 f->height = VIVID_TCH_HEIGHT; in vivid_set_touch()
196 f->field = V4L2_FIELD_NONE; in vivid_set_touch()
197 f->colorspace = V4L2_COLORSPACE_RAW; in vivid_set_touch()
198 f->bytesperline = f->width * sizeof(s16); in vivid_set_touch()
199 f->sizeimage = f->width * f->height * sizeof(s16); in vivid_set_touch()
212 /* Fill 10% of the values within range -3 and 3, zero the others */ in vivid_fill_buff_noise()
219 tch_buf[i] = (rand / 10) % 7 - 3; in vivid_fill_buff_noise()
228 static void vivid_tch_buf_set(struct v4l2_pix_format *f, in vivid_tch_buf_set() argument
232 unsigned int x = index % f->width; in vivid_tch_buf_set()
233 unsigned int y = index / f->width; in vivid_tch_buf_set()
239 tch_buf[index - 1] = offset + get_random_pressure(); in vivid_tch_buf_set()
240 if (x < f->width - 1) in vivid_tch_buf_set()
243 tch_buf[index - f->width] = offset + get_random_pressure(); in vivid_tch_buf_set()
244 if (y < f->height - 1) in vivid_tch_buf_set()
245 tch_buf[index + f->width] = offset + get_random_pressure(); in vivid_tch_buf_set()
248 tch_buf[index - 1 - f->width] = offset + get_random_pressure(); in vivid_tch_buf_set()
249 if (x < f->width - 1 && y) in vivid_tch_buf_set()
250 tch_buf[index + 1 - f->width] = offset + get_random_pressure(); in vivid_tch_buf_set()
251 if (x && y < f->height - 1) in vivid_tch_buf_set()
252 tch_buf[index - 1 + f->width] = offset + get_random_pressure(); in vivid_tch_buf_set()
253 if (x < f->width - 1 && y < f->height - 1) in vivid_tch_buf_set()
254 tch_buf[index + 1 + f->width] = offset + get_random_pressure(); in vivid_tch_buf_set()
259 struct v4l2_pix_format *f = &dev->tch_format; in vivid_fillbuff_tch() local
260 int size = f->width * f->height; in vivid_fillbuff_tch()
264 __s16 *tch_buf = vb2_plane_vaddr(&buf->vb.vb2_buf, 0); in vivid_fillbuff_tch()
266 buf->vb.sequence = dev->touch_cap_with_seq_wrap_count; in vivid_fillbuff_tch()
267 test_pattern = (buf->vb.sequence / TCH_SEQ_COUNT) % TEST_CASE_MAX; in vivid_fillbuff_tch()
268 test_pat_idx = buf->vb.sequence % TCH_SEQ_COUNT; in vivid_fillbuff_tch()
276 dev->tch_pat_random = get_random_u32(); in vivid_fillbuff_tch()
277 rand = dev->tch_pat_random; in vivid_fillbuff_tch()
282 vivid_tch_buf_set(f, tch_buf, rand % size); in vivid_fillbuff_tch()
286 vivid_tch_buf_set(f, tch_buf, rand % size); in vivid_fillbuff_tch()
290 vivid_tch_buf_set(f, tch_buf, rand % size); in vivid_fillbuff_tch()
293 vivid_tch_buf_set(f, tch_buf, in vivid_fillbuff_tch()
294 (rand % f->height) * f->width + in vivid_fillbuff_tch()
296 (f->width / TCH_PATTERN_COUNT)); in vivid_fillbuff_tch()
299 x = f->width / 2; in vivid_fillbuff_tch()
300 y = f->height / 2; in vivid_fillbuff_tch()
301 offset_x = ((TCH_PATTERN_COUNT - 1 - test_pat_idx) * x) / in vivid_fillbuff_tch()
303 offset_y = ((TCH_PATTERN_COUNT - 1 - test_pat_idx) * y) / in vivid_fillbuff_tch()
305 vivid_tch_buf_set(f, tch_buf, in vivid_fillbuff_tch()
306 (x - offset_x) + f->width * (y - offset_y)); in vivid_fillbuff_tch()
307 vivid_tch_buf_set(f, tch_buf, in vivid_fillbuff_tch()
308 (x + offset_x) + f->width * (y + offset_y)); in vivid_fillbuff_tch()
311 x = f->width / 2; in vivid_fillbuff_tch()
312 y = f->height / 2; in vivid_fillbuff_tch()
315 vivid_tch_buf_set(f, tch_buf, in vivid_fillbuff_tch()
316 (x - offset_x) + f->width * (y - offset_y)); in vivid_fillbuff_tch()
317 vivid_tch_buf_set(f, tch_buf, in vivid_fillbuff_tch()
318 (x + offset_x) + f->width * (y + offset_y)); in vivid_fillbuff_tch()
321 for (x = 0; x < f->width; x++) in vivid_fillbuff_tch()
322 for (y = f->height / 2; y < f->height; y++) in vivid_fillbuff_tch()
323 tch_buf[x + f->width * y] = VIVID_MIN_PRESSURE + in vivid_fillbuff_tch()
330 ystart = (y * f->height) / 4 + f->height / 8; in vivid_fillbuff_tch()
331 xstart = (x * f->width) / 4 + f->width / 8; in vivid_fillbuff_tch()
332 vivid_tch_buf_set(f, tch_buf, in vivid_fillbuff_tch()
333 ystart * f->width + xstart); in vivid_fillbuff_tch()