ark7116_ark169.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. #include<linux/gpio.h>
  2. #include <linux/delay.h>
  3. #include <linux/i2c.h>
  4. #include "ark7116.h"
  5. extern struct ark7116_private_data *g_ark7116_pdata;
  6. static int i2c_debug = 0;
  7. PanlstaticPara AV1_staticPara[]=
  8. {
  9. //GLOBAL
  10. {0XFD0A,0X30},
  11. {0XFD0B,0X27},
  12. {0XFD0D,0XF0},
  13. {0XFD0F,0X03},
  14. {0XFD10,0X04},
  15. {0XFD11,0XFF},
  16. {0XFD12,0XFF},
  17. {0XFD13,0XFF},
  18. {0XFD14,0X02},
  19. {0XFD15,0X02},
  20. {0XFD16,0X0A},
  21. {0XFD1A,0X40},
  22. //DECODER
  23. {0XFE00,0X90},
  24. {0XFE83,0X7F},
  25. {0XFE26,0X0E},
  26. {0XFE27,0X00},
  27. {0XFE28,0X00},
  28. {0XFE2A,0X01},
  29. {0XFE42,0X00},
  30. {0XFE44,0X1C},
  31. {0XFE83,0X7F},
  32. {0XFEAB,0X3E},
  33. {0XFEAC,0X77},
  34. {0XFEB1,0X01},
  35. {0XFEC9,0X00},
  36. {0XFED0,0X41},
  37. {0XFED7,0XF7},
  38. {0XFEE0,0X2E},
  39. {0XFEE1,0X94},
  40. {0XFEE2,0X01},
  41. //VP
  42. {0XFFB0,0X23},
  43. {0XFFB1,0X0F},
  44. {0XFFB2,0X12},
  45. {0XFFB3,0X15},
  46. {0XFFB4,0X15},
  47. {0XFFB7,0X90},
  48. {0XFFB8,0X10},
  49. {0XFFB9,0X62},
  50. {0XFFBA,0X20},
  51. {0XFFBB,0XAA},
  52. {0XFFBC,0X20},
  53. {0XFFBD,0X20},
  54. {0XFFC7,0X31},
  55. {0XFFC8,0X06},
  56. {0XFFC9,0X08},
  57. {0XFFCB,0XC0},
  58. {0XFFCC,0X80},
  59. {0XFFCD,0X2D},
  60. {0XFFCE,0X10},
  61. {0XFFCF,0X80},
  62. {0XFFD0,0X80},
  63. {0XFFD2,0X4F},
  64. {0XFFD3,0X80},
  65. {0XFFD4,0X80},
  66. {0XFFD7,0X1A},
  67. {0XFFD8,0X80},
  68. {0XFFE7,0X50},
  69. {0XFFE8,0XFF},
  70. {0XFFE9,0X22},
  71. {0XFFEA,0X20},
  72. {0XFFF0,0X4C},
  73. {0XFFF1,0XE8},
  74. {0XFFF2,0XE8},
  75. {0XFFF3,0XD7},
  76. {0XFFF4,0XFD},
  77. {0XFFF5,0X44},
  78. {0XFFF6,0XFA},
  79. {0XFFF7,0XE4},
  80. {0XFFF8,0XED},
  81. {0XFFF9,0XFD},
  82. {0XFFFA,0X4C},
  83. {0XFFFB,0X81},
  84. {0XFFD5,0X00},
  85. {0XFFD6,0X40},
  86. //TCON
  87. {0XFC00,0X40},
  88. //SCALE
  89. {0XFC90,0X02},
  90. {0XFC91,0X01},
  91. {0XFC92,0X00},
  92. {0XFC93,0X0C},
  93. {0XFC94,0X00},
  94. {0XFC95,0X00},
  95. {0XFC98,0X00},
  96. {0XFC99,0X04},
  97. {0XFC9A,0X59},
  98. {0XFC9B,0X03},
  99. {0XFC9C,0X01},
  100. {0XFC9D,0X00},
  101. {0XFC9E,0X06},
  102. {0XFC9F,0X00},
  103. {0XFCA0,0X23},
  104. {0XFCA1,0X00},
  105. {0XFCA2,0XF5},
  106. {0XFCA3,0X02},
  107. {0XFCA4,0X03},
  108. {0XFCA5,0X00},
  109. {0XFCA6,0X05},
  110. {0XFCA7,0X00},
  111. {0XFCA8,0X0E},
  112. {0XFCA9,0X00},
  113. {0XFCAA,0X06},
  114. {0XFCAB,0X01},
  115. {0XFCB1,0X14},
  116. {0XFCB2,0X00},
  117. {0XFCB3,0X00},
  118. {0XFCB4,0X00},
  119. {0XFCB5,0X00},
  120. {0XFCB7,0X07},
  121. {0XFCB8,0X01},
  122. {0XFCBB,0X37},
  123. {0XFCBC,0X01},
  124. {0XFCBD,0X01},
  125. {0XFCBE,0X00},
  126. {0XFCBF,0X0C},
  127. {0XFCC0,0X00},
  128. {0XFCC1,0X00},
  129. {0XFCC4,0X00},
  130. {0XFCC5,0X04},
  131. {0XFCC6,0X62},
  132. {0XFCC7,0X03},
  133. {0XFCC8,0X01},
  134. {0XFCC9,0X00},
  135. {0XFCCA,0X06},
  136. {0XFCCB,0X00},
  137. {0XFCCC,0X20},
  138. {0XFCCD,0X00},
  139. {0XFCCE,0XF2},
  140. {0XFCCF,0X02},
  141. {0XFCD1,0X00},
  142. {0XFCD2,0X08},
  143. {0XFCD3,0X00},
  144. {0XFCD4,0X08},
  145. {0XFCD5,0X00},
  146. {0XFCD6,0X28},
  147. {0XFCD7,0X01},
  148. {0XFCDD,0X14},
  149. {0XFCDE,0X00},
  150. {0XFCDF,0X00},
  151. {0XFCE0,0X00},
  152. {0XFCE1,0X00},
  153. {0XFCD0,0X03},
  154. {0XFCE2,0X00},
  155. {0XFCB6,0X00},
  156. {0XFB35,0X00},
  157. {0XFB89,0X00},
  158. //GAMMA
  159. {0XFF00,0X03},
  160. {0XFF01,0X2A},
  161. {0XFF02,0X3C},
  162. {0XFF03,0X4A},
  163. {0XFF04,0X57},
  164. {0XFF05,0X63},
  165. {0XFF06,0X6E},
  166. {0XFF07,0X78},
  167. {0XFF08,0X80},
  168. {0XFF09,0X88},
  169. {0XFF0A,0X91},
  170. {0XFF0B,0X99},
  171. {0XFF0C,0XA1},
  172. {0XFF0D,0XA9},
  173. {0XFF0E,0XB0},
  174. {0XFF0F,0XB6},
  175. {0XFF10,0XBC},
  176. {0XFF11,0XC2},
  177. {0XFF12,0XC7},
  178. {0XFF13,0XCC},
  179. {0XFF14,0XD0},
  180. {0XFF15,0XD4},
  181. {0XFF16,0XD8},
  182. {0XFF17,0XDC},
  183. {0XFF18,0XE1},
  184. {0XFF19,0XE5},
  185. {0XFF1A,0XE9},
  186. {0XFF1B,0XEC},
  187. {0XFF1C,0XF0},
  188. {0XFF1D,0XF4},
  189. {0XFF1E,0XF8},
  190. {0XFF1F,0XFB},
  191. {0XFF20,0X2A},
  192. {0XFF21,0X3C},
  193. {0XFF22,0X4A},
  194. {0XFF23,0X57},
  195. {0XFF24,0X63},
  196. {0XFF25,0X6E},
  197. {0XFF26,0X78},
  198. {0XFF27,0X80},
  199. {0XFF28,0X88},
  200. {0XFF29,0X91},
  201. {0XFF2A,0X99},
  202. {0XFF2B,0XA1},
  203. {0XFF2C,0XA9},
  204. {0XFF2D,0XB0},
  205. {0XFF2E,0XB6},
  206. {0XFF2F,0XBC},
  207. {0XFF30,0XC2},
  208. {0XFF31,0XC7},
  209. {0XFF32,0XCC},
  210. {0XFF33,0XD0},
  211. {0XFF34,0XD4},
  212. {0XFF35,0XD8},
  213. {0XFF36,0XDC},
  214. {0XFF37,0XE1},
  215. {0XFF38,0XE5},
  216. {0XFF39,0XE9},
  217. {0XFF3A,0XEC},
  218. {0XFF3B,0XF0},
  219. {0XFF3C,0XF4},
  220. {0XFF3D,0XF8},
  221. {0XFF3E,0XFB},
  222. {0XFF3F,0X2A},
  223. {0XFF40,0X3C},
  224. {0XFF41,0X4A},
  225. {0XFF42,0X57},
  226. {0XFF43,0X63},
  227. {0XFF44,0X6E},
  228. {0XFF45,0X78},
  229. {0XFF46,0X80},
  230. {0XFF47,0X88},
  231. {0XFF48,0X91},
  232. {0XFF49,0X99},
  233. {0XFF4A,0XA1},
  234. {0XFF4B,0XA9},
  235. {0XFF4C,0XB0},
  236. {0XFF4D,0XB6},
  237. {0XFF4E,0XBC},
  238. {0XFF4F,0XC2},
  239. {0XFF50,0XC7},
  240. {0XFF51,0XCC},
  241. {0XFF52,0XD0},
  242. {0XFF53,0XD4},
  243. {0XFF54,0XD8},
  244. {0XFF55,0XDC},
  245. {0XFF56,0XE1},
  246. {0XFF57,0XE5},
  247. {0XFF58,0XE9},
  248. {0XFF59,0XEC},
  249. {0XFF5A,0XF0},
  250. {0XFF5B,0XF4},
  251. {0XFF5C,0XF8},
  252. {0XFF5D,0XFB},
  253. {0XFF5E,0XFF},
  254. {0XFF5F,0XFF},
  255. {0XFF60,0XFF},
  256. };
  257. PanlPosDynPara AV1_posDynPara[]=
  258. {
  259. //dispmode: 16:9 4:3 DM_EX0 DM_EX1 DM_EX2 DM_EX3
  260. //GLOBAL
  261. //PAD MUX
  262. //DECODER
  263. //VP
  264. //TCON
  265. //SCALE
  266. {0XFC96,{0XDE,0XD4,0XD4,0XD4,0XD4,0XD4}},
  267. {0XFC97,{0X03,0X03,0X03,0X03,0X03,0X03}},
  268. {0XFCAC,{0X1E,0X20,0X20,0X20,0X20,0X20}},
  269. {0XFCAD,{0X00,0X00,0X00,0X00,0X00,0X00}},
  270. {0XFCAE,{0X02,0X02,0X02,0X02,0X02,0X02}},
  271. {0XFCAF,{0X04,0X04,0X04,0X04,0X04,0X04}},
  272. {0XFCB0,{0X00,0X00,0X00,0X00,0X00,0X00}},
  273. {0XFCC2,{0XE0,0XE0,0XE0,0XE0,0XE0,0XE0}},
  274. {0XFCC3,{0X03,0X03,0X03,0X03,0X03,0X03}},
  275. {0XFCD8,{0X0F,0X0F,0X0F,0X0F,0X0F,0X0F}},
  276. {0XFCD9,{0X00,0X00,0X00,0X00,0X00,0X00}},
  277. {0XFCDA,{0X0A,0X0A,0X0A,0X0A,0X0A,0X0A}},
  278. {0XFCDB,{0X05,0X05,0X05,0X05,0X05,0X05}},
  279. {0XFCDC,{0X00,0X00,0X00,0X00,0X00,0X00}},
  280. };
  281. PanlSysDynPara AV1_sysDynPara[]=
  282. {
  283. //picSys: PAL PAL-N PAL-M NTSC SECAM PAL-60 NTSC-J NTSC-4.43
  284. //GLOBAL
  285. //PAD MUX
  286. //DECODER
  287. //VP
  288. {0XFFD3,{0X82, 0X80, 0X80, 0X82, 0X80, 0X80, 0X80, 0X80}},
  289. {0XFFD4,{0X77, 0X80, 0X80, 0X77, 0X80, 0X80, 0X80, 0X80}},
  290. {0XFFD5,{0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00}},
  291. {0XFFD6,{0X40, 0X36, 0X36, 0X40, 0X36, 0X36, 0X36, 0X36}},
  292. //TCON
  293. //SCALE
  294. //GAMMA
  295. };
  296. /*µãÆÁ PAD MUX ²ÎÊý*/
  297. PanlstaticPara AMT_PadMuxStaticPara[]=
  298. {
  299. //PAD MUX
  300. {0XFD32,0X11},
  301. {0XFD33,0X11},
  302. {0XFD34,0X00},
  303. {0XFD35,0X40},
  304. {0XFD36,0X44},
  305. {0XFD37,0X44},
  306. {0XFD38,0X44},
  307. {0XFD39,0X44},
  308. {0XFD3A,0X00},
  309. {0XFD3B,0X00},
  310. {0XFD3C,0X00},
  311. {0XFD3D,0X00},
  312. {0XFD3E,0X00},
  313. {0XFD3F,0X00},
  314. {0XFD40,0X00},
  315. {0XFD41,0X00},
  316. {0XFD44,0X01},
  317. {0XFD45,0X00},
  318. {0XFD46,0X00},
  319. {0XFD47,0X00},
  320. {0XFD48,0X00},
  321. {0XFD49,0X00},
  322. {0XFD4A,0X00},
  323. {0XFD4B,0X00},
  324. {0XFD50,0X09},
  325. };
  326. unsigned char device_addr_convert(unsigned char device_addr)
  327. {
  328. unsigned char addr;
  329. switch(device_addr)
  330. {
  331. case 0XF9:
  332. case 0XFD:
  333. addr = 0XB0;
  334. break;
  335. case 0XFA:
  336. addr = 0XBE;
  337. break;
  338. case 0XFB:
  339. addr = 0XB6;
  340. break;
  341. case 0XFC:
  342. addr = 0XB8;
  343. break;
  344. case 0XFE:
  345. addr = 0XB2;
  346. break;
  347. case 0XFF:
  348. addr = 0XB4;
  349. break;
  350. case 0X00:
  351. addr = 0XBE;
  352. break;
  353. default:
  354. addr = 0XB0;
  355. break;
  356. }
  357. return addr;
  358. }
  359. static unsigned char amt_read_reg(unsigned int device_reg)
  360. {
  361. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  362. struct i2c_client *client;
  363. struct i2c_msg read_msgs[2];
  364. s32 ret = -1;
  365. s32 retries = 0;
  366. u8 reg_val = 0x00;
  367. u8 device_addr;
  368. u8 reg_addr;
  369. if(!ark7116_pdata)
  370. return -ENODEV;
  371. client = ark7116_pdata->client;
  372. if(!client)
  373. return -ENODEV;
  374. device_addr = device_addr_convert(device_reg>>8 & 0XFF);
  375. reg_addr = (u8)(device_reg & 0XFF);
  376. read_msgs[0].flags = !I2C_M_RD;
  377. //read_msgs[0].addr = 0xB2>>1;
  378. read_msgs[0].addr = device_addr >> 1;//client->addr;
  379. read_msgs[0].len = 1;
  380. read_msgs[0].buf = &reg_addr;
  381. read_msgs[1].flags = I2C_M_RD;
  382. //read_msgs[1].addr = 0xB2>>1;
  383. read_msgs[1].addr = device_addr >> 1;//client->addr;
  384. read_msgs[1].len = 1;
  385. read_msgs[1].buf = &reg_val;//low byte
  386. while(retries < 5){
  387. ret = i2c_transfer(client->adapter, read_msgs, 2);
  388. if(ret == 2)break;
  389. retries++;
  390. }
  391. //printk("regValue=%d.\n", regValue);
  392. if (reg_val == 0xFF) reg_val = 0;
  393. if((retries >= 5)){
  394. printk("ark7116_read_byte_data write error\n");
  395. }
  396. //gpioi2c_print("device_reg=0x%x-->0x%x,, regValue=0x%x \n",device_reg, device_addr,reg_val);
  397. return reg_val;
  398. }
  399. static int amt_write_reg(unsigned short device_reg,unsigned char reg_val)
  400. {
  401. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  402. struct i2c_client *client;
  403. struct i2c_msg msg;
  404. s32 ret = -1;
  405. s32 retries = 0;
  406. u8 buf[2] = {0};
  407. u8 device_addr;
  408. u8 reg_addr;
  409. if(!ark7116_pdata)
  410. return -ENODEV;
  411. client = ark7116_pdata->client;
  412. if(!client)
  413. return -ENODEV;
  414. device_addr = device_addr_convert(device_reg>>8 & 0XFF);
  415. reg_addr = (u8)(device_reg & 0XFF);
  416. buf[0] = reg_addr;
  417. buf[1] = reg_val;
  418. msg.flags = 0;
  419. //msg.addr = 0xB2>>1;
  420. msg.addr = device_addr >> 1;//client->addr;
  421. msg.len = 2;
  422. msg.buf = buf;
  423. while(retries < 5){
  424. ret = i2c_transfer(client->adapter, &msg, 1);
  425. if (ret == 1)break;
  426. retries++;
  427. }
  428. if((retries >= 5)){
  429. printk("ark7116_write_byte write error\n");
  430. }
  431. if(i2c_debug){
  432. unsigned char val;
  433. val = amt_read_reg(device_reg);
  434. if(val != reg_val)
  435. gpioi2c_print("device_reg=0x%x-->0x%x,, val=0x%x, regval=0x%x \n",device_reg, device_addr,val,reg_val);
  436. }
  437. return ret;
  438. }
  439. static int amt_write_static_para(PanlstaticPara * dataPt,unsigned int num)
  440. {
  441. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  442. struct i2c_client *client;
  443. struct i2c_msg msg;
  444. s32 ret = -1;
  445. s32 retries = 0;
  446. u8 buf[2] = {0};
  447. u8 device_addr;
  448. u8 reg_addr;
  449. if(!ark7116_pdata)
  450. return -ENODEV;
  451. client = ark7116_pdata->client;
  452. if(!client)
  453. return -ENODEV;
  454. while(num--){
  455. device_addr = device_addr_convert((((*dataPt).addr)>>8)&0XFF);
  456. reg_addr = (u8)(((*dataPt).addr)&0XFF);
  457. buf[0] = reg_addr;
  458. buf[1] = (*dataPt).dat;
  459. msg.flags = 0;
  460. //msg.addr = 0xB2>>1;
  461. msg.addr = device_addr >> 1;//client->addr;
  462. msg.len = 2;
  463. msg.buf = buf;
  464. while(retries < 5){
  465. ret = i2c_transfer(client->adapter, &msg, 1);
  466. if (ret == 1)break;
  467. retries++;
  468. }
  469. if((retries >= 5)){
  470. printk("ark7116_write_byte write error\n");
  471. }
  472. if(i2c_debug){
  473. unsigned char val;
  474. val = amt_read_reg((*dataPt).addr);
  475. if(val != (*dataPt).dat)
  476. gpioi2c_print("device_reg=0x%x-->0x%x,, val=0x%x, regval=0x%x \n",(*dataPt).addr, device_addr,val,(*dataPt).dat);
  477. }
  478. dataPt++;
  479. }
  480. return ret;
  481. }
  482. static int amt_write_disp_zoom_dyn_para(PanlPosDynPara *dataPt,unsigned int num,unsigned char currentmode)
  483. {
  484. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  485. struct i2c_client *client;
  486. struct i2c_msg msg;
  487. s32 ret = -1;
  488. s32 retries = 0;
  489. u8 buf[2] = {0};
  490. u8 device_addr;
  491. u8 reg_addr;
  492. if(!ark7116_pdata)
  493. return -ENODEV;
  494. client = ark7116_pdata->client;
  495. if(!client)
  496. return -ENODEV;
  497. while(num--){
  498. device_addr = device_addr_convert((((*dataPt).addr)>>8)&0XFF);
  499. reg_addr = (u8)(((*dataPt).addr)&0XFF);
  500. buf[0] = reg_addr;
  501. buf[1] = (*dataPt).dat_posDyn[currentmode];
  502. msg.flags = 0;
  503. //msg.addr = 0xB2>>1;
  504. msg.addr = device_addr >> 1;//client->addr;
  505. msg.len = 2;
  506. msg.buf = buf;
  507. while(retries < 5){
  508. ret = i2c_transfer(client->adapter, &msg, 1);
  509. if (ret == 1)break;
  510. retries++;
  511. }
  512. if(retries >= 5){
  513. printk("ark7116_write_byte write error\n");
  514. }
  515. if(i2c_debug){
  516. unsigned char val;
  517. val = amt_read_reg((*dataPt).addr);
  518. if(val != (*dataPt).dat_posDyn[currentmode])
  519. gpioi2c_print("device_reg=0x%x-->0x%x, val=0x%x, regval=0x%x \n",(*dataPt).addr, device_addr,val,(*dataPt).dat_posDyn[currentmode]);
  520. }
  521. dataPt++;
  522. }
  523. return ret;
  524. }
  525. static int amt_write_color_sys_dyn_para(PanlSysDynPara * dataPt,unsigned int num,unsigned char currentSys)
  526. {
  527. struct ark7116_private_data *ark7116_pdata = g_ark7116_pdata;
  528. struct i2c_client *client;
  529. struct i2c_msg msg;
  530. s32 ret = -1;
  531. s32 retries = 0;
  532. u8 buf[2] = {0};
  533. u8 device_addr;
  534. u8 reg_addr;
  535. if(!ark7116_pdata)
  536. return -ENODEV;
  537. client = ark7116_pdata->client;
  538. if(!client)
  539. return -ENODEV;
  540. while(num--){
  541. device_addr = device_addr_convert((((*dataPt).addr)>>8)&0XFF);
  542. reg_addr = (u8)(((*dataPt).addr)&0XFF);
  543. buf[0] = reg_addr;
  544. buf[1] = (*dataPt).dat_sysDyn[currentSys];
  545. msg.flags = 0;
  546. //msg.addr = 0xB2>>1;
  547. msg.addr = device_addr >> 1;//client->addr;
  548. msg.len = 2;
  549. msg.buf = buf;
  550. while(retries < 5){
  551. ret = i2c_transfer(client->adapter, &msg, 1);
  552. if (ret == 1)break;
  553. retries++;
  554. }
  555. if(retries >= 5){
  556. printk("ark7116_write_byte write error\n");
  557. }
  558. if(i2c_debug){
  559. unsigned char val;
  560. val = amt_read_reg((*dataPt).addr);
  561. if(val != (*dataPt).dat_sysDyn[currentSys])
  562. gpioi2c_print("device_reg=0x%x-->0x%x, val=0x%x, regval=0x%x \n",(*dataPt).addr, device_addr,val,(*dataPt).dat_sysDyn[currentSys]);
  563. }
  564. dataPt++;
  565. }
  566. return ret;
  567. }
  568. static void config_slave_mode(void)
  569. {
  570. unsigned char AddrBuff[6] = {0xa1,0xa2,0xa3,0xa4,0xa5,0xa6};
  571. unsigned char DataBuff[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
  572. unsigned char i;
  573. gpioi2c_print("+++%s.\n",__FUNCTION__);
  574. DataBuff[0] = 0X55;
  575. DataBuff[1] = 0xAA;
  576. DataBuff[2] = 0X03;
  577. DataBuff[3] = 0X50; //slave mode
  578. DataBuff[4] = 0; // crc val
  579. DataBuff[5] = DataBuff[2]^DataBuff[3]^DataBuff[4];
  580. amt_write_reg(BUS_STATUS_ADDR, 0x00); //I2c Write Start
  581. for(i =0;i < 6;i++)
  582. {
  583. amt_write_reg(AddrBuff[i], DataBuff[i]);
  584. }
  585. amt_write_reg(BUS_STATUS_ADDR, 0x11); //I2c Write End
  586. udelay(10);
  587. amt_write_reg(0xFAC6, 0x20);
  588. gpioi2c_print("---%s.\n",__FUNCTION__);
  589. }
  590. static void config_static_para(unsigned char curret_source)
  591. {
  592. gpioi2c_print("%s.\n",__FUNCTION__);
  593. amt_write_static_para(AV1_staticPara, sizeof(AV1_staticPara) / sizeof(AV1_staticPara[0]));
  594. }
  595. static void config_pad_mux_para(void)
  596. {
  597. gpioi2c_print("%s.\n",__FUNCTION__);
  598. amt_write_static_para(AMT_PadMuxStaticPara, sizeof(AMT_PadMuxStaticPara) / sizeof(AMT_PadMuxStaticPara[0]));
  599. }
  600. #if 0
  601. static void config_color_sys_dyn_para(unsigned char current_sys)
  602. {
  603. gpioi2c_print("%s.\n",__FUNCTION__);
  604. amt_write_color_sys_dyn_para(AV1_sysDynPara, sizeof(AV1_sysDynPara) / sizeof(AV1_sysDynPara[0]), current_sys);
  605. }
  606. #endif
  607. static void config_disp_zoom_dyn_para(unsigned char currentmode)
  608. {
  609. gpioi2c_print("%s.\n",__FUNCTION__);
  610. amt_write_disp_zoom_dyn_para(AV1_posDynPara, sizeof(AV1_posDynPara) / sizeof(AV1_posDynPara[0]), currentmode);
  611. }
  612. static void init_global_para(void)
  613. {
  614. gpioi2c_print("%s.\n",__FUNCTION__);
  615. amt_write_reg(ENH_PLL,0X20);
  616. config_static_para(INPUT_AV1);
  617. config_disp_zoom_dyn_para(DISP_16_9);
  618. //config_color_sys_dyn_para(PAL);
  619. config_pad_mux_para();
  620. amt_write_reg(ENH_PLL,0X2C);
  621. }
  622. static void ark7116_reset(void)
  623. {
  624. int reset_gpio = g_ark7116_pdata->gpio_reset;
  625. gpio_direction_output(reset_gpio, 0);
  626. gpio_set_value(reset_gpio, 0);
  627. mdelay(1);
  628. gpio_set_value(reset_gpio, 1);
  629. mdelay(100);//mdelay(1);
  630. gpio_set_value(reset_gpio, 0);
  631. mdelay(15);
  632. }
  633. int ark7116_config(void)
  634. {
  635. unsigned char val,slave_mode,rom_sel;
  636. int times = 10;
  637. gpioi2c_print("ark169 %s.\n",__FUNCTION__);
  638. if(g_ark7116_pdata->config_finish){
  639. return 0;
  640. }
  641. reset_ark7116:
  642. ark7116_reset();
  643. config_slave_mode();
  644. //soft reset 7116
  645. amt_write_reg(0xFD00, 0x5A);
  646. mdelay(15);
  647. config_slave_mode();
  648. val = amt_read_reg(0xFAC6);
  649. slave_mode = (val & 0x80)?0:1;
  650. rom_sel = (val & 0x02)?1:0;
  651. printk(KERN_ALERT "\n ark7116 slave status=0x%0x.slave_mode=%d,rom_sel=%d----->\n",val,slave_mode,rom_sel);
  652. if(rom_sel || !slave_mode){
  653. if(times-- > 0){
  654. goto reset_ark7116;
  655. }else{
  656. printk(KERN_ALERT "ark7116 slave config error.\n");
  657. return -1;
  658. }
  659. }
  660. init_global_para();
  661. //soft reset decoder
  662. val = amt_read_reg(0xFEA0);
  663. val |= 1;
  664. amt_write_reg(0xFEA0, val);
  665. mdelay(30);
  666. val &= ~1;
  667. amt_write_reg(0xFEA0, val);
  668. mdelay(1);
  669. ///////////////////////////////////////
  670. amt_write_reg(ENH_PLL,0X28);
  671. mdelay(200);
  672. amt_write_reg(ENH_PLL,0X2C);
  673. g_ark7116_pdata->config_finish = 1;
  674. return 0;
  675. }
  676. /* int amt_detect_signal(void)
  677. {
  678. return ((amt_read_reg(0xFE26) & 0x6) == 0x6);
  679. }*/