webcam.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. #pragma once
  2. #include <linux/firmware.h>
  3. int r5u870_control_msg( struct driverInstance* this, int write, int class, u8 request, u16 value, u16 index, void* data, u16 size );
  4. int r5u870_cap_stop_uvc( struct driverInstance* );
  5. int r5u870_decide_pkt_uvc( struct driverInstance*, int pktstatus, int pktlen, const u8* pktdata, int* start );
  6. int r5u870_uvc_parse_vc( struct driverInstance* );
  7. int webcamApplyFormat_uvc( struct driverInstance* );
  8. struct claimed_interface {
  9. struct list_head listItem; //ui_links;
  10. struct usb_interface* interface; //ui_intf;
  11. };
  12. /****************************
  13. * CONTROLS *
  14. ****************************/
  15. static const char* powerline_frequency_menu_item_names[] = { "Off", "50 Hz", "60 Hz", "" };
  16. struct webcam_control {
  17. struct v4l2_ctrl_config control;//uc_v4l
  18. int reg;
  19. //uvc only
  20. u8 unit;
  21. u8 info;
  22. u8 size;
  23. };
  24. /****************************
  25. * ENUM *
  26. ****************************/
  27. /*
  28. * WDM Device Registers are listed below.
  29. *
  30. * To set: use r5u870_set_reg_wdm().
  31. *
  32. * No information is given about how to retrieve values from these
  33. * registers.
  34. *
  35. * Note that some register IDs are overloaded. The Sony cam drivers
  36. * seem to use 0x36 for backlight compensation and 0x37 for gain,
  37. * whereas the HP drivers use 0x36 for color enable and 0x37 for frame
  38. * rate.
  39. */
  40. enum {
  41. R5U870_REG_BRIGHTNESS = 0x02, // Brightness: [0,127] D:63
  42. R5U870_REG_CONTRAST = 0x04, // Contrast: [0,127] D:63
  43. R5U870_REG_HUE = 0x34, // Hue: [-180,180] D:0 (16-bit 2's complement)
  44. R5U870_REG_SATURATION = 0x05, // Saturation: [0,127] D:63
  45. R5U870_REG_SHARPNESS = 0x03, // Sharpness: [0,127] D:63
  46. R5U870_REG_GAMMA = 0x35, // Gamma correction: [1,500] D:100
  47. R5U870_REG_COLOR_ENABLE = 0x36, // Registers with unknown usage
  48. R5U870_REG_WHITE_BALANCE = 0x1, // White balance: [0,127] D:63
  49. R5U870_REG_FRAME_RATE = 0x37, // Frame Rate: D:30
  50. /* Registers with unknown usage */
  51. R5U870_REG_BRIGHTNESS_EX = 0x20,
  52. R5U870_REG_CONTRAST_EX = 0x21,
  53. R5U870_REG_HUE_EX = 0x22,
  54. R5U870_REG_SATURATION_EX = 0x23,
  55. R5U870_REG_SHARPNESS_EX = 0x24,
  56. R5U870_REG_GAMMA_EX = 0x25,
  57. R5U870_REG_WB_RED_EX = 0x26, // White balance red value: [0,255] D:127
  58. R5U870_REG_WB_GREEN_EX = 0x27, // White balance green value: [0,255] D:127
  59. R5U870_REG_WB_BLUE_EX = 0x28, // White balance blue value: [0,255] D:127
  60. R5U870_REG_WB_AUTO_EX = 0x29, // Auto white balance: [0,1] D:1
  61. R5U870_REG_EXPOSURE_EX = 0x2a, // Exposure Control: [0,255] D:255
  62. R5U870_REG_AEC_EX = 0x2b, // Auto Exposure Control: [0,1] D:1
  63. R5U870_REG_GAIN_EX = 0x2c, // Gain: [0,127] D:63
  64. R5U870_REG_AGC_EX = 0x2d, // Auto Gain: [0,1] D:0
  65. R5U870_REG_POWERLINE_EX = 0x2e, // Light source flicker compensation: see R5U870_POWERLINE
  66. R5U870_REG_SCENE_EX = 0x2f, // Registers with unknown usage
  67. R5U870_REG_VFLIP_EX = 0x30, // Vertical flip: [0,1] D:0
  68. R5U870_REG_HFLIP_EX = 0x31, // Horizontal flip: [0,1] D:0
  69. R5U870_REG_PRIVACY_EX = 0x32, // Blank image: [0,1] D:0
  70. R5U870_REG_NIGHT_MODE_EX = 0x33, // Night mode: [0,1] D:0
  71. R5U870_REG_BACKLIGHT_COMP = 0x36, // Backlight compensation: [0,500] D:1
  72. R5U870_REG_GAIN = 0x37, // Registers with unknown usage
  73. R5U870_REG_BACKLIGHT_COMP_2 = 0x39, // Backlight compensation for 1834 device: [0,2] D:1
  74. /* Values for R5U870_REG_POWERLINE flicker compensation */
  75. R5U870_POWERLINE_OFF = 0,
  76. R5U870_POWERLINE_50HZ = 1,
  77. R5U870_POWERLINE_60HZ = 2,
  78. R5U870_EMPTYPKT_FRAME_DELIM = 10, // Number of empty packets between frames
  79. R5U870_EMPTYPKT_GIVE_UP = 4000, //Number of empty packets before declaring the device dead (.5sec)
  80. };
  81. enum {
  82. R5U870_WDM_CTRL_BRIGHTNESS,
  83. R5U870_WDM_CTRL_CONTRAST,
  84. R5U870_WDM_CTRL_SATURATION,
  85. R5U870_WDM_CTRL_SHARPNESS,
  86. R5U870_WDM_CTRL_HUE,
  87. R5U870_WDM_CTRL_GAMMA,
  88. R5U870_WDM_CTRL_BACKLIGHT_COMP_500,
  89. R5U870_WDM_CTRL_BACKLIGHT_COMP_500_DEF1,
  90. R5U870_WDM_CTRL_BACKLIGHT_COMP_X1834,
  91. R5U870_WDM_CTRL_WB_RED,
  92. R5U870_WDM_CTRL_WB_GREEN,
  93. R5U870_WDM_CTRL_WB_BLUE,
  94. R5U870_WDM_CTRL_WB_AUTO,
  95. R5U870_WDM_CTRL_AUTO_EXPOSURE,
  96. R5U870_WDM_CTRL_EXPOSURE,
  97. R5U870_WDM_CTRL_AUTO_GAIN,
  98. R5U870_WDM_CTRL_GAIN,
  99. R5U870_WDM_CTRL_POWERLINE,
  100. R5U870_WDM_CTRL_VFLIP,
  101. R5U870_WDM_CTRL_VFLIP_DEFAULTON,
  102. R5U870_WDM_CTRL_HFLIP,
  103. R5U870_WDM_CTRL_PRIVACY,
  104. R5U870_WDM_CTRL_NIGHTMODE,
  105. R5U870_WDM_CTRL_LAST = 0xffff,
  106. };
  107. //this defines is not exist in the kernel
  108. //R5U870_WDM_CTRL_AUTO_EXPOSURE,//V4L2_CID_EXPOSURE_AUTO
  109. //R5U870_WDM_CTRL_WB_GREEN,//V4L2_CID_GREEN_BALANCE
  110. /****************************
  111. * MODEL CONTROLS DB *
  112. ****************************/
  113. static const int r5u870_1830_ctrls[] = {
  114. R5U870_WDM_CTRL_BRIGHTNESS,
  115. R5U870_WDM_CTRL_CONTRAST,
  116. R5U870_WDM_CTRL_SATURATION,
  117. R5U870_WDM_CTRL_SHARPNESS,
  118. R5U870_WDM_CTRL_HUE,
  119. R5U870_WDM_CTRL_GAMMA,
  120. R5U870_WDM_CTRL_BACKLIGHT_COMP_500,
  121. R5U870_WDM_CTRL_WB_RED,
  122. R5U870_WDM_CTRL_WB_GREEN,
  123. R5U870_WDM_CTRL_WB_BLUE,
  124. R5U870_WDM_CTRL_WB_AUTO,
  125. R5U870_WDM_CTRL_GAIN,
  126. R5U870_WDM_CTRL_POWERLINE,
  127. R5U870_WDM_CTRL_VFLIP,
  128. R5U870_WDM_CTRL_HFLIP,
  129. R5U870_WDM_CTRL_PRIVACY,
  130. R5U870_WDM_CTRL_NIGHTMODE,
  131. R5U870_WDM_CTRL_LAST,
  132. };
  133. static const int r5u870_1832_ctrls[] = {
  134. R5U870_WDM_CTRL_BRIGHTNESS,
  135. R5U870_WDM_CTRL_CONTRAST,
  136. R5U870_WDM_CTRL_HUE,
  137. R5U870_WDM_CTRL_SATURATION,
  138. R5U870_WDM_CTRL_BACKLIGHT_COMP_500_DEF1,
  139. R5U870_WDM_CTRL_POWERLINE,
  140. R5U870_WDM_CTRL_VFLIP,
  141. R5U870_WDM_CTRL_HFLIP,
  142. R5U870_WDM_CTRL_PRIVACY,
  143. R5U870_WDM_CTRL_NIGHTMODE,
  144. R5U870_WDM_CTRL_LAST,
  145. };
  146. static const int r5u870_1833_ctrls[] = {
  147. R5U870_WDM_CTRL_BRIGHTNESS,
  148. R5U870_WDM_CTRL_CONTRAST,
  149. R5U870_WDM_CTRL_HUE,
  150. R5U870_WDM_CTRL_SATURATION,
  151. R5U870_WDM_CTRL_SHARPNESS,
  152. R5U870_WDM_CTRL_GAMMA,
  153. R5U870_WDM_CTRL_BACKLIGHT_COMP_500_DEF1,
  154. R5U870_WDM_CTRL_WB_RED,
  155. R5U870_WDM_CTRL_WB_GREEN,
  156. R5U870_WDM_CTRL_WB_BLUE,
  157. R5U870_WDM_CTRL_WB_AUTO,
  158. R5U870_WDM_CTRL_POWERLINE,
  159. R5U870_WDM_CTRL_VFLIP,
  160. R5U870_WDM_CTRL_HFLIP,
  161. R5U870_WDM_CTRL_PRIVACY,
  162. R5U870_WDM_CTRL_NIGHTMODE,
  163. R5U870_WDM_CTRL_LAST,
  164. };
  165. static const int r5u870_1834_ctrls[] = {
  166. R5U870_WDM_CTRL_BRIGHTNESS,
  167. R5U870_WDM_CTRL_CONTRAST,
  168. R5U870_WDM_CTRL_HUE,
  169. R5U870_WDM_CTRL_SATURATION,
  170. R5U870_WDM_CTRL_SHARPNESS,
  171. R5U870_WDM_CTRL_GAMMA,
  172. R5U870_WDM_CTRL_BACKLIGHT_COMP_X1834,
  173. R5U870_WDM_CTRL_WB_AUTO,
  174. R5U870_WDM_CTRL_WB_RED,
  175. R5U870_WDM_CTRL_WB_BLUE,
  176. R5U870_WDM_CTRL_AUTO_EXPOSURE,
  177. R5U870_WDM_CTRL_EXPOSURE,
  178. R5U870_WDM_CTRL_AUTO_GAIN,
  179. R5U870_WDM_CTRL_GAIN,
  180. R5U870_WDM_CTRL_POWERLINE,
  181. R5U870_WDM_CTRL_VFLIP,
  182. R5U870_WDM_CTRL_HFLIP,
  183. R5U870_WDM_CTRL_PRIVACY,
  184. R5U870_WDM_CTRL_NIGHTMODE,
  185. R5U870_WDM_CTRL_LAST,
  186. };
  187. static const int r5u870_1870_ctrls[] = {
  188. R5U870_WDM_CTRL_BRIGHTNESS,
  189. R5U870_WDM_CTRL_CONTRAST,
  190. R5U870_WDM_CTRL_HUE,
  191. R5U870_WDM_CTRL_SATURATION,
  192. R5U870_WDM_CTRL_SHARPNESS,
  193. R5U870_WDM_CTRL_GAMMA,
  194. R5U870_WDM_CTRL_WB_AUTO,
  195. R5U870_WDM_CTRL_WB_RED,
  196. R5U870_WDM_CTRL_WB_BLUE,
  197. R5U870_WDM_CTRL_AUTO_EXPOSURE,
  198. R5U870_WDM_CTRL_EXPOSURE,
  199. R5U870_WDM_CTRL_AUTO_GAIN,
  200. R5U870_WDM_CTRL_GAIN,
  201. R5U870_WDM_CTRL_POWERLINE,
  202. R5U870_WDM_CTRL_VFLIP,
  203. R5U870_WDM_CTRL_HFLIP,
  204. R5U870_WDM_CTRL_PRIVACY,
  205. R5U870_WDM_CTRL_NIGHTMODE,
  206. R5U870_WDM_CTRL_LAST,
  207. };
  208. /*
  209. * Even the UVC models do not express all of their controls in the UVC
  210. * descriptor tables, and get sets of hard-coded vendor controls
  211. */
  212. // FIXME: This device still has a bunch of unknown control IDs.
  213. static const int r5u870_1812_ctrls[] = {
  214. R5U870_WDM_CTRL_WB_RED,
  215. R5U870_WDM_CTRL_WB_GREEN,
  216. R5U870_WDM_CTRL_WB_BLUE,
  217. R5U870_WDM_CTRL_VFLIP,
  218. R5U870_WDM_CTRL_HFLIP,
  219. R5U870_WDM_CTRL_PRIVACY,
  220. R5U870_WDM_CTRL_LAST,
  221. };
  222. static const int r5u870_1835_ctrls[] = {
  223. R5U870_WDM_CTRL_WB_RED,
  224. R5U870_WDM_CTRL_WB_GREEN,
  225. R5U870_WDM_CTRL_WB_BLUE,
  226. R5U870_WDM_CTRL_WB_AUTO,
  227. R5U870_WDM_CTRL_VFLIP,
  228. R5U870_WDM_CTRL_HFLIP,
  229. R5U870_WDM_CTRL_PRIVACY,
  230. R5U870_WDM_CTRL_LAST,
  231. };
  232. static const int r5u870_1810_1836_ctrls[] = {
  233. R5U870_WDM_CTRL_WB_AUTO,
  234. R5U870_WDM_CTRL_WB_RED,
  235. R5U870_WDM_CTRL_WB_BLUE,
  236. R5U870_WDM_CTRL_AUTO_EXPOSURE,
  237. R5U870_WDM_CTRL_EXPOSURE,
  238. R5U870_WDM_CTRL_AUTO_GAIN,
  239. R5U870_WDM_CTRL_GAIN,
  240. R5U870_WDM_CTRL_VFLIP,
  241. R5U870_WDM_CTRL_HFLIP,
  242. R5U870_WDM_CTRL_PRIVACY,
  243. R5U870_WDM_CTRL_NIGHTMODE,
  244. R5U870_WDM_CTRL_LAST,
  245. };
  246. static const int r5u870_1810_1837_ctrls[] = {
  247. R5U870_WDM_CTRL_WB_AUTO,
  248. R5U870_WDM_CTRL_WB_RED,
  249. R5U870_WDM_CTRL_WB_BLUE,
  250. R5U870_WDM_CTRL_AUTO_EXPOSURE,
  251. R5U870_WDM_CTRL_EXPOSURE,
  252. R5U870_WDM_CTRL_AUTO_GAIN,
  253. R5U870_WDM_CTRL_GAIN,
  254. R5U870_WDM_CTRL_VFLIP_DEFAULTON,
  255. R5U870_WDM_CTRL_HFLIP,
  256. R5U870_WDM_CTRL_PRIVACY,
  257. R5U870_WDM_CTRL_NIGHTMODE,
  258. R5U870_WDM_CTRL_LAST,
  259. };
  260. static const int r5u870_1810_183a_ctrls[] = {
  261. R5U870_WDM_CTRL_WB_RED,
  262. R5U870_WDM_CTRL_WB_GREEN,
  263. R5U870_WDM_CTRL_WB_BLUE,
  264. R5U870_WDM_CTRL_WB_AUTO,
  265. R5U870_WDM_CTRL_VFLIP,
  266. R5U870_WDM_CTRL_HFLIP,
  267. R5U870_WDM_CTRL_PRIVACY,
  268. R5U870_WDM_CTRL_NIGHTMODE,
  269. R5U870_WDM_CTRL_LAST,
  270. };
  271. static const int r5u870_1810_183b_ctrls[] = {
  272. /* TODO: Maybe there are more of these? I don't actually have a webcam
  273. to test against the different WDM controls. */
  274. R5U870_WDM_CTRL_WB_RED,
  275. R5U870_WDM_CTRL_WB_GREEN,
  276. R5U870_WDM_CTRL_WB_BLUE,
  277. R5U870_WDM_CTRL_WB_AUTO,
  278. R5U870_WDM_CTRL_VFLIP,
  279. R5U870_WDM_CTRL_HFLIP,
  280. R5U870_WDM_CTRL_PRIVACY,
  281. R5U870_WDM_CTRL_NIGHTMODE,
  282. R5U870_WDM_CTRL_LAST,
  283. };
  284. static const int r5u870_1810_183e_ctrls[] = {
  285. /* TODO: Maybe there are more of these? I don't actually have a webcam
  286. to test against the different WDM controls. */
  287. R5U870_WDM_CTRL_WB_RED,
  288. R5U870_WDM_CTRL_WB_GREEN,
  289. R5U870_WDM_CTRL_WB_BLUE,
  290. R5U870_WDM_CTRL_WB_AUTO,
  291. R5U870_WDM_CTRL_VFLIP,
  292. R5U870_WDM_CTRL_HFLIP,
  293. R5U870_WDM_CTRL_PRIVACY,
  294. R5U870_WDM_CTRL_NIGHTMODE,
  295. R5U870_WDM_CTRL_LAST,
  296. };
  297. static const int r5u870_1810_1839_ctrls[] = {
  298. /* TODO: Maybe there are more of these? I don't actually have a webcam
  299. to test against the different WDM controls. */
  300. R5U870_WDM_CTRL_WB_RED,
  301. R5U870_WDM_CTRL_WB_GREEN,
  302. R5U870_WDM_CTRL_WB_BLUE,
  303. R5U870_WDM_CTRL_WB_AUTO,
  304. R5U870_WDM_CTRL_VFLIP,
  305. R5U870_WDM_CTRL_HFLIP,
  306. R5U870_WDM_CTRL_PRIVACY,
  307. R5U870_WDM_CTRL_LAST,
  308. };
  309. static const int r5u870_1841_ctrls[] = {
  310. /* TODO: Maybe there are more of these? I don't actually have a webcam
  311. to test against the different WDM controls. */
  312. R5U870_WDM_CTRL_WB_RED,
  313. R5U870_WDM_CTRL_WB_GREEN,
  314. R5U870_WDM_CTRL_WB_BLUE,
  315. R5U870_WDM_CTRL_WB_AUTO,
  316. R5U870_WDM_CTRL_VFLIP,
  317. R5U870_WDM_CTRL_HFLIP,
  318. R5U870_WDM_CTRL_PRIVACY,
  319. R5U870_WDM_CTRL_LAST,
  320. };
  321. /****************************
  322. * RESOLUTIONS DB *
  323. ****************************/
  324. /*
  325. * Standard resolution table for non-UVC cameras,
  326. * as UVC camera report back as to what resolutions
  327. * they support.
  328. * The Sony VGP-VCC2 Windows driver supports:
  329. * 160x120, 176x144, 320x240, 352x288, 640x480
  330. * The HP driver also supports 1280x1024
  331. */
  332. static const struct r5u870_resolution r5u870_vga_wdm_res[] = {
  333. { 160, 120, 1152000 },//30 fps
  334. { 176, 144, 1520640 },//30 fps
  335. { 320, 240, 4608000 },//30 fps
  336. { 352, 288, 6082560 },//30 fps
  337. { 640, 480, 18432000 },//30 fps
  338. { }
  339. };
  340. static const struct r5u870_resolution r5u870_sxga_wdm_res[] = {
  341. { 160, 120, 1152000 },//30 fps
  342. { 176, 144, 1520640 },//30 fps
  343. { 320, 240, 4608000 },//30 fps
  344. { 352, 288, 6082560 },//30 fps
  345. { 640, 480, 18432000 },//30 fps
  346. { 1280, 1024, 19660800 },//7.5 fps
  347. { }
  348. };
  349. static struct r5u870_pixelformat r5u870_vga_wdm_pixfmts[] = {
  350. {
  351. .description = "YUY2 4:2:2",
  352. .pixelformat = V4L2_PIX_FMT_YUYV,
  353. .flags = 0,
  354. .formatId = 0,
  355. .resolutionTable = r5u870_vga_wdm_res
  356. },
  357. {
  358. .description = "UYVY 4:2:2",
  359. .pixelformat = V4L2_PIX_FMT_UYVY,
  360. .flags = 0,
  361. .formatId = 1,
  362. .resolutionTable = r5u870_vga_wdm_res
  363. },
  364. };
  365. static struct r5u870_pixelformat r5u870_sxga_wdm_pixfmts[] = {
  366. {
  367. .description = "YUY2 4:2:2",
  368. .pixelformat = V4L2_PIX_FMT_YUYV,
  369. .flags = 0,
  370. .formatId = 0,
  371. .resolutionTable = r5u870_sxga_wdm_res
  372. },
  373. {
  374. .description = "UYVY 4:2:2",
  375. .pixelformat = V4L2_PIX_FMT_UYVY,
  376. .flags = 0,
  377. .formatId = 1,
  378. .resolutionTable = r5u870_sxga_wdm_res
  379. },
  380. };
  381. /****************************
  382. * MODELS DB *
  383. ****************************/
  384. static const struct r5u870_model r5u870_models[] = {
  385. [R5U870_DI_VGP_VCC2_SZ] = {
  386. .modelName = "Sony VGP-VCC2 (VAIO SZ)",
  387. .ucodeFile = "r5u870_1830.fw",
  388. .ucodeVersion = 0x0100,
  389. .controls_wdm = r5u870_1830_ctrls,
  390. .pixelformats = r5u870_vga_wdm_pixfmts,
  391. .pixelformatsCount = ARRAY_SIZE(r5u870_vga_wdm_pixfmts),
  392. },
  393. [R5U870_DI_VGP_VCC3] = {
  394. .modelName = "Sony VGP-VCC3",
  395. .ucodeFile = "r5u870_1832.fw",
  396. .ucodeVersion = 0x0100,
  397. .controls_wdm = r5u870_1832_ctrls,
  398. .pixelformats = r5u870_vga_wdm_pixfmts,
  399. .pixelformatsCount = ARRAY_SIZE(r5u870_vga_wdm_pixfmts),
  400. .rm_no_ctrl_reload = 1,
  401. },
  402. [R5U870_DI_VGP_VCC2_AR1] = {
  403. .modelName = "Sony VGP-VCC2 (VAIO AR1)",
  404. .ucodeFile = "r5u870_1833.fw",
  405. .ucodeVersion = 0x0100,
  406. .controls_wdm = r5u870_1833_ctrls,
  407. .pixelformats = r5u870_vga_wdm_pixfmts,
  408. .pixelformatsCount = ARRAY_SIZE(r5u870_vga_wdm_pixfmts),
  409. },
  410. [R5U870_DI_VGP_VCC2_AR2] = {
  411. .modelName = "Sony VGP-VCC2 (VAIO AR)",
  412. .ucodeFile = "r5u870_1834.fw",
  413. .ucodeVersion = 0x0111,
  414. .controls_wdm = r5u870_1834_ctrls,
  415. .pixelformats = r5u870_vga_wdm_pixfmts,
  416. .pixelformatsCount = ARRAY_SIZE(r5u870_vga_wdm_pixfmts),
  417. },
  418. [R5U870_DI_VGP_VCC5] = {
  419. .modelName = "Sony VGP-VCC5",
  420. .ucodeFile = "r5u870_1835.fw",
  421. .ucodeVersion = 0x0107,
  422. .controls_wdm = r5u870_1835_ctrls,
  423. .isUvc = 1,
  424. },
  425. [R5U870_DI_VGP_VCC4] = {
  426. .modelName = "Sony VGP-VCC4",
  427. .ucodeFile = "r5u870_1836.fw",
  428. .ucodeVersion = 0x0115,
  429. .controls_wdm = r5u870_1810_1836_ctrls,
  430. .isUvc = 1,
  431. },
  432. [R5U870_DI_VGP_VCC4_VFLIP] = {
  433. .modelName = "Sony VGP-VCC4",
  434. .ucodeFile = "r5u870_1836.fw",
  435. .ucodeVersion = 0x0115,
  436. .controls_wdm = r5u870_1810_1837_ctrls,
  437. .isUvc = 1,
  438. },
  439. [R5U870_DI_VGP_VCC6] = {
  440. .modelName = "Sony VGP-VCC6",
  441. .ucodeFile = "r5u870_1839.fw",
  442. //Which one is correct?
  443. //.ucodeVersion = 0x0113,
  444. .ucodeVersion = 0x0030,
  445. .controls_wdm = r5u870_1810_1839_ctrls,
  446. .isUvc = 1,
  447. },
  448. [R5U870_DI_VGP_VCC7] = {
  449. .modelName = "Sony VGP-VCC7",
  450. .ucodeFile = "r5u870_183a.fw",
  451. .ucodeVersion = 0x0111,
  452. .controls_wdm = r5u870_1810_183a_ctrls,
  453. .isUvc = 1,
  454. },
  455. [R5U870_DI_VGP_VCC8] = {
  456. .modelName = "Sony VGP-VCC8",
  457. .ucodeFile = "r5u870_183b.fw",
  458. .ucodeVersion = 0x0131,
  459. .controls_wdm = r5u870_1810_183b_ctrls,
  460. .isUvc = 1,
  461. },
  462. [R5U870_DI_VGP_VCC9] = {
  463. .modelName = "Sony VGP-VCC9",
  464. .ucodeFile = "r5u870_183e.fw",
  465. .ucodeVersion = 0x0100,
  466. .controls_wdm = r5u870_1810_183e_ctrls,
  467. .isUvc = 1,
  468. },
  469. [R5U870_DI_FUJITSU] = {
  470. .modelName = "Fujitsu F01",
  471. .ucodeFile = "r5u870_1841.fw",
  472. .ucodeVersion = 0x0103,
  473. .controls_wdm = r5u870_1841_ctrls,
  474. .isUvc = 1,
  475. },
  476. [R5U870_DI_HP_WEBCAM1K] = {
  477. .modelName = "HP Webcam 1000",
  478. .ucodeFile = "r5u870_1870_1.fw",
  479. .ucodeVersion = 0x0100,
  480. .controls_wdm = r5u870_1870_ctrls,
  481. .pixelformats = r5u870_vga_wdm_pixfmts,
  482. .pixelformatsCount = ARRAY_SIZE(r5u870_vga_wdm_pixfmts),
  483. },
  484. [R5U870_DI_HP_PAVWC_WDM] = {
  485. .modelName = "HP Pavilion Webcam (WDM)",
  486. .ucodeFile = "r5u870_1870.fw",
  487. .ucodeVersion = 0x0112,
  488. .controls_wdm = r5u870_1870_ctrls,
  489. .pixelformats = r5u870_sxga_wdm_pixfmts,
  490. .pixelformatsCount = ARRAY_SIZE(r5u870_sxga_wdm_pixfmts),
  491. .rm_no_ctrl_reload = 1,
  492. },
  493. [R5U870_DI_HP_PAVWC_UVC] = {
  494. .modelName = "HP Pavilion Webcam (UVC)",
  495. .ucodeFile = "r5u870_1810.fw",
  496. .ucodeVersion = 0x0115,
  497. .controls_wdm = r5u870_1810_1836_ctrls,
  498. .isUvc = 1,
  499. .rm_no_ctrl_reload = 1,
  500. },
  501. [R5U870_DI_HP_PAVWC_UVC_NOFW] = {
  502. .modelName = "HP Pavilion Webcam (UVC - NO FW)",
  503. .controls_wdm = r5u870_1812_ctrls,
  504. .isUvc = 1,
  505. .rm_no_ctrl_reload = 1,
  506. },
  507. [R5U870_DI_GENERIC_UVC] = {
  508. .modelName = "Generic UVC Webcam",
  509. .isUvc = 1,
  510. },
  511. };