/***************************************************************************** User interface *****************************************************************************/ static int constant_flashlight_ioctl(MUINT32 cmd, MUINT32 arg) { int i4RetValue = 0; int iFlashType = (int)FLASHLIGHT_NONE; switch(cmd) { case FLASHLIGHTIOC_T_ENABLE : printk("xxxxxxxxxx enable arg = %d, width = %d xxxxxxxx\n", arg, strobe_width); if (arg && strobe_width) { //enable strobe watchDog timer. if(FL_Enable()){ printk("FL_Enable fail!\n"); goto strobe_ioctl_error; } g_strobe_On = TRUE; } else { if(FL_Disable()) { printk("FL_Disable fail!\n"); goto strobe_ioctl_error; } g_strobe_On = FALSE; } break; case FLASHLIGHTIOC_T_LEVEL: strobe_width = 100; if(1 == (int)arg || 12 == (int)arg || 20 == (int)arg) video_mode = 1; else video_mode = 0; printk("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF level:%d FFFFFFFFFF\n",(int)arg); //PK_DBG("level:%d \n",(int)arg); if (arg > 0) { if(FL_dim_duty((kal_int8)arg-1)) { //PK_ERR("FL_dim_duty fail!\n"); //i4RetValue = -EINVAL; goto strobe_ioctl_error; } } break; case FLASHLIGHTIOC_T_FLASHTIME: strobe_Timeus = (u32)arg; printk("strobe_Timeus:%d \n",(int)strobe_Timeus); break; case FLASHLIGHTIOC_T_STATE: strobe_eState = (eFlashlightState)arg; break; case FLASHLIGHTIOC_G_FLASHTYPE: iFlashType = FLASHLIGHT_LED_CONSTANT; if(copy_to_user((void __user *) arg , (void*)&iFlashType , _IOC_SIZE(cmd))) { printk("[strobe_ioctl] ioctl copy to user failed\n"); return -EFAULT; } break; case FLASHLIGHTIOC_X_SET_FLASHLEVEL: strobe_width = arg; printk("level:%d \n",(int)arg); break; case FLASHLIGHTIOC_ENABLE_STATUS: // printk("**********g_strobe_on = %d \n", g_strobe_On); copy_to_user((void __user *) arg , (void*)&g_strobe_On , sizeof(int)); break; case FLASHLIGHT_TORCH_SELECT: printk("@@@@@@FLASHLIGHT_TORCH_SELECT@@@@@@\n"); if (arg && strobe_width){ TORCH_select(); g_strobe_On = TRUE; } else { if(TORCH_Disable()) { printk("FL_Disable fail!\n"); goto strobe_ioctl_error; } g_strobe_On = FALSE; } break; default : printk("No such command \n"); i4RetValue = -EPERM; break; } return i4RetValue; strobe_ioctl_error: printk("Error or ON state!\n"); return -EPERM; }
static int constant_flashlight_ioctl(MUINT32 cmd, MUINT32 arg) { int i4RetValue = 0; int iFlashType = (int)FLASHLIGHT_NONE; //when ON state , only disable command is permitted. if ( (TRUE == g_strobe_On) && !((FLASHLIGHTIOC_T_ENABLE == cmd) && (0 == arg)) ) { printk("[constant_flashlight] is already ON OR check parameters!\n"); return i4RetValue; } switch(cmd) { case FLASHLIGHTIOC_T_ENABLE : if (arg && strobe_width) { //enable strobe watchDog timer. if(FL_Enable()){ printk("FL_Enable fail!\n"); goto strobe_ioctl_error; } g_strobe_On = TRUE; } else { if(FL_Disable()) { printk("FL_Disable fail!\n"); goto strobe_ioctl_error; } g_strobe_On = FALSE; } break; case FLASHLIGHTIOC_T_LEVEL: if(arg > 32) arg=32; strobe_width = arg; printk("level:%d \n",(int)arg); if (arg > 0) { if(FL_dim_duty((kal_int8)arg - 1)) { //0(weak)~31(strong) printk("FL_dim_duty fail!\n"); //i4RetValue = -EINVAL; goto strobe_ioctl_error; } } break; case FLASHLIGHTIOC_T_FLASHTIME: strobe_Timeus = (u32)arg; printk("strobe_Timeus:%d \n",(int)strobe_Timeus); break; case FLASHLIGHTIOC_T_STATE: strobe_eState = (eFlashlightState)arg; break; case FLASHLIGHTIOC_G_FLASHTYPE: iFlashType = FLASHLIGHT_LED_CONSTANT; if(copy_to_user((void __user *) arg , (void*)&iFlashType , _IOC_SIZE(cmd))) { printk("[strobe_ioctl] ioctl copy to user failed\n"); return -EFAULT; } break; default : printk("No such command \n"); i4RetValue = -EPERM; break; } return i4RetValue; strobe_ioctl_error: printk("Error or ON state!\n"); return -EPERM; }