Ejemplo n.º 1
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;
}
Ejemplo n.º 2
0
static int rkusb_usb_command( struct rkusb_dev *dev )
{
        int r = RKUSB_CB_FAILD;
        rk28printk("%s::func=%d,len=%d\n" , __func__ , DEV_FUNC(dev),DEV_LENGTH(dev));
        switch( DEV_FUNC(dev) ) {
                case FUNC_UCMD_DEVREADY:
                        r = RKUSB_CB_OK_CSW;
                        break;
                case FUNC_UCMD_DISCONNECTMSC:
                        rk28_msc_switch( 0 );
                        r = RKUSB_CB_OK_CSW;
                        break;
                case FUNC_UCMD_SYSTEMINFO:
                        {
                        unsigned int off_len[2];
                        off_len[0] = (unsigned int)system_type;
                        off_len[1] = strlen(system_type)+1;
                        rkusb_normal_data_xfer_onetime(dev , off_len );
                        r = RKUSB_CB_OK_NONE;
                        }
                        break;
                case FUNC_UCMD_RESTART:
                        rk28printk("get restart cmd,lun=%d\n" , DEV_LUN(dev));
                        if( DEV_LUN(dev) == 0 ) { /* normal restart */
                                rk28_restart(0);
                        } else if( DEV_LUN(dev) == 1 ) { /* to loader rkusb */
                                rk28_restart(1);
                        }
                        break;
                case FUNC_UCMD_GETVERSION:
                        r = rkusb_ucmd_get_version( dev );
                        break;
                case FUNC_UCMD_GETCHIPINFO:
                        {
                        unsigned int off_len[2];
                        off_len[1] = kld_get_tag_data( 0X524B0000 , (void**)&off_len );
                        rkusb_normal_data_xfer_onetime(dev , off_len );
                        r = RKUSB_CB_OK_NONE;
                        }
                        break;
                case FUNC_UCMD_GETSN:
                        {
                        unsigned int off_len[2];
                        off_len[1] = kld_get_tag_data( 0X524B0006 , (void**)&off_len );
                        rkusb_normal_data_xfer_onetime(dev , off_len );
                        r = RKUSB_CB_OK_NONE;
                        }
                        break;
                case FUNC_UCMD_DEBUGINFO:
                        {
                        RKDEBUG_INFO      *dbi = DEV_FAST_ALLOC(dev,RKDEBUG_INFO);
                        dbi->size = sizeof(RKDEBUG_INFO);
                        dbi->adb_support = adb_support;
                        dbi->dbg_level = __rkusb_write_enable(dev)?2:(__rkusb_read_enable(dev)?1:0);
                        dbi->tr_length = dev->req_buf_length;
                        dbi->save_length = dev->buf_length;
                        dbi->save_buf = (unsigned long)__rkusb_rwbuffer_start(dev);
                        if( dev->fsg )
                                strcpy(dbi->cur_device,"msc");
                        else
                                strcpy(dbi->cur_device,"adb");
                        strcpy( dbi->cur_version,RKUSB_KVERSION);
                        #if 0
                        dbi->cmds[0]=K_FW_SDRAM_READ_10;
                        dbi->cmds[1]=K_FW_SDRAM_WRITE_10;
                        dbi->cmds[2]=K_FW_TRACE;
                        dbi->cmds[3]=K_FW_GETLOG;
                        dbi->cmds[4]=K_FW_FUNCALL;
                        dbi->cmds[5]=K_FW_GETSYMB;
                        dbi->cmds[6]=K_FW_GETRESULT;
                        dbi->cmds[7]=K_FW_USBCMD;
                        #endif
                        rkusb_normal_data_xfer_onetime(dev , dbi );
                        r = RKUSB_CB_OK_NONE;
                        }
                        break;
                 case FUNC_UCMD_OPENADB:
                        {
                        /* lun:0 close,1: open */
                        adb_function_enable(DEV_LUN(dev));
                        usb_vbus_status = 0; /* force to reconnect! */
                        r = RKUSB_CB_OK_CSW;
                        }
                        break;
                default:
                        break ;
        }
        return r;
}