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

📄 hspi.c

📁 SMDK2416_BSP
💻 C
📖 第 1 页 / 共 3 页
字号:

			while(((pSPIregs ->SPI_STATUS>>6) & 0x7f));
			while(!(pSPIregs ->SPI_STATUS & TX_DONE));

		}
		else		
		// POLLING + TX
		{
			RETAILMSG(1,(TEXT("[HSPI DD] Thread for TX : USE Polling (TxCount : %d) \r\n"), dwTxCount));

			if(pSpiPrivate->dwMode == SPI_MASTER_MODE) {
				pSPIregs->CH_CFG 	= pSpiPrivate->TxSPIregs.CH_CFG;
				pSPIregs->CLK_CFG 	= pSpiPrivate->TxSPIregs.CLK_CFG;
				pSPIregs->MODE_CFG  = pSpiPrivate->TxSPIregs.MODE_CFG;
			} else{
				pSPIregs->CH_CFG 	= pSpiPrivate->TxSPIregs.CH_CFG;
				pSPIregs->CLK_CFG 	= pSpiPrivate->TxSPIregs.CLK_CFG;
				pSPIregs->MODE_CFG  = pSpiPrivate->TxSPIregs.MODE_CFG;
			}
			pSPIregs->CH_CFG 		|=	TX_CH_ON;

			if(pSpiPrivate->dwMode == SPI_MASTER_MODE) 
			{
				RETAILMSG(1,(TEXT("[HSPI DD] Thread for TX : MASTER MODE \r\n")));
				MASTER_CS_ENABLE;
			}
			else
			{
				RETAILMSG(1,(TEXT("[HSPI DD] Thread for TX : SLAVE MODE \r\n")));
			}
			
			do
			{
				while(((pSPIregs ->SPI_STATUS>>6) & 0x7f)==FIFO_FULL);
				pSPIregs->SPI_TX_DATA = *(PBYTE)pSpiPrivate->pTxBuffer;
			} while(--pSpiPrivate->dwTxCount > 0 && ++(PBYTE)pSpiPrivate->pTxBuffer);

			while(((pSPIregs ->SPI_STATUS>>6) & 0x7f));
			while(!(pSPIregs ->SPI_STATUS & TX_DONE));

		}


		pSpiPrivate->dwTxCount = dwTestCount - pSpiPrivate->dwTxCount;
		
#ifdef TEST_MODE
		do
		{
			RETAILMSG(1,(TEXT("WRITE BYTE : %02X(dwTxCount : %d)\n"), *pTestBuffer, dwTestCount));
		} while( (--dwTestCount > 0) && ++pTestBuffer);
#endif

#if (BSP_TYPE == BSP_SMDK2443)

#elif (BSP_TYPE == BSP_SMDK2450)
		RETAILMSG(FALSE,(TEXT("[HSPI DD] TX_CH_OFF \n")));
		pSPIregs->CH_CFG 	&= ~TX_CH_ON;	
#endif
		if(pSpiPrivate->dwMode == SPI_MASTER_MODE)	
			MASTER_CS_DISABLE;
		
		UnMapPtr(pTxBuffer);
		SetProcPermissions(dwOldPerm);
		
		SetEvent(pSpiPublic->hTxDoneEvent);
		
	} while(TRUE);
	
	return 0;
}



DWORD ThreadForRx(PSPI_PUBLIC_CONTEXT pSpiPublic)
{
	volatile S3C2450_HSSPI_REG *pSPIregs   = pSpiPublic->pHSSPIregs;	// for HS-SPI
	volatile S3C2450_INTR_REG *pINTRregs = pSpiPublic->pINTRregs;
	volatile S3C2450_DMA_REG *pDMAregs   = pSpiPublic->pDMAregs;
	PSPI_PRIVATE_CONTEXT pSpiPrivate;
	DWORD 	dwRxCount;
	PBYTE 	pRxBuffer;
	DWORD 	dwOldPerm;
	
	PBYTE 	pTestBuffer;
	DWORD 	dwTestCount;
	
	do
	{
		WaitForSingleObject(pSpiPublic->hRxEvent, INFINITE);
		
		
		pSpiPrivate = (PSPI_PRIVATE_CONTEXT) pSpiPublic->pSpiPrivate;
		dwTestCount = dwRxCount = pSpiPrivate->dwRxCount;
		dwOldPerm = SetProcPermissions((DWORD)-1);
		pTestBuffer = pRxBuffer = (PBYTE) MapPtrToProcess(pSpiPrivate->pRxBuffer, (HANDLE) GetCurrentProcessId());

		RETAILMSG(1,(TEXT("pRxBuffer : 0x%X, dwRxCount : %d \r\n"), pRxBuffer, dwRxCount));

		//Reset
		pSPIregs->CH_CFG |= SW_RST;
		RETAILMSG(1,(TEXT("\n HS SPI reset\n")));
		pSPIregs->CH_CFG &= ~SW_RST;
		
	
		if(pSpiPrivate->dwMode == SPI_MASTER_MODE) 
		{
			RETAILMSG(1,(TEXT("[HSPI DD] Thread for RX : MASTER MODE \r\n")));
			MASTER_CS_ENABLE;
		}
		else
			RETAILMSG(1,(TEXT("[HSPI DD] Thread for RX : SLAVE MODE \r\n")));


		if(pSpiPrivate->bUseRxIntr)
		//INT Mode + RX	
		{
			RETAILMSG(1,(TEXT("[HSPI DD] Thread for RX : USE INT \r\n")));
			pSpiPrivate->State = STATE_RXINTR;
/*			
			if(pSpiPrivate->dwMode == SPI_MASTER_MODE) 
			{
				pSPIregs->CH_CFG 	= 0x0;
				pSPIregs->CLK_CFG  	= pSpiPrivate->RxSPIregs.CLK_CFG;	
				//pSPIregs->MODE_CFG	=	(0x8<<11) |(0x8<<5);
				//pSPIregs->MODE_CFG	=	(0x3ff<<19)|(0x8<<11) |(0x8<<5);
				pSPIregs->MODE_CFG	=	(0x3ff<<19)|(RX_TRIG_LEVEL<<11);
				pSPIregs->SP_INT_EN	=	(1<<6);
			}
			else 
			{
				pSPIregs->CH_CFG 	= (0x1<<4);
				pSPIregs->CLK_CFG  	= pSpiPrivate->RxSPIregs.CLK_CFG;			
				//pSPIregs->MODE_CFG	= (0x8<<11) |(0x14<<5);
				pSPIregs->MODE_CFG	= (RX_TRIG_LEVEL<<11);
			}
			// INT
			pSPIregs->PENDING_CLR_REG	|=	0xffffffff;
			pSPIregs->SP_INT_EN			|=	(1<<1);
			pSPIregs->CH_CFG			|= 	(1<<1);	
			RETAILMSG(1,(TEXT("CH_CFG : 0x%08X, pSPIregs->MODE_CFG 0x%08X, SPI_STATUS : 0x%08X\n"),pSPIregs->CH_CFG, pSPIregs->MODE_CFG, pSPIregs->SPI_STATUS));	

			WaitForSingleObject(pSpiPublic->hRxIntrDoneEvent, INFINITE);
*/
		}
		
		else if(pSpiPrivate->bUseRxDMA)
		//DMA Mode + Rx
		{
			DWORD dwDmaLen	= (pSpiPrivate->dwRxCount & 0xFFFFF);

			RETAILMSG(1,(TEXT("[HSPI DD] Thread for RX : USE DMA \r\n")));

			pSpiPrivate->State = STATE_RXDMA;
			VirtualCopy((PVOID)pSpiPrivate->pRxBuffer, (PVOID)((ULONG) pSpiPrivate->pRxDMABuffer>>8), sizeof(dwRxCount), PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);

			//Reset
			if(pSpiPrivate->dwMode == SPI_MASTER_MODE) {
				pSPIregs->CH_CFG 	= pSpiPrivate->RxSPIregs.CH_CFG;
				pSPIregs->CLK_CFG  	= pSpiPrivate->RxSPIregs.CLK_CFG;
				pSPIregs->MODE_CFG  = pSpiPrivate->RxSPIregs.MODE_CFG;
				pSPIregs->PACKET_COUNT_REG = PACKET_CNT_EN | (pSpiPrivate->dwRxCount) ;
			} else {
				pSPIregs->CH_CFG 	= pSpiPrivate->RxSPIregs.CH_CFG;
				pSPIregs->CLK_CFG  	= pSpiPrivate->RxSPIregs.CLK_CFG;
				pSPIregs->MODE_CFG  = pSpiPrivate->RxSPIregs.MODE_CFG;
			}	
			
			if(dwDmaLen > 0)
			{
				pSPIregs->MODE_CFG		|=	RX_DMA_ON|DMA_SINGLE;
				pSPIregs->CH_CFG 		|=	RX_CH_ON;
				
				pDMAregs->DISRC3      	= (UINT)SPI_RX_DATA_PHY_ADDR;
				pDMAregs->DISRCC3     	= (SOURCE_PERIPHERAL_BUS | FIXED_SOURCE_ADDRESS); 
				pDMAregs->DIDST3      	= (UINT)pSpiPrivate->pRxDMABuffer;
				pDMAregs->DIDSTC3     	= ~(DESTINATION_PERIPHERAL_BUS | FIXED_DESTINATION_ADDRESS); 
//				pDMAregs->DCON3  		= HANDSHAKE_MODE |GENERATE_INTERRUPT |PADDRFIX |NO_DMA_AUTO_RELOAD | dwDmaLen;
				pDMAregs->DCON3  		= HANDSHAKE_MODE |GENERATE_INTERRUPT |NO_DMA_AUTO_RELOAD | dwDmaLen;
				pDMAregs->DMAREQSEL3 	= ( DMAREQSEL_SPI_0RX | DMA_TRIGGERED_BY_HARDWARE );	
				pDMAregs->DMASKTRIG3 	= ENABLE_DMA_CHANNEL;

				WaitForSingleObject(pSpiPublic->hRxDmaDoneDoneEvent, INFINITE);

				pSpiPrivate->dwRxCount -= dwDmaLen;
				pSpiPrivate->pRxBuffer = (PBYTE) (((PUINT) pSpiPrivate->pRxBuffer) + dwDmaLen);
			}
			VirtualFree((PVOID)pRxBuffer, 0, MEM_RELEASE);
		}
		else
		{
		//POLLING Mode + RX
			RETAILMSG(1,(TEXT("[HSPI DD] Thread for TX : USE Polling (TxCount : %d) \r\n"), dwRxCount));

			if(pSpiPrivate->dwMode == SPI_MASTER_MODE) {
				pSPIregs->CH_CFG 	= pSpiPrivate->RxSPIregs.CH_CFG;
				pSPIregs->CLK_CFG 	= pSpiPrivate->RxSPIregs.CLK_CFG;
				pSPIregs->MODE_CFG  = pSpiPrivate->RxSPIregs.MODE_CFG;
				pSPIregs->PACKET_COUNT_REG = PACKET_CNT_EN | (pSpiPrivate->dwRxCount) ;
			} else{ 
				pSPIregs->CH_CFG 	= pSpiPrivate->RxSPIregs.CH_CFG;
				pSPIregs->CLK_CFG 	= pSpiPrivate->RxSPIregs.CLK_CFG;
				pSPIregs->MODE_CFG  = pSpiPrivate->RxSPIregs.MODE_CFG;
			}

			pSPIregs->CH_CFG 	|= RX_CH_ON;	

			do
			{
				while (((pSPIregs ->SPI_STATUS>>13)&0x7f)==FIFO_EMPTY);
				 *(PBYTE)pSpiPrivate->pRxBuffer = pSPIregs->SPI_RX_DATA;
			} while(--pSpiPrivate->dwRxCount > 0 && ++(PBYTE)pSpiPrivate->pRxBuffer);

			//RETAILMSG(1,(TEXT("[Test]  STATUS  0x%X  \r\n"),pSPIregs ->SPI_STATUS));
		}
		
		pSpiPrivate->dwRxCount = dwTestCount - pSpiPrivate->dwRxCount;

#ifdef TEST_MODE
		do
		{
			RETAILMSG(1,(TEXT("READ BYTE : %02X(dwRxCount %d)\n"), *pTestBuffer, dwTestCount));
		} while((--dwTestCount > 0) && ++pTestBuffer);
#endif

#if (BSP_TYPE == BSP_SMDK2443)

#elif (BSP_TYPE == BSP_SMDK2450)
		RETAILMSG(FALSE,(TEXT("[HSPI DD] RX_CH_OFF \n")));
		pSPIregs->CH_CFG 	&= ~RX_CH_ON;	
#endif
		if(pSpiPrivate->dwMode == SPI_MASTER_MODE)
			MASTER_CS_DISABLE;
		
		UnMapPtr(pRxBuffer);
		SetProcPermissions(dwOldPerm);
		
		SetEvent(pSpiPublic->hRxDoneEvent);
		
	} while(TRUE);
	
	return 0;
}


