static long am_gpio_ioctl(struct file *file, unsigned int ctl_cmd, unsigned long arg)
{
	cmd_t *op=file->private_data;
		char cmd[10];
		iocmd_t op_target;
		iocmd_t ret_target;
		
		switch(ctl_cmd)
		{
			case GPIO_CMD_OP_W:
					 if(copy_from_user(&op_target, (iocmd_t*)arg, sizeof(iocmd_t)))
					 {
						 return -EFAULT;
					 }
					 memcpy(&ret_target, &op_target, sizeof(iocmd_t));
					 if(op_target.nameb != ' ')
						  sprintf(cmd,"w %c%c_%d %d",op_target.namef,op_target.nameb,op_target.bit, op_target.val);
					 else
						  sprintf(cmd,"w %c_%d %d",op_target.namef,op_target.bit, op_target.val);
					 if(0 > _gpio_run_cmd(cmd, op))
							 return -EFAULT;
								 ret_target.val = op_target.val;
								 if(copy_to_user((iocmd_t*)arg, &ret_target, sizeof(iocmd_t)))
								 {
									 return -EFAULT;
								 }
					 break;
			case GPIO_CMD_OP_R:
					 if(copy_from_user(&op_target, (iocmd_t*)arg, sizeof(iocmd_t)))
					 {
						 return -EFAULT;
					 }
					 memcpy(&ret_target, &op_target, sizeof(iocmd_t));
					 if(op_target.nameb != ' ')
						  sprintf(cmd,"r %c%c_%d %d",op_target.namef,op_target.nameb,op_target.bit, op_target.val);
					 else
						  sprintf(cmd,"r %c_%d %d",op_target.namef,op_target.bit, op_target.val);
					 if(0 > _gpio_run_cmd(cmd, op))
							 return -EFAULT;
								 ret_target.val = op_target.val;
								 if(copy_to_user((iocmd_t*)arg, &ret_target, sizeof(iocmd_t)))
								 {
									 return -EFAULT;
								 }
					 break;
			default:
				break;
		}
	return 0;
}
static int am_gpio_ioctl(struct inode *inode, struct file *file,
                         unsigned int ctl_cmd, unsigned long arg)
{
    cmd_t  *op = file->private_data;
    char  cmd[10];
    cmd_t  op_target;
    cmd_t  ret_target;

    switch (ctl_cmd) {
    case GPIO_CMD_OP:
        if (copy_from_user(&op_target, (cmd_t*)arg, sizeof(cmd_t))) {
            return -EFAULT;
        }
        memcpy(&ret_target, &op_target, sizeof(cmd_t));
        sprintf(cmd, "%c:%c:%d:%d", op_target.cmd, op_target.bank, op_target.bit, op_target.val);
        _gpio_run_cmd(cmd, op);
        ret_target.val = op_target.val;
        if (copy_to_user((cmd_t*)arg, &ret_target, sizeof(cmd_t))) {
            return  -EFAULT;
        }
        break;
    default:
        break;
    }
    return 0;
}
static ssize_t am_gpio_read(struct file *file, char __user *buf, size_t size, loff_t*o)
{
    cmd_t  *op = file->private_data;
    char  tmp[10];
    char  cmd[10];
    int  val;

    if (buf == NULL || op == NULL) {
        return -1;
    }
    copy_from_user(tmp, buf, size);

    strcpy(cmd, "r:");
    strcat(cmd, tmp);
    val = _gpio_run_cmd(cmd, op);
    if (0 > val) {
        return -1;
    }
    sprintf(tmp, ":%d", val);
    strcat(cmd, tmp);
    return copy_to_user(buf, cmd, strlen(cmd));
}
static ssize_t am_gpio_write(struct file *file, const char __user *buf,
                             size_t bytes, loff_t *off)
{
    cmd_t  *op = file->private_data;
    char  tmp[10];
    char  cmd[10];
    int  val;

    if (buf == NULL || op == NULL) {
        return -1;
    }
    copy_from_user(tmp, buf, bytes);

    strcpy(cmd, "w:");
    strcat(cmd, tmp);
    val = _gpio_run_cmd(cmd, op);
    if (0 > val) {
        return -1;
    }
    return strlen(cmd);


}
static ssize_t am_gpio_write(struct file *file, const char __user *buf,
		size_t bytes, loff_t *off)
{
	cmd_t *op = file->private_data;
		char tmp[10];
		char cmd[10];
		int val;
		
		if(buf == NULL || op == NULL)
		    return -1;
		val = copy_from_user(tmp, buf, size);
		if (0 > val) {
		    printk("am_gpio_write: Some bytes could not be copied: %d\n", val);
		    return -EFAULT;
		}
		
		strcpy(cmd,"w ");
		strcat(cmd,tmp);
		val = _gpio_run_cmd(cmd,op);
		if(0 > val)
			return -1;
		return strlen(cmd);
}
static ssize_t am_gpio_read(struct file *file, char __user *buf, size_t size,loff_t*off)
{
	cmd_t *op=file->private_data;
		char tmp[10];
		char cmd[10];
		int val;
		
		if (buf == NULL || op == NULL)
		    return -1;
		
		val = copy_from_user(tmp, buf, size);
		if (0 > val) {
		    printk("am_gpio_read: Some bytes could not be copied: %d\n", val);
		    return -EFAULT;
		}
		strcpy(cmd, "r ");
		strcat(cmd, tmp);
		val = _gpio_run_cmd(cmd, op);
		if (0 > val)
			return -1;
		sprintf(tmp, ":%d", val);
		strcat(cmd, tmp);
		return copy_to_user(buf, cmd, strlen(cmd));
}
}
static const struct file_operations am_gpio_fops = {
	.open       = am_gpio_open,
		.read       = am_gpio_read,
		.write      = am_gpio_write,
		.unlocked_ioctl      = am_gpio_ioctl,
		//.ioctl      = am_gpio_ioctl,
		.release    = am_gpio_release,
		.poll       = NULL,
};

ssize_t gpio_cmd_restore(struct class *cla, struct class_attribute *attr, const char *buf, size_t count)
{
	        cmd_t op;
		int val;
		val=_gpio_run_cmd(buf, &op);
		if(val != -1){
		if(op.cmd_flag == 1)
			printk(KERN_DEBUG "READ [GPIO%s_%d]  %d \n",op.name,op.bit,val);
		else
			printk(KERN_DEBUG "WRITE [GPIO%s_%d] %d \n",op.name,op.bit,op.val);
		}
		else
			printk(KERN_ERR "you enter error!\n %s",help_cmd);
		return strlen(buf);
}
int create_gpio_device(gpio_t *gpio)
{
	int ret;
		
		ret = class_register(&gpio_class);