⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datatransfer.cpp

📁 完整的基于Conxant平台的USB电视棒的WIN驱动程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                    fail_counter = 0;
                    sendBuffer(p_buffer_entry);
                    p_buffer_entry = NULL;
                 
                    //Abort any outstanding requests if Pipe is broken
                    if(_p_usb->UsbGetStatusPipe(_pipe, _interface) != STATUS_SUCCESS)
                    {
                        KdPrint(("Data Transfer : parseBufferThread : Abort all ISO requests pending\n"));
                        status=_p_usb->UsbAbortPipe(_pipe, _interface);
                        if (!NT_SUCCESS(status))
	                    {
                            bUnrecoverableError = TRUE;
                        }
                    }
                    break;
                }
            }
           

            status=sendBuffer(p_buffer_entry);

            if( !NT_SUCCESS(status) || ( status == STATUS_NO_SUCH_DEVICE) || ( status == STATUS_DEVICE_NOT_CONNECTED))
            {
                p_buffer_entry = NULL;
                bUnrecoverableError = TRUE;
                KdPrint(("Data Transfer : parseBufferThread : looks like USB device is removed.\n"));
            }
            else
            {
                //Get the next buffer to parse
                p_buffer_entry = _buffer_complete_queue.getBuffer();
            }

        }

        if( _digital_stream && _polaris_engine_fail_count >= 10 )
        {
                KdPrint(("DataTransfer : parseBufferThread : All ZERO packets!\n"));

                stopStream();
                
                startStream();

                _polaris_engine_fail_count = 0;
		}

		if(bUnrecoverableError)
        {
            KdPrint(("Data Transfer : parseBufferThread : unrecoverable error\n"));
            break;
        }

        if(_stop_thread)
        {
            break;
        }

        //Wait for more buffers to come available
        _buffer_complete_queue.waitForBuffers(1000);
    }

    //If we had a buffer in progress, add it back to the buffer complete queue so it does
    // not get lost when we exit.
    if(p_buffer_entry)
    {
        _buffer_complete_queue.addBuffer(p_buffer_entry);
    }

    stopStream();

}


