Gem_isp_sensor.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. // Gem_sensor.c
  2. #include "Gem_isp_sensor.h"
  3. #include <stdio.h>
  4. #include <rtos.h>
  5. int isp_sen_id_check(void)
  6. {
  7. int id;
  8. id = i2c_reg_read (SEN_I2C_ADDR, ID_H_REG);
  9. id = (id << 8) | i2c_reg_read(SEN_I2C_ADDR, ID_L_REG);
  10. printf("\r\nFound Sensor id:0x%04x\n", id);
  11. if (id == OV9712_ID)
  12. {
  13. printf("Senosr OV9712... \n");
  14. }
  15. else if (id == OV2643_ID)
  16. {
  17. printf("Senosr OV2643... \n");
  18. }
  19. else if (id == JX_H22_ID)
  20. {
  21. printf("Senosr JX_H22... \n");
  22. }
  23. else if (id == PP1210K_ID)
  24. {
  25. printf("\r\nSenosr PixPlus1210K...\n");
  26. }
  27. else
  28. {
  29. printf("Senosr Unknown... \n");
  30. }
  31. return 0;
  32. }
  33. // sensor ov9712 API
  34. // -----------------
  35. int isp_sen_config_OV9712 (void)
  36. {
  37. int i,j;
  38. unsigned char val;
  39. int times = 20;
  40. if (isp_sen_id_check() != 0)
  41. {
  42. return -1;
  43. }
  44. //640x480--------------------------------------
  45. /*
  46. i2c_reg_write(SEN_I2C_ADDR,0x12, 0x80); //Reset
  47. i2c_reg_write(SEN_I2C_ADDR,0x09, 0x10); //disable sleep mode
  48. i2c_reg_write(SEN_I2C_ADDR,0x1e, 0x07);
  49. i2c_reg_write(SEN_I2C_ADDR,0x5f, 0x18);
  50. i2c_reg_write(SEN_I2C_ADDR,0x69, 0x04);
  51. i2c_reg_write(SEN_I2C_ADDR,0x65, 0x2a);
  52. i2c_reg_write(SEN_I2C_ADDR,0x68, 0x0a);
  53. i2c_reg_write(SEN_I2C_ADDR,0x39, 0x28);
  54. i2c_reg_write(SEN_I2C_ADDR,0x4d, 0x90);
  55. i2c_reg_write(SEN_I2C_ADDR,0xc1, 0x80);
  56. i2c_reg_write(SEN_I2C_ADDR,0x0c, 0x30);
  57. i2c_reg_write(SEN_I2C_ADDR,0x6d, 0x02);
  58. i2c_reg_write(SEN_I2C_ADDR,0x96, 0x01);
  59. i2c_reg_write(SEN_I2C_ADDR,0xbc, 0x68);
  60. i2c_reg_write(SEN_I2C_ADDR,0x12, 0x00);
  61. i2c_reg_write(SEN_I2C_ADDR,0x3b, 0x00);
  62. i2c_reg_write(SEN_I2C_ADDR,0x97, 0x80); // 0x88:bar 0x80:normal
  63. i2c_reg_write(SEN_I2C_ADDR,0x17, 0x25);
  64. i2c_reg_write(SEN_I2C_ADDR,0x18, 0xA2);
  65. i2c_reg_write(SEN_I2C_ADDR,0x19, 0x01);
  66. i2c_reg_write(SEN_I2C_ADDR,0x1a, 0xCA);
  67. i2c_reg_write(SEN_I2C_ADDR,0x03, 0x0A);
  68. i2c_reg_write(SEN_I2C_ADDR,0x32, 0x07);
  69. i2c_reg_write(SEN_I2C_ADDR,0x98, 0x40);
  70. i2c_reg_write(SEN_I2C_ADDR,0x99, 0xA0);
  71. i2c_reg_write(SEN_I2C_ADDR,0x9a, 0x01);
  72. i2c_reg_write(SEN_I2C_ADDR,0x57, 0x00);
  73. i2c_reg_write(SEN_I2C_ADDR,0x58, 0x78);
  74. i2c_reg_write(SEN_I2C_ADDR,0x59, 0x50);
  75. i2c_reg_write(SEN_I2C_ADDR,0x4c, 0x13);
  76. i2c_reg_write(SEN_I2C_ADDR,0x4b, 0x36);
  77. i2c_reg_write(SEN_I2C_ADDR,0x3d, 0x3c);
  78. i2c_reg_write(SEN_I2C_ADDR,0x3e, 0x03);
  79. i2c_reg_write(SEN_I2C_ADDR,0xbd, 0x50);
  80. i2c_reg_write(SEN_I2C_ADDR,0xbe, 0x78);
  81. i2c_reg_write(SEN_I2C_ADDR,0x4e, 0x55);
  82. i2c_reg_write(SEN_I2C_ADDR,0x4f, 0x55);
  83. i2c_reg_write(SEN_I2C_ADDR,0x50, 0x55);
  84. i2c_reg_write(SEN_I2C_ADDR,0x51, 0x55);
  85. i2c_reg_write(SEN_I2C_ADDR,0x24, 0x55);
  86. i2c_reg_write(SEN_I2C_ADDR,0x25, 0x40);
  87. i2c_reg_write(SEN_I2C_ADDR,0x26, 0xa1);
  88. i2c_reg_write(SEN_I2C_ADDR,0x5c, 0x1c); // bit [4:0] multiplier
  89. i2c_reg_write(SEN_I2C_ADDR,0x5d, 0x12); // bit [5:4] driver capability
  90. i2c_reg_write(SEN_I2C_ADDR,0x11, 0x01);
  91. i2c_reg_write(SEN_I2C_ADDR,0x2a, 0x8c);
  92. i2c_reg_write(SEN_I2C_ADDR,0x2b, 0x07);
  93. i2c_reg_write(SEN_I2C_ADDR,0x2d, 0x00);
  94. i2c_reg_write(SEN_I2C_ADDR,0x2e, 0x00);
  95. i2c_reg_write(SEN_I2C_ADDR,0x13, 0x00);
  96. i2c_reg_write(SEN_I2C_ADDR,0x0e, 0x40); // [7] AEC OPEN
  97. i2c_reg_write(SEN_I2C_ADDR,0x03, 0x0A); // [7:5] 鏈€浣嶧PS
  98. i2c_reg_write(SEN_I2C_ADDR,0x14, 0x00); // Gain Ceiling 8X
  99. i2c_reg_write(SEN_I2C_ADDR,0x13, 0x20);
  100. i2c_reg_write(SEN_I2C_ADDR,0x10, 0x40);
  101. i2c_reg_write(SEN_I2C_ADDR,0x16, 0x01);
  102. i2c_reg_write(SEN_I2C_ADDR,0x49, 0x00);
  103. i2c_reg_write(SEN_I2C_ADDR,0x4a, 0x02);
  104. //i2c_reg_write(SEN_I2C_ADDR,0x00, 0x00);
  105. //i2c_reg_write(SEN_I2C_ADDR,0x04, 0x80); //flip
  106. */
  107. //1280x800 ArkMicro OV9712
  108. //reset
  109. i2c_reg_write(SEN_I2C_ADDR,0x12,0x80);
  110. OS_Delay(1);
  111. i2c_reg_write(SEN_I2C_ADDR,0x09,0x10);
  112. OS_Delay(1);
  113. //Core Settings OV9712
  114. i2c_reg_write(SEN_I2C_ADDR,0x1e,0x07);
  115. i2c_reg_write(SEN_I2C_ADDR,0x5f,0x18);
  116. i2c_reg_write(SEN_I2C_ADDR,0x69,0x04);
  117. i2c_reg_write(SEN_I2C_ADDR,0x65,0x2a);
  118. i2c_reg_write(SEN_I2C_ADDR,0x68,0x0a);
  119. i2c_reg_write(SEN_I2C_ADDR,0x39,0x28);
  120. i2c_reg_write(SEN_I2C_ADDR,0x4d,0x90);
  121. i2c_reg_write(SEN_I2C_ADDR,0xc1,0x80);
  122. i2c_reg_write(SEN_I2C_ADDR,0x6d,0x02);
  123. //i2c_reg_write(SEN_I2C_ADDR,0x96,0xf1); // DSP options enable
  124. i2c_reg_write(SEN_I2C_ADDR,0xbc,0x68);
  125. i2c_reg_write(SEN_I2C_ADDR,0x12,0x00);
  126. i2c_reg_write(SEN_I2C_ADDR,0x3b,0x00);
  127. i2c_reg_write(SEN_I2C_ADDR,0x97,0x80); // color bar
  128. i2c_reg_write(SEN_I2C_ADDR,0x17,0x25);
  129. i2c_reg_write(SEN_I2C_ADDR,0x18,0xA2);
  130. i2c_reg_write(SEN_I2C_ADDR,0x19,0x01);
  131. i2c_reg_write(SEN_I2C_ADDR,0x1a,0xCA);
  132. i2c_reg_write(SEN_I2C_ADDR,0x32,0x07);
  133. i2c_reg_write(SEN_I2C_ADDR,0x98,0x00);
  134. i2c_reg_write(SEN_I2C_ADDR,0x99,0x00);
  135. i2c_reg_write(SEN_I2C_ADDR,0x9a,0x00);
  136. i2c_reg_write(SEN_I2C_ADDR,0x57,0x00);
  137. i2c_reg_write(SEN_I2C_ADDR,0x58,0xC8);//0xC8
  138. i2c_reg_write(SEN_I2C_ADDR,0x59,0xA0);
  139. i2c_reg_write(SEN_I2C_ADDR,0x4c,0x13);
  140. i2c_reg_write(SEN_I2C_ADDR,0x4b,0x36);
  141. i2c_reg_write(SEN_I2C_ADDR,0x3d,0x3C);
  142. i2c_reg_write(SEN_I2C_ADDR,0x3e,0x03);
  143. i2c_reg_write(SEN_I2C_ADDR,0xbd,0xA0);
  144. i2c_reg_write(SEN_I2C_ADDR,0xbe,0xC8);
  145. i2c_reg_write(SEN_I2C_ADDR,0x10,0xff);
  146. i2c_reg_write(SEN_I2C_ADDR,0x4e,0x55);// AVERAGE
  147. i2c_reg_write(SEN_I2C_ADDR,0x4f,0x55);
  148. i2c_reg_write(SEN_I2C_ADDR,0x50,0x55);
  149. i2c_reg_write(SEN_I2C_ADDR,0x51,0x55);
  150. i2c_reg_write(SEN_I2C_ADDR,0x24,0x30);// Exposure windows
  151. i2c_reg_write(SEN_I2C_ADDR,0x25,0x20);
  152. i2c_reg_write(SEN_I2C_ADDR,0x26,0xa1);
  153. //Clock OV9712
  154. //i2c_reg_write(SEN_I2C_ADDR,0x5c,0x5c);// pclk
  155. i2c_reg_write(SEN_I2C_ADDR,0x5c,0x1c);// *M pclk
  156. //
  157. #if 1
  158. i2c_reg_write(SEN_I2C_ADDR,0x5d,0x10);// bit [5:4] driver capability pclk=1/2主时钟
  159. #else
  160. i2c_reg_write(SEN_I2C_ADDR,0x5d,0x40);// bit.6 BYPASS PLL pclk=mclk
  161. #endif
  162. i2c_reg_write(SEN_I2C_ADDR,0x11,0x03);
  163. i2c_reg_write(SEN_I2C_ADDR,0x2a,0x8c);
  164. i2c_reg_write(SEN_I2C_ADDR,0x2b,0x07);
  165. i2c_reg_write(SEN_I2C_ADDR,0x2d,0x00);
  166. i2c_reg_write(SEN_I2C_ADDR,0x2e,0x00);
  167. //General OV9712
  168. i2c_reg_write(SEN_I2C_ADDR,0x13,0xa5);// 自动曝光
  169. //i2c_reg_write(SEN_I2C_ADDR,0x13,0x80);// 手动曝光
  170. i2c_reg_write(SEN_I2C_ADDR,0x14,0x40);// Gain Ceiling 8X
  171. //Banding OV9712
  172. i2c_reg_write(SEN_I2C_ADDR,0x4a,0x00);
  173. i2c_reg_write(SEN_I2C_ADDR,0x49,0xce);
  174. i2c_reg_write(SEN_I2C_ADDR,0x22,0x03);
  175. i2c_reg_write(SEN_I2C_ADDR,0x09,0x00);
  176. //close AE_AWB OV9712
  177. #if 0
  178. i2c_reg_write(SEN_I2C_ADDR,0x13, 0x80);//打开手动曝光
  179. i2c_reg_write(SEN_I2C_ADDR,0x16, 0x00);
  180. i2c_reg_write(SEN_I2C_ADDR,0x10, 0xf0);
  181. i2c_reg_write(SEN_I2C_ADDR,0x00, 0x3f);
  182. i2c_reg_write(SEN_I2C_ADDR,0x38, 0x00);
  183. i2c_reg_write(SEN_I2C_ADDR,0x01, 0x00);
  184. i2c_reg_write(SEN_I2C_ADDR,0x02, 0x00);
  185. i2c_reg_write(SEN_I2C_ADDR,0x05, 0x00);
  186. i2c_reg_write(SEN_I2C_ADDR,0x06, 0x00);
  187. i2c_reg_write(SEN_I2C_ADDR,0x07, 0x00);
  188. #else
  189. i2c_reg_write(SEN_I2C_ADDR,0x13, 0x8d);//打开自动曝光
  190. i2c_reg_write(SEN_I2C_ADDR,0x16, 0x00);//v
  191. i2c_reg_write(SEN_I2C_ADDR,0x10, 0xff);// v
  192. //i2c_reg_write(SEN_I2C_ADDR,0x00, 0x3f);
  193. //i2c_reg_write(SEN_I2C_ADDR,0x38, 0x00);
  194. //i2c_reg_write(SEN_I2C_ADDR,0x01, 0x40);
  195. //i2c_reg_write(SEN_I2C_ADDR,0x02, 0x40);
  196. i2c_reg_write(SEN_I2C_ADDR,0x05, 0x40);
  197. i2c_reg_write(SEN_I2C_ADDR,0x06, 0x00);
  198. i2c_reg_write(SEN_I2C_ADDR,0x07, 0x00);
  199. #endif
  200. //BLC OV9712
  201. i2c_reg_write(SEN_I2C_ADDR,0x41, 0x84);
  202. /*
  203. // Novatek
  204. i2c_reg_write(SEN_I2C_ADDR,0x96, 0x41);
  205. i2c_reg_write(SEN_I2C_ADDR,0xBC, 0x68);
  206. i2c_reg_write(SEN_I2C_ADDR,0x12, 0x00);
  207. i2c_reg_write(SEN_I2C_ADDR,0x3B, 0x00);
  208. i2c_reg_write(SEN_I2C_ADDR,0x97, 0x80);
  209. i2c_reg_write(SEN_I2C_ADDR,0x15, 0x00);
  210. i2c_reg_write(SEN_I2C_ADDR,0x17, 0x25);
  211. i2c_reg_write(SEN_I2C_ADDR,0x18, 0xA2);
  212. i2c_reg_write(SEN_I2C_ADDR,0x19, 0x00);
  213. i2c_reg_write(SEN_I2C_ADDR,0x1A, 0xCA);
  214. i2c_reg_write(SEN_I2C_ADDR,0x03, 0x0A);
  215. i2c_reg_write(SEN_I2C_ADDR,0x32, 0x07);
  216. i2c_reg_write(SEN_I2C_ADDR,0x98, 0x00);
  217. i2c_reg_write(SEN_I2C_ADDR,0x99, 0x00);
  218. i2c_reg_write(SEN_I2C_ADDR,0x9A, 0x00);
  219. i2c_reg_write(SEN_I2C_ADDR,0x57, 0x00);
  220. i2c_reg_write(SEN_I2C_ADDR,0x58, 0xC8);
  221. i2c_reg_write(SEN_I2C_ADDR,0x59, 0xA2);
  222. i2c_reg_write(SEN_I2C_ADDR,0x4C, 0x13);
  223. i2c_reg_write(SEN_I2C_ADDR,0x4B, 0x36);
  224. i2c_reg_write(SEN_I2C_ADDR,0x3D, 0x3C);
  225. i2c_reg_write(SEN_I2C_ADDR,0x3E, 0x03);
  226. i2c_reg_write(SEN_I2C_ADDR,0x4E, 0x55);
  227. i2c_reg_write(SEN_I2C_ADDR,0x4F, 0x55);
  228. i2c_reg_write(SEN_I2C_ADDR,0x50, 0x55);
  229. i2c_reg_write(SEN_I2C_ADDR,0x51, 0x55);
  230. i2c_reg_write(SEN_I2C_ADDR,0x24, 0x48);
  231. i2c_reg_write(SEN_I2C_ADDR,0x25, 0x38);
  232. i2c_reg_write(SEN_I2C_ADDR,0x26, 0x92);
  233. i2c_reg_write(SEN_I2C_ADDR,0x5c,0x1c);// 48m pclk
  234. i2c_reg_write(SEN_I2C_ADDR,0x5d,0x10);// bit [5:4] driver capability
  235. i2c_reg_write(SEN_I2C_ADDR,0x11,0x03);
  236. i2c_reg_write(SEN_I2C_ADDR,0x2a,0x8c);
  237. i2c_reg_write(SEN_I2C_ADDR,0x2b,0x07);
  238. i2c_reg_write(SEN_I2C_ADDR,0x2d,0x00);
  239. i2c_reg_write(SEN_I2C_ADDR,0x2e,0x00);
  240. i2c_reg_write(SEN_I2C_ADDR,0x41, 0x81);
  241. i2c_reg_write(SEN_I2C_ADDR,0x13, 0x00);
  242. i2c_reg_write(SEN_I2C_ADDR,0x14, 0x00);//0x40
  243. // General setting
  244. i2c_reg_write(SEN_I2C_ADDR,0x1E, 0x07);
  245. i2c_reg_write(SEN_I2C_ADDR,0x5F, 0x18);
  246. i2c_reg_write(SEN_I2C_ADDR,0x69, 0x04);
  247. i2c_reg_write(SEN_I2C_ADDR,0x65, 0x2A);
  248. i2c_reg_write(SEN_I2C_ADDR,0x68, 0x0A);
  249. i2c_reg_write(SEN_I2C_ADDR,0x39, 0x28);
  250. i2c_reg_write(SEN_I2C_ADDR,0x4D, 0x90);
  251. i2c_reg_write(SEN_I2C_ADDR,0xC1, 0x80);
  252. i2c_reg_write(SEN_I2C_ADDR,0x2A, 0x8c);
  253. i2c_reg_write(SEN_I2C_ADDR,0x96, 0x01); //{0x96, 0xC1},
  254. i2c_reg_write(SEN_I2C_ADDR,0x6D, 0x02);
  255. */
  256. return 0;
  257. }
  258. int isp_sen_config_PP1210K (void)
  259. {
  260. int temp;
  261. unsigned long count = 0;
  262. if (isp_sen_id_check() != 0)
  263. {
  264. return -1;
  265. }
  266. i2c_reg_write(SEN_I2C_ADDR,0x03,0x00);//W0300// select GROUP A
  267. i2c_reg_write(SEN_I2C_ADDR,0x24,0x01);//W0300// soft reset
  268. OS_Delay(1);
  269. //#################### start up ####################
  270. i2c_reg_write(SEN_I2C_ADDR,0x03,0x00);//W0300
  271. i2c_reg_write(SEN_I2C_ADDR,0x29,0x98);//W2998 # output Hi-z release
  272. i2c_reg_write(SEN_I2C_ADDR,0x03,0x00);//W0300
  273. i2c_reg_write(SEN_I2C_ADDR,0x05,0x00);//W0503 # mirror/flip
  274. //i2c_reg_write(SEN_I2C_ADDR,0x05,0x02 );//W0503 # mirror/flip
  275. i2c_reg_write(SEN_I2C_ADDR,0x06,0x08);//W0608 # framewidth_h (08)
  276. i2c_reg_write(SEN_I2C_ADDR,0x07,0x97);//W0797 # framewidth_l (97)
  277. i2c_reg_write(SEN_I2C_ADDR,0x08,0x04);
  278. i2c_reg_write(SEN_I2C_ADDR,0x09,0x74);
  279. i2c_reg_write(SEN_I2C_ADDR,0x0c,0x00);//W0C01 # windowx1_h (00)
  280. i2c_reg_write(SEN_I2C_ADDR,0x0d,0x0d);//W0D4E # windowx1_l (01)
  281. i2c_reg_write(SEN_I2C_ADDR,0x0e,0x00);//W0E00 # windowy1_h (00)
  282. i2c_reg_write(SEN_I2C_ADDR,0x0f,0x0e);//W0FC2 # windowy1_l (02)
  283. i2c_reg_write(SEN_I2C_ADDR,0x10,0x07);//W1006 # windowx2_h (07)
  284. i2c_reg_write(SEN_I2C_ADDR,0x11,0x8c);//W114D # windowx2_l (8C)
  285. i2c_reg_write(SEN_I2C_ADDR,0x12,0x04);//W1203 # windowy2_h (04)
  286. i2c_reg_write(SEN_I2C_ADDR,0x13,0x45);//W1391 # windowy2_l (45)
  287. i2c_reg_write(SEN_I2C_ADDR,0x14,0x00);//W1400 # vsyncstartrow_f0_h (00)
  288. i2c_reg_write(SEN_I2C_ADDR,0x15,0x19);//W1519 # vsyncstartrow_f0_l (0D)
  289. i2c_reg_write(SEN_I2C_ADDR,0x15,0x04);//W1604 # vsyncstoprow_f0_h (04)
  290. i2c_reg_write(SEN_I2C_ADDR,0x17,0x53);//W1753 # vsyncstoprow_f0_l (53)
  291. i2c_reg_write(SEN_I2C_ADDR,0x25,0x13);//W2510 # CLK DIV1
  292. i2c_reg_write(SEN_I2C_ADDR,0x33,0x01);//W3301 # pixelbias
  293. i2c_reg_write(SEN_I2C_ADDR,0x34,0x02);//W3402 # compbias
  294. i2c_reg_write(SEN_I2C_ADDR,0x36,0xc8);//W36C8 # TX_Bias; DCDC 4.96 V, LDO 4.37 V
  295. i2c_reg_write(SEN_I2C_ADDR,0x38,0x48);//W3848 # black_bias, range_sel 0.4 V
  296. i2c_reg_write(SEN_I2C_ADDR,0x3a,0x22);//W3A22 # main regulator output
  297. //i2c_reg_write(SEN_I2C_ADDR,0x41,0x06);//W4121 # pll_m_cnt (21)
  298. i2c_reg_write(SEN_I2C_ADDR,0x41,0x08);//0x41:08=3.66f/s//W4121 # pll_m_cnt (21)
  299. i2c_reg_write(SEN_I2C_ADDR,0x42,0x01);//W4208 # pll_r_cnt (04)
  300. i2c_reg_write(SEN_I2C_ADDR,0x40,0x10);//W4010 # pll_control
  301. //for(count=0;count<100000;count++); //$0500 # Delay ------- 500ms here
  302. OS_Delay(20);
  303. i2c_reg_write(SEN_I2C_ADDR,0x40,0x00);//W4000 # pll_control on
  304. i2c_reg_write(SEN_I2C_ADDR,0x03,0x01);//W0301
  305. i2c_reg_write(SEN_I2C_ADDR,0x26,0x03);//W2603 # blacksun_th_h
  306. i2c_reg_write(SEN_I2C_ADDR,0x03,0x01);//W0301
  307. //i2c_reg_write(SEN_I2C_ADDR,0xc0,0x01);//WC004 # inttime_h
  308. //i2c_reg_write(SEN_I2C_ADDR,0xc1,0xb8);//WC15F # inttime_m
  309. //i2c_reg_write(SEN_I2C_ADDR,0xc2,0x00);//WC200 # inttime_l
  310. i2c_reg_write(SEN_I2C_ADDR,0xc0,0x00);//WC004 # inttime_h
  311. i2c_reg_write(SEN_I2C_ADDR,0xc1,0x03);//WC15F # inttime_m
  312. i2c_reg_write(SEN_I2C_ADDR,0xc2,0x60);//WC200 # inttime_l
  313. i2c_reg_write(SEN_I2C_ADDR,0xc3,0x00);//WC300 # globalgain
  314. i2c_reg_write(SEN_I2C_ADDR,0xc4,0x40);//WC440 # digitalgain
  315. //for(count=0;count<500000;count++);
  316. OS_Delay(20);
  317. return 0;
  318. }
  319. int isp_sen_config_OV2643 (void)
  320. {
  321. if (isp_sen_id_check() != 0)
  322. {
  323. return -1;
  324. }
  325. return 0;
  326. }
  327. int isp_sen_config_MT9P031 (void)
  328. {
  329. if (isp_sen_id_check() != 0)
  330. {
  331. return -1;
  332. }
  333. return 0;
  334. }
  335. int isp_sen_config_JXH22 (void)
  336. {
  337. if (isp_sen_id_check() != 0)
  338. {
  339. return -1;
  340. }
  341. i2c_reg_write(SEN_I2C_ADDR,0x12,0x40);
  342. i2c_reg_write(SEN_I2C_ADDR,0x00,0x00);
  343. i2c_reg_write(SEN_I2C_ADDR,0x01,0x55);
  344. i2c_reg_write(SEN_I2C_ADDR,0x02,0x03);
  345. i2c_reg_write(SEN_I2C_ADDR,0x0E,0x10); //0x19
  346. i2c_reg_write(SEN_I2C_ADDR,0x0F,0x02);
  347. i2c_reg_write(SEN_I2C_ADDR,0x10,0x01);
  348. i2c_reg_write(SEN_I2C_ADDR,0x11,0x80); //0x01
  349. i2c_reg_write(SEN_I2C_ADDR,0x18,0xD5);
  350. i2c_reg_write(SEN_I2C_ADDR,0x19,0x00);
  351. i2c_reg_write(SEN_I2C_ADDR,0x1D,0xFF);
  352. i2c_reg_write(SEN_I2C_ADDR,0x1E,0xbF);
  353. i2c_reg_write(SEN_I2C_ADDR,0x1F,0x03);
  354. i2c_reg_write(SEN_I2C_ADDR,0x20,0xDC);
  355. i2c_reg_write(SEN_I2C_ADDR,0x21,0x05);
  356. i2c_reg_write(SEN_I2C_ADDR,0x22,0x55);
  357. i2c_reg_write(SEN_I2C_ADDR,0x23,0x03);
  358. i2c_reg_write(SEN_I2C_ADDR,0x24,0x00);
  359. i2c_reg_write(SEN_I2C_ADDR,0x25,0xD0);
  360. i2c_reg_write(SEN_I2C_ADDR,0x26,0x25);
  361. i2c_reg_write(SEN_I2C_ADDR,0x27,0xEa); // 0xe9
  362. i2c_reg_write(SEN_I2C_ADDR,0x28,0x0c); // 0x0d
  363. i2c_reg_write(SEN_I2C_ADDR,0x29,0x00);
  364. i2c_reg_write(SEN_I2C_ADDR,0x2A,0xD4);
  365. i2c_reg_write(SEN_I2C_ADDR,0x2B,0x10);
  366. i2c_reg_write(SEN_I2C_ADDR,0x2C,0x00);
  367. i2c_reg_write(SEN_I2C_ADDR,0x2D,0x0A);
  368. i2c_reg_write(SEN_I2C_ADDR,0x2E,0xC2);
  369. i2c_reg_write(SEN_I2C_ADDR,0x2F,0x20);
  370. i2c_reg_write(SEN_I2C_ADDR,0x37,0x36);
  371. i2c_reg_write(SEN_I2C_ADDR,0x38,0x98);
  372. i2c_reg_write(SEN_I2C_ADDR,0x12,0x30);
  373. return 0;
  374. }
  375. int isp_sen_config_AR0130 (void)
  376. {
  377. int rdata;
  378. /*
  379. if (isp_sen_id_check() != 0)
  380. {
  381. return -1;
  382. }
  383. */
  384. i2c_reg_read(0x21,0x301A);
  385. printf("\r\nrdata 0x%08x", rdata);
  386. //[720p30]
  387. /*
  388. i2c_reg_write(SEN_I2C_ADDR,0x301A, 0x0001); // RESET_REGISTER
  389. i2c_reg_write(SEN_I2C_ADDR,0x301A, 0x10D8); // RESET_REGISTER
  390. //delay_ms(200); //DELAY= 200
  391. i2c_reg_write(SEN_I2C_ADDR,0x3088, 0x8000); // SEQ_CTRL_PORT
  392. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0225); // SEQ_DATA_PORT
  393. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x5050); // SEQ_DATA_PORT
  394. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2D26); // SEQ_DATA_PORT
  395. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0828); // SEQ_DATA_PORT
  396. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0D17); // SEQ_DATA_PORT
  397. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0926); // SEQ_DATA_PORT
  398. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0028); // SEQ_DATA_PORT
  399. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0526); // SEQ_DATA_PORT
  400. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0xA728); // SEQ_DATA_PORT
  401. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0725); // SEQ_DATA_PORT
  402. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x8080); // SEQ_DATA_PORT
  403. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2917); // SEQ_DATA_PORT
  404. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0525); // SEQ_DATA_PORT
  405. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0040); // SEQ_DATA_PORT
  406. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2702); // SEQ_DATA_PORT
  407. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1616); // SEQ_DATA_PORT
  408. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2706); // SEQ_DATA_PORT
  409. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1736); // SEQ_DATA_PORT
  410. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x26A6); // SEQ_DATA_PORT
  411. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1703); // SEQ_DATA_PORT
  412. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x26A4); // SEQ_DATA_PORT
  413. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x171F); // SEQ_DATA_PORT
  414. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2805); // SEQ_DATA_PORT
  415. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2620); // SEQ_DATA_PORT
  416. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2804); // SEQ_DATA_PORT
  417. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2520); // SEQ_DATA_PORT
  418. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2027); // SEQ_DATA_PORT
  419. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0017); // SEQ_DATA_PORT
  420. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1E25); // SEQ_DATA_PORT
  421. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0020); // SEQ_DATA_PORT
  422. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2117); // SEQ_DATA_PORT
  423. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1028); // SEQ_DATA_PORT
  424. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x051B); // SEQ_DATA_PORT
  425. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1703); // SEQ_DATA_PORT
  426. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2706); // SEQ_DATA_PORT
  427. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1703); // SEQ_DATA_PORT
  428. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1741); // SEQ_DATA_PORT
  429. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2660); // SEQ_DATA_PORT
  430. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x17AE); // SEQ_DATA_PORT
  431. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2500); // SEQ_DATA_PORT
  432. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x9027); // SEQ_DATA_PORT
  433. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0026); // SEQ_DATA_PORT
  434. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1828); // SEQ_DATA_PORT
  435. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x002E); // SEQ_DATA_PORT
  436. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2A28); // SEQ_DATA_PORT
  437. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x081E); // SEQ_DATA_PORT
  438. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0831); // SEQ_DATA_PORT
  439. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1440); // SEQ_DATA_PORT
  440. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x4014); // SEQ_DATA_PORT
  441. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2020); // SEQ_DATA_PORT
  442. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1410); // SEQ_DATA_PORT
  443. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1034); // SEQ_DATA_PORT
  444. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1400); // SEQ_DATA_PORT
  445. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1014); // SEQ_DATA_PORT
  446. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0020); // SEQ_DATA_PORT
  447. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1400); // SEQ_DATA_PORT
  448. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x4013); // SEQ_DATA_PORT
  449. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1802); // SEQ_DATA_PORT
  450. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1470); // SEQ_DATA_PORT
  451. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x7004); // SEQ_DATA_PORT
  452. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1470); // SEQ_DATA_PORT
  453. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x7003); // SEQ_DATA_PORT
  454. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1470); // SEQ_DATA_PORT
  455. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x7017); // SEQ_DATA_PORT
  456. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2002); // SEQ_DATA_PORT
  457. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1400); // SEQ_DATA_PORT
  458. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2002); // SEQ_DATA_PORT
  459. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1400); // SEQ_DATA_PORT
  460. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x5004); // SEQ_DATA_PORT
  461. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1400); // SEQ_DATA_PORT
  462. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2004); // SEQ_DATA_PORT
  463. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x1400); // SEQ_DATA_PORT
  464. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x5022); // SEQ_DATA_PORT
  465. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0314); // SEQ_DATA_PORT
  466. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0020); // SEQ_DATA_PORT
  467. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0314); // SEQ_DATA_PORT
  468. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x0050); // SEQ_DATA_PORT
  469. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2C2C); // SEQ_DATA_PORT
  470. i2c_reg_write(SEN_I2C_ADDR,0x3086, 0x2C2C); // SEQ_DATA_PORT
  471. i2c_reg_write(SEN_I2C_ADDR,0x309E, 0x0000); // ERS_PROG_START_ADDR
  472. //delay_ms(200); //DELAY= 200
  473. i2c_reg_write(SEN_I2C_ADDR,0x30E4, 0x6372); // ADC_BITS_6_7
  474. i2c_reg_write(SEN_I2C_ADDR,0x30E2, 0x7253); // ADC_BITS_4_5
  475. i2c_reg_write(SEN_I2C_ADDR,0x30E0, 0x5470); // ADC_BITS_2_3
  476. i2c_reg_write(SEN_I2C_ADDR,0x30E6, 0xC4CC); // ADC_CONFIG1
  477. i2c_reg_write(SEN_I2C_ADDR,0x30E8, 0x8050); // ADC_CONFIG2
  478. i2c_reg_write(SEN_I2C_ADDR,0x3082, 0x0029); // OPERATION_MODE_CTRL
  479. i2c_reg_write(SEN_I2C_ADDR,0x30B0, 0x1300); // DIGITAL_TEST
  480. i2c_reg_write(SEN_I2C_ADDR,0x30D4, 0xE007); // COLUMN_CORRECTION
  481. i2c_reg_write(SEN_I2C_ADDR,0x301A, 0x10DC); // RESET_REGISTER
  482. i2c_reg_write(SEN_I2C_ADDR,0x301A, 0x10D8); // RESET_REGISTER
  483. i2c_reg_write(SEN_I2C_ADDR,0x3044, 0x0400); // DARK_CONTROL
  484. i2c_reg_write(SEN_I2C_ADDR,0x3EDA, 0x0F03); // DAC_LD_14_15
  485. i2c_reg_write(SEN_I2C_ADDR,0x3ED8, 0x01EF); // DAC_LD_12_13
  486. i2c_reg_write(SEN_I2C_ADDR,0x3012, 0x02A0); // COARSE_INTEGRATION_TIME
  487. i2c_reg_write(SEN_I2C_ADDR,0x3032, 0x0000); // DIGITAL_BINNING
  488. i2c_reg_write(SEN_I2C_ADDR,0x3002, 0x003e); // Y_ADDR_START
  489. i2c_reg_write(SEN_I2C_ADDR,0x3004, 0x0004); // X_ADDR_START
  490. i2c_reg_write(SEN_I2C_ADDR,0x3006, 0x030d); // Y_ADDR_END
  491. i2c_reg_write(SEN_I2C_ADDR,0x3008, 0x0503); // X_ADDR_END
  492. i2c_reg_write(SEN_I2C_ADDR,0x300A, 0x02EE); // FRAME_LENGTH_LINES
  493. i2c_reg_write(SEN_I2C_ADDR,0x300C, 0x0CE4); // LINE_LENGTH_PCK
  494. i2c_reg_write(SEN_I2C_ADDR,0x301A, 0x10D8); // RESET_REGISTER
  495. i2c_reg_write(SEN_I2C_ADDR,0x31D0, 0x0001); // HDR_COMP
  496. //Load = PLL Enabled 27Mhz to 74.25Mhz
  497. i2c_reg_write(SEN_I2C_ADDR,0x302C, 0x0002); // VT_SYS_CLK_DIV
  498. i2c_reg_write(SEN_I2C_ADDR,0x302A, 0x0004); // VT_PIX_CLK_DIV
  499. i2c_reg_write(SEN_I2C_ADDR,0x302E, 0x0002); // PRE_PLL_CLK_DIV
  500. i2c_reg_write(SEN_I2C_ADDR,0x3030, 0x002C); // PLL_MULTIPLIER
  501. i2c_reg_write(SEN_I2C_ADDR,0x30B0, 0x0000); // DIGITAL_TEST
  502. //delay_ms(100); //DELAY= 100
  503. //LOAD= Disable Embedded Data and Stats
  504. i2c_reg_write(SEN_I2C_ADDR,0x3064, 0x1802); // SMIA_TEST, EMBEDDED_STATS_EN, 0x0000
  505. i2c_reg_write(SEN_I2C_ADDR,0x3064, 0x1802); // SMIA_TEST, EMBEDDED_DATA, 0x0000
  506. i2c_reg_write(SEN_I2C_ADDR,0x30BA, 0x0008); //20120502
  507. i2c_reg_write(SEN_I2C_ADDR,0x3EE4, 0xD308); // Enable 1.25x analog gain
  508. i2c_reg_write(SEN_I2C_ADDR,0x301A, 0x10DC); // RESET_REGISTER
  509. //delay_ms(200); //DELAY= 200
  510. */
  511. return 0;
  512. }
  513. #ifdef PP1210K_SEN
  514. // exposure setting for Pixel-Plus cmos
  515. void isp_sen_exposure_set(isp_ae_ptr_t p_ae)
  516. {
  517. unsigned int count;
  518. unsigned int etime_H8 = (p_ae->etimeUpd>>16) & 0xff;
  519. unsigned int etime_M8 = (p_ae->etimeUpd>>8) & 0xff;
  520. unsigned int etime_L8 = (p_ae->etimeUpd>>0) & 0xff;
  521. unsigned int again8 = p_ae->againUpd;
  522. unsigned int dgain8 = p_ae->dgainUpd;
  523. i2c_reg_write(SEN_I2C_ADDR,0x03,0x01);//W0301
  524. if (p_ae->etimeComp == 1)
  525. {
  526. i2c_reg_write(SEN_I2C_ADDR,0xc0,etime_H8);//WC004 # inttime_h
  527. i2c_reg_write(SEN_I2C_ADDR,0xc1,etime_M8);//WC15F # inttime_m
  528. i2c_reg_write(SEN_I2C_ADDR,0xc2,etime_L8);//WC200 # inttime_l
  529. }
  530. if (p_ae->againComp == 1)
  531. {
  532. i2c_reg_write(SEN_I2C_ADDR,0xc3,again8);//WC300 # globalgain
  533. printf ("again8 = 0x%08x\n", again8);
  534. }
  535. if (p_ae->dgainComp == 1)
  536. {
  537. i2c_reg_write(SEN_I2C_ADDR,0xc4,dgain8);//WC440 # digitalgain
  538. }
  539. printf("ae:etime_H8:0x%x etime_M8:0x%x etime_L8:0x%x again8:0x%x dgain8:0x%x\n",etime_H8,etime_M8,etime_L8,again8,dgain8);
  540. //for(count=0;count<10000;count++);
  541. return;
  542. }
  543. // exposure reading for Pixel-Plus cmos
  544. int isp_sen_exposure_read(void)
  545. {
  546. int etime, etime_H, etime_M, etime_L, again, dgain, yavg;
  547. i2c_reg_write(SEN_I2C_ADDR,0x03,0x01);//W0301
  548. etime_H = i2c_reg_read(SEN_I2C_ADDR,0xc0);
  549. etime_M = i2c_reg_read(SEN_I2C_ADDR,0xc1);
  550. etime_L = i2c_reg_read(SEN_I2C_ADDR,0xc2);
  551. etime = (etime_H<<16) | (etime_M<<8) | etime_L;
  552. again = i2c_reg_read(SEN_I2C_ADDR,0xc3);
  553. dgain = i2c_reg_read(SEN_I2C_ADDR,0xc4);
  554. /*
  555. printf ("\n");
  556. printf ("etime = 0x%08x\n", etime);
  557. printf ("again = 0x%08x\n", again);
  558. printf ("dgain = 0x%08x\n", dgain);*/
  559. return etime;
  560. }
  561. #endif
  562. void isp_sen_init(isp_sen_ptr_t p_sen)
  563. {
  564. p_sen->sensor_type = SENSOR_TYPE;
  565. //p_sen->image_size = SENSOR_SIZE;
  566. // p_sen->bayer_mode = 2;
  567. if (p_sen->sensor_type == OV2643)
  568. {
  569. if (isp_sen_config_OV2643() == -1)
  570. printf( "\r\nOV2643 config: Failure ...");
  571. else
  572. printf( "\r\nOV2643 config: Successful ...");
  573. }
  574. else if (p_sen->sensor_type == OV9712)
  575. {
  576. if (isp_sen_config_OV9712() == -1)
  577. printf( "\r\nOV9712 config: Failure ...");
  578. else
  579. printf( "\r\nOV9712 config: Successful ...");
  580. }
  581. else if (p_sen->sensor_type == JXH22)
  582. {
  583. if (isp_sen_config_JXH22() == -1)
  584. printf( "\r\nJXH22 config: Failure ...");
  585. else
  586. printf( "\r\nJXH22 config: Successful ...");
  587. }
  588. else if (p_sen->sensor_type == MT9P031)
  589. {
  590. if (isp_sen_config_MT9P031() == -1)
  591. printf( "\r\nMT9P031 config: Failure ...");
  592. else
  593. printf( "\r\nMT9P031 config: Successful ...");
  594. }
  595. else if (p_sen->sensor_type == AR0130)
  596. {
  597. isp_sen_config_AR0130();
  598. return;
  599. }
  600. else if (p_sen->sensor_type == PP1210K)
  601. {
  602. isp_sen_config_PP1210K();
  603. return;
  604. }
  605. else
  606. {
  607. printf( "\r\nSensor config: Failure ...\n");
  608. }
  609. return;
  610. }