⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l2_fadjust.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "general.h"
extern xdata int Tidx;
extern void UI_PrintOSDNumber(USHORT num, UCHAR x, UCHAR y, UCHAR fillbit);
UCHAR L2_SetFrameRate (UCHAR FrameRate, UCHAR Option) USING_0
{
  UCHAR     temp1, temp2, tgpll;
  ULONG     pixclk;
  USHORT    linetotal, frametotal;
  float     temp;

  USHORT  V_off;
  USHORT  V_valid;
  USHORT  diff;

//XBYTE[0X203A] = XBYTE[0X203A] | 0x20;  //GPIO21 Output enable
//XBYTE[0X2032] = XBYTE[0X2032] | 0x20;  //GPIO21  = 1
//XBYTE[0X2032] = XBYTE[0X2032] & 0xDF;  //GPIO21  = 0
  //PRINT_FRONT ("            Enter Set FrameRate = %d \n", (USHORT)FrameRate);
  if ((FrameRate > 30) | (FrameRate == 0))  return 1;
  // Select the clock frequence

  #ifdef OV13		  			// Ov9620 1.3M CMOS Sensor
    XBYTE[0X2A81] = 0x01;
    XBYTE[0x2A82] = 0x03;
    if (FrameRate > 24)
      XBYTE[0x2A82] = 0x03;
    else if (FrameRate > 20)
      XBYTE[0x2A82] = 0x04;
    else if (FrameRate > 15)
      XBYTE[0x2A82] = 0x05;
    else if (FrameRate > 12)
      XBYTE[0x2A82] = 0x07;
    else if (FrameRate > 10)
      XBYTE[0x2A82] = 0x09;
    else if (FrameRate > 7)
      XBYTE[0x2A82] = 0x0B;
    else if (FrameRate > 5)
      XBYTE[0x2A82] = 0x0F;
    else if (FrameRate > 3)
      XBYTE[0x2A82] = 0x15;
	else if (FrameRate > 1)
      XBYTE[0x2A82] = 0x25;
    else
      XBYTE[0x2A82] = 0x6F;

  #endif

   #ifdef MCM20027		  		// Motorola 1.3M CMOS Sensor
    XBYTE[0X2A81] = 0x00;
    XBYTE[0x2A82] = 0x07;//patch4.3@jhyu@0612
//patch4.3@jhyu@0612
/*
    if (FrameRate > 24)
      XBYTE[0x2A82] = 0x06;
    else if (FrameRate > 20)
      XBYTE[0x2A82] = 0x07;
    else if (FrameRate > 15)
      XBYTE[0x2A82] = 0x09;
    else if (FrameRate > 12)
      XBYTE[0x2A82] = 0x0C;
    else if (FrameRate > 10)
      XBYTE[0x2A82] = 0x0F;
    else if (FrameRate > 7)
      XBYTE[0x2A82] = 0x14;
    else if (FrameRate > 5)
      XBYTE[0x2A82] = 0x1A;
    else if (FrameRate > 3)
      XBYTE[0x2A82] = 0x27;
	else if (FrameRate > 1)
      XBYTE[0x2A82] = 0x3F;
    else
      XBYTE[0x2A82] = 0xCF;
*/
  #endif

  #ifdef ICM107B		  		//IC-Media 1.0M CMOS Sensor
    XBYTE[0X2A81] = 0x01;
	XBYTE[0x2A82] = 0x01;
  #endif

  #ifdef ICM108		  		//IC-Media 1.0M CMOS Sensor
    XBYTE[0X2A81] = 0x01;
	XBYTE[0x2A82] = 0x01;
  #endif
//patch4.4@andrew@ICM109
  #ifdef ICM109		  		//IC-Media 2.0M CMOS Sensor
    XBYTE[0X2A81] = 0x00;
	XBYTE[0x2A82] = 0x01;
  #endif


  #ifdef ICM105		  			//IC-Media VGA CMOS Sensor
    XBYTE[0X2A81] = 0x01;
	XBYTE[0x2A82] = 0x02;
  #endif

  #ifdef TASC5130		  		//TASC VGA CMOS Sensor
    XBYTE[0X2A81] = 0x00;
	XBYTE[0x2A82] = 0x07;
  #endif

  #ifdef TASC5160		  		//TASC SXVGA CMOS Sensor
    	XBYTE[0X2A81] = 0x00;
	XBYTE[0x2A82] = 0x07;
  #endif

  #ifdef HP2020		  		//HP VGA CMOS Sensor
    	XBYTE[0X2A81] = 0x05;
	XBYTE[0x2A82] = 0x01;
  #endif


  #ifdef OV2610	 	  		//OV UXVGA CMOS Sensor
    	XBYTE[0x2080] = 0x00;
	XBYTE[0X2A81] = 0x01;  	//x1 div
    	XBYTE[0x2A82] = 0x03;
  #endif
#ifdef OV3610			  //patch5.2.1@jhyu@OV3610				  
    	XBYTE[0x2080] = 0x00; 
	XBYTE[0X2A81] = 0x01;  	//x1 div
    	XBYTE[0x2A82] = 0x01;		
#endif
//-------------------Davis:patch_2005/Jun/07 begin
#ifdef OV3620
   	XBYTE[0x2080] = 0x00;
    	XBYTE[0X2A81] = 0x01;  	//x1 div
   	XBYTE[0x2A82] = 0x01;
#endif
//-------------------Davis:patch_2005/Jun/07 end
  #ifdef RJ23N3		  			// Sharp 2.0M CCD Sensor
    XBYTE[0x2A81] = 0x03;
    if (FrameRate > 20)
      XBYTE[0x2A82] = 0x01;
    else if (FrameRate > 15)
      XBYTE[0x2A82] = 0x02;
    else if (FrameRate > 12)
      XBYTE[0x2A82] = 0x03;
    else if (FrameRate > 10)
      XBYTE[0x2A82] = 0x04;
    else if (FrameRate > 6)
      XBYTE[0x2A82] = 0x05;
	else if (FrameRate > 4)
      XBYTE[0x2A82] = 0x09;
	else if (FrameRate > 2)
      XBYTE[0x2A82] = 0x0D;
    else
      XBYTE[0x2A82] = 0x1D;
  #endif

  #ifdef SONY232		  			// Sony 1.3M CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x01;
  #endif

  #ifdef SONY262		  			// Sony 3.0M CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x01;
  #endif

  #ifdef SONY432		  			// Sony 3M 3 field CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x01;
  #endif

  #ifdef SONY406		  			// Sony 4M 2 field CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x01;
  #endif

  #ifdef SONY442		  			// Sony 1.3M Proggressive CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x02;
  #endif

  #ifdef SONY224		  			// Sony 2.0M CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x01;
  #endif

  #ifdef MN39472		  			// PANASONIC 2.0M Interlace CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x01;
  #endif

  #ifdef MN39470		  			// PANASONIC 2.0M Interlace CCD Sensor
    XBYTE[0x2A81] = 0x03;
    XBYTE[0x2A82] = 0x01;
  #endif

  //patch4.4@andrew@SHARP_LZ24
  #ifdef SHARP_LZ24BP
  XBYTE[0x2A81] = 0x03;
  XBYTE[0x2A82] = 0x02;
  #endif

 // patch4.5@andrew@MN39592
   #ifdef MN39592
 // 24Hhz =( 6*4*4)/4 /1
 //             TGpLL
   XBYTE[0x2A81] = 0x03;            //Set Clk1xDiv
  XBYTE[0x2A82] = 0x00;           //Set Clk2xDiv

  #endif

  //patch4.5@andrew@Vvalid
//Caculate the linetotal, pixel clock
  temp1      = XBYTE[0x2A41];
  temp2      = XBYTE[0x2A42];
  linetotal  = (USHORT)(temp2 << 8) + (USHORT)(temp1);

  temp1      = XBYTE[0x2A50];
  temp2      = XBYTE[0x2A51];
  frametotal  = (USHORT)(temp2 << 8) + (USHORT)(temp1);




  temp1      = XBYTE[0x2B36];      // ccd Vsize m
  temp2      = XBYTE[0X2B37];
  V_valid=(USHORT)(temp2 << 8) + (USHORT)(temp1);

  V_off   =  (USHORT)XBYTE[0x2B35];      //ccd V offset m

  diff =frametotal-V_valid-V_off;       // V valid falling edge to next vd


  temp1      = XBYTE[0x2A81];
  temp2      = XBYTE[0x2A82];
  tgpll      = XBYTE[0x2080] & 0x01;
  temp       = (float)(((XBYTE[0x2082] & 0x07) + 1) * (((XBYTE[0x2082] >> 4) & 0x07) + 1));
  if (tgpll)
 	pixclk = (6000000 * temp) / ((ULONG)(temp1 + 1) * (ULONG)(temp2 + 1) * (ULONG)(XBYTE[0x2081] + 1));
  else
    pixclk = 96000000 / ((ULONG)(temp1 + 1) * (ULONG)(temp2 + 1));
//////////////////////////////////////////////////////////////////////////////////////////////
//caculate the frame total needs, and write to register

#ifdef OV13
  temp1      = XBYTE[0x2A40];
  temp2      = (Option & 0x01) << 1;
  XBYTE[0x2A40] = temp1 | temp2;  		//Sync with Vd or not
  temp       = ((float)(pixclk) / (FrameRate * (float)(frametotal)));
  linetotal  = (USHORT) temp;
  temp1      = (UCHAR)linetotal;
  temp2      = (UCHAR)(linetotal >> 8);
  XBYTE[0x2A41] = temp1;
  XBYTE[0x2A42] = temp2;
#else
  temp1      = XBYTE[0x2A40];
  temp2      = (Option & 0x01) << 1;
  XBYTE[0x2A40] = temp1 | temp2;  		//Sync with Vd or not
  temp       = ((float)(pixclk) / (FrameRate * (float)(linetotal)));
  frametotal  = (USHORT) temp;
  temp1      = (UCHAR)frametotal;
  temp2      = (UCHAR)(frametotal >> 8);

  XBYTE[0x2A50] = temp1;
  XBYTE[0x2A51] = temp2;

   //let  V valid falling edge not to far away with next Vd
   V_valid= frametotal-V_off-diff;
   temp1=(UCHAR)(V_valid&0XFF);
   temp2=(UCHAR)(V_valid>>8);
#ifdef MN39472
   XBYTE[0X2B36]=temp1;
   XBYTE[0X2B37]=temp2;
 #endif

#endif

#ifdef TASC5130
  XBYTE[0x2A45] = temp1;
  XBYTE[0x2A46] = temp2;
#endif

#ifdef TASC5160
  XBYTE[0x2A45] = temp1;
  XBYTE[0x2A46] = temp2;
#endif

#ifdef HP2020
  XBYTE[0x2A45] = temp1;
  XBYTE[0x2A46] = temp2;
#endif

#ifdef OV2610
  XBYTE[0x2A45] = temp1;
  XBYTE[0x2A46] = temp2;
#endif
#ifdef OV3610			//patch5.2.1@jhyu@OV3610
	XBYTE[0x2A45] = temp1;
	XBYTE[0x2A46] = temp2;
#endif 
//-------------------Davis:patch4.0.0.0_2005/Jun/07 begin
  #ifdef OV3620
  XBYTE[0x2A45] = temp1;
  XBYTE[0x2A46] = temp2;
  #endif
  //-------------------Davis:patch4,0,0,0_2005/Jun/07 end
  //PRINT_FRONT ("            Frametotal = %d \n", frametotal);
  //PRINT_FRONT ("            linetotal = %d \n", linetotal);
  //PRINT_FRONT ("            Pixclk = %lu \n", pixclk);

  //printf ("            Frametotal = %d \n", frametotal);
  //printf ("            linetotal = %d \n", linetotal);
  //printf ("            Pixclk = %lu \n", pixclk);
//////////////////////////////////////////////////////////////////////////////////////////////
  #ifdef OV13		  			// Ov9620 1.3M CMOS Sensor
   {
	UCHAR i, j;
    UCHAR     reg_addr[2], reg_data[2],  option1;
    if (linetotal < 800) return 1;
    linetotal = linetotal - 800;
	reg_addr[0] = 0x2B;
    reg_data[0] = (UCHAR)(linetotal >> 1);
    L2_WriteSSC(reg_addr, reg_data, 1, 1);
	linetotal = (reg_data[0] << 1) + 0x7E;
    XBYTE[0x2A30] = (UCHAR)(linetotal);
    XBYTE[0x2A31] = (UCHAR)(linetotal >> 8) ;
    linetotal = (reg_data[0] << 1) + 0xDC;
    XBYTE[0x2A20] = (UCHAR)(linetotal);
    XBYTE[0x2A21] = (UCHAR)(linetotal >> 8) ;
	//for (i=0; i<40;i++)               //Delay
    //for (j=0; j<255; j++);
	//PRINT_FRONT ("            Exit Set FrameRate \n");
   }
  #endif

  #ifdef MCM20027
   {
    UCHAR     reg_addr[2], reg_data[2],  option1;
	reg_addr[0] = 0x51;
    reg_data[0] = (UCHAR)(frametotal-1);//patch4.3@jhyu@0612
    reg_addr[1] = 0x50;
    reg_data[1] = (UCHAR)((frametotal-1) >> 8);//patch4.3@jhyu@0612
    L2_WriteSSC(reg_addr, reg_data, 2, 2);
    //XBYTE[0x2A34] = (UCHAR)frametotal;
    //XBYTE[0x2A35] = (UCHAR)(frametotal >> 8);
   }
  #endif

  #ifdef ICM107B		  			//IC-Media 1.0M CMOS Sensor
   {
    UCHAR     reg_addr[1], reg_data[1],  option1;
    frametotal  = (frametotal >> 2); //Frame Total Must be 4N
	frametotal  = (frametotal << 2);
    reg_addr[0] = 0x0E;
	reg_data[0] = (UCHAR)frametotal;
    L2_WSSC107(reg_addr, reg_data, 1, 0x00);
    reg_addr[0] = 0x0F;
    reg_data[0] = (UCHAR)(frametotal >> 8);
    L2_WSSC107(reg_addr, reg_data, 1, 0x00);
    option1     = Option & 0x01;
    reg_addr[0]   = 0x00;
	L2_ReadSSC(reg_addr[0], reg_data, 0x01, 0x01);
    reg_data[0]   = reg_data[0] | 0x80;
	//L3_WaitUpdate107();
    L2_WSSC107(reg_addr, reg_data, 0x01, option1);
   }
  #endif

    #ifdef ICM108	  			//IC-Media 1.0M CMOS Sensor
   {
    UCHAR     reg_addr[1], reg_data[1],  option1;
    frametotal  = (frametotal >> 2); //Frame Total Must be 4N
	frametotal  = (frametotal << 2);
    reg_addr[0] = 0x0E;
	reg_data[0] = (UCHAR)frametotal;
    L2_WSSC108(reg_addr, reg_data, 1, 0x00);
    reg_addr[0] = 0x0F;
    reg_data[0] = (UCHAR)(frametotal >> 8);
    L2_WSSC108(reg_addr, reg_data, 1, 0x00);
    option1     = Option & 0x01;
    reg_addr[0]   = 0x00;
	L2_ReadSSC(reg_addr[0], reg_data, 0x01, 0x01);
    reg_data[0]   = reg_data[0] | 0x80;
	//L3_WaitUpdate108();
    L2_WSSC108(reg_addr, reg_data, 0x01, option1);
   }
  #endif
//patch4.4@andrew@ICM109
  #ifdef ICM109	  			//IC-Media 2.0M CMOS Sensor
   {
    UCHAR     reg_addr[1], reg_data[1],  option1;
    frametotal  = (frametotal >> 2); //Frame Total Must be 4N
	frametotal  = (frametotal << 2);
	printf("******\n frame total=%x\n\n**********\n",frametotal);
    reg_addr[0] = 0x0E;
	reg_data[0] = (UCHAR)frametotal;
    L2_WSSC109(reg_addr, reg_data, 1, 0x00);
    reg_addr[0] = 0x0F;
    reg_data[0] = (UCHAR)(frametotal >> 8);
    L2_WSSC109(reg_addr, reg_data, 1, 0x00);
    option1     = Option & 0x01;
    reg_addr[0]   = 0x00;
	L2_ReadSSC(reg_addr[0], reg_data, 0x01, 0x01);
    reg_data[0]   = reg_data[0] | 0x80;
	//L3_WaitUpdate108();
    L2_WSSC109(reg_addr, reg_data, 0x01, option1);
   }
  #endif


  #ifdef ICM105		  			//IC-Media VGA CMOS Sensor
   {
    UCHAR     reg_addr[2], reg_data[2],  option1;
    reg_addr[0] = 0x0E;
    reg_addr[1] = 0x0F;
    reg_data[0] = temp1;
    reg_data[1] = temp2;
    option1     = Option & 0x01;     		//Always in Burst mode
    L2_WriteSSC(reg_addr, reg_data, 2, 0x02);

	reg_addr[0]   = 0x00; 					//Update Value
    reg_data[0]   = 0x80;
    L2_WriteSSC(reg_addr, reg_data, 0x01, option1);
   }
  #endif

  #ifdef YM3170		  			//Y-Media 3.0M CMOS Sensor
   {
    UCHAR     reg_addr[1], reg_data[1],  option1, i, j;
	option1     = Option & 0x01;
	XBYTE[0X2032] = XBYTE[0X2032] & 0xDF;  //GPIO21  = 0
    reg_addr[0] = 0xB6;
	reg_data[0] = temp1;
    L2_WriteSSC(reg_addr, reg_data, 0x01, option1);
	//PRINT_FRONT ("            temp1 = %bx \n", temp1);
	XBYTE[0X2032] = XBYTE[0X2032] | 0x20;  //GPIO21  = 1
    for (i=0; i<40;i++)               //Delay
    for (j=0; j<255; j++);
	XBYTE[0X2032] = XBYTE[0X2032] & 0xDF;  //GPIO21  = 0
    reg_addr[0] = 0xB7;
    reg_data[0] = temp2;
    L2_WriteSSC(reg_addr, reg_data, 0x01, option1);
	//PRINT_FRONT ("            temp2 = %bx \n", temp2);
    XBYTE[0X2032] = XBYTE[0X2032] | 0x20;  //GPIO21  = 1
   }
  #endif

  //PRINT_FRONT ("            Exit Set FrameRate \n");

  return 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////
UCHAR L2_SetExposureTime (ULONG Number, UCHAR Option) USING_0
{

  UCHAR      temp1, temp2, tgpll, option1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -