📄 fifo_if.c
字号:
{
LONG retValue;
ULONG wFIFODataCount;
UCHAR bTemp[2];
retValue = STATUS_SUCCESS;
while (1) {
if (number >= MAX_FIFO) {
/* Specified the FIFO when it cannot be specified */
retValue = STATUS_INVALID_PARAMETER;
break;
}
*pRemain = 0;
if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
if ((RegRead(REG08_MediaFIFO_Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
/* For DMA0,DMA1 not Joined */
RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd); /* Select EP0 JoinCPU_Rd */
bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
do {
bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
} while (!(wFIFODataCount & RD_REMAIN_VALID_MASK));
wFIFODataCount &= ~RD_REMAIN_VALID_MASK;
RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd); /* Clear EP0 JoinCPU_Rd */
/* Return the number of bytes that exists in FIFO*/
*pRemain = wFIFODataCount;
}
break;
}
if (number == 0) {
if ((RegRead(REG08_D_EP0Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
/* For DMA0,DMA1 not Joined */
RegSet(REG08_D_EP0Join,BIT_JoinCPU_Rd); /* Select EP0 JoinCPU_Rd */
bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
do {
bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
} while (!(wFIFODataCount & RD_REMAIN_VALID_MASK));
wFIFODataCount &= ~RD_REMAIN_VALID_MASK;
RegClear(REG08_D_EP0Join,BIT_JoinCPU_Rd); /* Clear EP0 JoinCPU_Rd */
/* Return the number of bytes that exists in FIFO */
*pRemain = wFIFODataCount;
}
} else {
if ((RegRead(REG08_D_EPxJoin(number - 1)) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
/* For JoinIDE,DMA0,DMA1 not Joined */
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd); /* Select EPa,EPb,EPc */
bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
do {
bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
} while (!(wFIFODataCount & RD_REMAIN_VALID_MASK));
wFIFODataCount &= ~RD_REMAIN_VALID_MASK;
RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd); /* Clear EPa,EPb,EPc JoinCPU_Rd */
/* Return the number of bytes that exists in FIFO */
*pRemain = wFIFODataCount;
}
}
break;};
return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IF_FIFOWrRemain
// description : Return the number which can be written to FIFO.
// argument : number End point number
// pRemain Pointer to return can be written number
// return : STATUS_SUCCESS Terminated normally
// STATUS_NOT_OPENED Not opened
// STATUS_INVALID_PARAMETER Parameter error
// flag :
// global :
// =============================================================================
*/
LONG FIFO_IF_FIFOWrRemain(UCHAR number,ULONG *pRemain)
{
LONG retValue;
ULONG wFIFODataCount;
UCHAR bTemp[2];
retValue = STATUS_SUCCESS;
while (1) {
if (number >= MAX_FIFO) {
/* Specified the FIFO when it cannot be specified */
retValue = STATUS_INVALID_PARAMETER;
break;
}
*pRemain = 0;
if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
if ((RegRead(REG08_MediaFIFO_Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
/* For DMA0,DMA1 not Joined */
RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr); /* Select EP0 */
bTemp[1] = RegRead(REG08_FIFO_WrRemain_H);
bTemp[0] = RegRead(REG08_FIFO_WrRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr); /* Select EP0 */
/* Return the number of bytes that exists in FIFO */
*pRemain = wFIFODataCount;
}
break;
}
if (number == 0) {
if ((RegRead(REG08_D_EP0Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
/* For DMA0,DMA1 not Join */
RegSet(REG08_D_EP0Join,BIT_JoinCPU_Wr); /* Select EP0 JoinCPU_Rd */
bTemp[1] = RegRead(REG08_FIFO_WrRemain_H);
bTemp[0] = RegRead(REG08_FIFO_WrRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
RegClear(REG08_D_EP0Join,BIT_JoinCPU_Wr); /* Select EP0 */
/* Return the number of bytes that exists in FIFO */
*pRemain = wFIFODataCount;
}
} else {
if ((RegRead(REG08_D_EPxJoin(number - 1)) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
/* For JoinIDE,DMA0,DMA1 not Join */
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Wr); /* Select EPa,EPb,EPc */
bTemp[1] = RegRead(REG08_FIFO_WrRemain_H);
bTemp[0] = RegRead(REG08_FIFO_WrRemain_L);
wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Wr); /* Clear EPa,EPb,EPc */
/* Return the number of bytes that exists in FIFO */
*pRemain = wFIFODataCount;
}
}
break;};
return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IF_FIFOClear
// description : Clear the specified FIFO
// argument : number FIFO number
// return : STATUS_SUCCESS Terminated normally
// STATUS_NOT_OPENED Not opened
// STATUS_INVALID_PARAMETER Parameter error
// flag :
// global :
// =============================================================================
*/
LONG FIFO_IF_FIFOClear(UCHAR number)
{
LONG retValue;
retValue = STATUS_SUCCESS;
while (1) {
if (number >= MAX_FIFO) {
/* Specified the FIFO when it cannot be specified */
retValue = STATUS_INVALID_PARAMETER;
break;
}
if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
RegWrite(REG08_MediaFIFO_Control,BIT_MediaFIFO_Clr);
break;
}
if (number == 0) {
RegWrite(REG08_D_EPnControl,BIT_EP0FIFO_Clr); /* EP0 FIFO Clear */
} else {
RegWrite(REG08_D_EPrFIFO_Clr,1 << (number - 1)); /* EPa,EPb,EPc FIFO Clear */
}
sFifoInfo[number].ByteAccess = 0;
break;};
return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IF_FIFOAllClear
// description : Clear all FIFO
// argument : None
// return : STATUS_SUCCESS Terminated normally
// STATUS_NOT_OPENED Not opened
// flag :
// global :
// =============================================================================
*/
LONG FIFO_IF_FIFOAllClear(void)
{
LONG retValue;
UCHAR i;
retValue = STATUS_SUCCESS;
while (1) {
/* Clear FIFO of all end point */
RegWrite(REG08_D_EPnControl,BIT_AllFIFO_Clr);
RegWrite(REG08_MediaFIFO_Control,BIT_MediaFIFO_Clr);
for (i = 0;i < MAX_FIFO;i++) {
sFifoInfo[i].ByteAccess = 0;
}
break;};
return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IFGetFIFO_Join
// description : Examine the bit that Joined to FIFO
// argument : number FIFO number
// pJoin Joined bit
// return : STATUS_SUCCESS Terminated normally
// STATUS_NOT_OPENED Not opened
// STATUS_INVALID_PARAMETER Parameter error
// flag :
// global :
// =============================================================================
*/
LONG FIFO_IFGetFIFO_Join(UCHAR number,UCHAR *pJoin)
{
LONG retValue;
retValue = STATUS_SUCCESS;
while (1) {
if (number >= MAX_FIFO) {
/* Specified the FIFO when it cannot be specified */
retValue = STATUS_INVALID_PARAMETER;
break;
}
*pJoin = 0x00;
if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinIDE)) {
*pJoin |= FIFO_IF_JOIN_IDE;
}
if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinDMA0)) {
*pJoin |= FIFO_IF_JOIN_DMA0;
}
if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinDMA1)) {
*pJoin |= FIFO_IF_JOIN_DMA1;
}
if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinCPU_Rd)) {
*pJoin |= FIFO_IF_JOIN_CPU_RD;
}
if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinCPU_Wr)) {
*pJoin |= FIFO_IF_JOIN_CPU_WR;
}
break;
}
if (number == 0) {
if ((RegRead(REG08_D_EP0Join) & MASK_JoinDMA0)) {
*pJoin |= FIFO_IF_JOIN_DMA0;
}
if ((RegRead(REG08_D_EP0Join) & MASK_JoinDMA1)) {
*pJoin |= FIFO_IF_JOIN_DMA1;
}
if ((RegRead(REG08_D_EP0Join) & MASK_JoinCPU_Rd)) {
*pJoin |= FIFO_IF_JOIN_CPU_RD;
}
if ((RegRead(REG08_D_EP0Join) & MASK_JoinCPU_Wr)) {
*pJoin |= FIFO_IF_JOIN_CPU_WR;
}
} else {
if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinIDE)) {
*pJoin |= FIFO_IF_JOIN_IDE;
}
if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinFIFO_Stat)) {
*pJoin |= FIFO_IF_JOIN_STAT;
}
if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinDMA0)) {
*pJoin |= FIFO_IF_JOIN_DMA0;
}
if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinDMA1)) {
*pJoin |= FIFO_IF_JOIN_DMA1;
}
if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinCPU_Rd)) {
*pJoin |= FIFO_IF_JOIN_CPU_RD;
}
if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinCPU_Wr)) {
*pJoin |= FIFO_IF_JOIN_CPU_WR;
}
}
break;};
return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IFSetFIFO_Join
// description : Specify the Join of FIFO
// argument : number FIFO number
// Join Bit mask to join
// flag Specify set/clear
// return : STATUS_SUCCESS Terminated normally
// STATUS_NOT_OPENED Not opened
// STATUS_INVALID_PARAMETER Parameter error
// flag :
// global :
// =============================================================================
*/
LONG FIFO_IFSetFIFO_Join(UCHAR number,UCHAR join,UCHAR flag)
{
LONG retValue;
retValue = STATUS_SUCCESS;
while (1) {
if (number >= MAX_FIFO) {
/* Specified the FIFO when it cannot be specified */
retValue = STATUS_INVALID_PARAMETER;
break;
}
if (!(flag == 0 || flag == 1)) {
retValue = STATUS_INVALID_PARAMETER;
break;
}
if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
if (IS_BIT(join,FIFO_IF_JOIN_IDE) == TRUE) {
if (flag == 1) {
RegSet(REG08_MediaFIFO_Join,BIT_JoinIDE);
} else {
RegClear(REG08_MediaFIFO_Join,BIT_JoinIDE);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_DMA0) == TRUE) {
if (flag == 1) {
RegSet(REG08_MediaFIFO_Join,BIT_JoinDMA0);
} else {
RegClear(REG08_MediaFIFO_Join,BIT_JoinDMA0);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_DMA1) == TRUE) {
if (flag == 1) {
RegSet(REG08_MediaFIFO_Join,BIT_JoinDMA1);
} else {
RegClear(REG08_MediaFIFO_Join,BIT_JoinDMA1);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_CPU_RD) == TRUE) {
if (flag == 1) {
RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd);
} else {
RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_CPU_WR) == TRUE) {
if (flag == 1) {
RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr);
} else {
RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr);
}
}
if (flag == 1 && RegRead(REG08_MediaFIFO_Join) != join) {
/* For can not Join */
retValue = STATUS_INVALID_PARAMETER;
break;
}
break;
}
if (number == 0) {
if (IS_BIT(join,FIFO_IF_JOIN_DMA0) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EP0Join,BIT_JoinDMA0);
} else {
RegClear(REG08_D_EP0Join,BIT_JoinDMA0);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_DMA1) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EP0Join,BIT_JoinDMA1);
} else {
RegClear(REG08_D_EP0Join,BIT_JoinDMA1);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_CPU_RD) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EP0Join,BIT_JoinCPU_Rd);
} else {
RegClear(REG08_D_EP0Join,BIT_JoinCPU_Rd);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_CPU_WR) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EP0Join,BIT_JoinCPU_Wr);
} else {
RegClear(REG08_D_EP0Join,BIT_JoinCPU_Wr);
}
}
if (flag == 1 && RegRead(REG08_D_EP0Join) != join) {
/* For can not Join */
retValue = STATUS_INVALID_PARAMETER;
break;
}
} else {
if (IS_BIT(join,FIFO_IF_JOIN_IDE) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinIDE);
} else {
RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinIDE);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_STAT) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinFIFO_Stat);
} else {
RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinFIFO_Stat);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_DMA0) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinDMA0);
} else {
RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinDMA0);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_DMA1) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinDMA1);
} else {
RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinDMA1);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_CPU_RD) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd);
} else {
RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd);
}
}
if (IS_BIT(join,FIFO_IF_JOIN_CPU_WR) == TRUE) {
if (flag == 1) {
RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Wr);
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -