Gem_isp_sys.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. // =============================================================================
  2. // File : Gem_isp_sys.c
  3. // Version : v1.0
  4. // Author : Honglei Zhu
  5. // Date : 2014.12.5
  6. // -----------------------------------------------------------------------------
  7. // Description :
  8. //
  9. // -----------------------------------------------------------------------------
  10. #include "Gem_isp.h"
  11. #include "Gem_isp_sys.h"
  12. #include "Gem_isp_io.h"
  13. #include "Gem_isp_ae.h"
  14. #include "Gem_isp_denoise.h"
  15. #include "Gem_isp_sensor.h"
  16. #include "Gem_isp_awb.h"
  17. void isp_sys_init_io (isp_sys_ptr_t p_sys)
  18. {
  19. int i, data0, data1, data2, data3, data4, data5, data6;
  20. // ���֡��������
  21. // �������һ֡, bit0��������
  22. data0 = p_sys->vifrasel0;
  23. Gem_write ((GEM_VIFRASE_BASE + 0x00), data0);
  24. data0 = p_sys->vifrasel1;
  25. Gem_write ((GEM_VIFRASE_BASE + 0x04), data0);
  26. data0 = (p_sys->ckpolar << 1)
  27. | (p_sys->vcpolar << 2)
  28. | (p_sys->hcpolar << 3)
  29. | (p_sys->vmanSftenable << 4)
  30. | (p_sys->vmskenable << 5)
  31. | (p_sys->frameratei << 8)
  32. | (p_sys->framerateo << 16)
  33. ;
  34. data1 = (p_sys->imagewidth) | (p_sys->imageheight<<16);
  35. //XM_printf("width :%d\n",p_sys->imagewidth );
  36. //XM_printf("height :%d\n",p_sys->imageheight );
  37. data2 = p_sys->imagehblank
  38. | ((p_sys->resizebit & 0x03) << 16)
  39. | (p_sys->sensorbit << 18)
  40. | (p_sys->bayermode << 20)
  41. | (p_sys->sonyif << 22)
  42. ;
  43. //XM_printf("Sensor bit set:%d \n", p_sys->sensorbit );
  44. //XM_printf("Sensor bayer set:%d \n", p_sys->bayermode );
  45. //XM_printf("//slice line:%d\n", p_sys->ffiqIntdelay);
  46. data3 = ((p_sys->vchkIntenable & 0x01) << 0)
  47. | ((p_sys->pabtIntenable & 0x01) << 1)
  48. | ((p_sys->fendIntenable & 0x01) << 2)
  49. | ((p_sys->fabtIntenable & 0x01) << 3)
  50. | ((p_sys->babtIntenable & 0x01) << 4)
  51. | ((p_sys->ffiqIntenable & 0x01) << 5)
  52. | ((p_sys->pendIntenable & 0x01) << 6)
  53. | ((p_sys->infoIntenable & 0x01) << 7) // ISP�ڲ���AE��Ϣ��ͳ�����, �ⲿ������Ի�ȡAE��Ϣ, ִ����һ���ع⴦��
  54. // | ((0xF << 9)) // 9, 11, 12��Ϊ1��ʹ�ܶ�Ӧ��pabt, fabt, babt�쳣��λframe sync.
  55. // | ((0x1F << 9)) // 9, 11, 12 ��Ϊ1��ʹ�ܶ�Ӧ��pabt, fabt, babt�쳣��λframe sync.
  56. // 10 idle״̬��λ�ж�ʹ��/��ֹ,
  57. // 0 ���ж�, �����ISP����
  58. // 1 �ж�, ��ͬ���쳣����(����쳣״̬, �ָ�ISP)
  59. // 13 ʹ��/��ֹidle״̬��֡����
  60. // 0 ��ֹ
  61. // 1 ʹ��
  62. // ȱʡʱӦ������λȫ������Ϊ1
  63. | (0xFF << 9)
  64. | ((p_sys->ffiqIntdelay & 0xFF) << 24)
  65. ;
  66. data4 = (p_sys->zonestridex) | (p_sys->zonestridey << 16);
  67. data5 = (p_sys->sonysac1 << 16) | (p_sys->sonysac2 << 0);
  68. data6 = (p_sys->sonysac3 << 16) | (p_sys->sonysac4 << 0);
  69. Gem_write ((GEM_SYS_BASE+0x00), data0);
  70. Gem_write ((GEM_SYS_BASE+0x04), data1);
  71. Gem_write ((GEM_SYS_BASE+0x08), data2);
  72. Gem_write ((GEM_SYS_BASE+0x0c), data3);
  73. Gem_write ((GEM_SYS_BASE+0x10), data4);
  74. Gem_write ((GEM_SYS_BASE+0x60), data5);
  75. Gem_write ((GEM_SYS_BASE+0x64), data6);
  76. data0 = (p_sys->debugmode)
  77. | (p_sys->testenable << 1)
  78. | (p_sys->rawmenable << 2)
  79. | (p_sys->yuvenable << 3)
  80. | (p_sys->refenable << 4)
  81. | (p_sys->yuvformat << 5)
  82. | (p_sys->dmalock << 7)
  83. | (p_sys->hstride << 16)
  84. ;
  85. Gem_write ((GEM_SYS_BASE+0x14), data0);
  86. // XM_printf("p_sys->hstride :%d\n", p_sys->hstride );
  87. // XM_printf("p_sys->yuvformat = %d\n", p_sys->yuvformat );
  88. data0 = p_sys->refaddr;
  89. Gem_write ((GEM_SYS_BASE+0x18), data0);
  90. data0 = p_sys->rawaddr0;
  91. data1 = p_sys->rawaddr1;
  92. data2 = p_sys->rawaddr2;
  93. data3 = p_sys->rawaddr3;
  94. Gem_write ((GEM_SYS_BASE+0x1c), data0);
  95. Gem_write ((GEM_SYS_BASE+0x20), data1);
  96. Gem_write ((GEM_SYS_BASE+0x24), data2);
  97. Gem_write ((GEM_SYS_BASE+0x28), data3);
  98. data0 = p_sys->yaddr0;
  99. data1 = p_sys->yaddr1;
  100. data2 = p_sys->yaddr2;
  101. data3 = p_sys->yaddr3;
  102. // YUV ��ַ Y
  103. Gem_write ((GEM_SYS_BASE+0x2c), data0);
  104. Gem_write ((GEM_SYS_BASE+0x30), data1);
  105. Gem_write ((GEM_SYS_BASE+0x34), data2);
  106. Gem_write ((GEM_SYS_BASE+0x38), data3);
  107. data0 = p_sys->uaddr0;
  108. data1 = p_sys->uaddr1;
  109. data2 = p_sys->uaddr2;
  110. data3 = p_sys->uaddr3;
  111. Gem_write ((GEM_SYS_BASE+0x3c), data0);
  112. Gem_write ((GEM_SYS_BASE+0x40), data1);
  113. Gem_write ((GEM_SYS_BASE+0x44), data2);
  114. Gem_write ((GEM_SYS_BASE+0x48), data3);
  115. data0 = p_sys->vaddr0;
  116. data1 = p_sys->vaddr1;
  117. data2 = p_sys->vaddr2;
  118. data3 = p_sys->vaddr3;
  119. Gem_write ((GEM_SYS_BASE+0x4c), data0);
  120. Gem_write ((GEM_SYS_BASE+0x50), data1);
  121. Gem_write ((GEM_SYS_BASE+0x54), data2);
  122. Gem_write ((GEM_SYS_BASE+0x58), data3);
  123. if (p_sys->vmanSftset == 1)
  124. {
  125. // �����ID�ţ� �����λ������һ��
  126. // ����һ�������ź�
  127. data0 = (0x00);
  128. Gem_write ((GEM_MSK_BASE+0x00), data0);
  129. }
  130. if (p_sys->vchkIntclr == 1)// ֡ͷ ͬ�� �ж� ���
  131. {//
  132. data0 = (0x01);
  133. Gem_write ((GEM_MSK_BASE+0x00), data0);
  134. }
  135. if (p_sys->pabtIntclr == 1)
  136. {
  137. data0 = (0x02);
  138. Gem_write ((GEM_MSK_BASE+0x00), data0);
  139. }
  140. if (p_sys->fendIntset == 1)
  141. {
  142. for (i = 0; i < 4; i++)
  143. {
  144. data0 = (0x03) | (p_sys->fendIntid[i]<<16);
  145. Gem_write ((GEM_MSK_BASE+0x00), data0);
  146. }
  147. }
  148. if (p_sys->fendIntclr == 1)
  149. {
  150. data0 = (0x04);
  151. Gem_write ((GEM_MSK_BASE+0x00), data0);
  152. }
  153. if (p_sys->fabtIntclr == 1)
  154. {
  155. data0 = (0x05);
  156. Gem_write ((GEM_MSK_BASE+0x00), data0);
  157. }
  158. if (p_sys->babtIntclr == 1)
  159. {
  160. data0 = (0x06);
  161. Gem_write ((GEM_MSK_BASE+0x00), data0);
  162. }
  163. if (p_sys->infoStaclr == 1)
  164. {
  165. data0 = (0x07);
  166. Gem_write ((GEM_MSK_BASE+0x00), data0);
  167. }
  168. if (p_sys->ffiqIntclr == 1)
  169. {
  170. data0 = (0x08);
  171. Gem_write ((GEM_MSK_BASE+0x00), data0);
  172. }
  173. if (p_sys->pendIntclr == 1)
  174. {
  175. data0 = (0x09);
  176. Gem_write ((GEM_MSK_BASE+0x00), data0);
  177. }
  178. if(p_sys->ispenbale)
  179. {
  180. //isp_dump_sys_register ();
  181. }
  182. data0 = Gem_read ((GEM_SYS_BASE+0x00));
  183. data1 = data0 | p_sys->ispenbale;
  184. Gem_write ((GEM_SYS_BASE+0x00), data1);
  185. }
  186. #ifdef ISP_DEBUG
  187. void isp_dump_sys_register (void)
  188. {
  189. int i;
  190. for (i = 0; i <= 0x64; i += 4)
  191. {
  192. XM_printf ("GEM_SYS_BASE+0x%02x = 0x%08x\n", i, Gem_read(GEM_SYS_BASE+i));
  193. }
  194. }
  195. #endif
  196. unsigned int isp_sys_status_read(isp_sys_ptr_t p_sys)
  197. {
  198. unsigned int isp_status;
  199. // read mask status
  200. isp_status = Gem_read (GEM_STS_BASE+0x00);
  201. //isp_status = rISP_INT_STATUS;
  202. //1. bit.0:֡��ʼ�жϣ�֡ͷ
  203. p_sys->vchkIntmsk = isp_status & 0x01; //(isp_status<<31) >> 31;
  204. //2. bit.1:pclk buffer ���ˣ�sensor �����Ѿ����޷�����
  205. p_sys->pabtIntmsk = (isp_status >> 1) & 0x01; //(isp_status<<30) >> 30;
  206. //3. bit.2:֡����ж�
  207. p_sys->fendIntmsk = (isp_status >> 2) & 0x01; //(isp_status<<29) >> 29;
  208. //4. bit.3:��ַ�쳣 ����ַ ������� ����0
  209. p_sys->fabtIntmsk = (isp_status >> 3) & 0x01; //(isp_status<<28) >> 28;
  210. //5. bit.4:���ߴ����쳣��3D���������޷�ͬ����ʱ��ϲ���
  211. p_sys->babtIntmsk = (isp_status >> 4) & 0x01; //(isp_status<<27) >> 27;
  212. //6. bit.5:16�� Ϊ��λ��slice�ж�
  213. p_sys->ffiqIntmsk = (isp_status >> 5) & 0x01;
  214. //7. bit.6:��ֹ �ж�
  215. p_sys->pendIntmsk = (isp_status >> 6) & 0x01;
  216. // ֡���кţ�ȡֵ��0 1 2 3
  217. p_sys->fendStaid = (isp_status >> 8) & 0x03; //(isp_status<<26) >> 26;
  218. if(!p_sys->infoIntenable) // ���жϷ�ʽ(poll)
  219. {
  220. // RAW Interrupt Factor
  221. p_sys->infoStadone = ( Gem_read (GEM_STS_BASE+0x04) >> 7) & 0x01;
  222. }
  223. //16-23λ���ж�״̬������ ������8λ ����ʾÿ��Ҫ��ɵ���������Ҫ����16��
  224. // read raw status
  225. isp_status = Gem_read (GEM_STS_BASE+0x04);
  226. return isp_status;
  227. }
  228. void isp_sys_infosync_clr (void)
  229. {
  230. unsigned int infosync_clr;
  231. infosync_clr = (0x07);
  232. Gem_write ((GEM_MSK_BASE+0x00), infosync_clr);
  233. }
  234. void isp_sys_set_frame_ready (unsigned int frame_id)
  235. {
  236. unsigned int frame_set = (0x03) | ((frame_id & 0x03) << 16);
  237. //XM_printf ("push %d\n", frame_id);
  238. Gem_write ((GEM_MSK_BASE+0x00), frame_set);
  239. }
  240. extern isp_sys_t p_sys;
  241. extern isp_denoise_t p_denoise;
  242. extern isp_awb_t p_awb;
  243. extern isp_ae_t p_ae;
  244. //#define UPDATE_AWB_BLACK_USE_ISR
  245. #ifdef USE_ISR_TO_SWITCH_MODE
  246. extern volatile unsigned int new_isp_mode;
  247. #endif
  248. //#define isp_debug_printf
  249. extern void isp_histogram_bands_data (unsigned int data1, unsigned int data2);
  250. extern void isp_ae_yavg_s_read (isp_ae_ptr_t p_ae);
  251. static int isp_pixel_clock_abnormal_count = 0;
  252. void isp_sys_infomask_clr (void)
  253. {
  254. unsigned int infomaskclr;
  255. infomaskclr = (0x07);
  256. Gem_write ((GEM_MSK_BASE+0x00), infomaskclr);
  257. }
  258. void isp_enable (void)
  259. {
  260. unsigned int data;
  261. printk(KERN_ALERT "%s %d.\n", __FUNCTION__, __LINE__);
  262. data = Gem_read ((GEM_SYS_BASE+0x00));
  263. data |= 0x01;
  264. Gem_write ((GEM_SYS_BASE+0x00), data);
  265. }
  266. void isp_disable (void)
  267. {
  268. unsigned int data;
  269. data = Gem_read ((GEM_SYS_BASE+0x00));
  270. data &= ~0x01;
  271. Gem_write ((GEM_SYS_BASE+0x00), data);
  272. }