pr2000.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036
  1. /*
  2. * ark1668 driver for pr2000 video codec.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. */
  8. #include <linux/module.h>
  9. #include <linux/init.h>
  10. #include <linux/errno.h>
  11. #include <linux/kernel.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/i2c.h>
  14. #include <linux/slab.h>
  15. #include <linux/of.h>
  16. #include <linux/gpio/consumer.h>
  17. #include <linux/videodev2.h>
  18. #include <media/v4l2-ioctl.h>
  19. #include <media/v4l2-event.h>
  20. #include <media/v4l2-device.h>
  21. #include <media/v4l2-ctrls.h>
  22. #include <linux/mutex.h>
  23. #include <linux/delay.h>
  24. #include <asm/gpio.h>
  25. //#include "ark_itu656.h"
  26. //#include "../../platform/arkmicro/ark1668e_vin.h"
  27. #include "pr2000.h"
  28. #define SENSOR_NAME "pr2000_csi0"
  29. #define Camera_PlugIn 0x01
  30. #define Camera_PlugOut 0x00
  31. #define PAGE_ADDR 0xff
  32. #define PAGE_0_DEC 0x00
  33. #define PAGE_1_DEC 0x01
  34. #define PR2000_CONTRAST_CTL 0x20
  35. #define PR2000_BRIGHTNESS_CTL 0x21
  36. #define PR2000_HUE_CTL 0x23
  37. #define PR2000_SATURATION_CTL 0x22
  38. enum SENSOR_DPI{
  39. PR2000_SENSOR_NONE,
  40. PR2000_CVBS_NTSC,
  41. PR2000_CVBS_PAL,
  42. PR2000_AHD_720P_25PFS,
  43. PR2000_AHD_720P_30PFS,
  44. PR2000_AHD_1080P_25PFS,
  45. PR2000_AHD_1080P_30PFS
  46. };
  47. enum pr2000_ic_type {
  48. DVR_IC_TYPE_UNKNOWN,
  49. DVR_IC_TYPE_PR2000,
  50. DVR_IC_TYPE_END
  51. };
  52. struct dvr_pr2000{
  53. struct v4l2_subdev sd;
  54. struct v4l2_ctrl_handler hdl;
  55. struct i2c_client *client;
  56. struct gpio_desc *reset_gpio;
  57. int gpio_irq;
  58. //int gpio_reset;
  59. int enter_carback;
  60. int id;
  61. u32 input;
  62. };
  63. enum {
  64. TYPE_UNKNOWN = -1,
  65. TYPE_CVBS = 0,
  66. TYPE_720P,
  67. TYPE_1080P,
  68. };
  69. enum {
  70. TYPE_UNDEF = 1,
  71. TYPE_PR2000,
  72. };
  73. #define VIDIOC_PR2000_GET_RESOLUTION _IOWR('V', BASE_VIDIOC_PRIVATE + 1, int)
  74. #define VIDIOC_PR2000_GET_PROGRESSIVE _IOWR('V', BASE_VIDIOC_PRIVATE + 2, int)
  75. #define VIDIOC_PR2000_GET_CHIPINFO _IOWR('V', BASE_VIDIOC_PRIVATE + 3, int)
  76. #define VIDIOC_PR2000_GET_ITU601_ENABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 6, int)
  77. #define DBG_MODULE 0x00000001
  78. #define DBG_I2C 0x00000002
  79. #define DBG_INPUT 0x00000004
  80. static unsigned int DbgLevel = DBG_MODULE|DBG_I2C|DBG_INPUT;
  81. #define PR2000_DBG(level, fmt, args...) do{ if( (level&DbgLevel)>0 ) \
  82. printk( KERN_DEBUG "[PR2000_DBG]: " fmt, ## args); }while(0)
  83. static struct dvr_pr2000 *g_dvr_pr2000 = NULL;
  84. //extern void ark_clear_carback_signal(void);
  85. //extern int ark_itu656_probe(struct i2c_client *client, struct ark_private_data *pdata);
  86. //extern int ark_itu656_remove(void);
  87. //extern void dvr_restart(int source);
  88. //static int pr2000_read_byte(unsigned char regaddr);
  89. //static int pr2000_write_byte(unsigned char regaddr, unsigned char regval);
  90. static int pr2000_read_byte(struct dvr_pr2000 *dvr_pr2000,unsigned char regaddr);
  91. static int pr2000_write_byte(struct dvr_pr2000 *dvr_pr2000, unsigned char regaddr, unsigned char regval);
  92. static int pr2000_read(struct v4l2_subdev *sd, unsigned char addr);
  93. static int pr2000_write(struct v4l2_subdev *sd, unsigned char addr,unsigned char value);
  94. //static int pr2000_reset(int gpio);
  95. static int pr2000_reset(struct dvr_pr2000 *dvr_pr2000);
  96. static int pr2000_detect(struct dvr_pr2000 *dvr_pr2000);
  97. //static int pr2000_init(struct dvr_pr2000 *dvr_pr2000);
  98. static int pr2000_init(struct v4l2_subdev *sd, u32 val);
  99. static int pr2000_dvr_start_cb(void);
  100. static int pr2000_dvr_stop_cb(void);
  101. int pr2000_detect_camera_plug_status(struct dvr_pr2000 *dvr_pr2000);
  102. int pr2000_signal_check(struct dvr_pr2000 *dvr_pr2000);
  103. int pr2000_resolution_detect(struct dvr_pr2000 *dvr_pr2000);
  104. /*
  105. * The default register settings
  106. *
  107. */
  108. //Test 720p_30fps
  109. u8 sensor_regs[] = {
  110. // Page0 vdec
  111. 0xff, 0x00,
  112. 0x10, 0x92,
  113. 0x11, 0x07,
  114. 0x12, 0x00,
  115. 0x13, 0x00,
  116. 0x14, 0x21, //b[1:0}, => Select Camera Input. VinP(1), VinN(3), Differ(0).
  117. 0x15, 0x44,
  118. 0x16, 0x0d,
  119. 0x40, 0x00,
  120. 0x47, 0x3a,
  121. 0x4e, 0x3f,
  122. 0x80, 0x56,
  123. 0x81, 0x0e,
  124. 0x82, 0x0d,
  125. 0x84, 0x30,
  126. 0x86, 0x20,
  127. 0x87, 0x00,
  128. 0x8a, 0x00,
  129. 0x90, 0x00,
  130. 0x91, 0x00,
  131. 0x92, 0x00,
  132. 0x94, 0xff,
  133. 0x95, 0xff,
  134. 0x96, 0xff,
  135. 0xa0, 0x00,
  136. 0xa1, 0x20,
  137. 0xa4, 0x01,
  138. 0xa5, 0xe3,
  139. 0xa6, 0x00,
  140. 0xa7, 0x52,//default:0x12 Polarity Inversion:0x52
  141. 0xa8, 0x04,//default:0x00 Polarity Inversion:0x04
  142. 0xd0, 0x30,
  143. 0xd1, 0x08,
  144. 0xd2, 0x21,
  145. 0xd3, 0x00,
  146. 0xd8, 0x31,//default:0x31 add:0x30
  147. 0xd9, 0x08,
  148. 0xda, 0x21,
  149. 0xe0, 0x39,
  150. 0xe1, 0x90,//default:0x90 add:0x80 Inversion:0xd0
  151. 0xe2, 0x38,//default:0x38 add:0x18
  152. 0xe3, 0x19,//default:0x19 add:0x00
  153. 0xe4, 0x19,//default:0x19 add:0x00
  154. 0xea, 0x01,
  155. 0xeb, 0xff,
  156. 0xf1, 0x44,
  157. 0xf2, 0x01,
  158. // Page1 vdec
  159. 0xff, 0x01,
  160. 0x00, 0xe4,////0xe4->black,0xe5->blue
  161. 0x01, 0x61,
  162. 0x02, 0x00,
  163. 0x03, 0x57,
  164. 0x04, 0x0c,
  165. 0x05, 0x88,
  166. 0x06, 0x04,
  167. 0x07, 0xb2,
  168. 0x08, 0x44,
  169. 0x09, 0x34,
  170. 0x0a, 0x02,
  171. 0x0b, 0x14,
  172. 0x0c, 0x04,
  173. 0x0d, 0x08,
  174. 0x0e, 0x5e,
  175. 0x0f, 0x5e,
  176. 0x10, 0x26,
  177. 0x11, 0x00,
  178. 0x12, 0x45,
  179. 0x13, 0xfc,
  180. 0x14, 0x00,
  181. 0x15, 0x18,
  182. 0x16, 0xd0,
  183. 0x17, 0x00,
  184. 0x18, 0x41,
  185. 0x19, 0x46,
  186. 0x1a, 0x22,
  187. 0x1b, 0x05,
  188. 0x1c, 0xea,
  189. 0x1d, 0x45,
  190. 0x1e, 0x40,
  191. 0x1f, 0x00,
  192. 0x20, 0x80,
  193. 0x21, 0x80,
  194. 0x22, 0x90,
  195. 0x23, 0x80,
  196. 0x24, 0x80,
  197. 0x25, 0x80,
  198. 0x26, 0x84,
  199. 0x27, 0x82,
  200. 0x28, 0x00,
  201. 0x29, 0x7b,
  202. 0x2a, 0xa6,
  203. 0x2b, 0x00,
  204. 0x2c, 0x00,
  205. 0x2d, 0x00,
  206. 0x2e, 0x00,
  207. 0x2f, 0x00,
  208. 0x30, 0x00,
  209. 0x31, 0x00,
  210. 0x32, 0xc0,
  211. 0x33, 0x14,
  212. 0x34, 0x14,
  213. 0x35, 0x80,
  214. 0x36, 0x80,
  215. 0x37, 0xaa,
  216. 0x38, 0x48,
  217. 0x39, 0x08,
  218. 0x3a, 0x27,
  219. 0x3b, 0x02,
  220. 0x3c, 0x01,
  221. 0x3d, 0x23,
  222. 0x3e, 0x02,
  223. 0x3f, 0xc4,
  224. 0x40, 0x05,
  225. 0x41, 0x55,
  226. 0x42, 0x01,
  227. 0x43, 0x33,
  228. 0x44, 0x6a,
  229. 0x45, 0x00,
  230. 0x46, 0x09,
  231. 0x47, 0xdc,
  232. 0x48, 0xa0,
  233. 0x49, 0x00,
  234. 0x4a, 0x7b,
  235. 0x4b, 0x60,
  236. 0x4c, 0x00,
  237. 0x4d, 0x4a,
  238. 0x4e, 0x00,
  239. 0x4f, 0x24,
  240. 0x50, 0x01,
  241. 0x51, 0x28,
  242. 0x52, 0x40,
  243. 0x53, 0x0c,
  244. 0x54, 0x0f,
  245. 0x55, 0x8d,
  246. 0x70, 0x06,
  247. 0x71, 0x08,
  248. 0x72, 0x0a,
  249. 0x73, 0x0c,
  250. 0x74, 0x0e,
  251. 0x75, 0x10,
  252. 0x76, 0x12,
  253. 0x77, 0x14,
  254. 0x78, 0x06,
  255. 0x79, 0x08,
  256. 0x7a, 0x0a,
  257. 0x7b, 0x0c,
  258. 0x7c, 0x0e,
  259. 0x7d, 0x10,
  260. 0x7e, 0x12,
  261. 0x7f, 0x14,
  262. 0x80, 0x00,
  263. 0x81, 0x09,
  264. 0x82, 0x00,
  265. 0x83, 0x07,
  266. 0x84, 0x00,
  267. 0x85, 0x17,
  268. 0x86, 0x03,
  269. 0x87, 0xe5,
  270. 0x88, 0x08,
  271. 0x89, 0x91,
  272. 0x8a, 0x08,
  273. 0x8b, 0x91,
  274. 0x8c, 0x0b,
  275. 0x8d, 0xe0,
  276. 0x8e, 0x05,
  277. 0x8f, 0x47,
  278. 0x90, 0x05,
  279. 0x91, 0xa0,
  280. 0x92, 0x73,
  281. 0x93, 0xe8,
  282. 0x94, 0x0f,
  283. 0x95, 0x5e,
  284. 0x96, 0x07,
  285. 0x97, 0x90,
  286. 0x98, 0x17,
  287. 0x99, 0x34,
  288. 0x9a, 0x13,
  289. 0x9b, 0x56,
  290. 0x9c, 0x0b,
  291. 0x9d, 0x9a,
  292. 0x9e, 0x09,
  293. 0x9f, 0xab,
  294. 0xa0, 0x01,
  295. 0xa1, 0x74,
  296. 0xa2, 0x01,
  297. 0xa3, 0x6b,
  298. 0xa4, 0x00,
  299. 0xa5, 0xba,
  300. 0xa6, 0x00,
  301. 0xa7, 0xa3,
  302. 0xa8, 0x01,
  303. 0xa9, 0x39,
  304. 0xaa, 0x01,
  305. 0xab, 0x39,
  306. 0xac, 0x00,
  307. 0xad, 0xc1,
  308. 0xae, 0x00,
  309. 0xaf, 0xc1,
  310. 0xb0, 0x09,
  311. 0xb1, 0xaa,
  312. 0xb2, 0x0f,
  313. 0xb3, 0xae,
  314. 0xb4, 0x00,
  315. 0xb5, 0x17,
  316. 0xb6, 0x08,
  317. 0xb7, 0xe8,
  318. 0xb8, 0xb0,
  319. 0xb9, 0xce,
  320. 0xba, 0x90,
  321. 0xbb, 0x00,
  322. 0xbc, 0x00,
  323. 0xbd, 0x04,
  324. 0xbe, 0x05,
  325. 0xbf, 0x00,
  326. 0xc0, 0x00,
  327. 0xc1, 0x18,
  328. 0xc2, 0x02,
  329. 0xc3, 0xd0,
  330. 0xff, 0x01,
  331. 0x54, 0x0e,
  332. 0xff, 0x01,
  333. 0x54, 0x0f,
  334. };
  335. static inline struct dvr_pr2000 *to_pr2000(struct v4l2_subdev *sd)
  336. {
  337. return container_of(sd, struct dvr_pr2000, sd);
  338. }
  339. static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl)
  340. {
  341. return &container_of(ctrl->handler, struct dvr_pr2000, hdl)->sd;
  342. }
  343. //static int pr2000_reset(int gpio)
  344. static int pr2000_reset(struct dvr_pr2000 *dvr_pr2000)
  345. {
  346. PR2000_DBG(DBG_INPUT,"%s\n", __FUNCTION__);
  347. //if(gpio >= 0)
  348. //{
  349. //gpio_direction_output(gpio,1);
  350. //msleep(1);
  351. //gpio_direction_output(gpio,0);
  352. //msleep(100);
  353. //gpio_direction_output(gpio,1);
  354. //msleep(100);
  355. //}
  356. gpiod_direction_output(dvr_pr2000->reset_gpio,0);
  357. msleep(50);
  358. gpiod_direction_output(dvr_pr2000->reset_gpio,1);
  359. msleep(50);
  360. return 0;
  361. }
  362. static int pr2000_check_id(struct dvr_pr2000 *pr2000)
  363. {
  364. PR2000_DBG(DBG_INPUT,"%s\n", __FUNCTION__);
  365. int ret,dvr_id = -1;
  366. int nReg;
  367. unsigned char id_lsb = 0, id_msb = 0;
  368. dvr_id = pr2000_write_byte(pr2000,0xff,0x00);
  369. if(dvr_id < 0)
  370. goto err_check_id;
  371. id_msb = pr2000_read_byte(pr2000,0xfc);
  372. if(id_msb < 0)
  373. goto err_check_id;
  374. id_lsb = pr2000_read_byte(pr2000,0xfd);
  375. if(dvr_id < 0)
  376. goto err_check_id;
  377. dvr_id = (id_msb << 8) |id_lsb;
  378. PR2000_DBG(DBG_INPUT,"pr2000_detect. Chip_ID=0x%04x\n", dvr_id);
  379. if(dvr_id == 0x2000){
  380. pr2000->id = DVR_IC_TYPE_PR2000;//jianchuang
  381. //PR2000_DBG(DBG_INPUT,"------------------>PR2000_init_cfg_720p_30pfs<------------------\n");
  382. for(nReg=0; nReg < ARRAY_SIZE(PR2000_init_cfg_720p_30pfs); nReg+=2) {
  383. ret = pr2000_write_byte(pr2000,PR2000_init_cfg_720p_30pfs[nReg], PR2000_init_cfg_720p_30pfs[nReg+1]);
  384. //printk("[pr2000_init] Reg[0x%02x,0x%02x]\r\n",PR2000_init_cfg_720p_30pfs[nReg],PR2000_init_cfg_720p_30pfs[nReg+1]);
  385. }
  386. }
  387. else{
  388. PR2000_DBG(DBG_INPUT,"chip found is not an target chip.\n");
  389. }
  390. return dvr_id;
  391. err_check_id:
  392. PR2000_DBG(DBG_INPUT,"###ERR: %s failed, dvr_id:%d\n", __FUNCTION__,dvr_id);
  393. pr2000->id = DVR_IC_TYPE_UNKNOWN;
  394. return -ENODEV;
  395. }
  396. //static void pr2000_write_reg(const char *buf, int len)
  397. //{
  398. // int i;
  399. // for(i=0; i<len; i++)
  400. // pr2000_write_byte(g_dvr_pr2000,buf[2*i],buf[2*i+1]);
  401. //}
  402. //static void pr2000_read_reg(const char *buf, int len)
  403. //{
  404. // int i;
  405. // int regval;
  406. // for(i=0; i<len; i++){
  407. // regval = pr2000_read_byte(g_dvr_pr2000,buf[2*i]);
  408. // PR2000_DBG(DBG_INPUT,"reg:val [0x%x ,0x%x]\n", buf[2*i],regval);
  409. // }
  410. //}
  411. static void pr2000_dvr_get(void)
  412. {
  413. u32 ret;
  414. int i,nReg;
  415. #if 0
  416. pr2000_read_reg(sensor_regs,sizeof(sensor_regs)/2);
  417. #else
  418. for(nReg=0; nReg < ARRAY_SIZE(sensor_regs); nReg+=2)
  419. {
  420. //pr2000_write_byte(0xff, 0x00);
  421. ret = pr2000_read_byte(g_dvr_pr2000,sensor_regs[nReg]);
  422. PR2000_DBG(DBG_INPUT,"Reg[0x%02x,0x%02x]\r\n",sensor_regs[nReg],ret);
  423. }
  424. #endif
  425. }
  426. static void pr2000_dvr_set(const char *buf)
  427. {
  428. //printk("write:echo write 0xff 0x00 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-005c/dvr\n"); //Switch page0 ...
  429. //printk("write:echo write 0xe0 0x01 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-005c/dvr\n");
  430. //printk("read:echo read 0x00 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-005c/dvr\n");
  431. //printk("cat:cat /sys/devices/platform/i2c-gpio.1/i2c-1/1-005c/dvr\n");
  432. if(!strncmp(buf, "write", 5))
  433. {
  434. unsigned int reg,val;
  435. sscanf(buf,"%*s%x%x",&reg,&val);
  436. pr2000_write_byte(g_dvr_pr2000,reg,val);
  437. PR2000_DBG(DBG_INPUT,"write reg[0x%02x]:0x%02x\n",reg,val);
  438. }
  439. if(!strncmp(buf, "read", 4))
  440. {
  441. unsigned int reg,val;
  442. sscanf(buf,"%*s%x",&reg);
  443. val = pr2000_read_byte(g_dvr_pr2000,reg);
  444. PR2000_DBG(DBG_INPUT,"read reg[0x%02x]:0x%02x\n",reg,val);
  445. }
  446. }
  447. static void pr2000_device_init(struct dvr_pr2000 *pr2000,int Resolutuon)
  448. {
  449. u32 ret;
  450. int nReg;
  451. PR2000_DBG(DBG_INPUT,"Resolution is %d\n",Resolutuon);
  452. switch(Resolutuon)
  453. {
  454. case PR2000_CVBS_NTSC:
  455. case PR2000_CVBS_PAL:
  456. case PR2000_AHD_720P_25PFS:
  457. PR2000_DBG(DBG_INPUT,"%s:PR2000_AHD_720P_25PFS\n", __FUNCTION__);
  458. for(nReg=0; nReg < ARRAY_SIZE(PR2000_init_cfg_720p_25pfs); nReg+=2) {
  459. ret = pr2000_write_byte(pr2000,PR2000_init_cfg_720p_25pfs[nReg], PR2000_init_cfg_720p_25pfs[nReg+1]);
  460. //printk("[pr2000_init] Reg[0x%02x,0x%02x]\r\n",PR2000_init_cfg_720p_25pfs[nReg],PR2000_init_cfg_720p_25pfs[nReg+1]);
  461. }
  462. break;
  463. case PR2000_AHD_720P_30PFS:
  464. PR2000_DBG(DBG_INPUT,"%s:PR2000_AHD_720P_30PFS\n", __FUNCTION__);
  465. for(nReg=0; nReg < ARRAY_SIZE(PR2000_init_cfg_720p_30pfs); nReg+=2) {
  466. ret = pr2000_write_byte(pr2000,PR2000_init_cfg_720p_30pfs[nReg], PR2000_init_cfg_720p_30pfs[nReg+1]);
  467. //printk("[pr2000_init] Reg[0x%02x,0x%02x]\r\n",PR2000_init_cfg_720p_30pfs[nReg],PR2000_init_cfg_720p_30pfs[nReg+1]);
  468. }
  469. break;
  470. case PR2000_AHD_1080P_25PFS:
  471. case PR2000_AHD_1080P_30PFS:
  472. case PR2000_SENSOR_NONE:
  473. PR2000_DBG(DBG_INPUT,"%s:PR2000_SENSOR_NONE\n", __FUNCTION__);
  474. for(nReg=0; nReg < ARRAY_SIZE(PR2000_init_cfg_720p_30pfs); nReg+=2) {
  475. ret = pr2000_write_byte(pr2000,PR2000_init_cfg_720p_30pfs[nReg], PR2000_init_cfg_720p_30pfs[nReg+1]);
  476. //printk("[pr2000_init] Reg[0x%02x,0x%02x]\r\n",PR2000_init_cfg_720p_30pfs[nReg],PR2000_init_cfg_720p_30pfs[nReg+1]);
  477. }
  478. break;
  479. }
  480. }
  481. static int pr2000_init(struct v4l2_subdev *sd, u32 val)
  482. {
  483. PR2000_DBG(DBG_INPUT,"%s\n", __FUNCTION__);
  484. struct dvr_pr2000 *dvr_pr2000 = to_pr2000(sd);
  485. u32 ret;
  486. int nReg,id;
  487. int resolutuon_detect;
  488. //set channel
  489. //Make sure it is a target sensor
  490. // id = pr2000_check_id(dvr_pr2000);
  491. // if(id !=0x2000)
  492. // {
  493. // PR2000_DBG(DBG_INPUT,"chip found is not an target chip.\n");
  494. // goto err_gpio_request;
  495. // }else{
  496. // //PR2000_DBG(DBG_INPUT,"------------------>PR2000_init_cfg_720p_30pfs<------------------\n");
  497. // for(nReg=0; nReg < ARRAY_SIZE(PR2000_init_cfg_720p_30pfs); nReg+=2) {
  498. // ret = pr2000_write_byte(dvr_pr2000,PR2000_init_cfg_720p_30pfs[nReg], PR2000_init_cfg_720p_30pfs[nReg+1]);
  499. // //printk("[pr2000_init] Reg[0x%02x,0x%02x]\r\n",PR2000_init_cfg_720p_30pfs[nReg],PR2000_init_cfg_720p_30pfs[nReg+1]);
  500. // }
  501. // }
  502. //Detec Resolution
  503. resolutuon_detect = pr2000_resolution_detect(dvr_pr2000);
  504. //PR2000_DBG(DBG_INPUT,"Resolution Signal = %d\n", resolutuon_detect);
  505. //pr2000 reg init
  506. pr2000_device_init(dvr_pr2000,resolutuon_detect);
  507. //PR2000_DBG(DBG_INPUT,"%s end \n", __FUNCTION__);
  508. return 0;
  509. err_gpio_request:
  510. return -1;
  511. }
  512. static long pr2000_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
  513. {printk("++++++++++++++++++[%s]\n", __func__);
  514. int ret = 0;
  515. switch (cmd) {
  516. case VIDIOC_PR2000_GET_RESOLUTION:
  517. {
  518. int* temp = (int *)arg;
  519. *temp = TYPE_720P;//TYPE_720P
  520. break;
  521. }
  522. case VIDIOC_PR2000_GET_PROGRESSIVE:
  523. {
  524. int* temp = (int *)arg;
  525. *temp = 1;//ĬÈÏ1: ÖðÐÐÏÔʾ
  526. break;
  527. }
  528. case VIDIOC_PR2000_GET_CHIPINFO:
  529. {
  530. int* temp = (int *)arg;
  531. *temp = TYPE_PR2000;
  532. break;
  533. }
  534. case VIDIOC_PR2000_GET_ITU601_ENABLE:
  535. {
  536. int* temp = (int *)arg;
  537. *temp = 0;//1:enable 0:disabled
  538. break;
  539. }
  540. default:
  541. return -ENOIOCTLCMD;
  542. }
  543. return ret;
  544. }
  545. static int pr2000_read_byte(struct dvr_pr2000 *dvr_pr2000,unsigned char regaddr)
  546. {
  547. //struct i2c_client *client;
  548. struct v4l2_subdev *sd = &dvr_pr2000->sd;
  549. struct i2c_client *client = v4l2_get_subdevdata(sd);
  550. struct i2c_msg read_msgs[2];
  551. s32 ret = -1;
  552. s32 retries = 0;
  553. u8 regValue = 0x00;
  554. if(!g_dvr_pr2000)
  555. return -ENODEV;
  556. client = g_dvr_pr2000->client;
  557. read_msgs[0].flags = !I2C_M_RD;
  558. read_msgs[0].addr = client->addr;
  559. read_msgs[0].len = 1;
  560. read_msgs[0].buf = &regaddr;
  561. read_msgs[1].flags = I2C_M_RD;
  562. read_msgs[1].addr = client->addr;
  563. read_msgs[1].len = 1;
  564. read_msgs[1].buf = &regValue;//low byte
  565. while(retries < 5)
  566. {
  567. ret = i2c_transfer(client->adapter, read_msgs, 2);
  568. if(ret == 2)
  569. break;
  570. retries++;
  571. }
  572. //printk("regValue=%d.\n", regValue);
  573. //if (regValue == 0xFF)
  574. // regValue = 0;
  575. if(ret != 2)
  576. {
  577. PR2000_DBG(DBG_I2C,"ERR: [%s] reg:0x%x failure\n",__FUNCTION__, regaddr);
  578. return -EBUSY;
  579. }
  580. return regValue;
  581. }
  582. static int pr2000_write_byte(struct dvr_pr2000 *dvr_pr2000, unsigned char regaddr, unsigned char regval)
  583. {
  584. //struct i2c_client *client;
  585. struct v4l2_subdev *sd = &dvr_pr2000->sd;
  586. struct i2c_client *client = v4l2_get_subdevdata(sd);
  587. struct i2c_msg msg;
  588. s32 ret = -1;
  589. s32 retries = 0;
  590. u8 buf[2] = {0};
  591. if(!g_dvr_pr2000)
  592. return -ENODEV;
  593. client = g_dvr_pr2000->client;
  594. buf[0] = regaddr;
  595. buf[1] = regval;
  596. msg.flags = 0;
  597. msg.addr = client->addr;
  598. msg.len = 2;
  599. msg.buf = buf;
  600. while(retries < 5)
  601. {
  602. ret = i2c_transfer(client->adapter, &msg, 1);
  603. if (ret == 1)
  604. break;
  605. retries++;
  606. }
  607. if((retries >= 5))
  608. {
  609. PR2000_DBG(DBG_I2C,"ERR: %s failure\n",__FUNCTION__);
  610. return -EBUSY;
  611. }
  612. return 0;
  613. }
  614. int pr2000_detect_camera_plug_status(struct dvr_pr2000 *dvr_pr2000)
  615. {
  616. unsigned char detvideo;
  617. unsigned char lockstatus;
  618. pr2000_write_byte(dvr_pr2000,0xff, 0x00);
  619. detvideo = pr2000_read_byte(dvr_pr2000,0x00);
  620. lockstatus = pr2000_read_byte(dvr_pr2000,0x01);
  621. //printk("detvideo is 0x%02x\n",detvideo);
  622. //printk("lockstatus is 0x%02x\n",lockstatus);
  623. if((((lockstatus & 0x18) == 0x18) && ((detvideo & 0x08) == 0x08))||\
  624. ((lockstatus & 0x90) == 0x90))
  625. //((lockstatus & 0x90) == 0x90)||(((lockstatus & 0x10) == 0x10) && ((detvideo & 0x83) == 0x83)))
  626. //if(((lockstatus & 0x18) == 0x18) && ((detvideo & 0x08) == 0x08))
  627. {
  628. PR2000_DBG(DBG_INPUT,"Camera Plug In\n");
  629. return Camera_PlugIn;
  630. }
  631. else if (((lockstatus & 0x18) == 0) && ((detvideo & 0x08) == 0))
  632. {
  633. PR2000_DBG(DBG_INPUT,"Camera Plug Out\n");
  634. return Camera_PlugOut;
  635. }
  636. return 0;
  637. }
  638. int pr2000_signal_check(struct dvr_pr2000 *dvr_pr2000)
  639. {
  640. return(pr2000_detect_camera_plug_status(dvr_pr2000));
  641. }
  642. int pr2000_resolution_detect(struct dvr_pr2000 *dvr_pr2000)
  643. {
  644. int ret;
  645. unsigned char detvideo;
  646. int resolutuon_detect=0;
  647. ret = pr2000_detect_camera_plug_status(dvr_pr2000);
  648. if(ret == Camera_PlugIn)
  649. {
  650. pr2000_write_byte(dvr_pr2000,0xff, 0x00);
  651. detvideo = pr2000_read_byte(dvr_pr2000,0x00);
  652. PR2000_DBG(DBG_INPUT,"detvideo = 0x%02x,detvideo & 0x03 = 0x%02x\n",detvideo,detvideo & 0x03);
  653. if((detvideo & 0x03) == 0x00)
  654. {PR2000_DBG(DBG_INPUT,"PR2000_CVBS_NTSC\n");
  655. resolutuon_detect=PR2000_CVBS_NTSC;
  656. }
  657. else if((detvideo & 0x03) == 0x01)
  658. {PR2000_DBG(DBG_INPUT,"PR2000_CVBS_PAL\n");
  659. resolutuon_detect=PR2000_CVBS_PAL;
  660. }
  661. else if(((detvideo & 0x03) == 0x02) &&((detvideo & 0x30) == 0x00))
  662. {PR2000_DBG(DBG_INPUT,"PR2000_AHD_720P_25PFS\n");
  663. resolutuon_detect=PR2000_AHD_720P_25PFS;
  664. }
  665. else if(((detvideo & 0x03) == 0x02) &&((detvideo & 0x30) == 0x10))
  666. {PR2000_DBG(DBG_INPUT,"PR2000_AHD_720P_30PFS\n");
  667. resolutuon_detect=PR2000_AHD_720P_30PFS;
  668. }
  669. else if(((detvideo & 0x03) == 0x03) &&((detvideo & 0x30) == 0x00))
  670. {PR2000_DBG(DBG_INPUT,"PR2000_AHD_1080P_25PFS\n");
  671. resolutuon_detect=PR2000_AHD_1080P_25PFS;
  672. }
  673. else if(((detvideo & 0x03) == 0x03) &&((detvideo & 0x30) == 0x10))
  674. {PR2000_DBG(DBG_INPUT,"PR2000_AHD_1080P_30PFS\n");
  675. resolutuon_detect=PR2000_AHD_1080P_30PFS;
  676. }
  677. }
  678. else
  679. {
  680. PR2000_DBG(DBG_INPUT,"02:PR2000_SENSOR_NONE\n");
  681. resolutuon_detect=PR2000_SENSOR_NONE;
  682. }
  683. //PR2000_DBG(DBG_INPUT,"resolutuon_detect is %d\n",resolutuon_detect);
  684. return resolutuon_detect;
  685. }
  686. static int pr2000_get_progressive(void)
  687. {
  688. return 0;
  689. }
  690. //Select itu656 input channel
  691. static int pr2000_select_channel(int channel)
  692. {
  693. u8 temp;
  694. int nReg;
  695. u32 ret;
  696. //PR2000_DBG(DBG_INPUT,"%s\n", __FUNCTION__);
  697. if((channel >= 0) && (channel <= 2))
  698. {
  699. PR2000_DBG(DBG_INPUT,"%s channel:%d\n", __FUNCTION__,channel);
  700. }
  701. return 0;
  702. }
  703. static int pr2000_detect_signal(void)
  704. {
  705. //PR2000_DBG(DBG_INPUT,"%s\n", __FUNCTION__);
  706. if(g_dvr_pr2000)
  707. {
  708. if(g_dvr_pr2000->enter_carback) //carback
  709. {
  710. }
  711. else //auxin
  712. {
  713. }
  714. //PR2000_DBG(DBG_INPUT,"%s CHIP_ID = %d\n", __FUNCTION__,g_dvr_pr2000->id);
  715. if(g_dvr_pr2000->id == DVR_IC_TYPE_PR2000)
  716. return 1;
  717. }
  718. return 0;
  719. }
  720. static int pr2000_get_itu601en(void)
  721. {
  722. int enable_itu601 = 1;
  723. PR2000_DBG(DBG_INPUT,"%s:%d\n", __FUNCTION__,enable_itu601);
  724. return enable_itu601;
  725. }
  726. /* ----------------------------------------------------------------------- */
  727. static int pr2000_read(struct v4l2_subdev *sd, unsigned char addr)
  728. {
  729. //struct v4l2_subdev *sd = &dvr_pr2000->sd;
  730. struct i2c_client *client = v4l2_get_subdevdata(sd);
  731. int ret;
  732. ret = i2c_smbus_read_byte_data(client, addr);
  733. if (ret < 0) {
  734. PR2000_DBG(DBG_I2C,"i2c i/o error: ret = %s %d\n", __FUNCTION__,ret);
  735. return ret;
  736. }
  737. PR2000_DBG(DBG_I2C,"pr2000: read 0x%02x = %02x\n", addr, ret);
  738. return ret;
  739. }
  740. static int pr2000_write(struct v4l2_subdev *sd, unsigned char addr,
  741. unsigned char value)
  742. {
  743. //struct v4l2_subdev *sd = &dvr_pr2000->sd;
  744. struct i2c_client *client = v4l2_get_subdevdata(sd);
  745. int ret;
  746. PR2000_DBG(DBG_I2C,"pr2000: writing %02x %02x\n", addr, value);
  747. ret = i2c_smbus_write_byte_data(client, addr, value);
  748. if (ret < 0)
  749. PR2000_DBG(DBG_I2C,"i2c i/o error: ret == %d\n", ret);
  750. return ret;
  751. }
  752. /* ----------------------------------------------------------------------- */
  753. static int pr2000_s_ctrl(struct v4l2_ctrl *ctrl)
  754. {
  755. struct v4l2_subdev *sd = to_sd(ctrl);
  756. switch (ctrl->id) {
  757. case V4L2_CID_BRIGHTNESS:
  758. pr2000_write(sd, PAGE_ADDR, PAGE_1_DEC);//(0xff,0x01)
  759. pr2000_write(sd, PR2000_BRIGHTNESS_CTL, ctrl->val);
  760. return 0;
  761. case V4L2_CID_CONTRAST:
  762. pr2000_write(sd, PAGE_ADDR, PAGE_1_DEC);//(0xff,0x01)
  763. pr2000_write(sd, PR2000_CONTRAST_CTL, ctrl->val);
  764. return 0;
  765. case V4L2_CID_SATURATION:
  766. pr2000_write(sd, PAGE_ADDR, PAGE_1_DEC);//(0xff,0x01)
  767. pr2000_write(sd, PR2000_SATURATION_CTL, ctrl->val);
  768. return 0;
  769. case V4L2_CID_HUE:
  770. pr2000_write(sd, PAGE_ADDR, PAGE_1_DEC);//(0xff,0x01)
  771. pr2000_write(sd, PR2000_HUE_CTL, ctrl->val);
  772. return 0;
  773. }
  774. return -EINVAL;
  775. }
  776. static int pr2000_g_input_status(struct v4l2_subdev *sd, u32 *status)
  777. {
  778. struct dvr_pr2000 *pr2000 = to_pr2000(sd);
  779. int status_reg;
  780. if (status) {
  781. *status = 0;
  782. }
  783. status_reg = pr2000_signal_check(pr2000);
  784. //printk("++++++++++++++++++[%s] status_reg = %d\n", __func__,status_reg);
  785. *status = status_reg? 0 : V4L2_IN_ST_NO_SIGNAL;
  786. return 0;
  787. }
  788. //set pr2000 channel
  789. static int pr2000_s_routing(struct v4l2_subdev *sd,
  790. u32 input, u32 output, u32 config)
  791. {//printk("++++++++++++++++++[%s]\n", __func__);
  792. struct dvr_pr2000 *pr2000 = to_pr2000(sd);
  793. PR2000_DBG(DBG_INPUT,"%s select channel:%d\n", __FUNCTION__,input);
  794. pr2000->input = input;
  795. return 0;
  796. }
  797. /* ----------------------------------------------------------------------- */
  798. static const struct v4l2_ctrl_ops pr2000_ctrl_ops = {
  799. .s_ctrl = pr2000_s_ctrl,
  800. };
  801. static const struct v4l2_subdev_video_ops pr2000_video_ops = {
  802. .g_input_status = pr2000_g_input_status,
  803. .s_routing = pr2000_s_routing,
  804. };
  805. static const struct v4l2_subdev_core_ops pr2000_core_ops = {
  806. .init = pr2000_init,
  807. .ioctl = pr2000_ioctl,
  808. };
  809. static const struct v4l2_subdev_ops pr2000_ops = {
  810. .core = &pr2000_core_ops,
  811. .video = &pr2000_video_ops,
  812. };
  813. /* ----------------------------------------------------------------------- */
  814. static int dvr_pr2000_probe(struct i2c_client *client,
  815. const struct i2c_device_id *id)
  816. {
  817. struct dvr_pr2000 *dvr_pr2000;
  818. struct v4l2_subdev *sd;
  819. struct device_node *np = client->dev.of_node;
  820. int res;
  821. int nReg,ret;
  822. PR2000_DBG(DBG_MODULE,"%s probe start \n", __FUNCTION__);
  823. /* Check if the adapter supports the needed features */
  824. if (!i2c_check_functionality(client->adapter,
  825. I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
  826. return -EIO;
  827. v4l_info(client, "chip found @ 0x%x (%s)\n",
  828. client->addr, client->adapter->name);
  829. dvr_pr2000 = devm_kzalloc(&client->dev, sizeof(*dvr_pr2000), GFP_KERNEL);
  830. if (dvr_pr2000 == NULL)
  831. return -ENOMEM;
  832. dvr_pr2000->client = client;
  833. dvr_pr2000->gpio_irq = -1;
  834. dvr_pr2000->enter_carback = 1;
  835. dvr_pr2000->id = 0;
  836. dvr_pr2000->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
  837. GPIOD_OUT_HIGH);
  838. if (IS_ERR(dvr_pr2000->reset_gpio)) {
  839. res = PTR_ERR(dvr_pr2000->reset_gpio);
  840. v4l_err(client, "request for reset pin failed: %d\n", res);
  841. return res;
  842. }
  843. //pr2000_reset(dvr_pr2000);
  844. sd = &dvr_pr2000->sd;
  845. v4l2_i2c_subdev_init(sd, client, &pr2000_ops);
  846. sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  847. v4l2_ctrl_handler_init(&dvr_pr2000->hdl, 4);
  848. v4l2_ctrl_new_std(&dvr_pr2000->hdl, &pr2000_ctrl_ops,
  849. V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
  850. v4l2_ctrl_new_std(&dvr_pr2000->hdl, &pr2000_ctrl_ops,
  851. V4L2_CID_CONTRAST, 0, 255, 1, 128);
  852. v4l2_ctrl_new_std(&dvr_pr2000->hdl, &pr2000_ctrl_ops,
  853. V4L2_CID_SATURATION, 0, 255, 1, 128);
  854. v4l2_ctrl_new_std(&dvr_pr2000->hdl, &pr2000_ctrl_ops,
  855. V4L2_CID_HUE, -128, 127, 1, 0);
  856. sd->ctrl_handler = &dvr_pr2000->hdl;
  857. if (dvr_pr2000->hdl.error) {
  858. res = dvr_pr2000->hdl.error;
  859. goto err;
  860. }
  861. g_dvr_pr2000 = dvr_pr2000;
  862. res = v4l2_async_register_subdev(sd);
  863. if (res)
  864. goto err;
  865. id = pr2000_check_id(dvr_pr2000);
  866. if(id !=0x2000)
  867. return -1;
  868. PR2000_DBG(DBG_MODULE,"%s probe done\n", __FUNCTION__);
  869. return 0;
  870. err:
  871. v4l2_ctrl_handler_free(&dvr_pr2000->hdl);
  872. PR2000_DBG(DBG_MODULE,"******************[%s]\n", __FUNCTION__);
  873. return res;
  874. }
  875. static int dvr_pr2000_remove(struct i2c_client *client)
  876. {
  877. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  878. struct dvr_pr2000 *dvr_pr2000_pdata = to_pr2000(sd);
  879. v4l2_device_unregister_subdev(sd);
  880. v4l2_ctrl_handler_free(&dvr_pr2000_pdata->hdl);
  881. return 0;
  882. }
  883. MODULE_DEVICE_TABLE(i2c, dvr_pr2000_id);
  884. /* ----------------------------------------------------------------------- */
  885. static const struct i2c_device_id dvr_pr2000_id[] = {
  886. {"pr2000", 0},
  887. {}
  888. };
  889. static const struct of_device_id pr2000_of_match[] = {
  890. { .compatible = "arkmicro,pr2000", },
  891. { /* sentinel */ },
  892. };
  893. MODULE_DEVICE_TABLE(of, pr2000_of_match);
  894. static struct i2c_driver dvr_pr2000_driver = {
  895. .driver = {
  896. .name = "pr2000",
  897. .of_match_table = of_match_ptr(pr2000_of_match),
  898. },
  899. .probe = dvr_pr2000_probe,
  900. .remove = dvr_pr2000_remove,
  901. .id_table = dvr_pr2000_id,
  902. };
  903. static __init int dvr_pr2000_init(void)
  904. {
  905. return i2c_add_driver(&dvr_pr2000_driver);
  906. }
  907. static __exit void dvr_pr2000_exit(void)
  908. {
  909. i2c_del_driver(&dvr_pr2000_driver);
  910. }
  911. //subsys_initcall(dvr_pr2000_init);
  912. device_initcall(dvr_pr2000_init);
  913. //module_init(dvr_pr2000_init);
  914. module_exit(dvr_pr2000_exit);
  915. MODULE_AUTHOR("Arkmicro");
  916. MODULE_DESCRIPTION("pr2000 decoder driver for v4l2");
  917. MODULE_LICENSE("GPL");