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

📄 ncufnpdd.c

📁 CE下 NET2778 NDIS Drivers, 在每个平台上都可以使用
💻 C
📖 第 1 页 / 共 3 页
字号:

    // Start the transfer
    NcStatus = NcApi_EpTransfer(pEndpointObject);

	HISTO(DEFAULT_HISTORY, "Trx)", 0, pTransfer, 0);
	
	LeaveCriticalSection(&pContext->csInterrupt);
	
	LeaveCriticalSection(&pContext->NcUfnEp[dwEndpoint].cs);

    if(NcStatus == NCSTATUS_SUCCESS)
    {
        return ERROR_SUCCESS;
    }
    else
    {
        return ERROR_INVALID_PARAMETER;
    }
}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_AbortTransfer(
    PVOID           pvPddContext,
    DWORD           dwEndpoint,
    PSTransfer      pTransfer
    )
{
    PCEUFNPDD_CONTEXT pContext = (PCEUFNPDD_CONTEXT) pvPddContext;
    PNC_ENDPOINT_OBJECT pEndpointObject = pContext->pEndpointObjects[dwEndpoint];
    PSTransfer UfnpTransfer = pTransfer;

	EnterCriticalSection(&pContext->NcUfnEp[dwEndpoint].cs);
	HISTO(DEFAULT_HISTORY, "UpAb", dwEndpoint, pTransfer->cbBuffer, 0);
    
    if (pEndpointObject->CompletionStatus != NCSTATUS_PENDING)
    {   // No Transfer Pending, Call MDD Completion Notification 
        // This can't be done in NcApi_EpCancel because when NcApi_EpCancel
        // notifies up, it needs to pass a valid TransferObject
        UfnpTransfer->cbTransferred = 0;
    
        UfnpTransfer->dwUsbError = UFN_CANCELED_ERROR;
        HISTO(DEFAULT_HISTORY, "NoTP", dwEndpoint, UfnpTransfer->cbTransferred, 0);

        pContext->pfnNotify(
			pContext->pvMddContext, 
			UFN_MSG_TRANSFER_COMPLETE, 
			(DWORD)UfnpTransfer
			);
    }
    else
    {
		EnterCriticalSection(&pContext->csInterrupt);
        NcApi_EpCancel(pEndpointObject, FALSE);
		LeaveCriticalSection(&pContext->csInterrupt);
    }

	LeaveCriticalSection(&pContext->NcUfnEp[dwEndpoint].cs);

    return ERROR_SUCCESS;

}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_DeinitEndpoint(
    PVOID           pvPddContext,
    DWORD           dwEndpoint
    )
{
    PCEUFNPDD_CONTEXT pContext = (PCEUFNPDD_CONTEXT) pvPddContext;
    PNC_DEVICE_OBJECT pNcDeviceObject = pContext->pNcDeviceObject;

	HISTO(DEFAULT_HISTORY, "DIEp", dwEndpoint, 0, 0);

    NcApi_EpClose(dwEndpoint);

    return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_StallEndpoint(
    PVOID           pvPddContext,
    DWORD           dwEndpoint
    )
{
    PCEUFNPDD_CONTEXT pContext = (PCEUFNPDD_CONTEXT) pvPddContext;
    PNC_DEVICE_OBJECT pNcDeviceObject = pContext->pNcDeviceObject;

    HISTO(DEFAULT_HISTORY, "USll", dwEndpoint, 0, 0);

    pContext->pEndpointObjects[dwEndpoint]->Stall = TRUE;

	EnterCriticalSection(&pContext->csInterrupt);
    NcApi_EpStall(pContext->pEndpointObjects[dwEndpoint]);
	
	LeaveCriticalSection(&pContext->csInterrupt);
    
	return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_ClearEndpointStall(
    PVOID           pvPddContext,
    DWORD           dwEndpoint
    )
{
    PCEUFNPDD_CONTEXT pContext = (PCEUFNPDD_CONTEXT) pvPddContext;
    PNC_DEVICE_OBJECT pNcDeviceObject = pContext->pNcDeviceObject;
    
	HISTO(DEFAULT_HISTORY, "UCll", dwEndpoint, 0, 0);

	pContext->pEndpointObjects[dwEndpoint]->Stall = FALSE;

	EnterCriticalSection(&pContext->csInterrupt);
    NcApi_EpStall(pContext->pEndpointObjects[dwEndpoint]);
	
	LeaveCriticalSection(&pContext->csInterrupt);
    
	return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_SendControlStatusHandshake(
    PVOID           pvPddContext,
    DWORD           dwEndpoint
    )
{   // The MDD calls this function to handle the Status Phase of Control
    // Transfers.  The FirmwareApi handles the Status Phase automatically, so
    // we tell the MDD that it has been handled correctly.
    return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_SetAddress(
    PVOID pvPddContext,
    BYTE  bAddress
    )
{   // The MDD calls this function to set the USB address of the device.
    // This FirmwareApi handles this automatically, so we tell the MDD that it 
    // has been handled correctly.
    return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_IsEndpointHalted(
    PVOID pvPddContext,
    DWORD dwEndpoint,
    PBOOL pfHalted
    )
{
    PCEUFNPDD_CONTEXT pContext = (PCEUFNPDD_CONTEXT) pvPddContext;
    PNC_ENDPOINT_OBJECT EndpointObject = pContext->pEndpointObjects[dwEndpoint];
    
	*pfHalted = EndpointObject->Stall;

    return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
DWORD
WINAPI
UfnPdd_InitiateRemoteWakeup(
    PVOID pvPddContext
    )
{
    PCEUFNPDD_CONTEXT pContext = (PCEUFNPDD_CONTEXT) pvPddContext;
    PNC_DEVICE_OBJECT DeviceObject = pContext->pNcDeviceObject;

	// Wake up USB host
    //  - If chip is suspended, it must be wakened too
    if (DeviceObject->ChipState == NC_CHIP_STATE_SUSPENDED)
    {   // Chip is suspended
        //  - Awaken chip first:
        //  - Interrupts required for chip wakeup
        NcApi_WakeupChip(DeviceObject);
    }

    NcApi_WakeupHost(DeviceObject);

    return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
// Initialize the 2272 and endpoint 0.
DWORD
WINAPI
UfnPdd_Init(
    LPCTSTR                     pszActiveKey,
    PVOID                       pvMddContext,
    PUFN_MDD_INTERFACE_INFO     pMddInterfaceInfo,
    PUFN_PDD_INTERFACE_INFO     pPddInterfaceInfo
    )
{   
    static const UFN_PDD_INTERFACE_INFO sc_PddInterfaceInfo = {
        UFN_PDD_INTERFACE_VERSION,
        (UFN_PDD_CAPS_SUPPORTS_FULL_SPEED | UFN_PDD_CAPS_SUPPORTS_HIGH_SPEED),
        NCAPI_MAX_ENDPOINT_COUNT,
        NULL, // UfnPdd_Init corrects this later
        
        &UfnPdd_Deinit,
        &UfnPdd_IsConfigurationSupportable,
        &UfnPdd_IsEndpointSupportable,
        &UfnPdd_InitEndpoint,
        &UfnPdd_RegisterDevice,
        &UfnPdd_DeregisterDevice,
        &UfnPdd_Start,
        &UfnPdd_Stop,
        &UfnPdd_IssueTransfer,
        &UfnPdd_AbortTransfer,
        &UfnPdd_DeinitEndpoint,
        &UfnPdd_StallEndpoint,
        &UfnPdd_ClearEndpointStall,
        &UfnPdd_SendControlStatusHandshake,
        &UfnPdd_SetAddress,
        &UfnPdd_IsEndpointHalted,
        &UfnPdd_InitiateRemoteWakeup,
        &UfnPdd_PowerDown,
        &UfnPdd_PowerUp,
        &UfnPdd_IOControl,
    };
	HKEY hKey = NULL;
    PNC_DEVICE_OBJECT pNcDeviceObject = NULL;
	DWORD dwRet;
    PCEUFNPDD_CONTEXT pContext = NULL;

    hKey = OpenDeviceKey(pszActiveKey);
    if (!hKey) {
        dwRet = GetLastError();
        DEBUGMSG(ZONE_ERROR, (_T(" Could not open device key. Error: %d\r\n"), 
            dwRet));
        goto EXIT;        
    }

    // Allocate the driver Context, NetChip DeviceObject and TransferObjects
    pContext = (PCEUFNPDD_CONTEXT) LocalAlloc(LPTR, sizeof(CEUFNPDD_CONTEXT));
    pNcDeviceObject = (PNC_DEVICE_OBJECT) LocalAlloc(LPTR, sizeof(NC_DEVICE_OBJECT));
    
    pContext->pNcDeviceObject = pNcDeviceObject;
	pContext->pvMddContext = pvMddContext;
	pContext->pfnNotify = pMddInterfaceInfo->pfnNotify;

    pNcDeviceObject->ClientContext1 = pContext;

	pContext->hKey = hKey;

    // Initialize subsystems (interrupt, DMA, memory-mapped chip access)
    if (!System_InitializeSystem(pContext))
    {   // Failed to initialize system
        dwRet = ERROR_GEN_FAILURE;
		goto EXIT;
    }

    // USB speed and connection haven't been reported yet
    pContext->SpeedReported = FALSE;
	pContext->ConnectionReported = FALSE;

    // Call application's one-time initialization function
    //  - Upon completion, the firmware application should be able to process USB requests 
    //    under interrupt control.
    ASSERT(System_InterruptController(NCSYS_INTERRUPT_STATUS) == NCSYS_INTERRUPT_DISABLE);

    // Enable system interrupt controller
    System_InterruptController(NCSYS_INTERRUPT_ENABLE);

	memcpy(pPddInterfaceInfo, &sc_PddInterfaceInfo, sizeof(sc_PddInterfaceInfo));
    pPddInterfaceInfo->pvPddContext = pContext;

	dwRet = ERROR_SUCCESS;

EXIT:
    if (dwRet != ERROR_SUCCESS ) 
	{
		if (pContext != NULL)
			LocalFree(pContext);
		if (pNcDeviceObject != NULL)
			LocalFree(pNcDeviceObject);
    }

	if (hKey)
		RegCloseKey(hKey);

    return ERROR_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
BOOL
UfnPdd_DllEntry(
    HANDLE hDllHandle,
    DWORD  dwReason, 
    LPVOID lpReserved
    )
{    
    // Nothing to do.
    return TRUE;
}


///////////////////////////////////////////////////////////////////////////////
//  End of file
///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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