123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- // =============================================================================
- // File : Gem_isp_sys.c
- // Version : v1.0
- // Author : Honglei Zhu
- // Date : 2014.12.5
- // -----------------------------------------------------------------------------
- // Description :
- //
- // -----------------------------------------------------------------------------
- #include "Gem_isp.h"
- #include "Gem_isp_sys.h"
- #include "Gem_isp_io.h"
- #include "Gem_isp_ae.h"
- #include "Gem_isp_denoise.h"
- #include "Gem_isp_sensor.h"
- #include "Gem_isp_awb.h"
- void isp_sys_init_io (isp_sys_ptr_t p_sys)
- {
- int i, data0, data1, data2, data3, data4, data5, data6;
- // ���֡��������
- // �������һ֡, bit0��������
- data0 = p_sys->vifrasel0;
- Gem_write ((GEM_VIFRASE_BASE + 0x00), data0);
- data0 = p_sys->vifrasel1;
- Gem_write ((GEM_VIFRASE_BASE + 0x04), data0);
- data0 = (p_sys->ckpolar << 1)
- | (p_sys->vcpolar << 2)
- | (p_sys->hcpolar << 3)
- | (p_sys->vmanSftenable << 4)
- | (p_sys->vmskenable << 5)
- | (p_sys->frameratei << 8)
- | (p_sys->framerateo << 16)
- ;
- data1 = (p_sys->imagewidth) | (p_sys->imageheight<<16);
- //XM_printf("width :%d\n",p_sys->imagewidth );
- //XM_printf("height :%d\n",p_sys->imageheight );
- data2 = p_sys->imagehblank
- | ((p_sys->resizebit & 0x03) << 16)
- | (p_sys->sensorbit << 18)
- | (p_sys->bayermode << 20)
- | (p_sys->sonyif << 22)
- ;
- //XM_printf("Sensor bit set:%d \n", p_sys->sensorbit );
- //XM_printf("Sensor bayer set:%d \n", p_sys->bayermode );
- //XM_printf("//slice line:%d\n", p_sys->ffiqIntdelay);
- data3 = ((p_sys->vchkIntenable & 0x01) << 0)
- | ((p_sys->pabtIntenable & 0x01) << 1)
- | ((p_sys->fendIntenable & 0x01) << 2)
- | ((p_sys->fabtIntenable & 0x01) << 3)
- | ((p_sys->babtIntenable & 0x01) << 4)
- | ((p_sys->ffiqIntenable & 0x01) << 5)
- | ((p_sys->pendIntenable & 0x01) << 6)
- | ((p_sys->infoIntenable & 0x01) << 7) // ISP�ڲ���AE��Ϣ��ͳ�����, �ⲿ������Ի�ȡAE��Ϣ, ִ����һ���ع��
- // | ((0xF << 9)) // 9, 11, 12��Ϊ1��ʹ�ܶ�Ӧ��pabt, fabt, babt�쳣��λframe sync.
- // | ((0x1F << 9)) // 9, 11, 12 ��Ϊ1��ʹ�ܶ�Ӧ��pabt, fabt, babt�쳣��λframe sync.
- // 10 idle״̬��λ�ж�ʹ��/��ֹ,
- // 0 ���ж�, �����ISP����
- // 1 �ж�, ��ͬ���쳣����(����쳣״̬, �ָ�ISP)
- // 13 ʹ��/��ֹidle״̬��֡����
- // 0 ��ֹ
- // 1 ʹ��
- // ȱʡʱӦ������λȫ������Ϊ1
- | (0xFF << 9)
- | ((p_sys->ffiqIntdelay & 0xFF) << 24)
- ;
- data4 = (p_sys->zonestridex) | (p_sys->zonestridey << 16);
- data5 = (p_sys->sonysac1 << 16) | (p_sys->sonysac2 << 0);
- data6 = (p_sys->sonysac3 << 16) | (p_sys->sonysac4 << 0);
- Gem_write ((GEM_SYS_BASE+0x00), data0);
- Gem_write ((GEM_SYS_BASE+0x04), data1);
- Gem_write ((GEM_SYS_BASE+0x08), data2);
- Gem_write ((GEM_SYS_BASE+0x0c), data3);
- Gem_write ((GEM_SYS_BASE+0x10), data4);
- Gem_write ((GEM_SYS_BASE+0x60), data5);
- Gem_write ((GEM_SYS_BASE+0x64), data6);
- data0 = (p_sys->debugmode)
- | (p_sys->testenable << 1)
- | (p_sys->rawmenable << 2)
- | (p_sys->yuvenable << 3)
- | (p_sys->refenable << 4)
- | (p_sys->yuvformat << 5)
- | (p_sys->dmalock << 7)
- | (p_sys->hstride << 16)
- ;
- Gem_write ((GEM_SYS_BASE+0x14), data0);
- // XM_printf("p_sys->hstride :%d\n", p_sys->hstride );
- // XM_printf("p_sys->yuvformat = %d\n", p_sys->yuvformat );
- data0 = p_sys->refaddr;
- Gem_write ((GEM_SYS_BASE+0x18), data0);
- data0 = p_sys->rawaddr0;
- data1 = p_sys->rawaddr1;
- data2 = p_sys->rawaddr2;
- data3 = p_sys->rawaddr3;
- Gem_write ((GEM_SYS_BASE+0x1c), data0);
- Gem_write ((GEM_SYS_BASE+0x20), data1);
- Gem_write ((GEM_SYS_BASE+0x24), data2);
- Gem_write ((GEM_SYS_BASE+0x28), data3);
- data0 = p_sys->yaddr0;
- data1 = p_sys->yaddr1;
- data2 = p_sys->yaddr2;
- data3 = p_sys->yaddr3;
- // YUV ��ַ Y
- Gem_write ((GEM_SYS_BASE+0x2c), data0);
- Gem_write ((GEM_SYS_BASE+0x30), data1);
- Gem_write ((GEM_SYS_BASE+0x34), data2);
- Gem_write ((GEM_SYS_BASE+0x38), data3);
- data0 = p_sys->uaddr0;
- data1 = p_sys->uaddr1;
- data2 = p_sys->uaddr2;
- data3 = p_sys->uaddr3;
- Gem_write ((GEM_SYS_BASE+0x3c), data0);
- Gem_write ((GEM_SYS_BASE+0x40), data1);
- Gem_write ((GEM_SYS_BASE+0x44), data2);
- Gem_write ((GEM_SYS_BASE+0x48), data3);
- data0 = p_sys->vaddr0;
- data1 = p_sys->vaddr1;
- data2 = p_sys->vaddr2;
- data3 = p_sys->vaddr3;
- Gem_write ((GEM_SYS_BASE+0x4c), data0);
- Gem_write ((GEM_SYS_BASE+0x50), data1);
- Gem_write ((GEM_SYS_BASE+0x54), data2);
- Gem_write ((GEM_SYS_BASE+0x58), data3);
- if (p_sys->vmanSftset == 1)
- {
- // �����ID�ţ� �����λ������һ��
- // ����һ�������ź�
- data0 = (0x00);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->vchkIntclr == 1)// ֡ͷ ͬ�� �ж� ���
- {//
- data0 = (0x01);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->pabtIntclr == 1)
- {
- data0 = (0x02);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->fendIntset == 1)
- {
- for (i = 0; i < 4; i++)
- {
- data0 = (0x03) | (p_sys->fendIntid[i]<<16);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- }
- if (p_sys->fendIntclr == 1)
- {
- data0 = (0x04);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->fabtIntclr == 1)
- {
- data0 = (0x05);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->babtIntclr == 1)
- {
- data0 = (0x06);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->infoStaclr == 1)
- {
- data0 = (0x07);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->ffiqIntclr == 1)
- {
- data0 = (0x08);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if (p_sys->pendIntclr == 1)
- {
- data0 = (0x09);
- Gem_write ((GEM_MSK_BASE+0x00), data0);
- }
- if(p_sys->ispenbale)
- {
- //isp_dump_sys_register ();
- }
- data0 = Gem_read ((GEM_SYS_BASE+0x00));
- data1 = data0 | p_sys->ispenbale;
- Gem_write ((GEM_SYS_BASE+0x00), data1);
- }
- #ifdef ISP_DEBUG
- void isp_dump_sys_register (void)
- {
- int i;
- for (i = 0; i <= 0x64; i += 4)
- {
- XM_printf ("GEM_SYS_BASE+0x%02x = 0x%08x\n", i, Gem_read(GEM_SYS_BASE+i));
- }
- }
- #endif
- unsigned int isp_sys_status_read(isp_sys_ptr_t p_sys)
- {
- unsigned int isp_status;
- // read mask status
- isp_status = Gem_read (GEM_STS_BASE+0x00);
- //isp_status = rISP_INT_STATUS;
- //1. bit.0:֡��ʼ�жϣ�֡ͷ
- p_sys->vchkIntmsk = isp_status & 0x01; //(isp_status<<31) >> 31;
- //2. bit.1:pclk buffer ���ˣ�sensor �����Ѿ���������
- p_sys->pabtIntmsk = (isp_status >> 1) & 0x01; //(isp_status<<30) >> 30;
- //3. bit.2:֡����ж�
- p_sys->fendIntmsk = (isp_status >> 2) & 0x01; //(isp_status<<29) >> 29;
- //4. bit.3:��ַ�쳣 ����ַ ������� ����0
- p_sys->fabtIntmsk = (isp_status >> 3) & 0x01; //(isp_status<<28) >> 28;
- //5. bit.4:���ߴ����쳣��3D����������ͬ����ʱ��ϲ���
- p_sys->babtIntmsk = (isp_status >> 4) & 0x01; //(isp_status<<27) >> 27;
- //6. bit.5:16�� Ϊ��λ��slice�ж�
- p_sys->ffiqIntmsk = (isp_status >> 5) & 0x01;
- //7. bit.6:��ֹ �ж�
- p_sys->pendIntmsk = (isp_status >> 6) & 0x01;
- // ֡���кţ�ȡֵ��0 1 2 3
- p_sys->fendStaid = (isp_status >> 8) & 0x03; //(isp_status<<26) >> 26;
- if(!p_sys->infoIntenable) // ���жϷ�ʽ(poll)
- {
- // RAW Interrupt Factor
- p_sys->infoStadone = ( Gem_read (GEM_STS_BASE+0x04) >> 7) & 0x01;
- }
- //16-23λ���ж�״̬������ ������8λ ����ʾÿ��Ҫ��ɵ���������Ҫ����16��
- // read raw status
- isp_status = Gem_read (GEM_STS_BASE+0x04);
- return isp_status;
- }
- void isp_sys_infosync_clr (void)
- {
- unsigned int infosync_clr;
- infosync_clr = (0x07);
- Gem_write ((GEM_MSK_BASE+0x00), infosync_clr);
- }
- void isp_sys_set_frame_ready (unsigned int frame_id)
- {
- unsigned int frame_set = (0x03) | ((frame_id & 0x03) << 16);
- //XM_printf ("push %d\n", frame_id);
- Gem_write ((GEM_MSK_BASE+0x00), frame_set);
- }
- extern isp_sys_t p_sys;
- extern isp_denoise_t p_denoise;
- extern isp_awb_t p_awb;
- extern isp_ae_t p_ae;
- //#define UPDATE_AWB_BLACK_USE_ISR
- #ifdef USE_ISR_TO_SWITCH_MODE
- extern volatile unsigned int new_isp_mode;
- #endif
- //#define isp_debug_printf
- extern void isp_histogram_bands_data (unsigned int data1, unsigned int data2);
- extern void isp_ae_yavg_s_read (isp_ae_ptr_t p_ae);
- static int isp_pixel_clock_abnormal_count = 0;
- void isp_sys_infomask_clr (void)
- {
- unsigned int infomaskclr;
- infomaskclr = (0x07);
- Gem_write ((GEM_MSK_BASE+0x00), infomaskclr);
- }
- void isp_enable (void)
- {
- unsigned int data;
- printk(KERN_ALERT "%s %d.\n", __FUNCTION__, __LINE__);
- data = Gem_read ((GEM_SYS_BASE+0x00));
- data |= 0x01;
- Gem_write ((GEM_SYS_BASE+0x00), data);
- }
- void isp_disable (void)
- {
- unsigned int data;
- data = Gem_read ((GEM_SYS_BASE+0x00));
- data &= ~0x01;
- Gem_write ((GEM_SYS_BASE+0x00), data);
- }
|