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