PageRenderTime 55ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/media/video/gspca/jeilinj.c

https://gitlab.com/bsd1993/android_kernel_zte_x9180
C | 585 lines | 463 code | 67 blank | 55 comment | 32 complexity | 8dfba0678d7b43e17d326bb26e35ced4 MD5 | raw file
  1. /*
  2. * Jeilinj subdriver
  3. *
  4. * Supports some Jeilin dual-mode cameras which use bulk transport and
  5. * download raw JPEG data.
  6. *
  7. * Copyright (C) 2009 Theodore Kilgore
  8. *
  9. * Sportscam DV15 support and control settings are
  10. * Copyright (C) 2011 Patrice Chotard
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation; either version 2 of the License, or
  15. * any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  25. */
  26. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  27. #define MODULE_NAME "jeilinj"
  28. #include <linux/slab.h>
  29. #include "gspca.h"
  30. #include "jpeg.h"
  31. MODULE_AUTHOR("Theodore Kilgore <kilgota@auburn.edu>");
  32. MODULE_DESCRIPTION("GSPCA/JEILINJ USB Camera Driver");
  33. MODULE_LICENSE("GPL");
  34. /* Default timeouts, in ms */
  35. #define JEILINJ_CMD_TIMEOUT 500
  36. #define JEILINJ_CMD_DELAY 160
  37. #define JEILINJ_DATA_TIMEOUT 1000
  38. /* Maximum transfer size to use. */
  39. #define JEILINJ_MAX_TRANSFER 0x200
  40. #define FRAME_HEADER_LEN 0x10
  41. #define FRAME_START 0xFFFFFFFF
  42. enum {
  43. SAKAR_57379,
  44. SPORTSCAM_DV15,
  45. };
  46. #define CAMQUALITY_MIN 0 /* highest cam quality */
  47. #define CAMQUALITY_MAX 97 /* lowest cam quality */
  48. enum e_ctrl {
  49. LIGHTFREQ,
  50. AUTOGAIN,
  51. RED,
  52. GREEN,
  53. BLUE,
  54. NCTRLS /* number of controls */
  55. };
  56. /* Structure to hold all of our device specific stuff */
  57. struct sd {
  58. struct gspca_dev gspca_dev; /* !! must be the first item */
  59. struct gspca_ctrl ctrls[NCTRLS];
  60. int blocks_left;
  61. const struct v4l2_pix_format *cap_mode;
  62. /* Driver stuff */
  63. u8 type;
  64. u8 quality; /* image quality */
  65. #define QUALITY_MIN 35
  66. #define QUALITY_MAX 85
  67. #define QUALITY_DEF 85
  68. u8 jpeg_hdr[JPEG_HDR_SZ];
  69. };
  70. struct jlj_command {
  71. unsigned char instruction[2];
  72. unsigned char ack_wanted;
  73. unsigned char delay;
  74. };
  75. /* AFAICT these cameras will only do 320x240. */
  76. static struct v4l2_pix_format jlj_mode[] = {
  77. { 320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
  78. .bytesperline = 320,
  79. .sizeimage = 320 * 240,
  80. .colorspace = V4L2_COLORSPACE_JPEG,
  81. .priv = 0},
  82. { 640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
  83. .bytesperline = 640,
  84. .sizeimage = 640 * 480,
  85. .colorspace = V4L2_COLORSPACE_JPEG,
  86. .priv = 0}
  87. };
  88. /*
  89. * cam uses endpoint 0x03 to send commands, 0x84 for read commands,
  90. * and 0x82 for bulk transfer.
  91. */
  92. /* All commands are two bytes only */
  93. static void jlj_write2(struct gspca_dev *gspca_dev, unsigned char *command)
  94. {
  95. int retval;
  96. if (gspca_dev->usb_err < 0)
  97. return;
  98. memcpy(gspca_dev->usb_buf, command, 2);
  99. retval = usb_bulk_msg(gspca_dev->dev,
  100. usb_sndbulkpipe(gspca_dev->dev, 3),
  101. gspca_dev->usb_buf, 2, NULL, 500);
  102. if (retval < 0) {
  103. pr_err("command write [%02x] error %d\n",
  104. gspca_dev->usb_buf[0], retval);
  105. gspca_dev->usb_err = retval;
  106. }
  107. }
  108. /* Responses are one byte only */
  109. static void jlj_read1(struct gspca_dev *gspca_dev, unsigned char response)
  110. {
  111. int retval;
  112. if (gspca_dev->usb_err < 0)
  113. return;
  114. retval = usb_bulk_msg(gspca_dev->dev,
  115. usb_rcvbulkpipe(gspca_dev->dev, 0x84),
  116. gspca_dev->usb_buf, 1, NULL, 500);
  117. response = gspca_dev->usb_buf[0];
  118. if (retval < 0) {
  119. pr_err("read command [%02x] error %d\n",
  120. gspca_dev->usb_buf[0], retval);
  121. gspca_dev->usb_err = retval;
  122. }
  123. }
  124. static void setfreq(struct gspca_dev *gspca_dev)
  125. {
  126. struct sd *sd = (struct sd *) gspca_dev;
  127. u8 freq_commands[][2] = {
  128. {0x71, 0x80},
  129. {0x70, 0x07}
  130. };
  131. freq_commands[0][1] |= (sd->ctrls[LIGHTFREQ].val >> 1);
  132. jlj_write2(gspca_dev, freq_commands[0]);
  133. jlj_write2(gspca_dev, freq_commands[1]);
  134. }
  135. static void setcamquality(struct gspca_dev *gspca_dev)
  136. {
  137. struct sd *sd = (struct sd *) gspca_dev;
  138. u8 quality_commands[][2] = {
  139. {0x71, 0x1E},
  140. {0x70, 0x06}
  141. };
  142. u8 camquality;
  143. /* adapt camera quality from jpeg quality */
  144. camquality = ((QUALITY_MAX - sd->quality) * CAMQUALITY_MAX)
  145. / (QUALITY_MAX - QUALITY_MIN);
  146. quality_commands[0][1] += camquality;
  147. jlj_write2(gspca_dev, quality_commands[0]);
  148. jlj_write2(gspca_dev, quality_commands[1]);
  149. }
  150. static void setautogain(struct gspca_dev *gspca_dev)
  151. {
  152. struct sd *sd = (struct sd *) gspca_dev;
  153. u8 autogain_commands[][2] = {
  154. {0x94, 0x02},
  155. {0xcf, 0x00}
  156. };
  157. autogain_commands[1][1] = (sd->ctrls[AUTOGAIN].val << 4);
  158. jlj_write2(gspca_dev, autogain_commands[0]);
  159. jlj_write2(gspca_dev, autogain_commands[1]);
  160. }
  161. static void setred(struct gspca_dev *gspca_dev)
  162. {
  163. struct sd *sd = (struct sd *) gspca_dev;
  164. u8 setred_commands[][2] = {
  165. {0x94, 0x02},
  166. {0xe6, 0x00}
  167. };
  168. setred_commands[1][1] = sd->ctrls[RED].val;
  169. jlj_write2(gspca_dev, setred_commands[0]);
  170. jlj_write2(gspca_dev, setred_commands[1]);
  171. }
  172. static void setgreen(struct gspca_dev *gspca_dev)
  173. {
  174. struct sd *sd = (struct sd *) gspca_dev;
  175. u8 setgreen_commands[][2] = {
  176. {0x94, 0x02},
  177. {0xe7, 0x00}
  178. };
  179. setgreen_commands[1][1] = sd->ctrls[GREEN].val;
  180. jlj_write2(gspca_dev, setgreen_commands[0]);
  181. jlj_write2(gspca_dev, setgreen_commands[1]);
  182. }
  183. static void setblue(struct gspca_dev *gspca_dev)
  184. {
  185. struct sd *sd = (struct sd *) gspca_dev;
  186. u8 setblue_commands[][2] = {
  187. {0x94, 0x02},
  188. {0xe9, 0x00}
  189. };
  190. setblue_commands[1][1] = sd->ctrls[BLUE].val;
  191. jlj_write2(gspca_dev, setblue_commands[0]);
  192. jlj_write2(gspca_dev, setblue_commands[1]);
  193. }
  194. static const struct ctrl sd_ctrls[NCTRLS] = {
  195. [LIGHTFREQ] = {
  196. {
  197. .id = V4L2_CID_POWER_LINE_FREQUENCY,
  198. .type = V4L2_CTRL_TYPE_MENU,
  199. .name = "Light frequency filter",
  200. .minimum = V4L2_CID_POWER_LINE_FREQUENCY_DISABLED, /* 1 */
  201. .maximum = V4L2_CID_POWER_LINE_FREQUENCY_60HZ, /* 2 */
  202. .step = 1,
  203. .default_value = V4L2_CID_POWER_LINE_FREQUENCY_60HZ,
  204. },
  205. .set_control = setfreq
  206. },
  207. [AUTOGAIN] = {
  208. {
  209. .id = V4L2_CID_AUTOGAIN,
  210. .type = V4L2_CTRL_TYPE_INTEGER,
  211. .name = "Automatic Gain (and Exposure)",
  212. .minimum = 0,
  213. .maximum = 3,
  214. .step = 1,
  215. #define AUTOGAIN_DEF 0
  216. .default_value = AUTOGAIN_DEF,
  217. },
  218. .set_control = setautogain
  219. },
  220. [RED] = {
  221. {
  222. .id = V4L2_CID_RED_BALANCE,
  223. .type = V4L2_CTRL_TYPE_INTEGER,
  224. .name = "red balance",
  225. .minimum = 0,
  226. .maximum = 3,
  227. .step = 1,
  228. #define RED_BALANCE_DEF 2
  229. .default_value = RED_BALANCE_DEF,
  230. },
  231. .set_control = setred
  232. },
  233. [GREEN] = {
  234. {
  235. .id = V4L2_CID_GAIN,
  236. .type = V4L2_CTRL_TYPE_INTEGER,
  237. .name = "green balance",
  238. .minimum = 0,
  239. .maximum = 3,
  240. .step = 1,
  241. #define GREEN_BALANCE_DEF 2
  242. .default_value = GREEN_BALANCE_DEF,
  243. },
  244. .set_control = setgreen
  245. },
  246. [BLUE] = {
  247. {
  248. .id = V4L2_CID_BLUE_BALANCE,
  249. .type = V4L2_CTRL_TYPE_INTEGER,
  250. .name = "blue balance",
  251. .minimum = 0,
  252. .maximum = 3,
  253. .step = 1,
  254. #define BLUE_BALANCE_DEF 2
  255. .default_value = BLUE_BALANCE_DEF,
  256. },
  257. .set_control = setblue
  258. },
  259. };
  260. static int jlj_start(struct gspca_dev *gspca_dev)
  261. {
  262. int i;
  263. int start_commands_size;
  264. u8 response = 0xff;
  265. struct sd *sd = (struct sd *) gspca_dev;
  266. struct jlj_command start_commands[] = {
  267. {{0x71, 0x81}, 0, 0},
  268. {{0x70, 0x05}, 0, JEILINJ_CMD_DELAY},
  269. {{0x95, 0x70}, 1, 0},
  270. {{0x71, 0x81 - gspca_dev->curr_mode}, 0, 0},
  271. {{0x70, 0x04}, 0, JEILINJ_CMD_DELAY},
  272. {{0x95, 0x70}, 1, 0},
  273. {{0x71, 0x00}, 0, 0}, /* start streaming ??*/
  274. {{0x70, 0x08}, 0, JEILINJ_CMD_DELAY},
  275. {{0x95, 0x70}, 1, 0},
  276. #define SPORTSCAM_DV15_CMD_SIZE 9
  277. {{0x94, 0x02}, 0, 0},
  278. {{0xde, 0x24}, 0, 0},
  279. {{0x94, 0x02}, 0, 0},
  280. {{0xdd, 0xf0}, 0, 0},
  281. {{0x94, 0x02}, 0, 0},
  282. {{0xe3, 0x2c}, 0, 0},
  283. {{0x94, 0x02}, 0, 0},
  284. {{0xe4, 0x00}, 0, 0},
  285. {{0x94, 0x02}, 0, 0},
  286. {{0xe5, 0x00}, 0, 0},
  287. {{0x94, 0x02}, 0, 0},
  288. {{0xe6, 0x2c}, 0, 0},
  289. {{0x94, 0x03}, 0, 0},
  290. {{0xaa, 0x00}, 0, 0}
  291. };
  292. sd->blocks_left = 0;
  293. /* Under Windows, USB spy shows that only the 9 first start
  294. * commands are used for SPORTSCAM_DV15 webcam
  295. */
  296. if (sd->type == SPORTSCAM_DV15)
  297. start_commands_size = SPORTSCAM_DV15_CMD_SIZE;
  298. else
  299. start_commands_size = ARRAY_SIZE(start_commands);
  300. for (i = 0; i < start_commands_size; i++) {
  301. jlj_write2(gspca_dev, start_commands[i].instruction);
  302. if (start_commands[i].delay)
  303. msleep(start_commands[i].delay);
  304. if (start_commands[i].ack_wanted)
  305. jlj_read1(gspca_dev, response);
  306. }
  307. setcamquality(gspca_dev);
  308. msleep(2);
  309. setfreq(gspca_dev);
  310. if (gspca_dev->usb_err < 0)
  311. PDEBUG(D_ERR, "Start streaming command failed");
  312. return gspca_dev->usb_err;
  313. }
  314. static void sd_pkt_scan(struct gspca_dev *gspca_dev,
  315. u8 *data, int len)
  316. {
  317. struct sd *sd = (struct sd *) gspca_dev;
  318. int packet_type;
  319. u32 header_marker;
  320. PDEBUG(D_STREAM, "Got %d bytes out of %d for Block 0",
  321. len, JEILINJ_MAX_TRANSFER);
  322. if (len != JEILINJ_MAX_TRANSFER) {
  323. PDEBUG(D_PACK, "bad length");
  324. goto discard;
  325. }
  326. /* check if it's start of frame */
  327. header_marker = ((u32 *)data)[0];
  328. if (header_marker == FRAME_START) {
  329. sd->blocks_left = data[0x0a] - 1;
  330. PDEBUG(D_STREAM, "blocks_left = 0x%x", sd->blocks_left);
  331. /* Start a new frame, and add the JPEG header, first thing */
  332. gspca_frame_add(gspca_dev, FIRST_PACKET,
  333. sd->jpeg_hdr, JPEG_HDR_SZ);
  334. /* Toss line 0 of data block 0, keep the rest. */
  335. gspca_frame_add(gspca_dev, INTER_PACKET,
  336. data + FRAME_HEADER_LEN,
  337. JEILINJ_MAX_TRANSFER - FRAME_HEADER_LEN);
  338. } else if (sd->blocks_left > 0) {
  339. PDEBUG(D_STREAM, "%d blocks remaining for frame",
  340. sd->blocks_left);
  341. sd->blocks_left -= 1;
  342. if (sd->blocks_left == 0)
  343. packet_type = LAST_PACKET;
  344. else
  345. packet_type = INTER_PACKET;
  346. gspca_frame_add(gspca_dev, packet_type,
  347. data, JEILINJ_MAX_TRANSFER);
  348. } else
  349. goto discard;
  350. return;
  351. discard:
  352. /* Discard data until a new frame starts. */
  353. gspca_dev->last_packet_type = DISCARD_PACKET;
  354. }
  355. /* This function is called at probe time just before sd_init */
  356. static int sd_config(struct gspca_dev *gspca_dev,
  357. const struct usb_device_id *id)
  358. {
  359. struct cam *cam = &gspca_dev->cam;
  360. struct sd *dev = (struct sd *) gspca_dev;
  361. dev->type = id->driver_info;
  362. gspca_dev->cam.ctrls = dev->ctrls;
  363. dev->quality = QUALITY_DEF;
  364. cam->cam_mode = jlj_mode;
  365. cam->nmodes = ARRAY_SIZE(jlj_mode);
  366. cam->bulk = 1;
  367. cam->bulk_nurbs = 1;
  368. cam->bulk_size = JEILINJ_MAX_TRANSFER;
  369. return 0;
  370. }
  371. static void sd_stopN(struct gspca_dev *gspca_dev)
  372. {
  373. int i;
  374. u8 *buf;
  375. static u8 stop_commands[][2] = {
  376. {0x71, 0x00},
  377. {0x70, 0x09},
  378. {0x71, 0x80},
  379. {0x70, 0x05}
  380. };
  381. for (;;) {
  382. /* get the image remaining blocks */
  383. usb_bulk_msg(gspca_dev->dev,
  384. gspca_dev->urb[0]->pipe,
  385. gspca_dev->urb[0]->transfer_buffer,
  386. JEILINJ_MAX_TRANSFER, NULL,
  387. JEILINJ_DATA_TIMEOUT);
  388. /* search for 0xff 0xd9 (EOF for JPEG) */
  389. i = 0;
  390. buf = gspca_dev->urb[0]->transfer_buffer;
  391. while ((i < (JEILINJ_MAX_TRANSFER - 1)) &&
  392. ((buf[i] != 0xff) || (buf[i+1] != 0xd9)))
  393. i++;
  394. if (i != (JEILINJ_MAX_TRANSFER - 1))
  395. /* last remaining block found */
  396. break;
  397. }
  398. for (i = 0; i < ARRAY_SIZE(stop_commands); i++)
  399. jlj_write2(gspca_dev, stop_commands[i]);
  400. }
  401. /* this function is called at probe and resume time */
  402. static int sd_init(struct gspca_dev *gspca_dev)
  403. {
  404. return gspca_dev->usb_err;
  405. }
  406. /* Set up for getting frames. */
  407. static int sd_start(struct gspca_dev *gspca_dev)
  408. {
  409. struct sd *dev = (struct sd *) gspca_dev;
  410. /* create the JPEG header */
  411. jpeg_define(dev->jpeg_hdr, gspca_dev->height, gspca_dev->width,
  412. 0x21); /* JPEG 422 */
  413. jpeg_set_qual(dev->jpeg_hdr, dev->quality);
  414. PDEBUG(D_STREAM, "Start streaming at %dx%d",
  415. gspca_dev->height, gspca_dev->width);
  416. jlj_start(gspca_dev);
  417. return gspca_dev->usb_err;
  418. }
  419. /* Table of supported USB devices */
  420. static const struct usb_device_id device_table[] = {
  421. {USB_DEVICE(0x0979, 0x0280), .driver_info = SAKAR_57379},
  422. {USB_DEVICE(0x0979, 0x0270), .driver_info = SPORTSCAM_DV15},
  423. {}
  424. };
  425. MODULE_DEVICE_TABLE(usb, device_table);
  426. static int sd_querymenu(struct gspca_dev *gspca_dev,
  427. struct v4l2_querymenu *menu)
  428. {
  429. switch (menu->id) {
  430. case V4L2_CID_POWER_LINE_FREQUENCY:
  431. switch (menu->index) {
  432. case 0: /* V4L2_CID_POWER_LINE_FREQUENCY_DISABLED */
  433. strcpy((char *) menu->name, "disable");
  434. return 0;
  435. case 1: /* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */
  436. strcpy((char *) menu->name, "50 Hz");
  437. return 0;
  438. case 2: /* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */
  439. strcpy((char *) menu->name, "60 Hz");
  440. return 0;
  441. }
  442. break;
  443. }
  444. return -EINVAL;
  445. }
  446. static int sd_set_jcomp(struct gspca_dev *gspca_dev,
  447. struct v4l2_jpegcompression *jcomp)
  448. {
  449. struct sd *sd = (struct sd *) gspca_dev;
  450. if (jcomp->quality < QUALITY_MIN)
  451. sd->quality = QUALITY_MIN;
  452. else if (jcomp->quality > QUALITY_MAX)
  453. sd->quality = QUALITY_MAX;
  454. else
  455. sd->quality = jcomp->quality;
  456. if (gspca_dev->streaming) {
  457. jpeg_set_qual(sd->jpeg_hdr, sd->quality);
  458. setcamquality(gspca_dev);
  459. }
  460. return 0;
  461. }
  462. static int sd_get_jcomp(struct gspca_dev *gspca_dev,
  463. struct v4l2_jpegcompression *jcomp)
  464. {
  465. struct sd *sd = (struct sd *) gspca_dev;
  466. memset(jcomp, 0, sizeof *jcomp);
  467. jcomp->quality = sd->quality;
  468. jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT
  469. | V4L2_JPEG_MARKER_DQT;
  470. return 0;
  471. }
  472. /* sub-driver description */
  473. static const struct sd_desc sd_desc_sakar_57379 = {
  474. .name = MODULE_NAME,
  475. .config = sd_config,
  476. .init = sd_init,
  477. .start = sd_start,
  478. .stopN = sd_stopN,
  479. .pkt_scan = sd_pkt_scan,
  480. };
  481. /* sub-driver description */
  482. static const struct sd_desc sd_desc_sportscam_dv15 = {
  483. .name = MODULE_NAME,
  484. .config = sd_config,
  485. .init = sd_init,
  486. .start = sd_start,
  487. .stopN = sd_stopN,
  488. .pkt_scan = sd_pkt_scan,
  489. .ctrls = sd_ctrls,
  490. .nctrls = ARRAY_SIZE(sd_ctrls),
  491. .querymenu = sd_querymenu,
  492. .get_jcomp = sd_get_jcomp,
  493. .set_jcomp = sd_set_jcomp,
  494. };
  495. static const struct sd_desc *sd_desc[2] = {
  496. &sd_desc_sakar_57379,
  497. &sd_desc_sportscam_dv15
  498. };
  499. /* -- device connect -- */
  500. static int sd_probe(struct usb_interface *intf,
  501. const struct usb_device_id *id)
  502. {
  503. return gspca_dev_probe(intf, id,
  504. sd_desc[id->driver_info],
  505. sizeof(struct sd),
  506. THIS_MODULE);
  507. }
  508. static struct usb_driver sd_driver = {
  509. .name = MODULE_NAME,
  510. .id_table = device_table,
  511. .probe = sd_probe,
  512. .disconnect = gspca_disconnect,
  513. #ifdef CONFIG_PM
  514. .suspend = gspca_suspend,
  515. .resume = gspca_resume,
  516. #endif
  517. };
  518. module_usb_driver(sd_driver);