Пример #1
0
static int rkusb_do_thread_cmd( struct rkusb_dev *dev )
{
        rk28printk("rkusb thread cmd = 0x%x,func=0x%x,len=%d\n" , 
            DEV_CMD(dev),DEV_FUNC(dev) , DEV_LENGTH(dev));
        switch( DEV_CMD(dev)) {
        #if RKUSB_XFILE
        case K_FW_XFERFILE:
                {
                        FILE_INFO               *fi = rkusb_xfer_cmd_valid( dev );
                        if( !fi ) {
                                rk28printk("invalid FILE_INFO for K_FW_XFERFILE[0x%x]\n" , K_FW_XFERFILE );
                                break;
                        }
                        switch( DEV_FUNC(dev )) {
                        case FUNC_XFER_FILE_PATH:
                                rkusb_file_path( dev );
                                break;
                        case FUNC_RFILE_DATA:
                        case FUNC_WFILE_DATA:
                                rkusb_xfer_file_task( dev );
                                break;
                        default:
                                break;
                        }
                        if( fi->error )
                                rkusb_xfer_free_fi( dev );
                }
                break;
        #endif /* RKUSB_XFILE */
        case K_FW_TASKFUN:
                rkusb_do_task_cmd( dev );
                break;
        case K_FW_SDRAM_READ_10:
                rkusb_do_read_sdram( dev );
                break;
        case K_FW_SDRAM_WRITE_10:
                rkusb_do_write_sdram( dev );
                break;
        case K_FW_FUNCALL:
                rkusb_do_func_call( dev );
                break;
         case K_FW_USBCMD : 
                if(FUNC_UCMD_RKUSBVER== DEV_FUNC(dev ) && 
                    (DEV_OFFSET(dev) == ECC_SWITCH_MSC || DEV_OFFSET(dev) == ECC_RESET) ) {
                        char cmd[32];
                        char *p=(char *)DEV_INREQ_BUF(dev);
                        strncpy( cmd , p , sizeof(cmd) );
                        rkusb_send_csw( dev , RKUSB_STATUS_PASS );
        		  mdelay(10);
                        sys_sync();
        		  kernel_restart( cmd );
		  } else {
		         rkusb_send_csw( dev , RKUSB_STATUS_FAIL );
		  }
		  break;
        default:
                return -ENOTSUPP;
                break;
        }
        return 0;
}
Пример #2
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;
}