DWORD ThreadForSpi(PSPI_PUBLIC_CONTEXT pSpiPublic)
{
	volatile S3C2450_HSSPI_REG *pSPIregs  = pSpiPublic->pHSSPIregs;		// for HS-SPI
	PSPI_PRIVATE_CONTEXT pSpiPrivate;
//	DWORD 	dwRxCount;
//	DWORD 	dwTxCount;
	DWORD	dwOldPerm;

	RETAILMSG(1,(TEXT("ThreadForSpi thread is created \r\n")));
	do
	{
		WaitForSingleObject(pSpiPublic->hSpiEvent, INFINITE);

		pSpiPrivate = (PSPI_PRIVATE_CONTEXT) pSpiPublic->pSpiPrivate;		
		dwOldPerm = SetProcPermissions((DWORD)-1);

/*
		if((pSPIregs ->SPI_STATUS>>20) & 0x1) {
			pSPIregs->PENDING_CLR_REG |= (1<<0);
			RETAILMSG(1,(TEXT("Time out event is occurred \r\n")));
			goto END_POINT;
		}


		if(pSpiPrivate->State == STATE_RXINTR)
		{ 

		}

		else if(pSpiPrivate->State == STATE_TXINTR)
		{


			RETAILMSG(1,(TEXT("STATE_TXINTR  %d \r\n"),pSpiPrivate->dwTxCount ));
			
			

#if 1
			dwTxCount = FIFO_SIZE -((pSPIregs ->SPI_STATUS>>6) & 0x7f) ;
			//RETAILMSG(1,(TEXT("dwTxCount = FIFO_SIZE -((pSPIregs ->SPI_STATUS>>6) & 0x7f) ;  %d \r\n"),dwTxCount));
			do
			{
				pSPIregs->SPI_TX_DATA = *(PBYTE)pSpiPrivate->pTxBuffer;
//			} while(--pSpiPrivate->dwTxCount > 0 && ++(PBYTE)pSpiPrivate->pTxBuffer && --dwTxCount > 0);
			} while(--pSpiPrivate->dwTxCount > FIFO_SIZE && ++(PBYTE)pSpiPrivate->pTxBuffer && --dwTxCount > 0);

			if(pSpiPrivate->dwTxCount ==0)
				SetEvent(pSpiPublic->hTxIntrDoneEvent);

#else
			dwTxCount = FIFO_SIZE - TX_TRIG_LEVEL;
			do
			{
				pSPIregs->SPI_TX_DATA = *(PBYTE)pSpiPrivate->pTxBuffer;
			} while(--pSpiPrivate->dwTxCount > 0 && ++(PBYTE)pSpiPrivate->pTxBuffer && --dwTxCount > 0);

			if(pSpiPrivate->dwTxCount ==0)
				SetEvent(pSpiPublic->hTxIntrDoneEvent);
#endif
		}

		else 
		{
			RETAILMSG(1,(TEXT("UNSOLVED OPERATION\n")));
		}

		
END_POINT:
*/		
		SetProcPermissions(dwOldPerm);
		InterruptDone(pSpiPublic->dwSpiSysIntr);
	} while(TRUE);
	return 0;
}


