qspipsu_v1_1: Modified the code according to Misrac 2012.

This patch modifies the code according to Misrac 2012.

Signed-off-by: P L Sai Krishna <lakshmis@xilinx.com>
This commit is contained in:
P L Sai Krishna 2015-05-06 15:58:43 +05:30 committed by Nava kishore Manne
parent 1dd455366e
commit dcf79611f8
3 changed files with 35 additions and 35 deletions

View file

@ -144,6 +144,7 @@ s32 XQspiPsu_CfgInitialize(XQspiPsu *InstancePtr, XQspiPsu_Config *ConfigPtr,
InstancePtr->GenFifoCS = XQSPIPSU_GENFIFO_CS_LOWER;
InstancePtr->GenFifoBus = XQSPIPSU_GENFIFO_BUS_LOWER;
InstancePtr->IsUnaligned = 0;
InstancePtr->IsManualstart = TRUE;
/* Select QSPIPSU */
XQspiPsu_Select(InstancePtr);
@ -340,11 +341,11 @@ s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
u32 StatusReg;
u32 ConfigReg;
s32 Index;
u8 IsManualStart;
u32 QspiPsuStatusReg, DmaStatusReg;
u32 BaseAddress;
s32 Status;
s32 RxThr;
u32 IOPending = (u32)FALSE;
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
@ -373,9 +374,6 @@ s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
BaseAddress = InstancePtr->Config.BaseAddress;
/* Start if manual start */
IsManualStart = XQspiPsu_IsManualStart(InstancePtr);
/* Enable */
XQspiPsu_Enable(InstancePtr);
@ -383,12 +381,11 @@ s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
XQspiPsu_GenFifoEntryCSAssert(InstancePtr);
/* list */
for (Index = 0; Index < (s32)NumMsg; Index++) {
GENFIFO:
Index = 0;
while (Index < (s32)NumMsg) {
XQspiPsu_GenFifoEntryData(InstancePtr, Msg, Index);
if (IsManualStart == TRUE) {
if (InstancePtr->IsManualstart == TRUE) {
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_CFG_OFFSET,
XQspiPsu_ReadReg(BaseAddress,
XQSPIPSU_CFG_OFFSET) |
@ -432,7 +429,8 @@ GENFIFO:
Msg[Index].RxBfrPtr += (InstancePtr->RxBytes -
(InstancePtr->RxBytes % 4));
InstancePtr->IsUnaligned = 1;
goto GENFIFO;
IOPending = (u32)TRUE;
break;
}
InstancePtr->RxBytes = 0;
}
@ -460,7 +458,7 @@ GENFIFO:
((QspiPsuStatusReg & XQSPIPSU_ISR_TXEMPTY_MASK) == FALSE) ||
(InstancePtr->RxBytes != 0));
if(InstancePtr->IsUnaligned != 0) {
if((InstancePtr->IsUnaligned != 0) && (IOPending == (u32)FALSE)) {
InstancePtr->IsUnaligned = 0;
XQspiPsu_WriteReg(BaseAddress,
XQSPIPSU_CFG_OFFSET, (XQspiPsu_ReadReg(
@ -469,12 +467,18 @@ GENFIFO:
XQSPIPSU_CFG_MODE_EN_DMA_MASK));
InstancePtr->ReadMode = XQSPIPSU_READMODE_DMA;
}
if (IOPending == (u32)TRUE) {
IOPending = (u32)FALSE;
} else {
Index++;
}
}
/* De-select slave */
XQspiPsu_GenFifoEntryCSDeAssert(InstancePtr);
if (IsManualStart == TRUE) {
if (InstancePtr->IsManualstart == TRUE) {
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_CFG_OFFSET,
XQspiPsu_ReadReg(BaseAddress, XQSPIPSU_CFG_OFFSET) |
XQSPIPSU_CFG_START_GEN_FIFO_MASK);
@ -520,7 +524,6 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
u32 StatusReg;
u32 ConfigReg;
s32 Index;
u8 IsManualStart;
u32 BaseAddress;
s32 Status;
@ -551,9 +554,6 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
BaseAddress = InstancePtr->Config.BaseAddress;
/* Start if manual start */
IsManualStart = XQspiPsu_IsManualStart(InstancePtr);
InstancePtr->Msg = Msg;
InstancePtr->NumMsg = (s32)NumMsg;
InstancePtr->MsgCnt = 0;
@ -568,7 +568,7 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
/* Put first message in FIFO along with the above slave select */
XQspiPsu_GenFifoEntryData(InstancePtr, Msg, 0);
if (IsManualStart == TRUE) {
if (InstancePtr->IsManualstart == TRUE) {
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_CFG_OFFSET,
XQspiPsu_ReadReg(BaseAddress, XQSPIPSU_CFG_OFFSET) |
XQSPIPSU_CFG_START_GEN_FIFO_MASK);
@ -604,7 +604,6 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
******************************************************************************/
s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
{
u8 IsManualStart;
u32 QspiPsuStatusReg, DmaIntrStatusReg = 0;
u32 BaseAddress;
XQspiPsu_Msg *Msg;
@ -622,9 +621,6 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
NumMsg = InstancePtr->NumMsg;
MsgCnt = InstancePtr->MsgCnt;
/* Start if manual start */
IsManualStart = XQspiPsu_IsManualStart(InstancePtr);
/* QSPIPSU Intr cleared on read */
QspiPsuStatusReg = XQspiPsu_ReadReg(BaseAddress, XQSPIPSU_ISR_OFFSET);
if (InstancePtr->ReadMode == XQSPIPSU_READMODE_DMA) {
@ -679,7 +675,7 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
InstancePtr->IsUnaligned = 1;
XQspiPsu_GenFifoEntryData(InstancePtr, Msg,
MsgCnt);
if(IsManualStart == TRUE) {
if(InstancePtr->IsManualstart == TRUE) {
XQspiPsu_WriteReg(BaseAddress,
XQSPIPSU_CFG_OFFSET,
XQspiPsu_ReadReg(BaseAddress,
@ -752,7 +748,7 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
/* This might not work if not manual start */
XQspiPsu_GenFifoEntryData(InstancePtr, Msg, MsgCnt);
if (IsManualStart == TRUE) {
if (InstancePtr->IsManualstart == TRUE) {
XQspiPsu_WriteReg(BaseAddress,
XQSPIPSU_CFG_OFFSET,
XQspiPsu_ReadReg(BaseAddress,
@ -767,7 +763,7 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
/* De-select slave */
XQspiPsu_GenFifoEntryCSDeAssert(InstancePtr);
if (IsManualStart == TRUE) {
if (InstancePtr->IsManualstart == TRUE) {
XQspiPsu_WriteReg(BaseAddress,
XQSPIPSU_CFG_OFFSET,
XQspiPsu_ReadReg(BaseAddress,
@ -1011,7 +1007,7 @@ static inline void XQspiPsu_FillTxFifo(XQspiPsu *InstancePtr,
Xil_AssertVoid(Msg->TxBfrPtr != NULL);
while ((InstancePtr->TxBytes > 0) && (Count < Size)) {
Data = *((u32*)(Msg->TxBfrPtr));
Data = *((u32 *)((void *)(Msg->TxBfrPtr)));
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress,
XQSPIPSU_TXD_OFFSET, Data);
Msg->TxBfrPtr += 4;
@ -1245,19 +1241,16 @@ static inline void XQspiPsu_ReadRxFifo(XQspiPsu *InstancePtr,
Data = XQspiPsu_ReadReg(InstancePtr->
Config.BaseAddress, XQSPIPSU_RXD_OFFSET);
if (InstancePtr->RxBytes >= 4) {
*(u32 *)Msg->RxBfrPtr = Data;
(void)memcpy(Msg->RxBfrPtr, &Data, 4);
InstancePtr->RxBytes -= 4;
Msg->RxBfrPtr += 4;
Count += 4;
} else {
/* Read unaligned bytes (< 4 bytes) */
while (InstancePtr->RxBytes != 0) {
*Msg->RxBfrPtr = (u8)Data;
InstancePtr->RxBytes--;
Msg->RxBfrPtr += 1;
Count++;
Data >>= (u32)8;
}
(void)memcpy(Msg->RxBfrPtr, &Data, InstancePtr->RxBytes);
Msg->RxBfrPtr += InstancePtr->RxBytes;
Count += InstancePtr->RxBytes;
InstancePtr->RxBytes = 0;
}
}
}

View file

@ -127,7 +127,7 @@ extern "C" {
* requested if the status event indicates an error.
*/
typedef void (*XQspiPsu_StatusHandler) (void *CallBackRef, u32 StatusEvent,
unsigned ByteCount);
u32 ByteCount);
/**
* This typedef contains configuration information for a flash message.
@ -173,6 +173,7 @@ typedef struct {
s32 NumMsg;
s32 MsgCnt;
s32 IsUnaligned;
u8 IsManualstart;
XQspiPsu_Msg *Msg;
XQspiPsu_StatusHandler StatusHandler;
void *StatusRef; /**< Callback reference for status handler */
@ -229,8 +230,6 @@ typedef struct {
#define XQspiPsu_Disable(InstancePtr) XQspiPsu_Out32(((InstancePtr)->Config.BaseAddress) + XQSPIPSU_EN_OFFSET, 0x0U)
#define XQspiPsu_IsManualStart(InstancePtr) (((XQspiPsu_GetOptions(InstancePtr) & XQSPIPSU_MANUAL_START_OPTION) != FALSE) ? TRUE : FALSE)
/************************** Function Prototypes ******************************/
/* Initialization and reset */

View file

@ -144,6 +144,10 @@ s32 XQspiPsu_SetOptions(XQspiPsu *InstancePtr, u32 Options)
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPSU_CFG_OFFSET,
ConfigReg);
if ((Options & XQSPIPSU_MANUAL_START_OPTION) != FALSE) {
InstancePtr->IsManualstart = TRUE;
}
Status = XST_SUCCESS;
}
@ -212,6 +216,10 @@ s32 XQspiPsu_ClearOptions(XQspiPsu *InstancePtr, u32 Options)
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPSU_CFG_OFFSET,
ConfigReg);
if ((Options & XQSPIPSU_MANUAL_START_OPTION) != FALSE) {
InstancePtr->IsManualstart = FALSE;
}
Status = XST_SUCCESS;
}