示例#1
0
static int rkusb_write_sdram( struct rkusb_dev *dev )
{
        int pid;
        if( __rkusb_write_enable() ) {
                int max_len;
                if( DEV_OFFSET(dev) >= 0xc0000000 ) {
                        rkusb_normal_data_xfer( dev , NULL ); 
                        return RKUSB_CB_OK_NONE;
                }
                max_len = DEV_RWBUF_LENGTH( dev );
                if( max_len < DEV_LENGTH(dev) ) {
                            return RKUSB_CB_FAILD;
                }
                pid = DEV_PID( dev );
                if( pid ) {
                        dev->slave_task = find_task_by_pid( pid );
                        if(!dev->slave_task )
                                return RKUSB_CB_FAILD;
                        //rk28printk("%s::pid=%d,task=%s\n" , __func__ , pid , dev->slave_task->comm );
                } else {
                        dev->slave_task = current ;
                }
                /* bakeup real offset and length */
                dev->private_tmp = (void*)DEV_OFFSET(dev);
                dev->buf_nfill = DEV_LENGTH(dev);
                __rkusb_set_dest_or_source( dev , __rkusb_rwbuffer_start( dev ) );
                rkusb_normal_data_xfer( dev , rkusb_write_sdram_cb);
                return RKUSB_CB_OK_NONE;
        }
        return RKUSB_CB_FAILD;
}
示例#2
0
static int rkusb_read_sdram( struct rkusb_dev *dev )
{
        int pid;
        if( __rkusb_read_enable() ) {
                if( DEV_OFFSET(dev) >= 0xc0000000 ) {
                        rkusb_normal_data_xfer( dev , NULL ); 
                        return RKUSB_CB_OK_NONE;
                }
                pid = DEV_PID( dev );
                if( pid ) {
                        dev->slave_task = find_task_by_pid( pid );
                        if(!dev->slave_task )
                                return RKUSB_CB_FAILD;
                        //rk28printk("%s::pid=%d,task=%s\n" , __func__ , pid , dev->slave_task->comm );
                } else {
                        dev->slave_task = current ;
                }
                if( dev->slave_task == current ){
                        char *dest = __rkusb_rwbuffer_start( dev );
                        int n = copy_from_user((void*)dest, (const void __user*)DEV_OFFSET(dev), DEV_LENGTH(dev));
                        if( !n ) {
                                rkusb_normal_data_xfer_onetime( dev , dest );
                                return RKUSB_CB_OK_NONE;
                        } else 
                                return RKUSB_CB_FAILD;
                }
                rkusb_wakeup_thread( dev );
                return RKUSB_CB_OK_NONE;
        }
        return RKUSB_CB_FAILD;
}
示例#3
0
static int rkusb_xfer_file_path( struct rkusb_dev *dev )
{
        if( DEV_LENGTH(dev) < sizeof(FILE_INFO) || DEV_LENGTH(dev) > RKUSB_BUFFER_SIZE ) {
                return RKUSB_CB_FAILD;
        }
        rkusb_normal_data_xfer( dev , rkusb_xfer_file_path_cb );
        return RKUSB_CB_OK_NONE;
}
示例#4
0
static int rkusb_do_get_task_cmd( struct rkusb_dev *dev )
{
        struct task_struct *p = dev->slave_task;
        int len = rkusb_get_task_cmdline( p , __rkusb_rwbuffer_start(dev) , DEV_RWBUF_LENGTH( dev ) ); 
        __rkusb_set_dest_or_source( dev , __rkusb_rwbuffer_start(dev) );
        rkusb_normal_data_xfer( dev , rkusb_do_get_taskcmd_cb );
        dev->buf[0].filled = len;
        //rkusb_normal_data_xfer_onetime( dev , __rkusb_rwbuffer_start(dev) );
        return RKUSB_CB_OK_NONE;
}
示例#5
0
/*
 *      write sdram, just send command to shell.
 */
static int rkusb_set_log( struct rkusb_dev *dev )
{
        rk28printk("%s:lun=%d,lba=0x%08x\n" ,__func__ , DEV_LUN(dev) , DEV_OFFSET(dev));
        if( DEV_LUN(dev) < dev->luns && (dev->log[DEV_LUN(dev)].property & LOG_PROT_WRITE )
                && !__system_crashed() ) {
                rkusb_normal_data_xfer( dev , rkusb_write_shell_callback );
                return RKUSB_CB_OK_NONE;
        } 
        return RKUSB_CB_FAILD;
}
示例#6
0
static int rkusb_command( struct rkusb_dev *dev )
{
        int r= RKUSB_CB_FAILD;
        //dev->cb.DataTransferLength = __be32_to_cpu( dev->cb.DataTransferLength );
        //dev->cb.Lba = __be32_to_cpu( dev->cb.Lba );
        //dev->cb.pid = __be16_to_cpu( dev->cb.pid );

        rkusb_print_cb( dev );
        if( DEV_LENGTH(dev) > dev->req_buf_length ){
                rk28printk("data length[0x%x] > limit[0x%x]\n" , DEV_LENGTH(dev),dev->req_buf_length);
                DEV_LENGTH(dev) = dev->req_buf_length;
        }
        //dev->thread_task->mm = NULL;
        dev->slave_task = NULL;
        switch ( DEV_CMD(dev) )
        {
        case K_FW_GETRESULT:
                r = rkusb_get_lastcmd_result( dev );
                break;
        case K_FW_GETLOG:				
                r = rkusb_get_log( dev );
                break;
        case K_FW_SETLOG:				
                r = rkusb_set_log( dev );
                break;
        case K_FW_TRACE:
               r = rkusb_do_trace( dev );
               break;
        case K_FW_USBCMD:
               r = rkusb_usb_command( dev );
               break;
        case K_FW_XFERFILE:
                r = rkusb_do_xfer_file( dev );
                break;
        case K_FW_FUNCALL:
                r = rkusb_function_call( dev );
                break;
        case K_FW_SDRAM_READ_10:
                r = rkusb_read_sdram( dev );
                break;
        case K_FW_SDRAM_WRITE_10:
                r = rkusb_write_sdram( dev );
                break;
        case K_FW_GETSYMB:
                r = rkusb_get_symbol( dev );
                break;
        case K_FW_TASKFUN:
                r = rkusb_task_cmd( dev );
                break;
        default:
                return RKUSB_NOT_HANDLED;
        } 
        if( RKUSB_CB_FAILD == r ) {
                /* 20100330,HSL@RK,for failed cmd,must handle it */
                DEV_OFFSET(dev) = 0;
                rkusb_normal_data_xfer( dev , rkusb_failed_cb ); 
                return 0 ; /* RKUSB_NOT_HANDLED;*/
        } else if( RKUSB_CB_OK_CSW == r )
                rkusb_send_csw( dev , RKUSB_STATUS_PASS );
        else if( RKUSB_CB_FAILD_CSW == r )
                rkusb_send_csw( dev , RKUSB_STATUS_FAIL);
        return 0;
}
示例#7
0
static int rkusb_function_call( struct rkusb_dev *dev )
{
        rkusb_normal_data_xfer( dev , rkusb_function_call_callback );   
        return RKUSB_CB_OK_NONE;
}