📄 ncufnpdd.c
字号:
// 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 + -