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

📄 hallow.c

📁 mx27 f14v2 源代码。包括ADS板上诸多驱动的源码。
💻 C
📖 第 1 页 / 共 2 页
字号:
		// 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 + -