static void oneshot_event(void)
{
    shot_time = 0;
    if(pwmSwitch == 0)
    {
        //strcat(logbuf, "open\n");

        pwmSwitch = 1;
        SET_CBUS_REG_MASK(PWM_MISC_REG_AB, ((1<<15)|(0<<8)|(1<<0)));//on
    }
    else
    {
        //strcat(logbuf, "close\n");

        pwmSwitch = 0;
        CLEAR_CBUS_REG_MASK(PWM_MISC_REG_AB, ((1<<15)|(0<<8)|(1<<0)));//off
    }
    
    //set next window timer
    send_idx++;
    if(send_idx < send_win.winNum)
    {
        //dbg("delay time[%d] and trgger next event\n", send_win.winArray[send_idx]);
        set_timer_b_event(send_win.winArray[send_idx]);
    }
    else //pwm should be off
    {
        //dbg("off pwm\n");
        CLEAR_CBUS_REG_MASK(PWM_MISC_REG_AB, ((1<<15)|(0<<8)|(1<<0)));
        pwmSwitch = 0;
    }
}
static void oneshot_event(void)
{
    shot_time = 0;
    if(pwmSwitch == 0)
    {
        pwmSwitch = 1;
        open_pwm(irreceiver_data->pwm_no);//on
    }
    else
    {
        pwmSwitch = 0;
        close_pwm(irreceiver_data->pwm_no);//off
    }
    
    //set next window timer
    send_idx++;
    if(send_idx < send_win.winNum)
    {
        set_timer_b_event(send_win.winArray[send_idx]);
    }
    else //pwm should be off
    {
        close_pwm(irreceiver_data->pwm_no);;
        pwmSwitch = 0;
        send_flag = 0;
    }
}
static int aml_ir_receiver_ioctl(struct inode *inode, struct file *filp,
                 unsigned int cmd, unsigned long args)
{
    int i;
    s32 r = 0;
    unsigned long flags;
    void __user *argp = (void __user *)args;
	dbg("aml_ir_receiver_ioctl()\n");
    
    switch(cmd)
    {
    case IRRECEIVER_IOC_SEND:
        if (copy_from_user(&send_win, argp, sizeof(struct ir_window)))
		    return -EFAULT;

        #ifdef DEBUG
        for(i=0; i<send_win.winNum; i++)
            dbg("idx[%d]:[%d]\n", i, send_win.winArray[i]);
        #endif

        logbuf[0] = 0;
        send_idx = 0;
        pwmSwitch = 1;
        send_flag = 1;
        open_pwm(irreceiver_data->pwm_no);;
        if(send_idx < send_win.winNum)
        {
            local_irq_save(flags);
            set_timer_b_event(send_win.winArray[send_idx]);
            local_irq_restore(flags);
        }
        break;

    case IRRECEIVER_IOC_RECV:
		dbg("recv win [%d]\n", reced_win.winNum);
        if(copy_to_user(argp, &reced_win, sizeof(struct ir_window)))
            return -EFAULT;
        break;

	case IRRECEIVER_IOC_STUDY_S:
		dbg("IRRECEIVER_IOC_STUDY_S\n");
		rec_win.winNum = 0;
		reced_win.winNum = 0;
		invalid_win = 0;
		end_key = false;
		break;

	case IRRECEIVER_IOC_STUDY_E:
		dbg("IRRECEIVER_IOC_STUDY_E\n");
		break;
        
    default:
        r = -ENOIOCTLCMD;
        break;
    }
    
	return r;
}
static long aml_ir_receiver_ioctl(struct file *filp, unsigned int cmd, unsigned long args)

{
    int i;
    s32 r = 0;
    unsigned long flags;
    void __user *argp = (void __user *)args;
	dbg("aml_ir_receiver_ioctl()\n");
    
    switch(cmd)
    {
    case IRRECEIVER_IOC_SEND:
        if (copy_from_user(&send_win, argp, sizeof(struct ir_window)))
		    return -EFAULT;
        
        //for(i=0; i<send_win.winNum; i++)
        //    dbg("idx[%d]:[%d]\n", i, send_win.winArray[i]);
        dbg("send win [%d]\n", send_win.winNum);
        
        logbuf[0] = 0;
        send_idx = 0;
        pwmSwitch = 1;
        SET_CBUS_REG_MASK(PWM_MISC_REG_AB, ((1<<15)|(0<<8)|(1<<0)));
        if(send_idx < send_win.winNum)
        {
            local_irq_save(flags);
            set_timer_b_event(send_win.winArray[send_idx]);
            local_irq_restore(flags);
        }
        break;

    case IRRECEIVER_IOC_RECV:
		dbg("recv win [%d]\n", rec_win.winNum);
        if(copy_to_user(argp, &rec_win, sizeof(struct ir_window)))
            return -EFAULT;
        break;

	case IRRECEIVER_IOC_STUDY_S:
		dbg("IRRECEIVER_IOC_STUDY_S\n");
		rec_win.winNum = 0;
		break;

	case IRRECEIVER_IOC_STUDY_E:
		dbg("IRRECEIVER_IOC_STUDY_E\n");
		break;
        
    default:
        r = -ENOIOCTLCMD;
        break;
    }
    
	return r;
}