/////////////////////////////////////////////////////////////////////////////////////////
VOID DataTransfer::initializeTransfer()
{

      getUrbAndBufferSizes();

      if(_p_current_config->getUsbSpeed()==1)
      {
          switch(_media_type)
          {
            //case 1: //audio
            case 0x81:	// audio with HANC  		        
                KdPrint(("Audio enter HANC\n"));
                PolarisModeRegister(TS_MODE_REG, 0x9300);
                break;

            case 2: // vbi
                KdPrint(("set vanc registers\n"));
                PolarisModeRegister(TS_MODE_REG,  0x300);
                break;

            case 3: //sliced cc
                KdPrint(("set hanc registers\n"));
                PolarisModeRegister(TS_MODE_REG, 0x1300);
                break;

            case 0: //video
                PolarisModeRegister(TS_MODE_REG, 0x100);
                break;

            case 4: //ts1
                PolarisModeRegister(TS_MODE_REG, 0x101);
                PolarisModeRegister(TS1_CFG_REG , 0x400);
                break;		    
        }
    }
    else
    {
        PolarisModeRegister(TS_MODE_REG, 0x101);
    }     
    
    startStream();
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID DataTransfer::setPin(BasePin* p_pin)
{
    PIN_TYPES pin_type = p_pin->getPinType();
    if(pin_type == PIN_TYPE_TS_MPEG || pin_type == PIN_TYPE_TS2_MPEG)
    {        
        // need to store the flag
        _digital_stream = 1;
        _ts_Data.setPin(p_pin);
    }
    else
    {
    	 if (pin_type == PIN_TYPE_AUDIO)
    	 {
    	    if(_media_type == 0x1)
    	    {
		        _data_parser.setAudioPin( p_pin);	
    	    }
	        else
		    {
                _data_parser.setPin(p_pin);	
            }
    	 }
	     else
         {
            _data_parser.setPin(p_pin);
         }
    }
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID DataTransfer::releasePin(BasePin* p_pin)
{
    PIN_TYPES pin_type = p_pin->getPinType();
    if(pin_type == PIN_TYPE_TS_MPEG || pin_type == PIN_TYPE_TS2_MPEG)
    {        
        // need to store the flag
        //_digital_stream = 0;
        _ts_Data.setPin(p_pin);
    }
    else
    {
         if (pin_type == PIN_TYPE_AUDIO)
    	 {
    	    if(_media_type == 0x1)
    	    {
    	        _data_parser.releaseAudioPin();
    	    }
	        else
		    {
                _data_parser.releasePin(p_pin);	
            }
    	 }
         else
         {
            _data_parser.releasePin(p_pin);
         }
    }
}

/////////////////////////////////////////////////////////////////////////////////////////
NTSTATUS DataTransfer::startThread()
{
    if (_p_thread_object)
    {
        //Thread is already started
        return STATUS_UNSUCCESSFUL;
    }

    _stop_thread = FALSE;

    HANDLE thread_handle;
    NTSTATUS status = PsCreateSystemThread(
        &thread_handle,
        THREAD_ALL_ACCESS,
        NULL,
        NULL,
        NULL,
        (PKSTART_ROUTINE) DataTransfer::static_ThreadFunction,   // Thread routine
        this);                                                 // Context

    if(!NT_SUCCESS(status))
        return status;

    return ObReferenceObjectByHandle(
            thread_handle,
            THREAD_ALL_ACCESS,
            NULL,
            KernelMode,
            &_p_thread_object,
            NULL);
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID DataTransfer::sleep(LONG time)
{
    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);

    LARGE_INTEGER wait_time;

    wait_time.LowPart = -(time*10000);
    wait_time.HighPart = -1;

    KeDelayExecutionThread(
        KernelMode,
        FALSE,
        &wait_time);
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID DataTransfer::startStream()
{
	BYTE  value[4];
    RtlZeroMemory(value, 4);
    DWORD tmp =0;

    KdPrint(("DataTransfer::startStream():::_ep_mask = %x\n", _ep_mask));
    _p_usb_firmware->getPolarisRegister(EP_MODE_SET, value, 4);

    tmp = *((DWORD *)value);
    tmp |= _ep_mask;
    value[0]=(BYTE)(tmp);
    value[1]=(BYTE)(tmp>>8);
    value[2]=(BYTE)(tmp>>16);
    value[3]=(BYTE)(tmp>>24);
    
    _p_usb_firmware->setPolarisRegister(EP_MODE_SET, value, 4);

    
}

/////////////////////////////////////////////////////////////////////////////////////////
VOID DataTransfer::stopStream()
{   
    BYTE  value[4];
    RtlZeroMemory(value, 4);
    DWORD tmp =0;
    KdPrint(("DataTransfer::stopStream():::_ep_mask = %x\n", _ep_mask));
    
    _p_usb_firmware->getPolarisRegister(EP_MODE_SET, value, 4);
    
    tmp = *((DWORD *)value);
    tmp&= (~_ep_mask);
    value[0]=(BYTE)tmp;
    value[1]=(BYTE)(tmp>>8);
    value[2]=(BYTE)(tmp>>16);
    value[3]=(BYTE)(tmp>>24);
    
    _p_usb_firmware->setPolarisRegister(EP_MODE_SET, value, 4);

}

/////////////////////////////////////////////////////////////////////////////////////////
VOID DataTransfer::PolarisModeRegister(WORD address, DWORD mode)
{
    BYTE  value[4];
    RtlZeroMemory(value, 4);
    DWORD tmp =0;
    
    _p_usb_firmware->getPolarisRegister(address , value, 4);
      
    tmp = *((DWORD *)value);
    tmp |= mode;

    value[0]=(BYTE)tmp;
    value[1]=(BYTE)(tmp>>8);
    value[2]=(BYTE)(tmp>>16);
    value[3]=(BYTE)(tmp>>24);

    _p_usb_firmware->setPolarisRegister(address, value, 4);   
    
}

/////////////////////////////////////////////////////////////////////////////////////////
BYTE DataTransfer::getType()
{
    return _media_type;
}

////////////////////////////////////////////////
// NTSTATUS DataTransfer::setInterface(UCHAR usb_interface_index)
// This function is only used for Polaris T0, which has multi-configuration
// scenarios, when configuration changes, dataTransfer should be updated.
// A0 donot need this function since A0 has only one configuration in each
// scenario.
NTSTATUS DataTransfer::setInterface(UCHAR usb_interface_index)
{
    _interface = usb_interface_index;
    return STATUS_SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -