cpia2_usb.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  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. * You should have received a copy of the GNU General Public License
  24. * along with this program; if not, write to the Free Software
  25. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26. *
  27. * Stripped of 2.4 stuff ready for main kernel submit by
  28. * Alan Cox <alan@lxorguk.ukuu.org.uk>
  29. ****************************************************************************/
  30. #include <linux/kernel.h>
  31. #include <linux/slab.h>
  32. #include <linux/usb.h>
  33. #include <linux/module.h>
  34. #include "cpia2.h"
  35. static int frame_sizes[] = {
  36. 0, // USBIF_CMDONLY
  37. 0, // USBIF_BULK
  38. 128, // USBIF_ISO_1
  39. 384, // USBIF_ISO_2
  40. 640, // USBIF_ISO_3
  41. 768, // USBIF_ISO_4
  42. 896, // USBIF_ISO_5
  43. 1023, // USBIF_ISO_6
  44. };
  45. #define FRAMES_PER_DESC 10
  46. #define FRAME_SIZE_PER_DESC frame_sizes[cam->cur_alt]
  47. static void process_frame(struct camera_data *cam);
  48. static void cpia2_usb_complete(struct urb *urb);
  49. static int cpia2_usb_probe(struct usb_interface *intf,
  50. const struct usb_device_id *id);
  51. static void cpia2_usb_disconnect(struct usb_interface *intf);
  52. static void free_sbufs(struct camera_data *cam);
  53. static void add_APPn(struct camera_data *cam);
  54. static void add_COM(struct camera_data *cam);
  55. static int submit_urbs(struct camera_data *cam);
  56. static int set_alternate(struct camera_data *cam, unsigned int alt);
  57. static int configure_transfer_mode(struct camera_data *cam, unsigned int alt);
  58. static struct usb_device_id cpia2_id_table[] = {
  59. {USB_DEVICE(0x0553, 0x0100)},
  60. {USB_DEVICE(0x0553, 0x0140)},
  61. {USB_DEVICE(0x0553, 0x0151)}, /* STV0676 */
  62. {} /* Terminating entry */
  63. };
  64. MODULE_DEVICE_TABLE(usb, cpia2_id_table);
  65. static struct usb_driver cpia2_driver = {
  66. .name = "cpia2",
  67. .probe = cpia2_usb_probe,
  68. .disconnect = cpia2_usb_disconnect,
  69. .id_table = cpia2_id_table
  70. };
  71. /******************************************************************************
  72. *
  73. * process_frame
  74. *
  75. *****************************************************************************/
  76. static void process_frame(struct camera_data *cam)
  77. {
  78. static int frame_count;
  79. unsigned char *inbuff = cam->workbuff->data;
  80. DBG("Processing frame #%d, current:%d\n",
  81. cam->workbuff->num, cam->curbuff->num);
  82. if(cam->workbuff->length > cam->workbuff->max_length)
  83. cam->workbuff->max_length = cam->workbuff->length;
  84. if ((inbuff[0] == 0xFF) && (inbuff[1] == 0xD8)) {
  85. frame_count++;
  86. } else {
  87. cam->workbuff->status = FRAME_ERROR;
  88. DBG("Start of frame not found\n");
  89. return;
  90. }
  91. /***
  92. * Now the output buffer should have a JPEG image in it.
  93. ***/
  94. if(!cam->first_image_seen) {
  95. /* Always skip the first image after streaming
  96. * starts. It is almost certainly corrupt. */
  97. cam->first_image_seen = 1;
  98. cam->workbuff->status = FRAME_EMPTY;
  99. return;
  100. }
  101. if (cam->workbuff->length > 3) {
  102. if(cam->mmapped &&
  103. cam->workbuff->length < cam->workbuff->max_length) {
  104. /* No junk in the buffers */
  105. memset(cam->workbuff->data+cam->workbuff->length,
  106. 0, cam->workbuff->max_length-
  107. cam->workbuff->length);
  108. }
  109. cam->workbuff->max_length = cam->workbuff->length;
  110. cam->workbuff->status = FRAME_READY;
  111. if(!cam->mmapped && cam->num_frames > 2) {
  112. /* During normal reading, the most recent
  113. * frame will be read. If the current frame
  114. * hasn't started reading yet, it will never
  115. * be read, so mark it empty. If the buffer is
  116. * mmapped, or we have few buffers, we need to
  117. * wait for the user to free the buffer.
  118. *
  119. * NOTE: This is not entirely foolproof with 3
  120. * buffers, but it would take an EXTREMELY
  121. * overloaded system to cause problems (possible
  122. * image data corruption). Basically, it would
  123. * need to take more time to execute cpia2_read
  124. * than it would for the camera to send
  125. * cam->num_frames-2 frames before problems
  126. * could occur.
  127. */
  128. cam->curbuff->status = FRAME_EMPTY;
  129. }
  130. cam->curbuff = cam->workbuff;
  131. cam->workbuff = cam->workbuff->next;
  132. DBG("Changed buffers, work:%d, current:%d\n",
  133. cam->workbuff->num, cam->curbuff->num);
  134. return;
  135. } else {
  136. DBG("Not enough data for an image.\n");
  137. }
  138. cam->workbuff->status = FRAME_ERROR;
  139. return;
  140. }
  141. /******************************************************************************
  142. *
  143. * add_APPn
  144. *
  145. * Adds a user specified APPn record
  146. *****************************************************************************/
  147. static void add_APPn(struct camera_data *cam)
  148. {
  149. if(cam->APP_len > 0) {
  150. cam->workbuff->data[cam->workbuff->length++] = 0xFF;
  151. cam->workbuff->data[cam->workbuff->length++] = 0xE0+cam->APPn;
  152. cam->workbuff->data[cam->workbuff->length++] = 0;
  153. cam->workbuff->data[cam->workbuff->length++] = cam->APP_len+2;
  154. memcpy(cam->workbuff->data+cam->workbuff->length,
  155. cam->APP_data, cam->APP_len);
  156. cam->workbuff->length += cam->APP_len;
  157. }
  158. }
  159. /******************************************************************************
  160. *
  161. * add_COM
  162. *
  163. * Adds a user specified COM record
  164. *****************************************************************************/
  165. static void add_COM(struct camera_data *cam)
  166. {
  167. if(cam->COM_len > 0) {
  168. cam->workbuff->data[cam->workbuff->length++] = 0xFF;
  169. cam->workbuff->data[cam->workbuff->length++] = 0xFE;
  170. cam->workbuff->data[cam->workbuff->length++] = 0;
  171. cam->workbuff->data[cam->workbuff->length++] = cam->COM_len+2;
  172. memcpy(cam->workbuff->data+cam->workbuff->length,
  173. cam->COM_data, cam->COM_len);
  174. cam->workbuff->length += cam->COM_len;
  175. }
  176. }
  177. /******************************************************************************
  178. *
  179. * cpia2_usb_complete
  180. *
  181. * callback when incoming packet is received
  182. *****************************************************************************/
  183. static void cpia2_usb_complete(struct urb *urb)
  184. {
  185. int i;
  186. unsigned char *cdata;
  187. static int frame_ready = false;
  188. struct camera_data *cam = (struct camera_data *) urb->context;
  189. if (urb->status!=0) {
  190. if (!(urb->status == -ENOENT ||
  191. urb->status == -ECONNRESET ||
  192. urb->status == -ESHUTDOWN))
  193. {
  194. DBG("urb->status = %d!\n", urb->status);
  195. }
  196. DBG("Stopping streaming\n");
  197. return;
  198. }
  199. if (!cam->streaming || !cam->present || cam->open_count == 0) {
  200. LOG("Will now stop the streaming: streaming = %d, "
  201. "present=%d, open_count=%d\n",
  202. cam->streaming, cam->present, cam->open_count);
  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. do_gettimeofday(&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(!cam->present)
  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. if (!registers || size <= 0)
  482. return -EINVAL;
  483. return usb_control_msg(udev,
  484. usb_sndctrlpipe(udev, 0),
  485. request,
  486. USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  487. start, /* value */
  488. 0, /* index */
  489. registers, /* buffer */
  490. size,
  491. HZ);
  492. }
  493. /****************************************************************************
  494. *
  495. * read_packet
  496. *
  497. ***************************************************************************/
  498. static int read_packet(struct usb_device *udev,
  499. u8 request, u8 * registers, u16 start, size_t size)
  500. {
  501. if (!registers || size <= 0)
  502. return -EINVAL;
  503. return usb_control_msg(udev,
  504. usb_rcvctrlpipe(udev, 0),
  505. request,
  506. USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_DEVICE,
  507. start, /* value */
  508. 0, /* index */
  509. registers, /* buffer */
  510. size,
  511. HZ);
  512. }
  513. /******************************************************************************
  514. *
  515. * cpia2_usb_transfer_cmd
  516. *
  517. *****************************************************************************/
  518. int cpia2_usb_transfer_cmd(struct camera_data *cam,
  519. void *registers,
  520. u8 request, u8 start, u8 count, u8 direction)
  521. {
  522. int err = 0;
  523. struct usb_device *udev = cam->dev;
  524. if (!udev) {
  525. ERR("%s: Internal driver error: udev is NULL\n", __func__);
  526. return -EINVAL;
  527. }
  528. if (!registers) {
  529. ERR("%s: Internal driver error: register array is NULL\n", __func__);
  530. return -EINVAL;
  531. }
  532. if (direction == TRANSFER_READ) {
  533. err = read_packet(udev, request, (u8 *)registers, start, count);
  534. if (err > 0)
  535. err = 0;
  536. } else if (direction == TRANSFER_WRITE) {
  537. err =write_packet(udev, request, (u8 *)registers, start, count);
  538. if (err < 0) {
  539. LOG("Control message failed, err val = %d\n", err);
  540. LOG("Message: request = 0x%0X, start = 0x%0X\n",
  541. request, start);
  542. LOG("Message: count = %d, register[0] = 0x%0X\n",
  543. count, ((unsigned char *) registers)[0]);
  544. } else
  545. err=0;
  546. } else {
  547. LOG("Unexpected first byte of direction: %d\n",
  548. direction);
  549. return -EINVAL;
  550. }
  551. if(err != 0)
  552. LOG("Unexpected error: %d\n", err);
  553. return err;
  554. }
  555. /******************************************************************************
  556. *
  557. * submit_urbs
  558. *
  559. *****************************************************************************/
  560. static int submit_urbs(struct camera_data *cam)
  561. {
  562. struct urb *urb;
  563. int fx, err, i, j;
  564. for(i=0; i<NUM_SBUF; ++i) {
  565. if (cam->sbuf[i].data)
  566. continue;
  567. cam->sbuf[i].data =
  568. kmalloc(FRAMES_PER_DESC * FRAME_SIZE_PER_DESC, GFP_KERNEL);
  569. if (!cam->sbuf[i].data) {
  570. while (--i >= 0) {
  571. kfree(cam->sbuf[i].data);
  572. cam->sbuf[i].data = NULL;
  573. }
  574. return -ENOMEM;
  575. }
  576. }
  577. /* We double buffer the Isoc lists, and also know the polling
  578. * interval is every frame (1 == (1 << (bInterval -1))).
  579. */
  580. for(i=0; i<NUM_SBUF; ++i) {
  581. if(cam->sbuf[i].urb) {
  582. continue;
  583. }
  584. urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
  585. if (!urb) {
  586. ERR("%s: usb_alloc_urb error!\n", __func__);
  587. for (j = 0; j < i; j++)
  588. usb_free_urb(cam->sbuf[j].urb);
  589. return -ENOMEM;
  590. }
  591. cam->sbuf[i].urb = urb;
  592. urb->dev = cam->dev;
  593. urb->context = cam;
  594. urb->pipe = usb_rcvisocpipe(cam->dev, 1 /*ISOC endpoint*/);
  595. urb->transfer_flags = URB_ISO_ASAP;
  596. urb->transfer_buffer = cam->sbuf[i].data;
  597. urb->complete = cpia2_usb_complete;
  598. urb->number_of_packets = FRAMES_PER_DESC;
  599. urb->interval = 1;
  600. urb->transfer_buffer_length =
  601. FRAME_SIZE_PER_DESC * FRAMES_PER_DESC;
  602. for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
  603. urb->iso_frame_desc[fx].offset =
  604. FRAME_SIZE_PER_DESC * fx;
  605. urb->iso_frame_desc[fx].length = FRAME_SIZE_PER_DESC;
  606. }
  607. }
  608. /* Queue the ISO urbs, and resubmit in the completion handler */
  609. for(i=0; i<NUM_SBUF; ++i) {
  610. err = usb_submit_urb(cam->sbuf[i].urb, GFP_KERNEL);
  611. if (err) {
  612. ERR("usb_submit_urb[%d]() = %d\n", i, err);
  613. return err;
  614. }
  615. }
  616. return 0;
  617. }
  618. /******************************************************************************
  619. *
  620. * cpia2_usb_stream_start
  621. *
  622. *****************************************************************************/
  623. int cpia2_usb_stream_start(struct camera_data *cam, unsigned int alternate)
  624. {
  625. int ret;
  626. int old_alt;
  627. if(cam->streaming)
  628. return 0;
  629. if (cam->flush) {
  630. int i;
  631. DBG("Flushing buffers\n");
  632. for(i=0; i<cam->num_frames; ++i) {
  633. cam->buffers[i].status = FRAME_EMPTY;
  634. cam->buffers[i].length = 0;
  635. }
  636. cam->curbuff = &cam->buffers[0];
  637. cam->workbuff = cam->curbuff->next;
  638. cam->flush = false;
  639. }
  640. old_alt = cam->params.camera_state.stream_mode;
  641. cam->params.camera_state.stream_mode = 0;
  642. ret = cpia2_usb_change_streaming_alternate(cam, alternate);
  643. if (ret < 0) {
  644. int ret2;
  645. ERR("cpia2_usb_change_streaming_alternate() = %d!\n", ret);
  646. cam->params.camera_state.stream_mode = old_alt;
  647. ret2 = set_alternate(cam, USBIF_CMDONLY);
  648. if (ret2 < 0) {
  649. ERR("cpia2_usb_change_streaming_alternate(%d) =%d has already "
  650. "failed. Then tried to call "
  651. "set_alternate(USBIF_CMDONLY) = %d.\n",
  652. alternate, ret, ret2);
  653. }
  654. } else {
  655. cam->frame_count = 0;
  656. cam->streaming = 1;
  657. ret = cpia2_usb_stream_resume(cam);
  658. }
  659. return ret;
  660. }
  661. /******************************************************************************
  662. *
  663. * cpia2_usb_stream_pause
  664. *
  665. *****************************************************************************/
  666. int cpia2_usb_stream_pause(struct camera_data *cam)
  667. {
  668. int ret = 0;
  669. if(cam->streaming) {
  670. ret = set_alternate(cam, USBIF_CMDONLY);
  671. free_sbufs(cam);
  672. }
  673. return ret;
  674. }
  675. /******************************************************************************
  676. *
  677. * cpia2_usb_stream_resume
  678. *
  679. *****************************************************************************/
  680. int cpia2_usb_stream_resume(struct camera_data *cam)
  681. {
  682. int ret = 0;
  683. if(cam->streaming) {
  684. cam->first_image_seen = 0;
  685. ret = set_alternate(cam, cam->params.camera_state.stream_mode);
  686. if(ret == 0) {
  687. ret = submit_urbs(cam);
  688. }
  689. }
  690. return ret;
  691. }
  692. /******************************************************************************
  693. *
  694. * cpia2_usb_stream_stop
  695. *
  696. *****************************************************************************/
  697. int cpia2_usb_stream_stop(struct camera_data *cam)
  698. {
  699. int ret;
  700. ret = cpia2_usb_stream_pause(cam);
  701. cam->streaming = 0;
  702. configure_transfer_mode(cam, 0);
  703. return ret;
  704. }
  705. /******************************************************************************
  706. *
  707. * cpia2_usb_probe
  708. *
  709. * Probe and initialize.
  710. *****************************************************************************/
  711. static int cpia2_usb_probe(struct usb_interface *intf,
  712. const struct usb_device_id *id)
  713. {
  714. struct usb_device *udev = interface_to_usbdev(intf);
  715. struct usb_interface_descriptor *interface;
  716. struct camera_data *cam;
  717. int ret;
  718. /* A multi-config CPiA2 camera? */
  719. if (udev->descriptor.bNumConfigurations != 1)
  720. return -ENODEV;
  721. interface = &intf->cur_altsetting->desc;
  722. /* If we get to this point, we found a CPiA2 camera */
  723. LOG("CPiA2 USB camera found\n");
  724. if((cam = cpia2_init_camera_struct()) == NULL)
  725. return -ENOMEM;
  726. cam->dev = udev;
  727. cam->iface = interface->bInterfaceNumber;
  728. ret = set_alternate(cam, USBIF_CMDONLY);
  729. if (ret < 0) {
  730. ERR("%s: usb_set_interface error (ret = %d)\n", __func__, ret);
  731. kfree(cam);
  732. return ret;
  733. }
  734. if ((ret = cpia2_register_camera(cam)) < 0) {
  735. ERR("%s: Failed to register cpia2 camera (ret = %d)\n", __func__, ret);
  736. kfree(cam);
  737. return ret;
  738. }
  739. if((ret = cpia2_init_camera(cam)) < 0) {
  740. ERR("%s: failed to initialize cpia2 camera (ret = %d)\n", __func__, ret);
  741. cpia2_unregister_camera(cam);
  742. kfree(cam);
  743. return ret;
  744. }
  745. LOG(" CPiA Version: %d.%02d (%d.%d)\n",
  746. cam->params.version.firmware_revision_hi,
  747. cam->params.version.firmware_revision_lo,
  748. cam->params.version.asic_id,
  749. cam->params.version.asic_rev);
  750. LOG(" CPiA PnP-ID: %04x:%04x:%04x\n",
  751. cam->params.pnp_id.vendor,
  752. cam->params.pnp_id.product,
  753. cam->params.pnp_id.device_revision);
  754. LOG(" SensorID: %d.(version %d)\n",
  755. cam->params.version.sensor_flags,
  756. cam->params.version.sensor_rev);
  757. usb_set_intfdata(intf, cam);
  758. return 0;
  759. }
  760. /******************************************************************************
  761. *
  762. * cpia2_disconnect
  763. *
  764. *****************************************************************************/
  765. static void cpia2_usb_disconnect(struct usb_interface *intf)
  766. {
  767. struct camera_data *cam = usb_get_intfdata(intf);
  768. usb_set_intfdata(intf, NULL);
  769. cam->present = 0;
  770. DBG("Stopping stream\n");
  771. cpia2_usb_stream_stop(cam);
  772. DBG("Unregistering camera\n");
  773. cpia2_unregister_camera(cam);
  774. if(cam->buffers) {
  775. DBG("Wakeup waiting processes\n");
  776. cam->curbuff->status = FRAME_READY;
  777. cam->curbuff->length = 0;
  778. if (waitqueue_active(&cam->wq_stream))
  779. wake_up_interruptible(&cam->wq_stream);
  780. }
  781. DBG("Releasing interface\n");
  782. usb_driver_release_interface(&cpia2_driver, intf);
  783. if (cam->open_count == 0) {
  784. DBG("Freeing camera structure\n");
  785. kfree(cam);
  786. }
  787. LOG("CPiA2 camera disconnected.\n");
  788. }
  789. /******************************************************************************
  790. *
  791. * usb_cpia2_init
  792. *
  793. *****************************************************************************/
  794. int cpia2_usb_init(void)
  795. {
  796. return usb_register(&cpia2_driver);
  797. }
  798. /******************************************************************************
  799. *
  800. * usb_cpia_cleanup
  801. *
  802. *****************************************************************************/
  803. void cpia2_usb_cleanup(void)
  804. {
  805. schedule_timeout(2 * HZ);
  806. usb_deregister(&cpia2_driver);
  807. }