Lines Matching +full:double +full:- +full:buffering

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * Copyright (C) 2002-2004 by Luca Risolia <[email protected]>
23 #define Y_QUANTABLE (&sd->jpeg_hdr[JPEG_QT0_OFFSET])
24 #define UV_QUANTABLE (&sd->jpeg_hdr[JPEG_QT1_OFFSET])
51 /*--------------------------------------------------------------------------
52 Write 64-bit data to the fast serial bus registers.
53 Return 0 on success, -1 otherwise.
54 --------------------------------------------------------------------------*/
57 struct usb_device *udev = sd->gspca_dev.dev; in w9968cf_write_fsb()
61 if (sd->gspca_dev.usb_err < 0) in w9968cf_write_fsb()
65 memcpy(sd->gspca_dev.usb_buf, data, 6); in w9968cf_write_fsb()
71 value, 0x06, sd->gspca_dev.usb_buf, 6, 500); in w9968cf_write_fsb()
74 sd->gspca_dev.usb_err = ret; in w9968cf_write_fsb()
78 /*--------------------------------------------------------------------------
81 --------------------------------------------------------------------------*/
86 if (sd->gspca_dev.usb_err < 0) in w9968cf_write_sb()
94 ret = usb_control_msg(sd->gspca_dev.dev, in w9968cf_write_sb()
95 usb_sndctrlpipe(sd->gspca_dev.dev, 0), in w9968cf_write_sb()
104 sd->gspca_dev.usb_err = ret; in w9968cf_write_sb()
108 /*--------------------------------------------------------------------------
111 --------------------------------------------------------------------------*/
116 if (sd->gspca_dev.usb_err < 0) in w9968cf_read_sb()
117 return -1; in w9968cf_read_sb()
124 ret = usb_control_msg(sd->gspca_dev.dev, in w9968cf_read_sb()
125 usb_rcvctrlpipe(sd->gspca_dev.dev, 0), in w9968cf_read_sb()
128 0, 0x01, sd->gspca_dev.usb_buf, 2, 500); in w9968cf_read_sb()
130 ret = sd->gspca_dev.usb_buf[0] | in w9968cf_read_sb()
131 (sd->gspca_dev.usb_buf[1] << 8); in w9968cf_read_sb()
134 sd->gspca_dev.usb_err = ret; in w9968cf_read_sb()
139 memset(sd->gspca_dev.usb_buf, 0, 2); in w9968cf_read_sb()
147 /*--------------------------------------------------------------------------
151 --------------------------------------------------------------------------*/
169 * Low-level I2C I/O functions. *
243 sd->gspca_dev.usb_err = -EIO; in w9968cf_smbus_read_ack()
251 u16* data = (u16 *)sd->gspca_dev.usb_buf; in w9968cf_i2c_w()
253 data[0] = 0x082f | ((sd->sensor_addr & 0x80) ? 0x1500 : 0x0); in w9968cf_i2c_w()
254 data[0] |= (sd->sensor_addr & 0x40) ? 0x4000 : 0x0; in w9968cf_i2c_w()
255 data[1] = 0x2082 | ((sd->sensor_addr & 0x40) ? 0x0005 : 0x0); in w9968cf_i2c_w()
256 data[1] |= (sd->sensor_addr & 0x20) ? 0x0150 : 0x0; in w9968cf_i2c_w()
257 data[1] |= (sd->sensor_addr & 0x10) ? 0x5400 : 0x0; in w9968cf_i2c_w()
258 data[2] = 0x8208 | ((sd->sensor_addr & 0x08) ? 0x0015 : 0x0); in w9968cf_i2c_w()
259 data[2] |= (sd->sensor_addr & 0x04) ? 0x0540 : 0x0; in w9968cf_i2c_w()
260 data[2] |= (sd->sensor_addr & 0x02) ? 0x5000 : 0x0; in w9968cf_i2c_w()
261 data[3] = 0x1d20 | ((sd->sensor_addr & 0x02) ? 0x0001 : 0x0); in w9968cf_i2c_w()
262 data[3] |= (sd->sensor_addr & 0x01) ? 0x0054 : 0x0; in w9968cf_i2c_w()
294 gspca_dbg(gspca_dev, D_USBO, "i2c 0x%02x -> [0x%02x]\n", value, reg); in w9968cf_i2c_w()
308 w9968cf_smbus_write_byte(sd, sd->sensor_addr); in w9968cf_i2c_r()
314 w9968cf_smbus_write_byte(sd, sd->sensor_addr + 1); in w9968cf_i2c_r()
323 /* Fast serial bus data control re-enable */ in w9968cf_i2c_r()
326 if (sd->gspca_dev.usb_err >= 0) { in w9968cf_i2c_r()
328 gspca_dbg(gspca_dev, D_USBI, "i2c [0x%02X] -> 0x%02X\n", in w9968cf_i2c_r()
336 /*--------------------------------------------------------------------------
339 --------------------------------------------------------------------------*/
342 reg_w(sd, 0x00, 0xff00); /* power-down */ in w9968cf_configure()
347 reg_w(sd, 0x01, 0x0010); /* ..high 'beep-beep' */ in w9968cf_configure()
350 sd->stopped = 1; in w9968cf_configure()
355 unsigned long hw_bufsize = sd->sif ? (352 * 288 * 2) : (640 * 480 * 2), in w9968cf_init()
391 reg_w(sd, 0x38, 0x0000);/* disable hw up-scaling */ in w9968cf_init()
400 if (sd->sif) { in w9968cf_set_crop_window()
408 if (sd->sensor == SEN_OV7620) { in w9968cf_set_crop_window()
416 if (sd->freq->val == 1) { in w9968cf_set_crop_window()
432 fw = SC(sd->gspca_dev.pixfmt.width) / max_width; in w9968cf_set_crop_window()
433 fh = SC(sd->gspca_dev.pixfmt.height) / max_height; in w9968cf_set_crop_window()
435 cw = (fw >= fh) ? max_width : SC(sd->gspca_dev.pixfmt.width) / fh; in w9968cf_set_crop_window()
436 ch = (fw >= fh) ? SC(sd->gspca_dev.pixfmt.height) / fw : max_height; in w9968cf_set_crop_window()
438 sd->sensor_width = max_width; in w9968cf_set_crop_window()
439 sd->sensor_height = max_height; in w9968cf_set_crop_window()
441 x = (max_width - cw) / 2; in w9968cf_set_crop_window()
442 y = (max_height - ch) / 2; in w9968cf_set_crop_window()
456 reg_w(sd, 0x14, sd->gspca_dev.pixfmt.width); in w9968cf_mode_init_regs()
457 reg_w(sd, 0x15, sd->gspca_dev.pixfmt.height); in w9968cf_mode_init_regs()
460 reg_w(sd, 0x30, sd->gspca_dev.pixfmt.width); in w9968cf_mode_init_regs()
461 reg_w(sd, 0x31, sd->gspca_dev.pixfmt.height); in w9968cf_mode_init_regs()
464 if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat == in w9968cf_mode_init_regs()
466 reg_w(sd, 0x2c, sd->gspca_dev.pixfmt.width / 2); in w9968cf_mode_init_regs()
467 reg_w(sd, 0x2d, sd->gspca_dev.pixfmt.width / 4); in w9968cf_mode_init_regs()
469 reg_w(sd, 0x2c, sd->gspca_dev.pixfmt.width); in w9968cf_mode_init_regs()
475 val = sd->gspca_dev.pixfmt.width * sd->gspca_dev.pixfmt.height; in w9968cf_mode_init_regs()
479 if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat == in w9968cf_mode_init_regs()
482 jpeg_define(sd->jpeg_hdr, sd->gspca_dev.pixfmt.height, in w9968cf_mode_init_regs()
483 sd->gspca_dev.pixfmt.width, 0x22); /* JPEG 420 */ in w9968cf_mode_init_regs()
484 jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual)); in w9968cf_mode_init_regs()
486 v4l2_ctrl_grab(sd->jpegqual, true); in w9968cf_mode_init_regs()
490 if (sd->sensor == SEN_OV7620) { in w9968cf_mode_init_regs()
501 /* NOTE: We may not have enough memory to do double buffering while in w9968cf_mode_init_regs()
504 (see w9968cf_init), and disable double buffering. */ in w9968cf_mode_init_regs()
505 if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat == in w9968cf_mode_init_regs()
510 val |= 0x0080; /* Enable HW double buffering */ in w9968cf_mode_init_regs()
513 /* val |= 0x0008; enable (1-2-1) filter */ in w9968cf_mode_init_regs()
514 /* val |= 0x000c; enable (2-3-6-3-2) filter */ in w9968cf_mode_init_regs()
520 sd->gspca_dev.empty_packet = 0; in w9968cf_mode_init_regs()
525 v4l2_ctrl_grab(sd->jpegqual, false); in w9968cf_stop0()
536 to be precise it sends: SOI, SOF, DRI, SOS, Y-data, SOS, U-data, SOS,
537 V-data, EOI. */
544 if (w9968cf_vga_mode[gspca_dev->curr_mode].pixelformat == in w9968cf_pkt_scan()
552 sd->jpeg_hdr, JPEG_HDR_SZ); in w9968cf_pkt_scan()
555 len -= 2; in w9968cf_pkt_scan()
560 if (gspca_dev->empty_packet) { in w9968cf_pkt_scan()
565 gspca_dev->empty_packet = 0; in w9968cf_pkt_scan()