tv8532.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. /*
  2. * Quickcam cameras initialization data
  3. *
  4. * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. *
  20. */
  21. #define MODULE_NAME "tv8532"
  22. #include "gspca.h"
  23. #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 0)
  24. static const char version[] = "2.1.0";
  25. MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
  26. MODULE_DESCRIPTION("TV8532 USB Camera Driver");
  27. MODULE_LICENSE("GPL");
  28. /* specific webcam descriptor */
  29. struct sd {
  30. struct gspca_dev gspca_dev; /* !! must be the first item */
  31. int buflen; /* current length of tmpbuf */
  32. __u8 tmpbuf[352 * 288 + 10 * 288]; /* no protection... */
  33. __u8 tmpbuf2[352 * 288]; /* no protection... */
  34. unsigned short brightness;
  35. unsigned short contrast;
  36. char packet;
  37. char synchro;
  38. };
  39. /* V4L2 controls supported by the driver */
  40. static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
  41. static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
  42. static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
  43. static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
  44. static struct ctrl sd_ctrls[] = {
  45. #define SD_BRIGHTNESS 0
  46. {
  47. {
  48. .id = V4L2_CID_BRIGHTNESS,
  49. .type = V4L2_CTRL_TYPE_INTEGER,
  50. .name = "Brightness",
  51. .minimum = 1,
  52. .maximum = 0x2ff,
  53. .step = 1,
  54. .default_value = 0x18f,
  55. },
  56. .set = sd_setbrightness,
  57. .get = sd_getbrightness,
  58. },
  59. #define SD_CONTRAST 1
  60. {
  61. {
  62. .id = V4L2_CID_CONTRAST,
  63. .type = V4L2_CTRL_TYPE_INTEGER,
  64. .name = "Contrast",
  65. .minimum = 0,
  66. .maximum = 0xffff,
  67. .step = 1,
  68. .default_value = 0x7fff,
  69. },
  70. .set = sd_setcontrast,
  71. .get = sd_getcontrast,
  72. },
  73. };
  74. static struct cam_mode sif_mode[] = {
  75. {V4L2_PIX_FMT_SBGGR8, 176, 144, 1},
  76. {V4L2_PIX_FMT_SBGGR8, 352, 288, 0},
  77. };
  78. /*
  79. * Initialization data: this is the first set-up data written to the
  80. * device (before the open data).
  81. */
  82. #define TESTCLK 0x10 /* reg 0x2c -> 0x12 //10 */
  83. #define TESTCOMP 0x90 /* reg 0x28 -> 0x80 */
  84. #define TESTLINE 0x81 /* reg 0x29 -> 0x81 */
  85. #define QCIFLINE 0x41 /* reg 0x29 -> 0x81 */
  86. #define TESTPTL 0x14 /* reg 0x2D -> 0x14 */
  87. #define TESTPTH 0x01 /* reg 0x2E -> 0x01 */
  88. #define TESTPTBL 0x12 /* reg 0x2F -> 0x0a */
  89. #define TESTPTBH 0x01 /* reg 0x30 -> 0x01 */
  90. #define ADWIDTHL 0xe8 /* reg 0x0c -> 0xe8 */
  91. #define ADWIDTHH 0x03 /* reg 0x0d -> 0x03 */
  92. #define ADHEIGHL 0x90 /* reg 0x0e -> 0x91 //93 */
  93. #define ADHEIGHH 0x01 /* reg 0x0f -> 0x01 */
  94. #define EXPOL 0x8f /* reg 0x1c -> 0x8f */
  95. #define EXPOH 0x01 /* reg 0x1d -> 0x01 */
  96. #define ADCBEGINL 0x44 /* reg 0x10 -> 0x46 //47 */
  97. #define ADCBEGINH 0x00 /* reg 0x11 -> 0x00 */
  98. #define ADRBEGINL 0x0a /* reg 0x14 -> 0x0b //0x0c */
  99. #define ADRBEGINH 0x00 /* reg 0x15 -> 0x00 */
  100. #define TV8532_CMD_UPDATE 0x84
  101. #define TV8532_EEprom_Add 0x03
  102. #define TV8532_EEprom_DataL 0x04
  103. #define TV8532_EEprom_DataM 0x05
  104. #define TV8532_EEprom_DataH 0x06
  105. #define TV8532_EEprom_TableLength 0x07
  106. #define TV8532_EEprom_Write 0x08
  107. #define TV8532_PART_CTRL 0x00
  108. #define TV8532_CTRL 0x01
  109. #define TV8532_CMD_EEprom_Open 0x30
  110. #define TV8532_CMD_EEprom_Close 0x29
  111. #define TV8532_UDP_UPDATE 0x31
  112. #define TV8532_GPIO 0x39
  113. #define TV8532_GPIO_OE 0x3B
  114. #define TV8532_REQ_RegWrite 0x02
  115. #define TV8532_REQ_RegRead 0x03
  116. #define TV8532_ADWIDTH_L 0x0C
  117. #define TV8532_ADWIDTH_H 0x0D
  118. #define TV8532_ADHEIGHT_L 0x0E
  119. #define TV8532_ADHEIGHT_H 0x0F
  120. #define TV8532_EXPOSURE 0x1C
  121. #define TV8532_QUANT_COMP 0x28
  122. #define TV8532_MODE_PACKET 0x29
  123. #define TV8532_SETCLK 0x2C
  124. #define TV8532_POINT_L 0x2D
  125. #define TV8532_POINT_H 0x2E
  126. #define TV8532_POINTB_L 0x2F
  127. #define TV8532_POINTB_H 0x30
  128. #define TV8532_BUDGET_L 0x2A
  129. #define TV8532_BUDGET_H 0x2B
  130. #define TV8532_VID_L 0x34
  131. #define TV8532_VID_H 0x35
  132. #define TV8532_PID_L 0x36
  133. #define TV8532_PID_H 0x37
  134. #define TV8532_DeviceID 0x83
  135. #define TV8532_AD_SLOPE 0x91
  136. #define TV8532_AD_BITCTRL 0x94
  137. #define TV8532_AD_COLBEGIN_L 0x10
  138. #define TV8532_AD_COLBEGIN_H 0x11
  139. #define TV8532_AD_ROWBEGIN_L 0x14
  140. #define TV8532_AD_ROWBEGIN_H 0x15
  141. static __u32 tv_8532_eeprom_data[] = {
  142. /* add dataL dataM dataH */
  143. 0x00010001, 0x01018011, 0x02050014, 0x0305001c,
  144. 0x040d001e, 0x0505001f, 0x06050519, 0x0705011b,
  145. 0x0805091e, 0x090d892e, 0x0a05892f, 0x0b050dd9,
  146. 0x0c0509f1, 0
  147. };
  148. static void reg_r(struct usb_device *dev,
  149. __u16 index, __u8 *buffer)
  150. {
  151. usb_control_msg(dev,
  152. usb_rcvctrlpipe(dev, 0),
  153. TV8532_REQ_RegRead,
  154. USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  155. 0, /* value */
  156. index, buffer, sizeof(__u8),
  157. 500);
  158. }
  159. static void reg_w(struct usb_device *dev,
  160. __u16 index, __u8 *buffer, __u16 length)
  161. {
  162. usb_control_msg(dev,
  163. usb_sndctrlpipe(dev, 0),
  164. TV8532_REQ_RegWrite,
  165. USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  166. 0, /* value */
  167. index, buffer, length, 500);
  168. }
  169. static void tv_8532WriteEEprom(struct gspca_dev *gspca_dev)
  170. {
  171. int i = 0;
  172. __u8 reg, data0, data1, data2, datacmd;
  173. struct usb_device *dev = gspca_dev->dev;
  174. datacmd = 0xb0;;
  175. reg_w(dev, TV8532_GPIO, &datacmd, 1);
  176. datacmd = TV8532_CMD_EEprom_Open;
  177. reg_w(dev, TV8532_CTRL, &datacmd, 1);
  178. /* msleep(1); */
  179. while (tv_8532_eeprom_data[i]) {
  180. reg = (tv_8532_eeprom_data[i] & 0xff000000) >> 24;
  181. reg_w(dev, TV8532_EEprom_Add, &reg, 1);
  182. /* msleep(1); */
  183. data0 = (tv_8532_eeprom_data[i] & 0x000000ff);
  184. reg_w(dev, TV8532_EEprom_DataL, &data0, 1);
  185. /* msleep(1); */
  186. data1 = (tv_8532_eeprom_data[i] & 0x0000FF00) >> 8;
  187. reg_w(dev, TV8532_EEprom_DataM, &data1, 1);
  188. /* msleep(1); */
  189. data2 = (tv_8532_eeprom_data[i] & 0x00FF0000) >> 16;
  190. reg_w(dev, TV8532_EEprom_DataH, &data2, 1);
  191. /* msleep(1); */
  192. datacmd = 0;
  193. reg_w(dev, TV8532_EEprom_Write, &datacmd, 1);
  194. /* msleep(10); */
  195. i++;
  196. }
  197. datacmd = i;
  198. reg_w(dev, TV8532_EEprom_TableLength, &datacmd, 1);
  199. /* msleep(1); */
  200. datacmd = TV8532_CMD_EEprom_Close;
  201. reg_w(dev, TV8532_CTRL, &datacmd, 1);
  202. msleep(10);
  203. }
  204. /* this function is called at probe time */
  205. static int sd_config(struct gspca_dev *gspca_dev,
  206. const struct usb_device_id *id)
  207. {
  208. struct sd *sd = (struct sd *) gspca_dev;
  209. struct cam *cam;
  210. tv_8532WriteEEprom(gspca_dev);
  211. cam = &gspca_dev->cam;
  212. cam->dev_name = (char *) id->driver_info;
  213. cam->epaddr = 1;
  214. cam->cam_mode = sif_mode;
  215. cam->nmodes = sizeof sif_mode / sizeof sif_mode[0];
  216. sd->brightness = sd_ctrls[SD_BRIGHTNESS].qctrl.default_value;
  217. sd->contrast = sd_ctrls[SD_CONTRAST].qctrl.default_value;
  218. return 0;
  219. }
  220. static void tv_8532ReadRegisters(struct gspca_dev *gspca_dev)
  221. {
  222. struct usb_device *dev = gspca_dev->dev;
  223. __u8 data = 0;
  224. /* __u16 vid, pid; */
  225. reg_r(dev, 0x0001, &data);
  226. PDEBUG(D_USBI, "register 0x01-> %x", data);
  227. reg_r(dev, 0x0002, &data);
  228. PDEBUG(D_USBI, "register 0x02-> %x", data);
  229. reg_r(dev, TV8532_ADWIDTH_L, &data);
  230. reg_r(dev, TV8532_ADWIDTH_H, &data);
  231. reg_r(dev, TV8532_QUANT_COMP, &data);
  232. reg_r(dev, TV8532_MODE_PACKET, &data);
  233. reg_r(dev, TV8532_SETCLK, &data);
  234. reg_r(dev, TV8532_POINT_L, &data);
  235. reg_r(dev, TV8532_POINT_H, &data);
  236. reg_r(dev, TV8532_POINTB_L, &data);
  237. reg_r(dev, TV8532_POINTB_H, &data);
  238. reg_r(dev, TV8532_BUDGET_L, &data);
  239. reg_r(dev, TV8532_BUDGET_H, &data);
  240. reg_r(dev, TV8532_VID_L, &data);
  241. reg_r(dev, TV8532_VID_H, &data);
  242. reg_r(dev, TV8532_PID_L, &data);
  243. reg_r(dev, TV8532_PID_H, &data);
  244. reg_r(dev, TV8532_DeviceID, &data);
  245. reg_r(dev, TV8532_AD_COLBEGIN_L, &data);
  246. reg_r(dev, TV8532_AD_COLBEGIN_H, &data);
  247. reg_r(dev, TV8532_AD_ROWBEGIN_L, &data);
  248. reg_r(dev, TV8532_AD_ROWBEGIN_H, &data);
  249. }
  250. static void tv_8532_setReg(struct gspca_dev *gspca_dev)
  251. {
  252. struct usb_device *dev = gspca_dev->dev;
  253. __u8 data = 0;
  254. __u8 value[2] = { 0, 0 };
  255. data = ADCBEGINL;
  256. reg_w(dev, TV8532_AD_COLBEGIN_L, &data, 1); /* 0x10 */
  257. data = ADCBEGINH; /* also digital gain */
  258. reg_w(dev, TV8532_AD_COLBEGIN_H, &data, 1);
  259. data = TV8532_CMD_UPDATE;
  260. reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */
  261. data = 0x0a;
  262. reg_w(dev, TV8532_GPIO_OE, &data, 1);
  263. /******************************************************/
  264. data = ADHEIGHL;
  265. reg_w(dev, TV8532_ADHEIGHT_L, &data, 1); /* 0e */
  266. data = ADHEIGHH;
  267. reg_w(dev, TV8532_ADHEIGHT_H, &data, 1); /* 0f */
  268. value[0] = EXPOL;
  269. value[1] = EXPOH; /* 350d 0x014c; */
  270. reg_w(dev, TV8532_EXPOSURE, value, 2); /* 1c */
  271. data = ADCBEGINL;
  272. reg_w(dev, TV8532_AD_COLBEGIN_L, &data, 1); /* 0x10 */
  273. data = ADCBEGINH; /* also digital gain */
  274. reg_w(dev, TV8532_AD_COLBEGIN_H, &data, 1);
  275. data = ADRBEGINL;
  276. reg_w(dev, TV8532_AD_ROWBEGIN_L, &data, 1); /* 0x14 */
  277. data = 0x00;
  278. reg_w(dev, TV8532_AD_SLOPE, &data, 1); /* 0x91 */
  279. data = 0x02;
  280. reg_w(dev, TV8532_AD_BITCTRL, &data, 1); /* 0x94 */
  281. data = TV8532_CMD_EEprom_Close;
  282. reg_w(dev, TV8532_CTRL, &data, 1); /* 0x01 */
  283. data = 0x00;
  284. reg_w(dev, TV8532_AD_SLOPE, &data, 1); /* 0x91 */
  285. data = TV8532_CMD_UPDATE;
  286. reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */
  287. }
  288. static void tv_8532_PollReg(struct gspca_dev *gspca_dev)
  289. {
  290. struct usb_device *dev = gspca_dev->dev;
  291. __u8 data = 0;
  292. int i;
  293. /* strange polling from tgc */
  294. for (i = 0; i < 10; i++) {
  295. data = TESTCLK; /* 0x48; //0x08; */
  296. reg_w(dev, TV8532_SETCLK, &data, 1); /* 0x2c */
  297. data = TV8532_CMD_UPDATE;
  298. reg_w(dev, TV8532_PART_CTRL, &data, 1);
  299. data = 0x01;
  300. reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */
  301. }
  302. }
  303. /* this function is called at open time */
  304. static int sd_open(struct gspca_dev *gspca_dev)
  305. {
  306. struct usb_device *dev = gspca_dev->dev;
  307. __u8 data = 0;
  308. __u8 dataStart = 0;
  309. __u8 value[2] = { 0, 0 };
  310. data = 0x32;
  311. reg_w(dev, TV8532_AD_SLOPE, &data, 1);
  312. data = 0;
  313. reg_w(dev, TV8532_AD_BITCTRL, &data, 1);
  314. tv_8532ReadRegisters(gspca_dev);
  315. data = 0x0b;
  316. reg_w(dev, TV8532_GPIO_OE, &data, 1);
  317. value[0] = ADHEIGHL;
  318. value[1] = ADHEIGHH; /* 401d 0x0169; */
  319. reg_w(dev, TV8532_ADHEIGHT_L, value, 2); /* 0e */
  320. value[0] = EXPOL;
  321. value[1] = EXPOH; /* 350d 0x014c; */
  322. reg_w(dev, TV8532_EXPOSURE, value, 2); /* 1c */
  323. data = ADWIDTHL; /* 0x20; */
  324. reg_w(dev, TV8532_ADWIDTH_L, &data, 1); /* 0x0c */
  325. data = ADWIDTHH;
  326. reg_w(dev, TV8532_ADWIDTH_H, &data, 1); /* 0x0d */
  327. /*******************************************************************/
  328. data = TESTCOMP; /* 0x72 compressed mode */
  329. reg_w(dev, TV8532_QUANT_COMP, &data, 1); /* 0x28 */
  330. data = TESTLINE; /* 0x84; // CIF | 4 packet */
  331. reg_w(dev, TV8532_MODE_PACKET, &data, 1); /* 0x29 */
  332. /************************************************/
  333. data = TESTCLK; /* 0x48; //0x08; */
  334. reg_w(dev, TV8532_SETCLK, &data, 1); /* 0x2c */
  335. data = TESTPTL; /* 0x38; */
  336. reg_w(dev, TV8532_POINT_L, &data, 1); /* 0x2d */
  337. data = TESTPTH; /* 0x04; */
  338. reg_w(dev, TV8532_POINT_H, &data, 1); /* 0x2e */
  339. dataStart = TESTPTBL; /* 0x04; */
  340. reg_w(dev, TV8532_POINTB_L, &dataStart, 1); /* 0x2f */
  341. data = TESTPTBH; /* 0x04; */
  342. reg_w(dev, TV8532_POINTB_H, &data, 1); /* 0x30 */
  343. data = TV8532_CMD_UPDATE;
  344. reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */
  345. /*************************************************/
  346. data = 0x01;
  347. reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */
  348. msleep(200);
  349. data = 0x00;
  350. reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */
  351. /*************************************************/
  352. tv_8532_setReg(gspca_dev);
  353. /*************************************************/
  354. data = 0x0b;
  355. reg_w(dev, TV8532_GPIO_OE, &data, 1);
  356. /*************************************************/
  357. tv_8532_setReg(gspca_dev);
  358. /*************************************************/
  359. tv_8532_PollReg(gspca_dev);
  360. return 0;
  361. }
  362. static void setbrightness(struct gspca_dev *gspca_dev)
  363. {
  364. struct sd *sd = (struct sd *) gspca_dev;
  365. __u8 value[2];
  366. __u8 data;
  367. int brightness = sd->brightness;
  368. value[1] = (brightness >> 8) & 0xff;
  369. value[0] = (brightness) & 0xff;
  370. reg_w(gspca_dev->dev, TV8532_EXPOSURE, value, 2); /* 1c */
  371. data = TV8532_CMD_UPDATE;
  372. reg_w(gspca_dev->dev, TV8532_PART_CTRL, &data, 1);
  373. }
  374. /* -- start the camera -- */
  375. static void sd_start(struct gspca_dev *gspca_dev)
  376. {
  377. struct usb_device *dev = gspca_dev->dev;
  378. __u8 data;
  379. __u8 value[2];
  380. data = 0x32;
  381. reg_w(dev, TV8532_AD_SLOPE, &data, 1);
  382. data = 0;
  383. reg_w(dev, TV8532_AD_BITCTRL, &data, 1);
  384. tv_8532ReadRegisters(gspca_dev);
  385. data = 0x0b;
  386. reg_w(dev, TV8532_GPIO_OE, &data, 1);
  387. value[0] = ADHEIGHL;
  388. value[1] = ADHEIGHH; /* 401d 0x0169; */
  389. reg_w(dev, TV8532_ADHEIGHT_L, value, 2); /* 0e */
  390. /* value[0] = EXPOL; value[1] =EXPOH; * 350d 0x014c; */
  391. /* reg_w(dev,TV8532_REQ_RegWrite,0,TV8532_EXPOSURE,value,2); * 1c */
  392. setbrightness(gspca_dev);
  393. data = ADWIDTHL; /* 0x20; */
  394. reg_w(dev, TV8532_ADWIDTH_L, &data, 1); /* 0x0c */
  395. data = ADWIDTHH;
  396. reg_w(dev, TV8532_ADWIDTH_H, &data, 1); /* 0x0d */
  397. /************************************************/
  398. data = TESTCOMP; /* 0x72 compressed mode */
  399. reg_w(dev, TV8532_QUANT_COMP, &data, 1); /* 0x28 */
  400. if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].mode) {
  401. /* 176x144 */
  402. data = QCIFLINE; /* 0x84; // CIF | 4 packet */
  403. reg_w(dev, TV8532_MODE_PACKET, &data, 1); /* 0x29 */
  404. } else {
  405. /* 352x288 */
  406. data = TESTLINE; /* 0x84; // CIF | 4 packet */
  407. reg_w(dev, TV8532_MODE_PACKET, &data, 1); /* 0x29 */
  408. }
  409. /************************************************/
  410. data = TESTCLK; /* 0x48; //0x08; */
  411. reg_w(dev, TV8532_SETCLK, &data, 1); /* 0x2c */
  412. data = TESTPTL; /* 0x38; */
  413. reg_w(dev, TV8532_POINT_L, &data, 1); /* 0x2d */
  414. data = TESTPTH; /* 0x04; */
  415. reg_w(dev, TV8532_POINT_H, &data, 1); /* 0x2e */
  416. data = TESTPTBL; /* 0x04; */
  417. reg_w(dev, TV8532_POINTB_L, &data, 1); /* 0x2f */
  418. data = TESTPTBH; /* 0x04; */
  419. reg_w(dev, TV8532_POINTB_H, &data, 1); /* 0x30 */
  420. data = TV8532_CMD_UPDATE;
  421. reg_w(dev, TV8532_PART_CTRL, &data, 1); /* 0x00<-0x84 */
  422. /************************************************/
  423. data = 0x01;
  424. reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */
  425. msleep(200);
  426. data = 0x00;
  427. reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */
  428. /************************************************/
  429. tv_8532_setReg(gspca_dev);
  430. /************************************************/
  431. data = 0x0b;
  432. reg_w(dev, TV8532_GPIO_OE, &data, 1);
  433. /************************************************/
  434. tv_8532_setReg(gspca_dev);
  435. /************************************************/
  436. tv_8532_PollReg(gspca_dev);
  437. data = 0x00;
  438. reg_w(dev, TV8532_UDP_UPDATE, &data, 1); /* 0x31 */
  439. }
  440. static void sd_stopN(struct gspca_dev *gspca_dev)
  441. {
  442. struct usb_device *dev = gspca_dev->dev;
  443. __u8 data;
  444. data = 0x0b;
  445. reg_w(dev, TV8532_GPIO_OE, &data, 1);
  446. }
  447. static void sd_stop0(struct gspca_dev *gspca_dev)
  448. {
  449. }
  450. static void sd_close(struct gspca_dev *gspca_dev)
  451. {
  452. }
  453. static void tv8532_preprocess(struct gspca_dev *gspca_dev)
  454. {
  455. struct sd *sd = (struct sd *) gspca_dev;
  456. /* we should received a whole frame with header and EOL marker
  457. * in gspca_dev->tmpbuf and return a GBRG pattern in gspca_dev->tmpbuf2
  458. * sequence 2bytes header the Alternate pixels bayer GB 4 bytes
  459. * Alternate pixels bayer RG 4 bytes EOL */
  460. int width = gspca_dev->width;
  461. int height = gspca_dev->height;
  462. unsigned char *dst = sd->tmpbuf2;
  463. unsigned char *data = sd->tmpbuf;
  464. int i;
  465. /* precompute where is the good bayer line */
  466. if (((data[3] + data[width + 7]) >> 1)
  467. + (data[4] >> 2)
  468. + (data[width + 6] >> 1) >= ((data[2] + data[width + 6]) >> 1)
  469. + (data[3] >> 2)
  470. + (data[width + 5] >> 1))
  471. data += 3;
  472. else
  473. data += 2;
  474. for (i = 0; i < height / 2; i++) {
  475. memcpy(dst, data, width);
  476. data += width + 3;
  477. dst += width;
  478. memcpy(dst, data, width);
  479. data += width + 7;
  480. dst += width;
  481. }
  482. }
  483. static void sd_pkt_scan(struct gspca_dev *gspca_dev,
  484. struct gspca_frame *frame, /* target */
  485. __u8 *data, /* isoc packet */
  486. int len) /* iso packet length */
  487. {
  488. struct sd *sd = (struct sd *) gspca_dev;
  489. if (data[0] != 0x80) {
  490. sd->packet++;
  491. if (sd->buflen + len > sizeof sd->tmpbuf) {
  492. if (gspca_dev->last_packet_type != DISCARD_PACKET) {
  493. PDEBUG(D_PACK, "buffer overflow");
  494. gspca_dev->last_packet_type = DISCARD_PACKET;
  495. }
  496. return;
  497. }
  498. memcpy(&sd->tmpbuf[sd->buflen], data, len);
  499. sd->buflen += len;
  500. return;
  501. }
  502. /* here we detect 0x80 */
  503. /* counter is limited so we need few header for a frame :) */
  504. /* header 0x80 0x80 0x80 0x80 0x80 */
  505. /* packet 00 63 127 145 00 */
  506. /* sof 0 1 1 0 0 */
  507. /* update sequence */
  508. if (sd->packet == 63 || sd->packet == 127)
  509. sd->synchro = 1;
  510. /* is there a frame start ? */
  511. if (sd->packet >= (gspca_dev->height >> 1) - 1) {
  512. PDEBUG(D_PACK, "SOF > %d packet %d", sd->synchro,
  513. sd->packet);
  514. if (!sd->synchro) { /* start of frame */
  515. if (gspca_dev->last_packet_type == FIRST_PACKET) {
  516. tv8532_preprocess(gspca_dev);
  517. frame = gspca_frame_add(gspca_dev,
  518. LAST_PACKET,
  519. frame, sd->tmpbuf2,
  520. gspca_dev->width *
  521. gspca_dev->width);
  522. }
  523. gspca_frame_add(gspca_dev, FIRST_PACKET,
  524. frame, data, 0);
  525. memcpy(sd->tmpbuf, data, len);
  526. sd->buflen = len;
  527. sd->packet = 0;
  528. return;
  529. }
  530. if (gspca_dev->last_packet_type != DISCARD_PACKET) {
  531. PDEBUG(D_PACK,
  532. "Warning wrong TV8532 frame detection %d",
  533. sd->packet);
  534. gspca_dev->last_packet_type = DISCARD_PACKET;
  535. }
  536. return;
  537. }
  538. if (!sd->synchro) {
  539. /* Drop packet frame corrupt */
  540. PDEBUG(D_PACK, "DROP SOF %d packet %d",
  541. sd->synchro, sd->packet);
  542. sd->packet = 0;
  543. gspca_dev->last_packet_type = DISCARD_PACKET;
  544. return;
  545. }
  546. sd->synchro = 1;
  547. sd->packet++;
  548. memcpy(&sd->tmpbuf[sd->buflen], data, len);
  549. sd->buflen += len;
  550. }
  551. static void setcontrast(struct gspca_dev *gspca_dev)
  552. {
  553. }
  554. static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
  555. {
  556. struct sd *sd = (struct sd *) gspca_dev;
  557. sd->brightness = val;
  558. if (gspca_dev->streaming)
  559. setbrightness(gspca_dev);
  560. return 0;
  561. }
  562. static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
  563. {
  564. struct sd *sd = (struct sd *) gspca_dev;
  565. *val = sd->brightness;
  566. return 0;
  567. }
  568. static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
  569. {
  570. struct sd *sd = (struct sd *) gspca_dev;
  571. sd->contrast = val;
  572. if (gspca_dev->streaming)
  573. setcontrast(gspca_dev);
  574. return 0;
  575. }
  576. static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
  577. {
  578. struct sd *sd = (struct sd *) gspca_dev;
  579. *val = sd->contrast;
  580. return 0;
  581. }
  582. /* sub-driver description */
  583. static struct sd_desc sd_desc = {
  584. .name = MODULE_NAME,
  585. .ctrls = sd_ctrls,
  586. .nctrls = ARRAY_SIZE(sd_ctrls),
  587. .config = sd_config,
  588. .open = sd_open,
  589. .start = sd_start,
  590. .stopN = sd_stopN,
  591. .stop0 = sd_stop0,
  592. .close = sd_close,
  593. .pkt_scan = sd_pkt_scan,
  594. };
  595. /* -- module initialisation -- */
  596. #define DVNM(name) .driver_info = (kernel_ulong_t) name
  597. static __devinitdata struct usb_device_id device_table[] = {
  598. {USB_DEVICE(0x046d, 0x0920), DVNM("QC Express")},
  599. {USB_DEVICE(0x046d, 0x0921), DVNM("Labtec Webcam")},
  600. {USB_DEVICE(0x0545, 0x808b), DVNM("Veo Stingray")},
  601. {USB_DEVICE(0x0545, 0x8333), DVNM("Veo Stingray")},
  602. {USB_DEVICE(0x0923, 0x010f), DVNM("ICM532 cams")},
  603. {}
  604. };
  605. MODULE_DEVICE_TABLE(usb, device_table);
  606. /* -- device connect -- */
  607. static int sd_probe(struct usb_interface *intf,
  608. const struct usb_device_id *id)
  609. {
  610. return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
  611. THIS_MODULE);
  612. }
  613. static struct usb_driver sd_driver = {
  614. .name = MODULE_NAME,
  615. .id_table = device_table,
  616. .probe = sd_probe,
  617. .disconnect = gspca_disconnect,
  618. };
  619. /* -- module insert / remove -- */
  620. static int __init sd_mod_init(void)
  621. {
  622. if (usb_register(&sd_driver) < 0)
  623. return -1;
  624. PDEBUG(D_PROBE, "v%s registered", version);
  625. return 0;
  626. }
  627. static void __exit sd_mod_exit(void)
  628. {
  629. usb_deregister(&sd_driver);
  630. PDEBUG(D_PROBE, "deregistered");
  631. }
  632. module_init(sd_mod_init);
  633. module_exit(sd_mod_exit);