cpia2_usb.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. /****************************************************************************
  2. *
  3. * Filename: cpia2_usb.c
  4. *
  5. * Copyright 2001, STMicrolectronics, Inc.
  6. * Contact: steve.miller@st.com
  7. *
  8. * Description:
  9. * This is a USB driver for CPia2 based video cameras.
  10. * The infrastructure of this driver is based on the cpia usb driver by
  11. * Jochen Scharrlach and Johannes Erdfeldt.
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License as published by
  15. * the Free Software Foundation; either version 2 of the License, or
  16. * (at your option) any later version.
  17. *
  18. * This program is distributed in the hope that it will be useful,
  19. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * Stripped of 2.4 stuff ready for main kernel submit by
  24. * Alan Cox <alan@lxorguk.ukuu.org.uk>
  25. ****************************************************************************/
  26. #include <linux/kernel.h>
  27. #include <linux/slab.h>
  28. #include <linux/usb.h>
  29. #include <linux/module.h>
  30. #include "cpia2.h"
  31. static int frame_sizes[] = {
  32. 0, // USBIF_CMDONLY
  33. 0, // USBIF_BULK
  34. 128, // USBIF_ISO_1
  35. 384, // USBIF_ISO_2
  36. 640, // USBIF_ISO_3
  37. 768, // USBIF_ISO_4
  38. 896, // USBIF_ISO_5
  39. 1023, // USBIF_ISO_6
  40. };
  41. #define FRAMES_PER_DESC 10
  42. #define FRAME_SIZE_PER_DESC frame_sizes[cam->cur_alt]
  43. static void process_frame(struct camera_data *cam);
  44. static void cpia2_usb_complete(struct urb *urb);
  45. static int cpia2_usb_probe(struct usb_interface *intf,
  46. const struct usb_device_id *id);
  47. static void cpia2_usb_disconnect(struct usb_interface *intf);
  48. static int cpia2_usb_suspend(struct usb_interface *intf, pm_message_t message);
  49. static int cpia2_usb_resume(struct usb_interface *intf);
  50. static void free_sbufs(struct camera_data *cam);
  51. static void add_APPn(struct camera_data *cam);
  52. static void add_COM(struct camera_data *cam);
  53. static int submit_urbs(struct camera_data *cam);
  54. static int set_alternate(struct camera_data *cam, unsigned int alt);
  55. static int configure_transfer_mode(struct camera_data *cam, unsigned int alt);
  56. static struct usb_device_id cpia2_id_table[] = {
  57. {USB_DEVICE(0x0553, 0x0100)},
  58. {USB_DEVICE(0x0553, 0x0140)},
  59. {USB_DEVICE(0x0553, 0x0151)}, /* STV0676 */
  60. {} /* Terminating entry */
  61. };
  62. MODULE_DEVICE_TABLE(usb, cpia2_id_table);
  63. static struct usb_driver cpia2_driver = {
  64. .name = "cpia2",
  65. .probe = cpia2_usb_probe,
  66. .disconnect = cpia2_usb_disconnect,
  67. .suspend = cpia2_usb_suspend,
  68. .resume = cpia2_usb_resume,
  69. .reset_resume = cpia2_usb_resume,
  70. .id_table = cpia2_id_table
  71. };
  72. /******************************************************************************
  73. *
  74. * process_frame
  75. *
  76. *****************************************************************************/
  77. static void process_frame(struct camera_data *cam)
  78. {
  79. static int frame_count;
  80. unsigned char *inbuff = cam->workbuff->data;
  81. DBG("Processing frame #%d, current:%d\n",
  82. cam->workbuff->num, cam->curbuff->num);
  83. if(cam->workbuff->length > cam->workbuff->max_length)
  84. cam->workbuff->max_length = cam->workbuff->length;
  85. if ((inbuff[0] == 0xFF) && (inbuff[1] == 0xD8)) {
  86. frame_count++;
  87. } else {
  88. cam->workbuff->status = FRAME_ERROR;
  89. DBG("Start of frame not found\n");
  90. return;
  91. }
  92. /***
  93. * Now the output buffer should have a JPEG image in it.
  94. ***/
  95. if(!cam->first_image_seen) {
  96. /* Always skip the first image after streaming
  97. * starts. It is almost certainly corrupt. */
  98. cam->first_image_seen = 1;
  99. cam->workbuff->status = FRAME_EMPTY;
  100. return;
  101. }
  102. if (cam->workbuff->length > 3) {
  103. if(cam->mmapped &&
  104. cam->workbuff->length < cam->workbuff->max_length) {
  105. /* No junk in the buffers */
  106. memset(cam->workbuff->data+cam->workbuff->length,
  107. 0, cam->workbuff->max_length-
  108. cam->workbuff->length);
  109. }
  110. cam->workbuff->max_length = cam->workbuff->length;
  111. cam->workbuff->status = FRAME_READY;
  112. if(!cam->mmapped && cam->num_frames > 2) {
  113. /* During normal reading, the most recent
  114. * frame will be read. If the current frame
  115. * hasn't started reading yet, it will never
  116. * be read, so mark it empty. If the buffer is
  117. * mmapped, or we have few buffers, we need to
  118. * wait for the user to free the buffer.
  119. *
  120. * NOTE: This is not entirely foolproof with 3
  121. * buffers, but it would take an EXTREMELY
  122. * overloaded system to cause problems (possible
  123. * image data corruption). Basically, it would
  124. * need to take more time to execute cpia2_read
  125. * than it would for the camera to send
  126. * cam->num_frames-2 frames before problems
  127. * could occur.
  128. */
  129. cam->curbuff->status = FRAME_EMPTY;
  130. }
  131. cam->curbuff = cam->workbuff;
  132. cam->workbuff = cam->workbuff->next;
  133. DBG("Changed buffers, work:%d, current:%d\n",
  134. cam->workbuff->num, cam->curbuff->num);
  135. return;
  136. } else {
  137. DBG("Not enough data for an image.\n");
  138. }
  139. cam->workbuff->status = FRAME_ERROR;
  140. return;
  141. }
  142. /******************************************************************************
  143. *
  144. * add_APPn
  145. *
  146. * Adds a user specified APPn record
  147. *****************************************************************************/
  148. static void add_APPn(struct camera_data *cam)
  149. {
  150. if(cam->APP_len > 0) {
  151. cam->workbuff->data[cam->workbuff->length++] = 0xFF;
  152. cam->workbuff->data[cam->workbuff->length++] = 0xE0+cam->APPn;
  153. cam->workbuff->data[cam->workbuff->length++] = 0;
  154. cam->workbuff->data[cam->workbuff->length++] = cam->APP_len+2;
  155. memcpy(cam->workbuff->data+cam->workbuff->length,
  156. cam->APP_data, cam->APP_len);
  157. cam->workbuff->length += cam->APP_len;
  158. }
  159. }
  160. /******************************************************************************
  161. *
  162. * add_COM
  163. *
  164. * Adds a user specified COM record
  165. *****************************************************************************/
  166. static void add_COM(struct camera_data *cam)
  167. {
  168. if(cam->COM_len > 0) {
  169. cam->workbuff->data[cam->workbuff->length++] = 0xFF;
  170. cam->workbuff->data[cam->workbuff->length++] = 0xFE;
  171. cam->workbuff->data[cam->workbuff->length++] = 0;
  172. cam->workbuff->data[cam->workbuff->length++] = cam->COM_len+2;
  173. memcpy(cam->workbuff->data+cam->workbuff->length,
  174. cam->COM_data, cam->COM_len);
  175. cam->workbuff->length += cam->COM_len;
  176. }
  177. }
  178. /******************************************************************************
  179. *
  180. * cpia2_usb_complete
  181. *
  182. * callback when incoming packet is received
  183. *****************************************************************************/
  184. static void cpia2_usb_complete(struct urb *urb)
  185. {
  186. int i;
  187. unsigned char *cdata;
  188. static bool frame_ready = false;
  189. struct camera_data *cam = (struct camera_data *) urb->context;
  190. if (urb->status!=0) {
  191. if (!(urb->status == -ENOENT ||
  192. urb->status == -ECONNRESET ||
  193. urb->status == -ESHUTDOWN))
  194. {
  195. DBG("urb->status = %d!\n", urb->status);
  196. }
  197. DBG("Stopping streaming\n");
  198. return;
  199. }
  200. if (!cam->streaming || !video_is_registered(&cam->vdev)) {
  201. LOG("Will now stop the streaming: streaming = %d, present=%d\n",
  202. cam->streaming, video_is_registered(&cam->vdev));
  203. return;
  204. }
  205. /***
  206. * Packet collater
  207. ***/
  208. //DBG("Collating %d packets\n", urb->number_of_packets);
  209. for (i = 0; i < urb->number_of_packets; i++) {
  210. u16 checksum, iso_checksum;
  211. int j;
  212. int n = urb->iso_frame_desc[i].actual_length;
  213. int st = urb->iso_frame_desc[i].status;
  214. if(cam->workbuff->status == FRAME_READY) {
  215. struct framebuf *ptr;
  216. /* Try to find an available buffer */
  217. DBG("workbuff full, searching\n");
  218. for (ptr = cam->workbuff->next;
  219. ptr != cam->workbuff;
  220. ptr = ptr->next)
  221. {
  222. if (ptr->status == FRAME_EMPTY) {
  223. ptr->status = FRAME_READING;
  224. ptr->length = 0;
  225. break;
  226. }
  227. }
  228. if (ptr == cam->workbuff)
  229. break; /* No READING or EMPTY buffers left */
  230. cam->workbuff = ptr;
  231. }
  232. if (cam->workbuff->status == FRAME_EMPTY ||
  233. cam->workbuff->status == FRAME_ERROR) {
  234. cam->workbuff->status = FRAME_READING;
  235. cam->workbuff->length = 0;
  236. }
  237. //DBG(" Packet %d length = %d, status = %d\n", i, n, st);
  238. cdata = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
  239. if (st) {
  240. LOG("cpia2 data error: [%d] len=%d, status = %d\n",
  241. i, n, st);
  242. if(!ALLOW_CORRUPT)
  243. cam->workbuff->status = FRAME_ERROR;
  244. continue;
  245. }
  246. if(n<=2)
  247. continue;
  248. checksum = 0;
  249. for(j=0; j<n-2; ++j)
  250. checksum += cdata[j];
  251. iso_checksum = cdata[j] + cdata[j+1]*256;
  252. if(checksum != iso_checksum) {
  253. LOG("checksum mismatch: [%d] len=%d, calculated = %x, checksum = %x\n",
  254. i, n, (int)checksum, (int)iso_checksum);
  255. if(!ALLOW_CORRUPT) {
  256. cam->workbuff->status = FRAME_ERROR;
  257. continue;
  258. }
  259. }
  260. n -= 2;
  261. if(cam->workbuff->status != FRAME_READING) {
  262. if((0xFF == cdata[0] && 0xD8 == cdata[1]) ||
  263. (0xD8 == cdata[0] && 0xFF == cdata[1] &&
  264. 0 != cdata[2])) {
  265. /* frame is skipped, but increment total
  266. * frame count anyway */
  267. cam->frame_count++;
  268. }
  269. DBG("workbuff not reading, status=%d\n",
  270. cam->workbuff->status);
  271. continue;
  272. }
  273. if (cam->frame_size < cam->workbuff->length + n) {
  274. ERR("buffer overflow! length: %d, n: %d\n",
  275. cam->workbuff->length, n);
  276. cam->workbuff->status = FRAME_ERROR;
  277. if(cam->workbuff->length > cam->workbuff->max_length)
  278. cam->workbuff->max_length =
  279. cam->workbuff->length;
  280. continue;
  281. }
  282. if (cam->workbuff->length == 0) {
  283. int data_offset;
  284. if ((0xD8 == cdata[0]) && (0xFF == cdata[1])) {
  285. data_offset = 1;
  286. } else if((0xFF == cdata[0]) && (0xD8 == cdata[1])
  287. && (0xFF == cdata[2])) {
  288. data_offset = 2;
  289. } else {
  290. DBG("Ignoring packet, not beginning!\n");
  291. continue;
  292. }
  293. DBG("Start of frame pattern found\n");
  294. v4l2_get_timestamp(&cam->workbuff->timestamp);
  295. cam->workbuff->seq = cam->frame_count++;
  296. cam->workbuff->data[0] = 0xFF;
  297. cam->workbuff->data[1] = 0xD8;
  298. cam->workbuff->length = 2;
  299. add_APPn(cam);
  300. add_COM(cam);
  301. memcpy(cam->workbuff->data+cam->workbuff->length,
  302. cdata+data_offset, n-data_offset);
  303. cam->workbuff->length += n-data_offset;
  304. } else if (cam->workbuff->length > 0) {
  305. memcpy(cam->workbuff->data + cam->workbuff->length,
  306. cdata, n);
  307. cam->workbuff->length += n;
  308. }
  309. if ((cam->workbuff->length >= 3) &&
  310. (cam->workbuff->data[cam->workbuff->length - 3] == 0xFF) &&
  311. (cam->workbuff->data[cam->workbuff->length - 2] == 0xD9) &&
  312. (cam->workbuff->data[cam->workbuff->length - 1] == 0xFF)) {
  313. frame_ready = true;
  314. cam->workbuff->data[cam->workbuff->length - 1] = 0;
  315. cam->workbuff->length -= 1;
  316. } else if ((cam->workbuff->length >= 2) &&
  317. (cam->workbuff->data[cam->workbuff->length - 2] == 0xFF) &&
  318. (cam->workbuff->data[cam->workbuff->length - 1] == 0xD9)) {
  319. frame_ready = true;
  320. }
  321. if (frame_ready) {
  322. DBG("Workbuff image size = %d\n",cam->workbuff->length);
  323. process_frame(cam);
  324. frame_ready = false;
  325. if (waitqueue_active(&cam->wq_stream))
  326. wake_up_interruptible(&cam->wq_stream);
  327. }
  328. }
  329. if(cam->streaming) {
  330. /* resubmit */
  331. urb->dev = cam->dev;
  332. if ((i = usb_submit_urb(urb, GFP_ATOMIC)) != 0)
  333. ERR("%s: usb_submit_urb ret %d!\n", __func__, i);
  334. }
  335. }
  336. /******************************************************************************
  337. *
  338. * configure_transfer_mode
  339. *
  340. *****************************************************************************/
  341. static int configure_transfer_mode(struct camera_data *cam, unsigned int alt)
  342. {
  343. static unsigned char iso_regs[8][4] = {
  344. {0x00, 0x00, 0x00, 0x00},
  345. {0x00, 0x00, 0x00, 0x00},
  346. {0xB9, 0x00, 0x00, 0x7E},
  347. {0xB9, 0x00, 0x01, 0x7E},
  348. {0xB9, 0x00, 0x02, 0x7E},
  349. {0xB9, 0x00, 0x02, 0xFE},
  350. {0xB9, 0x00, 0x03, 0x7E},
  351. {0xB9, 0x00, 0x03, 0xFD}
  352. };
  353. struct cpia2_command cmd;
  354. unsigned char reg;
  355. if (!video_is_registered(&cam->vdev))
  356. return -ENODEV;
  357. /***
  358. * Write the isoc registers according to the alternate selected
  359. ***/
  360. cmd.direction = TRANSFER_WRITE;
  361. cmd.buffer.block_data[0] = iso_regs[alt][0];
  362. cmd.buffer.block_data[1] = iso_regs[alt][1];
  363. cmd.buffer.block_data[2] = iso_regs[alt][2];
  364. cmd.buffer.block_data[3] = iso_regs[alt][3];
  365. cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
  366. cmd.start = CPIA2_VC_USB_ISOLIM;
  367. cmd.reg_count = 4;
  368. cpia2_send_command(cam, &cmd);
  369. /***
  370. * Enable relevant streams before starting polling.
  371. * First read USB Stream Config Register.
  372. ***/
  373. cmd.direction = TRANSFER_READ;
  374. cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
  375. cmd.start = CPIA2_VC_USB_STRM;
  376. cmd.reg_count = 1;
  377. cpia2_send_command(cam, &cmd);
  378. reg = cmd.buffer.block_data[0];
  379. /* Clear iso, bulk, and int */
  380. reg &= ~(CPIA2_VC_USB_STRM_BLK_ENABLE |
  381. CPIA2_VC_USB_STRM_ISO_ENABLE |
  382. CPIA2_VC_USB_STRM_INT_ENABLE);
  383. if (alt == USBIF_BULK) {
  384. DBG("Enabling bulk xfer\n");
  385. reg |= CPIA2_VC_USB_STRM_BLK_ENABLE; /* Enable Bulk */
  386. cam->xfer_mode = XFER_BULK;
  387. } else if (alt >= USBIF_ISO_1) {
  388. DBG("Enabling ISOC xfer\n");
  389. reg |= CPIA2_VC_USB_STRM_ISO_ENABLE;
  390. cam->xfer_mode = XFER_ISOC;
  391. }
  392. cmd.buffer.block_data[0] = reg;
  393. cmd.direction = TRANSFER_WRITE;
  394. cmd.start = CPIA2_VC_USB_STRM;
  395. cmd.reg_count = 1;
  396. cmd.req_mode = CAMERAACCESS_TYPE_BLOCK | CAMERAACCESS_VC;
  397. cpia2_send_command(cam, &cmd);
  398. return 0;
  399. }
  400. /******************************************************************************
  401. *
  402. * cpia2_usb_change_streaming_alternate
  403. *
  404. *****************************************************************************/
  405. int cpia2_usb_change_streaming_alternate(struct camera_data *cam,
  406. unsigned int alt)
  407. {
  408. int ret = 0;
  409. if(alt < USBIF_ISO_1 || alt > USBIF_ISO_6)
  410. return -EINVAL;
  411. if(alt == cam->params.camera_state.stream_mode)
  412. return 0;
  413. cpia2_usb_stream_pause(cam);
  414. configure_transfer_mode(cam, alt);
  415. cam->params.camera_state.stream_mode = alt;
  416. /* Reset the camera to prevent image quality degradation */
  417. cpia2_reset_camera(cam);
  418. cpia2_usb_stream_resume(cam);
  419. return ret;
  420. }
  421. /******************************************************************************
  422. *
  423. * set_alternate
  424. *
  425. *****************************************************************************/
  426. static int set_alternate(struct camera_data *cam, unsigned int alt)
  427. {
  428. int ret = 0;
  429. if(alt == cam->cur_alt)
  430. return 0;
  431. if (cam->cur_alt != USBIF_CMDONLY) {
  432. DBG("Changing from alt %d to %d\n", cam->cur_alt, USBIF_CMDONLY);
  433. ret = usb_set_interface(cam->dev, cam->iface, USBIF_CMDONLY);
  434. if (ret != 0)
  435. return ret;
  436. }
  437. if (alt != USBIF_CMDONLY) {
  438. DBG("Changing from alt %d to %d\n", USBIF_CMDONLY, alt);
  439. ret = usb_set_interface(cam->dev, cam->iface, alt);
  440. if (ret != 0)
  441. return ret;
  442. }
  443. cam->old_alt = cam->cur_alt;
  444. cam->cur_alt = alt;
  445. return ret;
  446. }
  447. /******************************************************************************
  448. *
  449. * free_sbufs
  450. *
  451. * Free all cam->sbuf[]. All non-NULL .data and .urb members that are non-NULL
  452. * are assumed to be allocated. Non-NULL .urb members are also assumed to be
  453. * submitted (and must therefore be killed before they are freed).
  454. *****************************************************************************/
  455. static void free_sbufs(struct camera_data *cam)
  456. {
  457. int i;
  458. for (i = 0; i < NUM_SBUF; i++) {
  459. if(cam->sbuf[i].urb) {
  460. usb_kill_urb(cam->sbuf[i].urb);
  461. usb_free_urb(cam->sbuf[i].urb);
  462. cam->sbuf[i].urb = NULL;
  463. }
  464. if(cam->sbuf[i].data) {
  465. kfree(cam->sbuf[i].data);
  466. cam->sbuf[i].data = NULL;
  467. }
  468. }
  469. }
  470. /*******
  471. * Convenience functions
  472. *******/
  473. /****************************************************************************
  474. *
  475. * write_packet
  476. *
  477. ***************************************************************************/
  478. static int write_packet(struct usb_device *udev,
  479. u8 request, u8 * registers, u16 start, size_t size)
  480. {
  481. unsigned char *buf;
  482. int ret;
  483. if (!registers || size <= 0)
  484. return -EINVAL;
  485. buf = kmemdup(registers, size, GFP_KERNEL);
  486. if (!buf)
  487. return -ENOMEM;
  488. ret = usb_control_msg(udev,
  489. usb_sndctrlpipe(udev, 0),
  490. request,
  491. USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  492. start, /* value */
  493. 0, /* index */
  494. buf, /* buffer */
  495. size,
  496. HZ);
  497. kfree(buf);
  498. return ret;
  499. }
  500. /****************************************************************************
  501. *
  502. * read_packet
  503. *
  504. ***************************************************************************/
  505. static int read_packet(struct usb_device *udev,
  506. u8 request, u8 * registers, u16 start, size_t size)
  507. {
  508. unsigned char *buf;
  509. int ret;
  510. if (!registers || size <= 0)
  511. return -EINVAL;
  512. buf = kmalloc(size, GFP_KERNEL);
  513. if (!buf)
  514. return -ENOMEM;
  515. ret = usb_control_msg(udev,
  516. usb_rcvctrlpipe(udev, 0),
  517. request,
  518. USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_DEVICE,
  519. start, /* value */
  520. 0, /* index */
  521. buf, /* buffer */
  522. size,
  523. HZ);
  524. if (ret >= 0)
  525. memcpy(registers, buf, size);
  526. kfree(buf);
  527. return ret;
  528. }
  529. /******************************************************************************
  530. *
  531. * cpia2_usb_transfer_cmd
  532. *
  533. *****************************************************************************/
  534. int cpia2_usb_transfer_cmd(struct camera_data *cam,
  535. void *registers,
  536. u8 request, u8 start, u8 count, u8 direction)
  537. {
  538. int err = 0;
  539. struct usb_device *udev = cam->dev;
  540. if (!udev) {
  541. ERR("%s: Internal driver error: udev is NULL\n", __func__);
  542. return -EINVAL;
  543. }
  544. if (!registers) {
  545. ERR("%s: Internal driver error: register array is NULL\n", __func__);
  546. return -EINVAL;
  547. }
  548. if (direction == TRANSFER_READ) {
  549. err = read_packet(udev, request, (u8 *)registers, start, count);
  550. if (err > 0)
  551. err = 0;
  552. } else if (direction == TRANSFER_WRITE) {
  553. err =write_packet(udev, request, (u8 *)registers, start, count);
  554. if (err < 0) {
  555. LOG("Control message failed, err val = %d\n", err);
  556. LOG("Message: request = 0x%0X, start = 0x%0X\n",
  557. request, start);
  558. LOG("Message: count = %d, register[0] = 0x%0X\n",
  559. count, ((unsigned char *) registers)[0]);
  560. } else
  561. err=0;
  562. } else {
  563. LOG("Unexpected first byte of direction: %d\n",
  564. direction);
  565. return -EINVAL;
  566. }
  567. if(err != 0)
  568. LOG("Unexpected error: %d\n", err);
  569. return err;
  570. }
  571. /******************************************************************************
  572. *
  573. * submit_urbs
  574. *
  575. *****************************************************************************/
  576. static int submit_urbs(struct camera_data *cam)
  577. {
  578. struct urb *urb;
  579. int fx, err, i, j;
  580. for(i=0; i<NUM_SBUF; ++i) {
  581. if (cam->sbuf[i].data)
  582. continue;
  583. cam->sbuf[i].data =
  584. kmalloc(FRAMES_PER_DESC * FRAME_SIZE_PER_DESC, GFP_KERNEL);
  585. if (!cam->sbuf[i].data) {
  586. while (--i >= 0) {
  587. kfree(cam->sbuf[i].data);
  588. cam->sbuf[i].data = NULL;
  589. }
  590. return -ENOMEM;
  591. }
  592. }
  593. /* We double buffer the Isoc lists, and also know the polling
  594. * interval is every frame (1 == (1 << (bInterval -1))).
  595. */
  596. for(i=0; i<NUM_SBUF; ++i) {
  597. if(cam->sbuf[i].urb) {
  598. continue;
  599. }
  600. urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
  601. if (!urb) {
  602. for (j = 0; j < i; j++)
  603. usb_free_urb(cam->sbuf[j].urb);
  604. return -ENOMEM;
  605. }
  606. cam->sbuf[i].urb = urb;
  607. urb->dev = cam->dev;
  608. urb->context = cam;
  609. urb->pipe = usb_rcvisocpipe(cam->dev, 1 /*ISOC endpoint*/);
  610. urb->transfer_flags = URB_ISO_ASAP;
  611. urb->transfer_buffer = cam->sbuf[i].data;
  612. urb->complete = cpia2_usb_complete;
  613. urb->number_of_packets = FRAMES_PER_DESC;
  614. urb->interval = 1;
  615. urb->transfer_buffer_length =
  616. FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
  617. for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
  618. urb->iso_frame_desc[fx].offset =
  619. FRAME_SIZE_PER_DESC * fx;
  620. urb->iso_frame_desc[fx].length = FRAME_SIZE_PER_DESC;
  621. }
  622. }
  623. /* Queue the ISO urbs, and resubmit in the completion handler */
  624. for(i=0; i<NUM_SBUF; ++i) {
  625. err = usb_submit_urb(cam->sbuf[i].urb, GFP_KERNEL);
  626. if (err) {
  627. ERR("usb_submit_urb[%d]() = %d\n", i, err);
  628. return err;
  629. }
  630. }
  631. return 0;
  632. }
  633. /******************************************************************************
  634. *
  635. * cpia2_usb_stream_start
  636. *
  637. *****************************************************************************/
  638. int cpia2_usb_stream_start(struct camera_data *cam, unsigned int alternate)
  639. {
  640. int ret;
  641. int old_alt;
  642. if(cam->streaming)
  643. return 0;
  644. if (cam->flush) {
  645. int i;
  646. DBG("Flushing buffers\n");
  647. for(i=0; i<cam->num_frames; ++i) {
  648. cam->buffers[i].status = FRAME_EMPTY;
  649. cam->buffers[i].length = 0;
  650. }
  651. cam->curbuff = &cam->buffers[0];
  652. cam->workbuff = cam->curbuff->next;
  653. cam->flush = false;
  654. }
  655. old_alt = cam->params.camera_state.stream_mode;
  656. cam->params.camera_state.stream_mode = 0;
  657. ret = cpia2_usb_change_streaming_alternate(cam, alternate);
  658. if (ret < 0) {
  659. int ret2;
  660. ERR("cpia2_usb_change_streaming_alternate() = %d!\n", ret);
  661. cam->params.camera_state.stream_mode = old_alt;
  662. ret2 = set_alternate(cam, USBIF_CMDONLY);
  663. if (ret2 < 0) {
  664. ERR("cpia2_usb_change_streaming_alternate(%d) =%d has already failed. Then tried to call set_alternate(USBIF_CMDONLY) = %d.\n",
  665. alternate, ret, ret2);
  666. }
  667. } else {
  668. cam->frame_count = 0;
  669. cam->streaming = 1;
  670. ret = cpia2_usb_stream_resume(cam);
  671. }
  672. return ret;
  673. }
  674. /******************************************************************************
  675. *
  676. * cpia2_usb_stream_pause
  677. *
  678. *****************************************************************************/
  679. int cpia2_usb_stream_pause(struct camera_data *cam)
  680. {
  681. int ret = 0;
  682. if(cam->streaming) {
  683. free_sbufs(cam);
  684. ret = set_alternate(cam, USBIF_CMDONLY);
  685. }
  686. return ret;
  687. }
  688. /******************************************************************************
  689. *
  690. * cpia2_usb_stream_resume
  691. *
  692. *****************************************************************************/
  693. int cpia2_usb_stream_resume(struct camera_data *cam)
  694. {
  695. int ret = 0;
  696. if(cam->streaming) {
  697. cam->first_image_seen = 0;
  698. ret = set_alternate(cam, cam->params.camera_state.stream_mode);
  699. if(ret == 0) {
  700. /* for some reason the user effects need to be set
  701. again when starting streaming. */
  702. cpia2_do_command(cam, CPIA2_CMD_SET_USER_EFFECTS, TRANSFER_WRITE,
  703. cam->params.vp_params.user_effects);
  704. ret = submit_urbs(cam);
  705. }
  706. }
  707. return ret;
  708. }
  709. /******************************************************************************
  710. *
  711. * cpia2_usb_stream_stop
  712. *
  713. *****************************************************************************/
  714. int cpia2_usb_stream_stop(struct camera_data *cam)
  715. {
  716. int ret;
  717. ret = cpia2_usb_stream_pause(cam);
  718. cam->streaming = 0;
  719. configure_transfer_mode(cam, 0);
  720. return ret;
  721. }
  722. /******************************************************************************
  723. *
  724. * cpia2_usb_probe
  725. *
  726. * Probe and initialize.
  727. *****************************************************************************/
  728. static int cpia2_usb_probe(struct usb_interface *intf,
  729. const struct usb_device_id *id)
  730. {
  731. struct usb_device *udev = interface_to_usbdev(intf);
  732. struct usb_interface_descriptor *interface;
  733. struct camera_data *cam;
  734. int ret;
  735. /* A multi-config CPiA2 camera? */
  736. if (udev->descriptor.bNumConfigurations != 1)
  737. return -ENODEV;
  738. interface = &intf->cur_altsetting->desc;
  739. /* If we get to this point, we found a CPiA2 camera */
  740. LOG("CPiA2 USB camera found\n");
  741. cam = cpia2_init_camera_struct(intf);
  742. if (cam == NULL)
  743. return -ENOMEM;
  744. cam->dev = udev;
  745. cam->iface = interface->bInterfaceNumber;
  746. ret = set_alternate(cam, USBIF_CMDONLY);
  747. if (ret < 0) {
  748. ERR("%s: usb_set_interface error (ret = %d)\n", __func__, ret);
  749. kfree(cam);
  750. return ret;
  751. }
  752. if((ret = cpia2_init_camera(cam)) < 0) {
  753. ERR("%s: failed to initialize cpia2 camera (ret = %d)\n", __func__, ret);
  754. kfree(cam);
  755. return ret;
  756. }
  757. LOG(" CPiA Version: %d.%02d (%d.%d)\n",
  758. cam->params.version.firmware_revision_hi,
  759. cam->params.version.firmware_revision_lo,
  760. cam->params.version.asic_id,
  761. cam->params.version.asic_rev);
  762. LOG(" CPiA PnP-ID: %04x:%04x:%04x\n",
  763. cam->params.pnp_id.vendor,
  764. cam->params.pnp_id.product,
  765. cam->params.pnp_id.device_revision);
  766. LOG(" SensorID: %d.(version %d)\n",
  767. cam->params.version.sensor_flags,
  768. cam->params.version.sensor_rev);
  769. usb_set_intfdata(intf, cam);
  770. ret = cpia2_register_camera(cam);
  771. if (ret < 0) {
  772. ERR("%s: Failed to register cpia2 camera (ret = %d)\n", __func__, ret);
  773. kfree(cam);
  774. return ret;
  775. }
  776. return 0;
  777. }
  778. /******************************************************************************
  779. *
  780. * cpia2_disconnect
  781. *
  782. *****************************************************************************/
  783. static void cpia2_usb_disconnect(struct usb_interface *intf)
  784. {
  785. struct camera_data *cam = usb_get_intfdata(intf);
  786. usb_set_intfdata(intf, NULL);
  787. DBG("Stopping stream\n");
  788. cpia2_usb_stream_stop(cam);
  789. mutex_lock(&cam->v4l2_lock);
  790. DBG("Unregistering camera\n");
  791. cpia2_unregister_camera(cam);
  792. v4l2_device_disconnect(&cam->v4l2_dev);
  793. mutex_unlock(&cam->v4l2_lock);
  794. v4l2_device_put(&cam->v4l2_dev);
  795. if(cam->buffers) {
  796. DBG("Wakeup waiting processes\n");
  797. cam->curbuff->status = FRAME_READY;
  798. cam->curbuff->length = 0;
  799. wake_up_interruptible(&cam->wq_stream);
  800. }
  801. DBG("Releasing interface\n");
  802. usb_driver_release_interface(&cpia2_driver, intf);
  803. LOG("CPiA2 camera disconnected.\n");
  804. }
  805. static int cpia2_usb_suspend(struct usb_interface *intf, pm_message_t message)
  806. {
  807. struct camera_data *cam = usb_get_intfdata(intf);
  808. mutex_lock(&cam->v4l2_lock);
  809. if (cam->streaming) {
  810. cpia2_usb_stream_stop(cam);
  811. cam->streaming = 1;
  812. }
  813. mutex_unlock(&cam->v4l2_lock);
  814. dev_info(&intf->dev, "going into suspend..\n");
  815. return 0;
  816. }
  817. /* Resume device - start device. */
  818. static int cpia2_usb_resume(struct usb_interface *intf)
  819. {
  820. struct camera_data *cam = usb_get_intfdata(intf);
  821. mutex_lock(&cam->v4l2_lock);
  822. v4l2_ctrl_handler_setup(&cam->hdl);
  823. if (cam->streaming) {
  824. cam->streaming = 0;
  825. cpia2_usb_stream_start(cam,
  826. cam->params.camera_state.stream_mode);
  827. }
  828. mutex_unlock(&cam->v4l2_lock);
  829. dev_info(&intf->dev, "coming out of suspend..\n");
  830. return 0;
  831. }
  832. /******************************************************************************
  833. *
  834. * usb_cpia2_init
  835. *
  836. *****************************************************************************/
  837. int cpia2_usb_init(void)
  838. {
  839. return usb_register(&cpia2_driver);
  840. }
  841. /******************************************************************************
  842. *
  843. * usb_cpia_cleanup
  844. *
  845. *****************************************************************************/
  846. void cpia2_usb_cleanup(void)
  847. {
  848. schedule_timeout(2 * HZ);
  849. usb_deregister(&cpia2_driver);
  850. }