static long CAM_CAL_Ioctl( struct file *file, unsigned int a_u4Command, unsigned long a_u4Param ) #endif { int i4RetValue = 0; u8 * pBuff = NULL; u8 * pWorkingBuff = NULL; stCAM_CAL_INFO_STRUCT *ptempbuf; #ifdef CAM_CALGETDLT_DEBUG struct timeval ktv1, ktv2; unsigned long TimeIntervalUS; #endif if(_IOC_NONE == _IOC_DIR(a_u4Command)) { } else { pBuff = (u8 *)kmalloc(sizeof(stCAM_CAL_INFO_STRUCT),GFP_KERNEL); if(NULL == pBuff) { CAM_CALDB("[S24CAM_CAL] ioctl allocate mem failed\n"); return -ENOMEM; } if(_IOC_WRITE & _IOC_DIR(a_u4Command)) { if(copy_from_user((u8 *) pBuff , (u8 *) a_u4Param, sizeof(stCAM_CAL_INFO_STRUCT))) { //get input structure address kfree(pBuff); CAM_CALDB("[S24CAM_CAL] ioctl copy from user failed\n"); return -EFAULT; } } } ptempbuf = (stCAM_CAL_INFO_STRUCT *)pBuff; pWorkingBuff = (u8*)kmalloc(ptempbuf->u4Length,GFP_KERNEL); if(NULL == pWorkingBuff) { kfree(pBuff); CAM_CALDB("[S24CAM_CAL] ioctl allocate mem failed\n"); return -ENOMEM; } CAM_CALDB("[S24CAM_CAL] init Working buffer address 0x%8x command is 0x%8x\n", (u32)pWorkingBuff, (u32)a_u4Command); if(copy_from_user((u8*)pWorkingBuff , (u8*)ptempbuf->pu1Params, ptempbuf->u4Length)) { kfree(pBuff); kfree(pWorkingBuff); CAM_CALDB("[S24CAM_CAL] ioctl copy from user failed\n"); return -EFAULT; } switch(a_u4Command) { case CAM_CALIOC_S_WRITE: CAM_CALDB("[S24CAM_CAL] Write CMD \n"); #ifdef CAM_CALGETDLT_DEBUG do_gettimeofday(&ktv1); #endif i4RetValue = iWriteData((u16)ptempbuf->u4Offset, ptempbuf->u4Length, pWorkingBuff); #ifdef CAM_CALGETDLT_DEBUG do_gettimeofday(&ktv2); if(ktv2.tv_sec > ktv1.tv_sec) { TimeIntervalUS = ktv1.tv_usec + 1000000 - ktv2.tv_usec; } else { TimeIntervalUS = ktv2.tv_usec - ktv1.tv_usec; } printk("Write data %d bytes take %lu us\n",ptempbuf->u4Length, TimeIntervalUS); #endif break; case CAM_CALIOC_G_READ: CAM_CALDB("[S24CAM_CAL] Read CMD \n"); #ifdef CAM_CALGETDLT_DEBUG do_gettimeofday(&ktv1); #endif CAM_CALDB("[CAM_CAL] offset %d \n", ptempbuf->u4Offset); CAM_CALDB("[CAM_CAL] length %d \n", ptempbuf->u4Length); CAM_CALDB("[CAM_CAL] Before read Working buffer address 0x%8x \n", (u32)pWorkingBuff); Enb_OTP_Read(1); //Enable OTP Read i4RetValue = iReadData((u16)(ptempbuf->u4Offset+OTP_START_ADDR), ptempbuf->u4Length, pWorkingBuff); Enb_OTP_Read(0); //Disable OTP Read Clear_OTP_Buff(); //Clean OTP buff CAM_CALDB("[S24CAM_CAL] After read Working buffer data 0x%4x \n", *pWorkingBuff); #ifdef CAM_CALGETDLT_DEBUG do_gettimeofday(&ktv2); if(ktv2.tv_sec > ktv1.tv_sec) { TimeIntervalUS = ktv1.tv_usec + 1000000 - ktv2.tv_usec; } else { TimeIntervalUS = ktv2.tv_usec - ktv1.tv_usec; } printk("Read data %d bytes take %lu us\n",ptempbuf->u4Length, TimeIntervalUS); #endif break; default : CAM_CALDB("[S24CAM_CAL] No CMD \n"); i4RetValue = -EPERM; break; } if(_IOC_READ & _IOC_DIR(a_u4Command)) { //copy data to user space buffer, keep other input paremeter unchange. CAM_CALDB("[S24CAM_CAL] to user length %d \n", ptempbuf->u4Length); CAM_CALDB("[S24CAM_CAL] to user Working buffer address 0x%8x \n", (u32)pWorkingBuff); if(copy_to_user((u8 __user *) ptempbuf->pu1Params , (u8 *)pWorkingBuff , ptempbuf->u4Length)) { kfree(pBuff); kfree(pWorkingBuff); CAM_CALDB("[S24CAM_CAL] ioctl copy to user failed\n"); return -EFAULT; } } kfree(pBuff); kfree(pWorkingBuff); return i4RetValue; }
static long CAM_CAL_Ioctl( struct file *file, unsigned int a_u4Command, unsigned long a_u4Param ) #endif { int i4RetValue = 0; u8 * pBuff = NULL; u8 * pWorkingBuff = NULL; stCAM_CAL_INFO_STRUCT *ptempbuf; u16 otp_data; u8 temp_data=0; #ifdef CAM_CALGETDLT_DEBUG struct timeval ktv1, ktv2; unsigned long TimeIntervalUS; #endif if(_IOC_NONE == _IOC_DIR(a_u4Command)) { } else { pBuff = (u8 *)kmalloc(sizeof(stCAM_CAL_INFO_STRUCT),GFP_KERNEL); if(NULL == pBuff) { CAM_CALDB("[S24CAM_CAL] ioctl allocate mem failed\n"); return -ENOMEM; } if(_IOC_WRITE & _IOC_DIR(a_u4Command)) { if(copy_from_user((u8 *) pBuff , (u8 *) a_u4Param, sizeof(stCAM_CAL_INFO_STRUCT))) { //get input structure address kfree(pBuff); CAM_CALDB("[S24CAM_CAL] ioctl copy from user failed\n"); return -EFAULT; } } CAM_CALDB("[S24CAM_CAL] LONG TEST SIZE=%d.\n",sizeof( stCAM_CAL_INFO_STRUCT)); } ptempbuf = (stCAM_CAL_INFO_STRUCT *)pBuff; CAM_CALDB("[S24CAM_CAL] pBuff u4Length=%d.\n",ptempbuf->u4Length); pWorkingBuff = (u8*)kmalloc(ptempbuf->u4Length,GFP_KERNEL); //CAM_CALDB("[S24CAM_CAL]WorkingBuff Start Address is =%x, Buff length=%d, WorkingBuff End Address is=%x\n", pWorkingBuff, ptempbuf->u4Length, pWorkingBuff+ptempbuf->u4Length); if(NULL == pWorkingBuff) { kfree(pBuff); CAM_CALDB("[S24CAM_CAL] ioctl allocate mem failed\n"); return -ENOMEM; } CAM_CALDB("[S24CAM_CAL] init Working buffer address 0x%8x command is 0x%8x\n", (u32)pWorkingBuff, (u32)a_u4Command); if(copy_from_user((u8*)pWorkingBuff , (u8*)ptempbuf->pu1Params, 2)) { kfree(pBuff); kfree(pWorkingBuff); CAM_CALDB("[S24CAM_CAL] ioctl copy from user failed\n"); return -EFAULT; } switch(a_u4Command) { case CAM_CALIOC_S_WRITE: CAM_CALDB("[S24CAM_CAL] Write CMD \n"); #ifdef CAM_CALGETDLT_DEBUG do_gettimeofday(&ktv1); #endif CAM_CALDB("[S24CAM_CAL] ptempbuf->u4Offset=%0x.\n",ptempbuf->u4Offset); CAM_CALDB("[S24CAM_CAL] ptempbuf->u4Length=%0x.\n",ptempbuf->u4Length); //i4RetValue = iWriteData((u16)ptempbuf->u4Offset, ptempbuf->u4Length, pWorkingBuff); #ifdef CAM_CALGETDLT_DEBUG do_gettimeofday(&ktv2); if(ktv2.tv_sec > ktv1.tv_sec) { TimeIntervalUS = ktv1.tv_usec + 1000000 - ktv2.tv_usec; } else { TimeIntervalUS = ktv2.tv_usec - ktv1.tv_usec; } printk("Write data %d bytes take %lu us\n",ptempbuf->u4Length, TimeIntervalUS); #endif break; case CAM_CALIOC_G_READ: CAM_CALDB("[S24CAM_CAL] Read CMD \n"); #ifdef CAM_CALGETDLT_DEBUG do_gettimeofday(&ktv1); #endif // CAM_CALDB("[CAM_CAL] offset %x \n", ptempbuf->u4Offset); // CAM_CALDB("[CAM_CAL] length %d \n", ptempbuf->u4Length); // CAM_CALDB("[CAM_CAL] Before read Working buffer address 0x%8x,value 0x%8x \n", (u32)pWorkingBuff,(u8 *)pWorkingBuff); if(ptempbuf->u4Offset==0x3806) { if (isHaveOtpData(ptempbuf->u4Offset)) { CAM_CALDB("[S24CAM_CAL] have read otp data! \n"); otp_data = restoreOtpData(ptempbuf->u4Offset); pWorkingBuff[0] = otp_data >> 8; pWorkingBuff[1] = otp_data & 0xFF; } else { Enb_OTP_Read(1); //Enable OTP Read i4RetValue = iReadData((u16)(ptempbuf->u4Offset), ptempbuf->u4Length, pWorkingBuff); Enb_OTP_Read(0); //Disable OTP Read saveOtpData(ptempbuf->u4Offset, (u16)(pWorkingBuff[0] << 8 | pWorkingBuff[1])); } // Clear_OTP_Buff(); //Clean OTP buff CAM_CALDB("[S24CAM_CAL] After read Working buffer data 0x%x,%x \n", pWorkingBuff[0],pWorkingBuff[1]); }