Lines Matching +full:cam +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0-or-later
34 #define SQ905C_MAX_TRANSFER 0x8000
36 #define FRAME_HEADER_LEN 0x50
39 #define SQ905C_CLEAR 0xa0 /* clear everything */
40 #define SQ905C_GET_ID 0x14f4 /* Read version number */
41 #define SQ905C_CAPTURE_LOW 0xa040 /* Starts capture at 160x120 */
42 #define SQ905C_CAPTURE_MED 0x1440 /* Starts capture at 320x240 */
43 #define SQ905C_CAPTURE_HI 0x2840 /* Starts capture at 320x240 */
46 #define SQ905C_CAPTURE_INDEX 0x110f
60 * The 0x2770:0x9050 cameras have max resolution of 320x240.
67 .priv = 0},
72 .priv = 0}
80 ret = usb_control_msg(gspca_dev->dev, in sq905c_command()
81 usb_sndctrlpipe(gspca_dev->dev, 0), in sq905c_command()
84 command, index, NULL, 0, in sq905c_command()
86 if (ret < 0) { in sq905c_command()
91 return 0; in sq905c_command()
99 ret = usb_control_msg(gspca_dev->dev, in sq905c_read()
100 usb_rcvctrlpipe(gspca_dev->dev, 0), in sq905c_read()
103 command, index, gspca_dev->usb_buf, size, in sq905c_read()
105 if (ret < 0) { in sq905c_read()
110 return 0; in sq905c_read()
117 * threads attempting to use gspca_dev->usb_buf we take the usb_lock when
124 struct gspca_dev *gspca_dev = &dev->gspca_dev; in sq905c_dostream()
138 while (gspca_dev->present && gspca_dev->streaming) { in sq905c_dostream()
140 if (gspca_dev->frozen) in sq905c_dostream()
144 ret = usb_bulk_msg(gspca_dev->dev, in sq905c_dostream()
145 usb_rcvbulkpipe(gspca_dev->dev, 0x81), in sq905c_dostream()
151 if (ret < 0 || act_len < FRAME_HEADER_LEN) in sq905c_dostream()
153 /* size is read from 4 bytes starting 0x40, little endian */ in sq905c_dostream()
154 bytes_left = buffer[0x40]|(buffer[0x41]<<8)|(buffer[0x42]<<16) in sq905c_dostream()
155 |(buffer[0x43]<<24); in sq905c_dostream()
156 gspca_dbg(gspca_dev, D_STREAM, "bytes_left = 0x%x\n", in sq905c_dostream()
162 while (bytes_left > 0 && gspca_dev->present) { in sq905c_dostream()
165 ret = usb_bulk_msg(gspca_dev->dev, in sq905c_dostream()
166 usb_rcvbulkpipe(gspca_dev->dev, 0x81), in sq905c_dostream()
169 if (ret < 0 || act_len < data_len) in sq905c_dostream()
174 bytes_left -= data_len; in sq905c_dostream()
175 if (bytes_left == 0) in sq905c_dostream()
184 if (gspca_dev->present) { in sq905c_dostream()
185 mutex_lock(&gspca_dev->usb_lock); in sq905c_dostream()
186 sq905c_command(gspca_dev, SQ905C_CLEAR, 0); in sq905c_dostream()
187 mutex_unlock(&gspca_dev->usb_lock); in sq905c_dostream()
196 struct cam *cam = &gspca_dev->cam; in sd_config() local
201 "SQ9050 camera detected (vid/pid 0x%04X:0x%04X)\n", in sd_config()
202 id->idVendor, id->idProduct); in sd_config()
204 ret = sq905c_command(gspca_dev, SQ905C_GET_ID, 0); in sd_config()
205 if (ret < 0) { in sd_config()
210 ret = sq905c_read(gspca_dev, 0xf5, 0, 20); in sd_config()
211 if (ret < 0) { in sd_config()
217 "SQ9050 ID string: %02x - %*ph\n", in sd_config()
218 gspca_dev->usb_buf[3], 6, gspca_dev->usb_buf + 14); in sd_config()
220 cam->cam_mode = sq905c_mode; in sd_config()
221 cam->nmodes = 2; in sd_config()
222 if (gspca_dev->usb_buf[15] == 0) in sd_config()
223 cam->nmodes = 1; in sd_config()
225 cam->bulk_size = 32; in sd_config()
226 cam->bulk = 1; in sd_config()
227 INIT_WORK(&dev->work_struct, sq905c_dostream); in sd_config()
228 return 0; in sd_config()
231 /* called on streamoff with alt==0 and on disconnect */
232 /* the usb_lock is held at entry - restore on exit */
238 mutex_unlock(&gspca_dev->usb_lock); in sd_stop0()
240 destroy_workqueue(dev->work_thread); in sd_stop0()
241 dev->work_thread = NULL; in sd_stop0()
242 mutex_lock(&gspca_dev->usb_lock); in sd_stop0()
249 return sq905c_command(gspca_dev, SQ905C_CLEAR, 0); in sd_init()
258 dev->cap_mode = gspca_dev->cam.cam_mode; in sd_start()
260 switch (gspca_dev->pixfmt.width) { in sd_start()
263 dev->cap_mode++; in sd_start()
273 if (ret < 0) { in sd_start()
278 dev->work_thread = create_singlethread_workqueue(MODULE_NAME); in sd_start()
279 if (!dev->work_thread) in sd_start()
280 return -ENOMEM; in sd_start()
282 queue_work(dev->work_thread, &dev->work_struct); in sd_start()
284 return 0; in sd_start()
289 {USB_DEVICE(0x2770, 0x905c)},
290 {USB_DEVICE(0x2770, 0x9050)},
291 {USB_DEVICE(0x2770, 0x9051)},
292 {USB_DEVICE(0x2770, 0x9052)},
293 {USB_DEVICE(0x2770, 0x913d)},
299 /* sub-driver description */
308 /* -- device connect -- */