📄 l2_fadjust.c
字号:
#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 + -