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; }
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; }