DWORD ThreadForRxDmaDone(PSPI_PUBLIC_CONTEXT pSpiPublic)
{
//	volatile S3C2450_SPI_REG 	*pSPIregs   	= pSpiPublic->pSPIregs;
//	PSPI_PRIVATE_CONTEXT 	pSpiPrivate;
//	DWORD					dwOldPerm;
//	volatile S3C2450_DMA_REG *pDMAregs   = pSpiPublic->pDMAregs;	
	do
	{
		WaitForSingleObject(pSpiPublic->hRxDmaDoneEvent, INFINITE);
		
		SetEvent(pSpiPublic->hRxDmaDoneDoneEvent);
		InterruptDone(pSpiPublic->dwRxDmaDoneSysIntr);
	} while(TRUE);
	return 0;
}

DWORD ThreadForTxDmaDone(PSPI_PUBLIC_CONTEXT pSpiPublic)
{
//	volatile S3C2450_SPI_REG 	*pSPIregs   	= pSpiPublic->pSPIregs;
//	PSPI_PRIVATE_CONTEXT 	pSpiPrivate;
//	DWORD					dwOldPerm;
//	volatile S3C2450_DMA_REG *pDMAregs   = pSpiPublic->pDMAregs;
	do
	{
		WaitForSingleObject(pSpiPublic->hTxDmaDoneEvent, INFINITE);
		
		SetEvent(pSpiPublic->hTxDmaDoneDoneEvent);
		InterruptDone(pSpiPublic->dwTxDmaDoneSysIntr);
	} while(TRUE);
	return 0;
}

void HSP_PowerDown (DWORD dwContext) 
{
	return;
}

void HSP_Deinit (DWORD dwContext) 
{
	return;
}

void HSP_PowerUp (DWORD dwContext) 
{
	return;
}

BOOL HSP_Close (DWORD dwOpen) 
{
	return TRUE;
}

DWORD HSP_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
	return 0;
}


⌨️ 快捷键说明

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