📄 hallow.c
字号:
// Read blocks of data from IMEM.
iHALblockTransfer( psHAL, SD_IO_OP_READ, HAL_SDIO_FUNCTION_1, psHAL->ulBlockSize,
ulNumBlocks, ulAddress, (PUCHAR)pulDest );
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALwriteMailbox
//
// PARAMETERS psHAL Pointer to HAL context.
// ulAddress Offset in Mailbox (0x2000-0x27FF).
// pulSource Pointer to the host memory.
// ulLength The number of bytes to write.
//
// RETURNS na
//
// DESCRIPTION This function is used to transfer blocks of memory from the
// host to the card Mailbox using the HAL.
//
//-----------------------------------------------------------------------------
VOID
vHALwriteMailbox( IN PHAL_CONTEXT psHAL, IN ULONG ulAddress, IN PULONG pulSource, IN ULONG ulLength )
{
ULONG ulNumBlocks, ulTotalBlockLength;
NTSTATUS iStatus = STATUS_SUCCESS;
// Address must be WORD aligned.
ASSERT ((ulAddress & 1) == 0);
// Get DWORD aligned length if not a WORD.
if ( ulLength != sizeof(USHORT) )
ulLength = ((ulLength + 3) >> 2) << 2;
ulNumBlocks = ulLength / psHAL->ulBlockSize;
ulTotalBlockLength = ulNumBlocks * psHAL->ulBlockSize;
if ( ulNumBlocks )
{
// Write blocks of data to Mailbox.
iStatus = iHALblockTransfer( psHAL, SD_IO_OP_WRITE, HAL_SDIO_FUNCTION_1, psHAL->ulBlockSize,
ulNumBlocks, ulAddress, (PUCHAR)pulSource );
}
ulLength -= ulTotalBlockLength;
if ( NT_SUCCESS(iStatus) && ulLength )
{
ulAddress += ulTotalBlockLength;
pulSource += (ulTotalBlockLength >> 2);
// Write a small block to Mailbox.
iStatus = iHALbyteTransfer( psHAL, SD_IO_OP_WRITE, HAL_SDIO_FUNCTION_1,
ulLength, ulAddress, (PUCHAR)pulSource );
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALreadMailbox
//
// PARAMETERS psHAL Pointer to HAL context.
// ulAddress Offset in Mailbox (0x2000-0x27FF).
// pulDest Pointer to the host memory.
// ulLength The number of bytes to read.
//
// RETURNS na
//
// DESCRIPTION This function is used to transfer blocks of memory from the
// card Mailbox to host using the HAL.
//
//-----------------------------------------------------------------------------
VOID
vHALreadMailbox( IN PHAL_CONTEXT psHAL, IN ULONG ulAddress, OUT PULONG pulDest, IN ULONG ulLength )
{
ULONG ulNumBlocks, ulTotalBlockLength;
NTSTATUS iStatus = STATUS_SUCCESS;
// Address must be WORD aligned.
ASSERT ((ulAddress & 1) == 0);
// Get DWORD aligned length if not a WORD.
if ( ulLength != sizeof(USHORT) )
ulLength = ((ulLength + 3) >> 2) << 2;
ulNumBlocks = ulLength / psHAL->ulBlockSize;
ulTotalBlockLength = ulNumBlocks * psHAL->ulBlockSize;
if ( ulNumBlocks )
{
// Read blocks of data from Mailbox.
iStatus = iHALblockTransfer( psHAL, SD_IO_OP_READ, HAL_SDIO_FUNCTION_1, psHAL->ulBlockSize,
ulNumBlocks, ulAddress, (PUCHAR)pulDest );
}
ulLength -= ulTotalBlockLength;
if ( NT_SUCCESS(iStatus) && ulLength )
{
ulAddress += ulTotalBlockLength;
pulDest += (ulTotalBlockLength >> 2);
// Read a small block from Mailbox.
iStatus = iHALbyteTransfer( psHAL, SD_IO_OP_READ, HAL_SDIO_FUNCTION_1,
ulLength, ulAddress, (PUCHAR)pulDest );
}
}
//-----------------------------------------------------------------------------
//
// NAME boHALacquireSemaphore
//
// PARAMETERS psHAL Pointer to HAL context.
// ulSemaphore Index of semaphore.
//
// RETURNS TRUE if successfully acquire semaphore, FALSE otherwise.
//
// DESCRIPTION This function is used to acquire semaphore.
//
//-----------------------------------------------------------------------------
BOOLEAN
boHALacquireSemaphore( IN PHAL_CONTEXT psHAL, IN ULONG ulSemaphore )
{
ULONG i=0, ulAddress, ulValue=0;
BOOLEAN boFlag = TRUE;
ulAddress = HAL_ADDR_mailbox_semaphore_0 + ulSemaphore;
ulValue = HAL_SEMAPHORE_HOST_SET;
SDReadWriteRegistersDirect( psHAL->psAdapter->hSDDeviceHandle, SD_IO_WRITE, HAL_SDIO_FUNCTION_1,
ulAddress, TRUE, (PUCHAR)&ulValue, sizeof(BYTE) );
while ( (ulValue & HAL_MASK_mailbox_semaphore) != HAL_SEMAPHORE_HOST_SET )
{
i ++;
NdisStallExecution( HAL_SEMAPHORE_DELAY );
if ( i > HAL_SEMAPHORE_TIMEOUT )
{
boFlag = FALSE;
break;
}
ulValue = HAL_SEMAPHORE_HOST_SET;
SDReadWriteRegistersDirect( psHAL->psAdapter->hSDDeviceHandle, SD_IO_WRITE, HAL_SDIO_FUNCTION_1,
ulAddress, TRUE, (PUCHAR)&ulValue, sizeof(BYTE) );
}
//DBG_LEV1(("Acquire semaphore %d, i = %d.\n", ulSemaphore, i));
return boFlag;
}
//-----------------------------------------------------------------------------
//
// NAME vHALreleaseSemaphore
//
// PARAMETERS psHAL Pointer to HAL context.
// ulSemaphore Index of semaphore.
//
// RETURNS na
//
// DESCRIPTION This function is used to release semaphore.
//
//-----------------------------------------------------------------------------
VOID
vHALreleaseSemaphore( IN PHAL_CONTEXT psHAL, IN ULONG ulSemaphore )
{
ULONG ulAddress;
UCHAR ucValue = HAL_SEMAPHORE_HOST_CLEAR;
ulAddress = HAL_ADDR_mailbox_semaphore_0 + ulSemaphore;
SDReadWriteRegistersDirect( psHAL->psAdapter->hSDDeviceHandle, SD_IO_WRITE, HAL_SDIO_FUNCTION_1,
ulAddress, FALSE, &ucValue, sizeof(BYTE) );
//DBG_LEV1(("Release semaphore %d.\n", ulSemaphore));
}
//-----------------------------------------------------------------------------
//
// NAME vHALreadCardCIS
//
// PARAMETERS psHAL Pointer to HAL context.
// pData Pointer to data buffer.
// ulLength Length of data to be read.
//
// RETURNS na
//
// DESCRIPTION Write configuration register to reset the device.
//
//-----------------------------------------------------------------------------
VOID
vHALreadCardCIS( IN PHAL_CONTEXT psHAL, IN PVOID pData, IN ULONG ulLength )
{
}
//-----------------------------------------------------------------------------
//
// NAME vHALsoftReset
//
// PARAMETERS psHAL Pointer to HAL context.
//
// RETURNS na
//
// DESCRIPTION Write configuration register to reset the device,
// or, if under Linux, request a pcmcia card reset.
//
//-----------------------------------------------------------------------------
VOID
vHALsoftReset( IN PHAL_CONTEXT psHAL )
{
PEND_CONTEXT psAdapter = psHAL->psAdapter;
ULONG ulAddress;
UCHAR ucValue = 0;
ulAddress = HAL_ADDR_cccr_io_abort;
// SD_API_STATUS iStatus;
// Disconnect interrupt.
SDIODisconnectInterrupt( psAdapter->hSDDeviceHandle );
/* Bsquare v1.1 (non-working) reset code, commented out below */
SDReadWriteRegistersDirect( psAdapter->hSDDeviceHandle, SD_IO_READ, HAL_SDIO_FUNCTION_0,
ulAddress, FALSE, &ucValue, sizeof(BYTE) );
ucValue |= (1 << HAL_BIT_io_abort_reset);
SDReadWriteRegistersDirect( psAdapter->hSDDeviceHandle, SD_IO_WRITE, HAL_SDIO_FUNCTION_0,
ulAddress, FALSE, &ucValue, sizeof(BYTE) );
}
//-----------------------------------------------------------------------------
//
// NAME vHALinterruptDevice
//
// PARAMETERS psHAL Pointer to HAL context.
// ulIntMask Interrupt bit mask.
// ulIntOffset Interrupt bit offset.
//
// RETURNS na
//
// DESCRIPTION Generate interrupt to device.
//
//-----------------------------------------------------------------------------
VOID
vHALinterruptDevice( IN PHAL_CONTEXT psHAL, IN ULONG ulIntMask, IN ULONG ulIntOffset )
{
ULONG ulValue = (ulIntMask << ulIntOffset);
vHALwriteRegister( psHAL, HAL_ADDR_interrupt_host_to_arm, ulValue );
}
//-----------------------------------------------------------------------------
//
// NAME vHALenableInterrupt
//
// PARAMETERS psHAL Pointer to HAL context.
//
// RETURNS na
//
// DESCRIPTION Enable device interrupt.
//
//-----------------------------------------------------------------------------
VOID
vHALenableInterrupt( IN PHAL_CONTEXT psHAL )
{
vHALwriteRegister( psHAL, HAL_ADDR_interrupt_enable_arm_to_host, HAL_MASK_interrupt_arm_to_host );
}
//-----------------------------------------------------------------------------
//
// NAME vHALdisableInterrupt
//
// PARAMETERS psHAL Pointer to HAL context.
//
// RETURNS na
//
// DESCRIPTION Disable device interrupt.
//
//-----------------------------------------------------------------------------
VOID
vHALdisableInterrupt( IN PHAL_CONTEXT psHAL )
{
vHALwriteRegister( psHAL, HAL_ADDR_interrupt_enable_arm_to_host, 0 );
}
/* End of file CFSD_NDhallow.c. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -