Ark7116M.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  1. #include "FreeRTOS.h"
  2. #include "board.h"
  3. #include "chip.h"
  4. #include "Ark7116M.h"
  5. #ifdef VIDEO_DECODER_ARK7116M
  6. #define ARK7116M_RST_GPIO 110
  7. #define _ARK7116M_DRV_C_
  8. #define I2C_ACCESS_LOOP_TIME 20
  9. #define I2C_NON_ACK 1
  10. typedef struct _PanlstaticPara
  11. {
  12. unsigned int addr;
  13. unsigned char dat;
  14. }PanlstaticPara;
  15. PanlstaticPara Ark7116M_staticPara[]=
  16. {
  17. //GLOBAL
  18. {0XFD02,0X00},
  19. {0XFD0A,0X30},
  20. {0XFD0B,0X27},
  21. {0XFD0C,0X33},
  22. {0XFD0D,0XE0},
  23. {0XFD0E,0X2C},
  24. {0XFD0F,0X06},
  25. {0XFD10,0X04},
  26. {0XFD11,0XFF},
  27. {0XFD12,0XFF},
  28. {0XFD13,0XFF},
  29. {0XFD14,0X02},
  30. {0XFD15,0X02},
  31. {0XFD16,0X02},
  32. {0XFD1A,0X45},
  33. {0XFD19,0X02},
  34. //DECODER
  35. {0XFE00,0X80},
  36. {0XFE01,0X02},
  37. {0XFE06,0X02},
  38. {0XFE07,0X80},
  39. {0XFE0C,0X01},
  40. {0XFE0F,0X07},
  41. {0XFE13,0X16},
  42. {0XFE14,0X22},
  43. {0XFE15,0X05},
  44. {0XFE48,0X07},
  45. {0XFE54,0X40},
  46. {0XFE55,0X0A},
  47. {0XFE63,0XC0},
  48. {0XFE83,0XBF},
  49. {0XFED5,0XB1},
  50. {0XFED7,0XF7},
  51. {0XFEDC,0X00},
  52. {0XFE44,0X20},
  53. {0XFE45,0X80},
  54. {0XFE43,0X80},
  55. {0XFE56,0X07},
  56. {0XFEC9,0X01},
  57. {0XFE46,0X00},
  58. {0XFE42,0X00},
  59. {0XFE47,0X8A},
  60. //VP
  61. {0XFFB0,0X67},
  62. {0XFFB1,0X0F},
  63. {0XFFB2,0X10},
  64. {0XFFB3,0X10},
  65. {0XFFB4,0X10},
  66. {0XFFB7,0X10},
  67. {0XFFB8,0X10},
  68. {0XFFB9,0X22},
  69. {0XFFBA,0X20},
  70. {0XFFBB,0X22},
  71. {0XFFBC,0X20},
  72. {0XFFC7,0X31},
  73. {0XFFC8,0X03},
  74. {0XFFC9,0X10},
  75. {0XFFCB,0X80},
  76. {0XFFCC,0X80},
  77. {0XFFCD,0X2D},
  78. {0XFFCE,0X13},
  79. {0XFFCF,0XDD},
  80. {0XFFD0,0X72},
  81. {0XFFD2,0X4F},
  82. {0XFFD3,0X80},
  83. {0XFFD4,0X80},
  84. {0XFFD5,0X00},
  85. {0XFFD6,0X30},
  86. {0XFFD7,0X05},
  87. {0XFFD8,0X80},
  88. {0XFFE7,0X50},
  89. {0XFFE8,0X10},
  90. {0XFFE9,0X22},
  91. {0XFFEA,0X20},
  92. {0XFFF0,0X33},
  93. {0XFFF1,0XE7},
  94. {0XFFF2,0XE7},
  95. {0XFFF3,0XE0},
  96. {0XFFF4,0XFD},
  97. {0XFFF5,0X33},
  98. {0XFFF6,0XED},
  99. {0XFFF7,0XDF},
  100. {0XFFF8,0XEC},
  101. {0XFFF9,0XFD},
  102. {0XFFFA,0X33},
  103. {0XFFFB,0X81},
  104. //TCON
  105. {0XFC00,0X40},
  106. {0XFC01,0X00},
  107. {0XFC02,0X00},
  108. {0XFC09,0X00},
  109. {0XFC0A,0X00},
  110. //SCALE
  111. {0XFC90,0X02},
  112. {0XFC91,0X00},
  113. {0XFC92,0X00},
  114. {0XFC93,0X0C},
  115. {0XFC94,0X00},
  116. {0XFC95,0X00},
  117. {0XFC96,0XFF},
  118. {0XFC97,0X03},
  119. {0XFC98,0XFF},
  120. {0XFC99,0X03},
  121. {0XFC9A,0X5A},
  122. {0XFC9B,0X03},
  123. {0XFC9C,0X01},
  124. {0XFC9D,0X00},
  125. {0XFC9E,0X06},
  126. {0XFC9F,0X00},
  127. {0XFCA0,0X20},
  128. {0XFCA1,0X00},
  129. {0XFCA2,0XF2},
  130. {0XFCA3,0X02},
  131. {0XFCA4,0X01},
  132. {0XFCA5,0X00},
  133. {0XFCA6,0X03},
  134. {0XFCA7,0X00},
  135. {0XFCA8,0X0A},
  136. {0XFCA9,0X00},
  137. {0XFCAA,0XFB},
  138. {0XFCAB,0X00},
  139. {0XFCAC,0X00},
  140. {0XFCAD,0X01},
  141. {0XFCAE,0X00},
  142. {0XFCAF,0X00},
  143. {0XFCB0,0X00},
  144. {0XFCB1,0X14},
  145. {0XFCB2,0X00},
  146. {0XFCB3,0X00},
  147. {0XFCB4,0X00},
  148. {0XFCB5,0X00},
  149. {0XFCB7,0X06},
  150. {0XFCB8,0X01},
  151. {0XFCBB,0X38},
  152. {0XFCBC,0X01},
  153. {0XFCBD,0X00},
  154. {0XFCBE,0X00},
  155. {0XFCBF,0X0C},
  156. {0XFCC0,0X00},
  157. {0XFCC1,0X00},
  158. {0XFCC2,0XFF},
  159. {0XFCC3,0X03},
  160. {0XFCC4,0XFF},
  161. {0XFCC5,0X03},
  162. {0XFCC6,0X60},
  163. {0XFCC7,0X03},
  164. {0XFCC8,0X01},
  165. {0XFCC9,0X00},
  166. {0XFCCA,0X06},
  167. {0XFCCB,0X00},
  168. {0XFCCC,0X20},
  169. {0XFCCD,0X00},
  170. {0XFCCE,0XF2},
  171. {0XFCCF,0X02},
  172. {0XFCD1,0X00},
  173. {0XFCD2,0X03},
  174. {0XFCD3,0X00},
  175. {0XFCD4,0X0E},
  176. {0XFCD5,0X00},
  177. {0XFCD6,0X2F},
  178. {0XFCD7,0X01},
  179. {0XFCD8,0X00},
  180. {0XFCD9,0X08},
  181. {0XFCDA,0X00},
  182. {0XFCDB,0X00},
  183. {0XFCDC,0X00},
  184. {0XFCDD,0X00},
  185. {0XFCDE,0X00},
  186. {0XFCDF,0X00},
  187. {0XFCE0,0X00},
  188. {0XFCE1,0X00},
  189. {0XFCE3,0X11},
  190. {0XFCE4,0X02},
  191. {0XFCD0,0X01},
  192. {0XFCE2,0X03},
  193. {0XFCB6,0X02},
  194. {0XFB35,0X00},
  195. {0XFB89,0X00},
  196. //PAD MUX
  197. {0XFD30,0X22},
  198. {0XFD32,0X00},
  199. {0XFD33,0X00},
  200. {0XFD34,0X44},
  201. {0XFD35,0X40},
  202. {0XFD36,0X44},
  203. {0XFD37,0X44},
  204. {0XFD38,0X44},
  205. {0XFD39,0X44},
  206. {0XFD3A,0X00},
  207. {0XFD3B,0X00},
  208. {0XFD3C,0X00},
  209. {0XFD3D,0X00},
  210. {0XFD3E,0X00},
  211. {0XFD3F,0X00},
  212. {0XFD40,0X00},
  213. {0XFD41,0X00},
  214. {0XFD44,0X01},
  215. {0XFD45,0X00},
  216. {0XFD46,0X00},
  217. {0XFD47,0X00},
  218. {0XFD48,0X00},
  219. {0XFD49,0X00},
  220. {0XFD4A,0X00},
  221. {0XFD4B,0X00},
  222. {0XFD50,0X0B},
  223. {0XFD51,0X00},
  224. {0XFD52,0X00},
  225. {0XFD53,0XFC},
  226. {0XFD54,0XFF},
  227. {0XFD55,0XFF},
  228. {0XFD56,0X03},
  229. {0XFD57,0X00},
  230. {0XFD58,0X00},
  231. {0XFD59,0X00},
  232. {0XFD5A,0X00},
  233. //GAMMA
  234. {0XFF00,0X03},
  235. {0XFF01,0X0C},
  236. {0XFF02,0X15},
  237. {0XFF03,0X1D},
  238. {0XFF04,0X25},
  239. {0XFF05,0X2D},
  240. {0XFF06,0X36},
  241. {0XFF07,0X3E},
  242. {0XFF08,0X46},
  243. {0XFF09,0X4E},
  244. {0XFF0A,0X56},
  245. {0XFF0B,0X5E},
  246. {0XFF0C,0X66},
  247. {0XFF0D,0X6E},
  248. {0XFF0E,0X76},
  249. {0XFF0F,0X7D},
  250. {0XFF10,0X85},
  251. {0XFF11,0X8C},
  252. {0XFF12,0X93},
  253. {0XFF13,0X9B},
  254. {0XFF14,0XA2},
  255. {0XFF15,0XA9},
  256. {0XFF16,0XB0},
  257. {0XFF17,0XB7},
  258. {0XFF18,0XBF},
  259. {0XFF19,0XC6},
  260. {0XFF1A,0XCE},
  261. {0XFF1B,0XD6},
  262. {0XFF1C,0XDE},
  263. {0XFF1D,0XE6},
  264. {0XFF1E,0XEE},
  265. {0XFF1F,0XF7},
  266. {0XFF20,0X0C},
  267. {0XFF21,0X15},
  268. {0XFF22,0X1D},
  269. {0XFF23,0X25},
  270. {0XFF24,0X2D},
  271. {0XFF25,0X36},
  272. {0XFF26,0X3E},
  273. {0XFF27,0X46},
  274. {0XFF28,0X4E},
  275. {0XFF29,0X56},
  276. {0XFF2A,0X5E},
  277. {0XFF2B,0X66},
  278. {0XFF2C,0X6E},
  279. {0XFF2D,0X76},
  280. {0XFF2E,0X7D},
  281. {0XFF2F,0X85},
  282. {0XFF30,0X8C},
  283. {0XFF31,0X93},
  284. {0XFF32,0X9B},
  285. {0XFF33,0XA2},
  286. {0XFF34,0XA9},
  287. {0XFF35,0XB0},
  288. {0XFF36,0XB7},
  289. {0XFF37,0XBF},
  290. {0XFF38,0XC6},
  291. {0XFF39,0XCE},
  292. {0XFF3A,0XD6},
  293. {0XFF3B,0XDE},
  294. {0XFF3C,0XE6},
  295. {0XFF3D,0XEE},
  296. {0XFF3E,0XF7},
  297. {0XFF3F,0X0C},
  298. {0XFF40,0X15},
  299. {0XFF41,0X1D},
  300. {0XFF42,0X25},
  301. {0XFF43,0X2D},
  302. {0XFF44,0X36},
  303. {0XFF45,0X3E},
  304. {0XFF46,0X46},
  305. {0XFF47,0X4E},
  306. {0XFF48,0X56},
  307. {0XFF49,0X5E},
  308. {0XFF4A,0X66},
  309. {0XFF4B,0X6E},
  310. {0XFF4C,0X76},
  311. {0XFF4D,0X7D},
  312. {0XFF4E,0X85},
  313. {0XFF4F,0X8C},
  314. {0XFF50,0X93},
  315. {0XFF51,0X9B},
  316. {0XFF52,0XA2},
  317. {0XFF53,0XA9},
  318. {0XFF54,0XB0},
  319. {0XFF55,0XB7},
  320. {0XFF56,0XBF},
  321. {0XFF57,0XC6},
  322. {0XFF58,0XCE},
  323. {0XFF59,0XD6},
  324. {0XFF5A,0XDE},
  325. {0XFF5B,0XE6},
  326. {0XFF5C,0XEE},
  327. {0XFF5D,0XF7},
  328. {0XFF5E,0XFF},
  329. {0XFF5F,0XFF},
  330. {0XFF60,0XFF},
  331. };
  332. #define STATIC_NUM 307
  333. #if 0
  334. void Ark_WriteReg(UINT RegAddr,UCHAR RegVal)
  335. {
  336. UCHAR XDATA ucLoop;
  337. UCHAR XDATA ucDeviceAddr;
  338. UCHAR XDATA uctmpDeviceAddr;
  339. UCHAR XDATA ucSubAddr;
  340. ucLoop = I2C_ACCESS_LOOP_TIME; /*循环20次等待ACK*/
  341. uctmpDeviceAddr = (UCHAR)((RegAddr>>8)&0XFF); /*设备地址*/
  342. ucSubAddr = (UCHAR)(RegAddr&0XFF); /*寄存器地址*/
  343. switch(uctmpDeviceAddr)
  344. {
  345. case 0XFD:
  346. ucDeviceAddr= 0XB0;
  347. break;
  348. case 0XFA:
  349. ucDeviceAddr= 0XBE;
  350. break;
  351. case 0XFB:
  352. ucDeviceAddr= 0XB6;
  353. break;
  354. case 0XFC:
  355. ucDeviceAddr= 0XB8;
  356. break;
  357. case 0XFE:
  358. ucDeviceAddr= 0XB2;
  359. break;
  360. case 0XFF:
  361. ucDeviceAddr= 0XB4;
  362. break;
  363. case 0X00:
  364. ucDeviceAddr = 0XBE;
  365. break;
  366. default:
  367. ucDeviceAddr= 0XB0;
  368. break;
  369. }
  370. while(ucLoop--)
  371. {
  372. I2CStart(); /*I2C开始*/
  373. I2CWrite(ucDeviceAddr);
  374. if(ACKCheck()==I2C_NON_ACK) /*没有读到ACK,继续下一次*/
  375. {
  376. continue;
  377. }
  378. I2CWrite(ucSubAddr);
  379. if(ACKCheck()== I2C_NON_ACK)
  380. {
  381. continue;
  382. }
  383. I2CWrite(RegVal);
  384. if(ACKCheck()== I2C_NON_ACK)
  385. {
  386. continue;
  387. }
  388. break;
  389. }
  390. I2CStop(); /*I2C结束*/
  391. }
  392. #else
  393. static int ark7116M_i2c_write (struct i2c_adapter *adap, UINT16 RegAddr, unsigned int data)
  394. {
  395. struct i2c_msg msg;
  396. int ret = -1;
  397. u8 retries = 0;
  398. u8 buf[2];
  399. UINT8 ucDeviceAddr;
  400. UINT8 uctmpDeviceAddr;
  401. UINT8 ucSubAddr;
  402. uctmpDeviceAddr = (unsigned char)((RegAddr>>8)&0XFF);
  403. ucSubAddr = (UINT8)(RegAddr&0XFF);
  404. switch(uctmpDeviceAddr)
  405. {
  406. case 0XFD:
  407. ucDeviceAddr= 0XB0;
  408. break;
  409. case 0XFA:
  410. ucDeviceAddr= 0XBE;
  411. break;
  412. case 0XFB:
  413. ucDeviceAddr= 0XB6;
  414. break;
  415. case 0XFC:
  416. ucDeviceAddr= 0XB8;
  417. break;
  418. case 0XFE:
  419. ucDeviceAddr= 0XB2;
  420. break;
  421. case 0XFF:
  422. ucDeviceAddr= 0XB4;
  423. break;
  424. case 0X00:
  425. ucDeviceAddr = 0XBE;
  426. break;
  427. default:
  428. ucDeviceAddr= 0XB0;
  429. break;
  430. }
  431. buf[0] = (ucSubAddr);
  432. buf[1] = (data & 0xFF);
  433. msg.flags = !I2C_M_RD;
  434. msg.addr = (ucDeviceAddr>>1);
  435. msg.len = sizeof(buf);
  436. msg.buf = buf;
  437. //printf("msg.addr is %x\n", msg.addr);
  438. //printf("msg.ucSubAddr is %x\n",buf[0]);
  439. //printf("msg.data is %x\n", buf[1]);
  440. while(retries < 10)
  441. {
  442. //printf("retries is %x\n", retries);
  443. ret = i2c_transfer(adap, &msg, 1);
  444. //printf("ret is %x\n", ret);
  445. if (ret == 1)
  446. break;
  447. retries++;
  448. vTaskDelay (20);
  449. }
  450. if (retries >= 10)
  451. {
  452. printf("%s timeout11\n", __FUNCTION__);
  453. return -1;
  454. }
  455. return 0;
  456. }
  457. #endif
  458. static int i2c_write_byte (struct i2c_adapter *adapter,unsigned int slvaddr, unsigned int addr, char rxdata)
  459. {
  460. struct i2c_msg msg;
  461. int ret = -1;
  462. u8 retries = 0;
  463. u8 buf[2];
  464. u8 data = rxdata;
  465. buf[0] = (addr & 0xFF);
  466. buf[1] = (data & 0xFF);
  467. msg.flags = !I2C_M_RD;
  468. msg.addr = (unsigned char)(slvaddr >> 1);
  469. msg.len = sizeof(buf);
  470. msg.buf = buf;
  471. while(retries < 5)
  472. {
  473. ret = i2c_transfer(adapter, &msg, 1);
  474. if (ret == 1)
  475. break;
  476. retries++;
  477. }
  478. if (retries >= 5)
  479. {
  480. printf("%s timeout\n", __FUNCTION__);
  481. return -1;
  482. }
  483. return 0;
  484. }
  485. static int i2c_read_byte(struct i2c_adapter *adapter,unsigned int slvaddr, unsigned int addr,char *rxdata)
  486. {
  487. struct i2c_msg msgs[2];
  488. int retries = 0;
  489. int ret = -1;
  490. u8 buf = addr & 0xFF;
  491. msgs[0].flags = !I2C_M_RD;
  492. msgs[0].addr = (unsigned char)(slvaddr >> 1);
  493. msgs[0].len = 1;
  494. msgs[0].buf = &buf;
  495. msgs[1].flags = I2C_M_RD;
  496. msgs[1].addr = (unsigned char)(slvaddr >> 1);
  497. msgs[1].len = 1;
  498. msgs[1].buf = (uint8_t *)rxdata;
  499. while(retries < 5)
  500. {
  501. ret = i2c_transfer(adapter, msgs, 2);
  502. if(ret == 2)
  503. break;
  504. retries++;
  505. }
  506. if (retries >= 5)
  507. {
  508. printf( "%s timeout\n", __FUNCTION__);
  509. return 0;
  510. }
  511. return msgs[1].len;
  512. }
  513. #if 0
  514. void Ark_WriteStaticPara(PanlstaticPara * dataPt,UINT num)
  515. {
  516. UCHAR XDATA ucLoop;
  517. UCHAR XDATA ucDeviceAddr;
  518. UCHAR XDATA uctmpDeviceAddr;
  519. UCHAR XDATA ucSubAddr;
  520. UCHAR XDATA ucRegVal;
  521. while(num--)
  522. {
  523. ucLoop = I2C_ACCESS_LOOP_TIME;
  524. uctmpDeviceAddr = (UCHAR)((((*dataPt).addr)>>8)&0XFF);
  525. ucSubAddr = (UCHAR)(((*dataPt).addr)&0XFF);
  526. ucRegVal = (*dataPt).dat;
  527. switch(uctmpDeviceAddr)
  528. {
  529. case 0XFD:
  530. ucDeviceAddr= 0XB0;
  531. break;
  532. case 0XFA:
  533. ucDeviceAddr= 0XBE;
  534. break;
  535. case 0XFB:
  536. ucDeviceAddr= 0XB6;
  537. break;
  538. case 0XFC:
  539. ucDeviceAddr= 0XB8;
  540. break;
  541. case 0XFE:
  542. ucDeviceAddr= 0XB2;
  543. break;
  544. case 0XFF:
  545. ucDeviceAddr= 0XB4;
  546. break;
  547. case 0X00:
  548. ucDeviceAddr = 0XBE;
  549. break;
  550. default:
  551. ucDeviceAddr= 0XB0;
  552. break;
  553. }
  554. while(ucLoop--)
  555. {
  556. I2CStart();
  557. Delay(2);
  558. I2CWrite(ucDeviceAddr);
  559. Delay(1);
  560. if(ACKCheck()==I2C_NON_ACK)
  561. {
  562. continue;
  563. }
  564. I2CWrite(ucSubAddr);
  565. Delay(1);
  566. if(ACKCheck()== I2C_NON_ACK)
  567. {
  568. continue;
  569. }
  570. I2CWrite(ucRegVal);
  571. Delay(1);
  572. if(ACKCheck()== I2C_NON_ACK)
  573. {
  574. continue;
  575. }
  576. break;
  577. }
  578. dataPt++;
  579. }
  580. I2CStop();
  581. }
  582. #else
  583. int ark7116M_WriteStaticPara(struct i2c_adapter *adap,PanlstaticPara * dataPt,UINT16 num)
  584. {
  585. struct i2c_msg msg;
  586. int ret = -1;
  587. u8 retries = 0;
  588. u8 buf[2];
  589. u8 ucDeviceAddr;
  590. u8 uctmpDeviceAddr;
  591. u8 ucSubAddr;
  592. u8 ucRegVal;
  593. while(num--)
  594. {
  595. uctmpDeviceAddr = (unsigned char)(((*dataPt).addr>>8)&0XFF);
  596. ucSubAddr = (unsigned char)(((*dataPt).addr)&0XFF);
  597. ucRegVal = (*dataPt).dat;
  598. switch(uctmpDeviceAddr)
  599. {
  600. case 0XFD:
  601. ucDeviceAddr= 0XB0;
  602. break;
  603. case 0XFA:
  604. ucDeviceAddr= 0XBE;
  605. break;
  606. case 0XFB:
  607. ucDeviceAddr= 0XB6;
  608. break;
  609. case 0XFC:
  610. ucDeviceAddr= 0XB8;
  611. break;
  612. case 0XFE:
  613. ucDeviceAddr= 0XB2;
  614. break;
  615. case 0XFF:
  616. ucDeviceAddr= 0XB4;
  617. break;
  618. case 0X00:
  619. ucDeviceAddr = 0XBE;
  620. break;
  621. default:
  622. ucDeviceAddr= 0XB0;
  623. break;
  624. }
  625. buf[0] = (ucSubAddr);
  626. buf[1] = (ucRegVal & 0xFF);
  627. msg.flags = !I2C_M_RD;
  628. msg.addr = (ucDeviceAddr>>1);
  629. msg.len = sizeof(buf);
  630. msg.buf = buf;
  631. while(retries < 10)
  632. {
  633. ret = i2c_transfer(adap, &msg, 1);
  634. if (ret == 1)
  635. break;
  636. retries++;
  637. vTaskDelay (20);
  638. }
  639. if (retries >= 10)
  640. {
  641. return -1;
  642. }
  643. dataPt++;
  644. }
  645. return 0;
  646. }
  647. #endif
  648. unsigned char Ark_ReadReg(struct i2c_adapter *adap,unsigned int RegAddr)
  649. {
  650. unsigned char ucLoop;
  651. unsigned char ucRegVal;
  652. unsigned char ucDeviceAddr;
  653. unsigned char uctmpDeviceAddr;
  654. unsigned char ucSubAddr;
  655. ucLoop = I2C_ACCESS_LOOP_TIME;
  656. uctmpDeviceAddr = (unsigned char)((RegAddr>>8)&0XFF);
  657. ucSubAddr = (unsigned char)(RegAddr&0XFF);
  658. switch(uctmpDeviceAddr)
  659. {
  660. case 0XFD:
  661. ucDeviceAddr= 0XB0;
  662. break;
  663. case 0XFA:
  664. ucDeviceAddr= 0XBE;
  665. break;
  666. case 0XFB:
  667. ucDeviceAddr= 0XB6;
  668. break;
  669. case 0XFC:
  670. ucDeviceAddr= 0XB8;
  671. break;
  672. case 0XFE:
  673. ucDeviceAddr= 0XB2;
  674. break;
  675. case 0XFF:
  676. ucDeviceAddr= 0XB4;
  677. break;
  678. case 0X00:
  679. ucDeviceAddr = 0XBE;
  680. break;
  681. default:
  682. ucDeviceAddr= 0XB0;
  683. break;
  684. }
  685. i2c_read_byte(adap,uctmpDeviceAddr, ucSubAddr,&ucRegVal);
  686. return(ucRegVal);
  687. }
  688. #if 0
  689. void Ark_mipiRegWrite(UINT RegAddr,UCHAR RegVal)
  690. {
  691. UCHAR XDATA ucLoop;
  692. UCHAR XDATA ucDeviceAddr;
  693. UCHAR XDATA ucSubAddr;
  694. ucLoop = I2C_ACCESS_LOOP_TIME; /*循环20次等待ACK*/
  695. ucDeviceAddr = (UCHAR)((RegAddr>>8)&0XFF); /*设备地址*/
  696. ucSubAddr = (UCHAR)(RegAddr&0XFF); /*寄存器地址*/
  697. while(ucLoop--)
  698. {
  699. I2CStart(); /*I2C开始*/
  700. I2CWrite(ucDeviceAddr);
  701. if(ACKCheck()==I2C_NON_ACK)/*没有读到ACK,继续下一次*/
  702. {
  703. continue;
  704. }
  705. I2CWrite(ucSubAddr);
  706. if(ACKCheck()== I2C_NON_ACK)
  707. {
  708. continue;
  709. }
  710. I2CWrite(RegVal);
  711. if(ACKCheck()== I2C_NON_ACK)
  712. {
  713. continue;
  714. }
  715. break;
  716. }
  717. I2CStop(); /*I2C结束*/
  718. }
  719. #else
  720. static int Ark_mipiRegWrite (struct i2c_adapter *adap, UINT16 RegAddr, unsigned char data)
  721. {
  722. struct i2c_msg msg;
  723. int ret = -1;
  724. u8 retries = 0;
  725. u8 buf[2];
  726. UINT8 ucDeviceAddr;
  727. UINT8 uctmpDeviceAddr;
  728. UINT8 ucSubAddr;
  729. uctmpDeviceAddr = (unsigned char)((RegAddr>>8)&0XFF);
  730. ucSubAddr = (UINT8)(RegAddr&0XFF);
  731. buf[0] = (ucSubAddr);
  732. buf[1] = (data & 0xFF);
  733. msg.flags = !I2C_M_RD;
  734. msg.addr = (uctmpDeviceAddr>>1);
  735. msg.len = sizeof(buf);
  736. msg.buf = buf;
  737. //printf("msg.addr is %x\n", msg.addr);
  738. //printf("msg.ucSubAddr is %x\n",buf[0]);
  739. //printf("msg.data is %x\n", buf[1]);
  740. while(retries < 20)
  741. {
  742. //printf("retries is %x\n", retries);
  743. ret = i2c_transfer(adap, &msg, 1);
  744. //printf("ret is %x\n", ret);
  745. if (ret == 1)
  746. break;
  747. retries++;
  748. vTaskDelay (20);
  749. }
  750. if (retries >= 20)
  751. {
  752. printf("%s timeout11\n", __FUNCTION__);
  753. return -1;
  754. }
  755. return 0;
  756. }
  757. #endif
  758. #if 0
  759. UCHAR Ark_mipiRegRead(UINT RegAddr)
  760. {
  761. UCHAR XDATA ucLoop;
  762. UCHAR XDATA ucRegVal;
  763. UCHAR XDATA ucDeviceAddr;
  764. UCHAR XDATA ucSubAddr;
  765. ucLoop = I2C_ACCESS_LOOP_TIME;
  766. ucDeviceAddr = (UCHAR)((RegAddr>>8)&0XFF);
  767. ucSubAddr = (UCHAR)(RegAddr&0XFF);
  768. while(ucLoop--)
  769. {
  770. I2CStart();
  771. I2CWrite(ucDeviceAddr);
  772. if(ACKCheck()==I2C_NON_ACK)
  773. {
  774. continue;
  775. }
  776. I2CWrite(ucSubAddr);
  777. if(ACKCheck()== I2C_NON_ACK)
  778. {
  779. continue;
  780. }
  781. I2CStart();
  782. I2CWrite(ucDeviceAddr|0X01);
  783. if(ACKCheck()== I2C_NON_ACK)
  784. {
  785. continue;
  786. }
  787. ucRegVal = I2CRead();
  788. NACKSend();
  789. break;
  790. }
  791. I2CStop();
  792. return(ucRegVal);
  793. }
  794. #else
  795. unsigned char Ark_mipiRegRead(struct i2c_adapter *adap,unsigned int RegAddr)
  796. {
  797. unsigned char ucLoop;
  798. unsigned char ucRegVal;
  799. unsigned char ucDeviceAddr;
  800. unsigned char ucSubAddr;
  801. unsigned int retries = 0;
  802. int ret = -1;
  803. char data=0;
  804. ucLoop = I2C_ACCESS_LOOP_TIME;
  805. ucDeviceAddr = (unsigned char)((RegAddr>>8)&0XFF);
  806. ucSubAddr = (unsigned char)(RegAddr&0XFF);
  807. while(retries < I2C_ACCESS_LOOP_TIME)
  808. {
  809. ret = i2c_read_byte(adap,ucDeviceAddr, ucSubAddr,&data);
  810. if(ret == 1)
  811. break;
  812. retries++;
  813. }
  814. if(retries >= I2C_ACCESS_LOOP_TIME)
  815. {
  816. printf("%s i2c read dev:%x addr:%x error\n",__func__,ucDeviceAddr,ucSubAddr);
  817. ret = -1;
  818. }
  819. if(ret < 0)
  820. return 0xFF;
  821. else
  822. return data;
  823. }
  824. #endif
  825. //void ConfigDecoderStaticPara(void)
  826. int ConfigDecoderStaticPara(struct i2c_adapter *adap)
  827. { unsigned char data;
  828. printf("7116M ConfigDecoderPara\n");
  829. // Ark_WriteStaticPara(Ark7116M_staticPara,STATIC_NUM);
  830. ark7116M_WriteStaticPara(adap,Ark7116M_staticPara,STATIC_NUM);
  831. // Ark_WriteReg(0xFEA0,0X03);//DECODER RESET
  832. ark7116M_i2c_write(adap,0xFEA0,0X03);
  833. mdelay(50);
  834. // Ark_WriteReg(0xFEA0,0X02);
  835. ark7116M_i2c_write(adap,0xFEA0,0X02);
  836. }
  837. void Ark7116M_reset(void)
  838. {
  839. gpio_direction_output(ARK7116M_RST_GPIO, 1);
  840. vTaskDelay(10);
  841. gpio_direction_output(ARK7116M_RST_GPIO, 0);
  842. vTaskDelay(10);
  843. }
  844. void ConfigSlaveMode(struct i2c_adapter *adap)
  845. {
  846. unsigned char AddrBuff[6] = {0xa1,0xa2,0xa3,0xa4,0xa5,0xa6};
  847. unsigned char DataBuff[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
  848. unsigned char i;
  849. DataBuff[0] = 0X55;
  850. DataBuff[1] = 0xAA;
  851. DataBuff[2] = 0X03;
  852. DataBuff[3] = 0X50; //slave mode
  853. DataBuff[4] = 0; // crc val
  854. DataBuff[5] = DataBuff[2]^DataBuff[3]^DataBuff[4];
  855. printf("7116M ConfigSlaveMode\n");
  856. // Ark_WriteReg(0xC6,0X40);
  857. // Ark_WriteReg(0xAF, 0x00); //I2c Write Start
  858. ark7116M_i2c_write(adap,0xC6,0X40);
  859. ark7116M_i2c_write(adap,0xAF, 0x00);
  860. for(i =0;i < 6;i++)
  861. {
  862. // Ark_WriteReg(AddrBuff[i], DataBuff[i]);
  863. ark7116M_i2c_write(adap,AddrBuff[i], DataBuff[i]);
  864. }
  865. // Ark_WriteReg(0xAF, 0x11); //I2c Write End
  866. ark7116M_i2c_write(adap,0xFEA0,0X03);
  867. vTaskDelay (200);
  868. }
  869. void mipiphyreg_write(struct i2c_adapter *adap,unsigned char addr,unsigned char phy)
  870. {
  871. printf("mipiphyreg_write \n");
  872. Ark_mipiRegWrite(adap,0xA24D,0x00);
  873. Ark_mipiRegWrite(adap,0xA24F,0x01);
  874. Ark_mipiRegWrite(adap,0xA24D,0x02);
  875. Ark_mipiRegWrite(adap,0xA24E,addr);
  876. Ark_mipiRegWrite(adap,0xA24D,0x00);
  877. Ark_mipiRegWrite(adap,0xA24F,0x00);
  878. Ark_mipiRegWrite(adap,0xA24E,phy);
  879. Ark_mipiRegWrite(adap,0xA24D,0x02);
  880. Ark_mipiRegWrite(adap,0xA24D,0x00);
  881. }
  882. void Ark7116M_mipi_init(struct i2c_adapter *adap)
  883. {
  884. unsigned char phy_status;
  885. printf("Ark7116m_mipi_init start \n");
  886. Ark_mipiRegWrite(adap,0xA00F,0x07);
  887. Ark_mipiRegWrite(adap,0xA004,0x01); /*奇偶场标志放入指定行使能*/
  888. Ark_mipiRegWrite(adap,0xA007,0x06);
  889. Ark_mipiRegWrite(adap,0xA008,0x05);
  890. #if 0 // PAL 720x288
  891. Ark_mipiRegWrite(0xA009,0x20); /*奇偶场标志所在行设定*/
  892. Ark_mipiRegWrite(0xA00A,0x01);
  893. #else // NTSC 720x240
  894. Ark_mipiRegWrite(adap,0xA009,0xF0); /*奇偶场标志所在行设定*/
  895. Ark_mipiRegWrite(adap,0xA00A,0x00);
  896. #endif
  897. Ark_mipiRegWrite(adap,0xA260,0x1E);
  898. Ark_mipiRegWrite(adap,0xA261,0x00);
  899. Ark_mipiRegWrite(adap,0xA265,0x00);
  900. Ark_mipiRegWrite(adap,0xA264,0x02);
  901. Ark_mipiRegWrite(adap,0xA263,0xD0);
  902. Ark_mipiRegWrite(adap,0xA26F,0x00);
  903. Ark_mipiRegWrite(adap,0xA26E,0x00);
  904. Ark_mipiRegWrite(adap,0xA26D,0x01);
  905. //Ark_mipiRegWrite(0xA26C,0x38); //PAL
  906. Ark_mipiRegWrite(adap,0xA26C,0x08); //NTSC
  907. Ark_mipiRegWrite(adap,0xA240,0x00);
  908. Ark_mipiRegWrite(adap,0xA240,0x04);
  909. Ark_mipiRegWrite(adap,0xA240,0x05);
  910. Ark_mipiRegWrite(adap,0xA240,0x07);
  911. Ark_mipiRegWrite(adap,0xA241,0x00);
  912. Ark_mipiRegWrite(adap,0xA245,0x02);
  913. #if 1 // TEST PATTERN COLOR BAR
  914. Ark_mipiRegWrite(adap,0xA223,0x1E);
  915. Ark_mipiRegWrite(adap,0xA226,0x02);
  916. Ark_mipiRegWrite(adap,0xA225,0xD0);
  917. Ark_mipiRegWrite(adap,0xA227,0x0A);
  918. Ark_mipiRegWrite(adap,0xA229,0x0A);
  919. Ark_mipiRegWrite(adap,0xA22C,0x02);
  920. Ark_mipiRegWrite(adap,0xA22B,0xf8);
  921. Ark_mipiRegWrite(adap,0xA22D,0x02);
  922. Ark_mipiRegWrite(adap,0xA22F,0x0A);
  923. Ark_mipiRegWrite(adap,0xA231,0x0A);
  924. Ark_mipiRegWrite(adap,0xA233,0xE0);
  925. Ark_mipiRegWrite(adap,0xA234,0x01);
  926. Ark_mipiRegWrite(adap,0xA220,0x01);
  927. #endif
  928. mipiphyreg_write(adap,0xA244,0x06);
  929. mipiphyreg_write(adap,0xA219,0x30);
  930. mipiphyreg_write(adap,0xA217,0x02);
  931. mipiphyreg_write(adap,0xA218,0x17);
  932. mipiphyreg_write(adap,0xA218,0x80);
  933. mipiphyreg_write(adap,0xA210,0x89);
  934. mipiphyreg_write(adap,0xA211,0x12);
  935. mipiphyreg_write(adap,0xA212,0xC2);
  936. Ark_mipiRegWrite(adap,0xA243,0x00);
  937. Ark_mipiRegWrite(adap,0xA200,0x01);
  938. while(1)
  939. {
  940. mdelay(50);
  941. phy_status = Ark_mipiRegRead(adap,0xA24B); //phy status
  942. printf(" phy status = %x\r\n",phy_status);
  943. if((phy_status & 0x03) == 0x03)
  944. {
  945. printf("Ark7116m_mipi_init OK \n");
  946. break;
  947. }
  948. }
  949. mdelay(50);
  950. Ark_mipiRegWrite(adap,0xA243,0x01);
  951. Ark_mipiRegWrite(adap,0xA003,0x01); // Data EN
  952. printf("0xA003>>>>>0x%x\n",Ark_mipiRegRead(adap,0xA003));
  953. }
  954. unsigned char ARK7116M_ResolutionDetect(struct i2c_adapter *adap)
  955. {
  956. unsigned char video_format = 0;
  957. unsigned char Camera_Video_Format = 0xff;
  958. video_format = Ark_ReadReg(adap,0xFE2A);
  959. if((video_format&07) == 0x00)
  960. {
  961. Camera_Video_Format = PAL;
  962. }else if((video_format&07) == 0x01){
  963. Camera_Video_Format = NTSC;
  964. }else{
  965. Camera_Video_Format = NULL_SYS;
  966. }
  967. return Camera_Video_Format;
  968. }
  969. void InitArk7116MChip(struct i2c_adapter *adap)
  970. {
  971. printf("InitArk7116MChip start\n");
  972. Ark7116M_reset(); // 110脚 硬件复位
  973. ConfigSlaveMode(adap); // 配置从模式
  974. ConfigDecoderStaticPara(adap); // 配置静态参数
  975. Ark7116M_mipi_init(adap); // 初始化mipi 模块
  976. printf("InitArk7116Chip end\n");
  977. }
  978. int ark7116M_init(void)
  979. {
  980. struct i2c_adapter *adap = NULL;
  981. if (!(adap = i2c_open("i2c0"))) {
  982. printf("open i2c0 fail.\n");
  983. return -1;
  984. }
  985. InitArk7116MChip(adap);
  986. return 0;
  987. }
  988. #endif