Beispiel #1
0
static int get_module_type()
{
	int ret = 0;
	u8 module_id = 0;
	u8 program_id = 0;
	u16 puSendCmd = 0x09;	/* module id reg addr = 0x09 for s5k3l2xx liteon module */

	ret = iReadCAM_CAL(0x02 , 1, &program_id, S5K3L2XXOTP_LITEON_DEVICE_ID); //read 0x02,if equal to 0x4d,primax module,otherwise,liteon module
	ret = iReadCAM_CAL(puSendCmd , 1, &module_id, S5K3L2XXOTP_LITEON_DEVICE_ID);
	if (!((ret < 0) || (module_id != 0x01) || (program_id == 0x4D))){
		CAM_CALDB("[CAM_CAL]Get s5k3l2xx module type: liteon\n");
		return LITEON_MODULE;
	}

	/* module id reg addr = 0x01 for s5k3l2xx primax module */
	puSendCmd = 0x01;
	ret = iReadCAM_CAL(puSendCmd ,1, &module_id, S5K3L2XXOTP_PRIMAX_DEVICE_ID);
	if (!((ret < 0) || (module_id != 0x03) || (program_id != 0x4D))){
		CAM_CALDB("[CAM_CAL]Get s5k3l2xx module type: primax\n");
		return PRIMAX_MODULE;
	}

	CAM_CALDB("[CAM_CAL] get module type: no support main camera module! \n");
	return -ENODEV;
}
//int iReadData(stCAM_CAL_INFO_STRUCT * st_pOutputBuffer)
static int iReadData(unsigned int  ui4_offset, unsigned int  ui4_length, unsigned char * pinputdata)
{
   int  i4RetValue = 0;
   int  i4ResidueDataLength;
   u32 u4IncOffset = 0;
   u32 u4CurrentOffset;
   u8 * pBuff;
   CAM_CALDB("[CAM_CAL] iReadData \n" );
   
   if (ui4_offset + ui4_length >= 0x2000)
   {
      CAM_CALDB("[CAM_CAL] Read Error!! S-24CS64A not supprt address >= 0x2000!! \n" );
      return -1;
   }

   i4ResidueDataLength = (int)ui4_length;
   u4CurrentOffset = ui4_offset;
   pBuff = pinputdata;
   do 
   {
       if(i4ResidueDataLength >= 8)
       {
           i4RetValue = iReadCAM_CAL((u16)u4CurrentOffset, 8, pBuff);
           if (i4RetValue != 0)
           {
                CAM_CALDB("[CAM_CAL] I2C iReadData failed!! \n");
                return -1;
           }           
           u4IncOffset += 8;
           i4ResidueDataLength -= 8;
           u4CurrentOffset = ui4_offset + u4IncOffset;
           pBuff = pinputdata + u4IncOffset;
       }
       else
       {
           i4RetValue = iReadCAM_CAL((u16)u4CurrentOffset, i4ResidueDataLength, pBuff);
           if (i4RetValue != 0)
           {
                CAM_CALDB("[CAM_CAL] I2C iReadData failed!! \n");
                return -1;
           }  
           u4IncOffset += 8;
           i4ResidueDataLength -= 8;
           u4CurrentOffset = ui4_offset + u4IncOffset;
           pBuff = pinputdata + u4IncOffset;
           //break;
       }
   }while (i4ResidueDataLength > 0);
//fix warning MSG   CAM_CALDB("[CAM_CAL] iReadData finial address is %d length is %d buffer address is 0x%x\n",u4CurrentOffset, i4ResidueDataLength, pBuff);   
   CAM_CALDB("[CAM_CAL] iReadData done\n" );
   return 0;
}
static kal_uint8 check_IMX135_otp_valid_AWBPage(void)
{
	kal_uint8 Pagemax = 12;
	kal_uint8 Pagemin = 9;
	kal_uint8 page = 0;
	kal_uint8 AWB_OK = 0x00;
	u8  readbuff;
	int ret;
	for(page = Pagemax ; page>=Pagemin;page--)
	{
	if (IMX135_GotoPage(page))
		{
			ret = iReadCAM_CAL(0x3b04,1,&readbuff);
			AWB_OK = readbuff;
			if (AWB_OK != 0)
			{
				CAM_CALDB("AWB otp is exist\n");
				break;
			}
		
		}
	}
	if ( page<Pagemin)
		{		
		CAM_CALDB("No AWB OTP data!");
		return 0;
		}
return page;

}
Beispiel #4
0
static kal_uint8 S5K3L2XX_ReadOtp(u8 address,unsigned char *iBuffer,unsigned int buffersize)
{
		kal_uint16 i = 0;
		u8 readbuff = 0;
		int ret ;
		u16 i2c_id = 0;
		CAM_CALDB("[CAM_CAL]ENTER  address:0x%x buffersize:%d\n ", address, buffersize);
		
		if (get_module_type() == LITEON_MODULE) {
			i2c_id = S5K3L2XXOTP_LITEON_DEVICE_ID;
			if (address == LITEON_LSC_START_ADDR ) {
				memcpy(iBuffer, liteon_lsc_data, LITEON_LSC_SIZE);
				return 0;
			}
		} else if (get_module_type() == PRIMAX_MODULE) {
			i2c_id = S5K3L2XXOTP_PRIMAX_DEVICE_ID;
			if (address == PRIMAX_LSC_START_ADDR ) {
				/*
				 * lsc data had been read out in sensor driver,
				 * so just copy it to user.
				 */
				memcpy(iBuffer, primax_lsc_data, PRIMAX_LSC_SIZE);
				return 0;
			}
		}

		for(i = 0; i<buffersize; i++)
		{				
			ret= iReadCAM_CAL(address+i,1, &readbuff, i2c_id);
			//CAM_CALDB("[CAM_CAL]address+i = 0x%x,readbuff = 0x%x\n",(address+i),readbuff );
			*(iBuffer+i) =(unsigned char)readbuff;
		}
		return 0;
}
//Burst Read Data
static int iReadData(unsigned int  ui4_offset, unsigned int  ui4_length, unsigned char * pinputdata)
{
   int  i4RetValue = 0;
   int  i4ResidueDataLength;
   u32 u4IncOffset = 0;
   u32 u4CurrentOffset;
   u8 * pBuff;

   u8 * pOneByteBuff = NULL;
	pOneByteBuff = (u8 *)kmalloc(I2C_UNIT_SIZE, GFP_KERNEL);
   CAM_CALDB("ui4_offset=%0x,ui4_length=%d\n",ui4_offset,ui4_length);
   i4ResidueDataLength = (int)ui4_length;
   u4CurrentOffset = ui4_offset;
   pBuff = pinputdata;
   do 
   {   
       i4RetValue = iReadCAM_CAL(u4CurrentOffset, 1, pBuff);
	               //* pBuff   = HI704_read_cmos_sensor(u4CurrentOffset);
	   
	   CAM_CALDB("[CAM_CAL][iReadData] Read 0x%x=0x%x \n", u4CurrentOffset, pBuff[0]);
       if (i4RetValue != 0)
       {
            CAM_CALDB("[CAM_CAL] I2C iReadData failed!! \n");
            return -1;
       }           
       u4IncOffset++;
       i4ResidueDataLength --;
       u4CurrentOffset = ui4_offset + u4IncOffset;
       pBuff = pinputdata + u4IncOffset;
   }while (i4ResidueDataLength > 0);
//   CAM_CALDB("[S24EEPORM] iReadData finial address is %d length is %d buffer address is 0x%x\n",u4CurrentOffset, i4ResidueDataLength, pBuff);   
//   CAM_CALDB("[S24EEPORM] iReadData done\n" );
   return 0;
}
static kal_uint8 IMX135_ReadOtp(kal_uint8 page,kal_uint16 address,unsigned char *iBuffer,unsigned int buffersize)
{
		kal_uint16 i = 0;
		u8 readbuff ;
		int ret ;
		CAM_CALDB("[CAM_CAL]ENTER page:0x%x address:0x%x buffersize:%d\n ",page, address, buffersize);
		if (IMX135_GotoPage(page))
		{
			for(i = 0; i<buffersize; i++)
			{				
				ret= iReadCAM_CAL(address+i,1,&readbuff);
				CAM_CALDB("[CAM_CAL]address+i = 0x%x,readbuff = 0x%x\n",(address+i),readbuff );
				*(iBuffer+i) =(unsigned char)readbuff;
			}
		}
		return 0;
}
//Burst Read Data
static int iReadData(unsigned int  ui4_offset, unsigned int  ui4_length, unsigned char * pinputdata)
{
   int  i4RetValue = 0;
   int  i4ResidueDataLength;
   u32 u4IncOffset = 0;
   u32 u4CurrentOffset;
   u8 * pBuff;
//   CAM_CALDB("[S24EEPORM] iReadData \n" );
   
/*   if (ui4_offset + ui4_length >= 0x2000)
   {
      CAM_CALDB("[S24CAM_CAL] Read Error!! S-24CS64A not supprt address >= 0x2000!! \n" );
      return -1;
   }
   */
  // u8 * pOneByteBuff = NULL;
//	pOneByteBuff = (u8 *)kmalloc(I2C_UNIT_SIZE, GFP_KERNEL);

   i4ResidueDataLength = (int)ui4_length;
   u4CurrentOffset = ui4_offset;
   pBuff = pinputdata;
   do 
   {
   		
       i4RetValue = iReadCAM_CAL(ui4_offset, 2, pBuff);
	   
	   CAM_CALDB("[CAM_CAL][iReadData] Read 0x%x=0x%x,%x \n", u4CurrentOffset, pBuff[0],pBuff[1]);
       if (i4RetValue != 0)
       {
            CAM_CALDB("[CAM_CAL] I2C iReadData failed!! \n");
            return -1;
       }           
       u4IncOffset++;
       i4ResidueDataLength --;
       u4CurrentOffset = ui4_offset + u4IncOffset;
       pBuff = pinputdata + (u4IncOffset*2);
   }while (i4ResidueDataLength > 0);
//   CAM_CALDB("[S24EEPORM] iReadData finial address is %d length is %d buffer address is 0x%x\n",u4CurrentOffset, i4ResidueDataLength, pBuff);   
//   CAM_CALDB("[S24EEPORM] iReadData done\n" );
   return 0;
}
static kal_uint8 check_IMX135_otp_valid_AFPage(void)
{
	kal_uint8 Pagemax = 16;
	kal_uint8 Pagemin = 13;
	kal_uint8 page = 0;
	kal_uint8 AF_OK = 0x00;
	kal_uint8 i = 0;
	u8  readbuff;
	int ret;
	for(page = Pagemax ; page>=Pagemin;page--)
	{
	if (IMX135_GotoPage(page))
		{
		CAM_CALDB("[CAM_CAL]page= %d\n",page);
		for(i = 0; i<5 ;i++)
		{	
			ret = iReadCAM_CAL((0x3b04+i),1,&readbuff);
		    CAM_CALDB("[CAM_CAL](0x3b04+%d)= 0x%x\n",(0x3b04+i),readbuff);
			AF_OK = readbuff;
			if (AF_OK != 0)
			{
				break;
			}	
			}	
		}
			if (AF_OK != 0)
			{
				break;
			}	
	}
	if ( page<Pagemin)
		{		
		CAM_CALDB("[CAM_CAL]No AF OTP data!");
		return 0;
		}
	CAM_CALDB("[CAM_CAL]No AF OTP data!");

return page;

}
//Burst Read Data
static int iReadData(unsigned int  ui4_offset, unsigned int  ui4_length, unsigned char * pinputdata)
{
   int  i4RetValue = 0;
   int  i4ResidueDataLength;
   u32 u4IncOffset = 0;
   u32 u4CurrentOffset;
   u8 * pBuff;
//   CAM_CALDB("[S24EEPORM] iReadData \n" );
   
/*   if (ui4_offset + ui4_length >= 0x2000)
   {
      CAM_CALDB("[S24CAM_CAL] Read Error!! S-24CS64A not supprt address >= 0x2000!! \n" );
      return -1;
   }
   */

   i4ResidueDataLength = (int)ui4_length;
   u4CurrentOffset = ui4_offset;
   pBuff = pinputdata;
   do 
   {
       i4RetValue = iReadCAM_CAL((u16)u4CurrentOffset, 1, pBuff);
	   CAM_CALDB("[CAM_CAL][iReadData] Read 0x%x=0x%x \n", u4CurrentOffset, pBuff[0]);
       if (i4RetValue != 0)
       {
            CAM_CALDB("[CAM_CAL] I2C iReadData failed!! \n");
            return -1;
       }           
       u4IncOffset++;
       i4ResidueDataLength --;
       u4CurrentOffset = ui4_offset + u4IncOffset;
       pBuff = pinputdata + u4IncOffset;
   }while (i4ResidueDataLength > 0);
//   CAM_CALDB("[S24EEPORM] iReadData finial address is %d length is %d buffer address is 0x%x\n",u4CurrentOffset, i4ResidueDataLength, pBuff);   
//   CAM_CALDB("[S24EEPORM] iReadData done\n" );
   return 0;
}
//go to page
static kal_uint8 IMX135_GotoPage(kal_uint8 page)
{
	kal_uint8 rdrdy_status = 0;
	kal_uint8 checktimes = 2,i = 0;
	u8  readbuff ;
	int ret;
	for(i= 0; i<checktimes;i++)
	{
		iWriteCAM_CAL(0x3b02, 1 , page);
    	iWriteCAM_CAL(0x3b00,1, 0x01);
   		mdelay(2);
    	ret = iReadCAM_CAL(0x3b01,1,&readbuff);
		rdrdy_status = readbuff;
		if( rdrdy_status == 1)
		{			
			return 1;
		}
		else
		{
			CAM_CALDB("OTP fail!\n");
		}
	}
	return 0;	
}