s32 Xil_TestIO16(u16 *Addr, s32 Length, u16 Value, s32 Kind, s32 Swap) { u16 *TempAddr16; u16 ValueIn = 0U; s32 Index; TempAddr16 = Addr; Xil_AssertNonvoid(TempAddr16 != NULL); for (Index = 0; Index < Length; Index++) { switch (Kind) { case XIL_TESTIO_LE: Xil_Out16LE((INTPTR)TempAddr16, Value); break; case XIL_TESTIO_BE: Xil_Out16BE((INTPTR)TempAddr16, Value); break; default: Xil_Out16((INTPTR)TempAddr16, Value); break; } ValueIn = Xil_In16((INTPTR)TempAddr16); if ((Kind != 0) && (Swap != 0)) { ValueIn = Swap16(ValueIn); } if (Value != ValueIn) { return -1; } /* second round */ Xil_Out16((INTPTR)TempAddr16, Value); switch (Kind) { case XIL_TESTIO_LE: ValueIn = Xil_In16LE((INTPTR)TempAddr16); break; case XIL_TESTIO_BE: ValueIn = Xil_In16BE((INTPTR)TempAddr16); break; default: ValueIn = Xil_In16((INTPTR)TempAddr16); break; } if ((Kind != 0) && (Swap != 0)) { ValueIn = Swap16(ValueIn); } if (Value != ValueIn) { return -1; } TempAddr16 += sizeof(u16); } return 0; }
int Xil_TestIO16(u16 *Addr, int Len, u16 Value, int Kind, int Swap) { u16 ValueIn; int Index; for (Index = 0; Index < Len; Index++) { switch (Kind) { case XIL_TESTIO_LE: Xil_Out16LE((u32)Addr, Value); break; case XIL_TESTIO_BE: Xil_Out16BE((u32)Addr, Value); break; default: Xil_Out16((u32)Addr, Value); break; } ValueIn = Xil_In16((u32)Addr); if (Kind && Swap) ValueIn = Swap16(ValueIn); if (Value != ValueIn) { return -1; } /* second round */ Xil_Out16((u32)Addr, Value); switch (Kind) { case XIL_TESTIO_LE: ValueIn = Xil_In16LE((u32)Addr); break; case XIL_TESTIO_BE: ValueIn = Xil_In16BE((u32)Addr); break; default: ValueIn = Xil_In16((u32)Addr); break; } if (Kind && Swap) ValueIn = Swap16(ValueIn); if (Value != ValueIn) { return -1; } Addr++; } return 0; }
/** * * This bit of ugliness allows us to present a structure to the user. The * byte buffer which was read from the CompactFlash is converted into the * XSysAce_CFParameters structure. The byte buffer is accessed by the indices * of the fields as defined at the top of this file. We do not read from * CompactFlash directly into the CF Parameter structure because of structure * packing problems. * * Note that we also need to perform endian conversion here since the System * ACE device gives us little endian data and we're (possibly) on a big endian * processor. * * @param ParamPtr is the structure to fill * @param BufPtr is the byte buffer containing the CF parameter data * * @return None. * * @note None. * ******************************************************************************/ static void FillParam(XSysAce_CFParameters * ParamPtr, u8 *BufPtr) { u16 HiWord; u16 LoWord; Xil_Out16LE((u32)&ParamPtr->Signature, *((u16 *) &BufPtr[XSA_CFPARM_SIGNATURE])); Xil_Out16LE((u32)&ParamPtr->NumCylinders, *((u16 *) &BufPtr[XSA_CFPARM_NUMCYLS])); Xil_Out16LE((u32)&ParamPtr->Reserved, *((u16 *) &BufPtr[XSA_CFPARM_RESERVED1])); Xil_Out16LE((u32)&ParamPtr->NumHeads, *((u16 *) &BufPtr[XSA_CFPARM_NUMHEADS])); Xil_Out16LE((u32)&ParamPtr->NumBytesPerTrack, *((u16 *) &BufPtr[XSA_CFPARM_BYTES_TRACK])); Xil_Out16LE((u32)&ParamPtr->NumBytesPerSector, *((u16 *) &BufPtr[XSA_CFPARM_BYTES_SECT])); Xil_Out16LE((u32)&ParamPtr->NumSectorsPerTrack, *((u16 *) &BufPtr[XSA_CFPARM_SECTS_TRK])); /* NumSectorsPerCard is stored as two half-words, MSW first */ Xil_Out16LE((u32)&HiWord, *((u16 *) &BufPtr[XSA_CFPARM_SECTS_HI])); Xil_Out16LE((u32)&LoWord, *((u16 *) &BufPtr[XSA_CFPARM_SECTS_LO])); ParamPtr->NumSectorsPerCard = ((u32) HiWord << 16) | (u32) LoWord; Xil_Out16LE((u32)&ParamPtr->VendorUnique, *((u16 *) &BufPtr[XSA_CFPARM_VENDOR1])); WordCopySwap(&BufPtr[XSA_CFPARM_SERIAL_NO], ParamPtr->SerialNo, 20); Xil_Out16LE((u32)&ParamPtr->BufferType, *((u16 *) &BufPtr[XSA_CFPARM_BUFFER_TYPE])); Xil_Out16LE((u32)&ParamPtr->BufferSize, *((u16 *) &BufPtr[XSA_CFPARM_BUFFER_SIZE])); Xil_Out16LE((u32)&ParamPtr->NumEccBytes, *((u16 *) &BufPtr[XSA_CFPARM_ECC_BYTES])); WordCopySwap(&BufPtr[XSA_CFPARM_FW_VERSION], ParamPtr->FwVersion, 8); WordCopySwap(&BufPtr[XSA_CFPARM_MODEL_NO], ParamPtr->ModelNo, 40); Xil_Out16LE((u32)&ParamPtr->MaxSectors, *((u16 *) &BufPtr[XSA_CFPARM_MAX_SECTORS])); Xil_Out16LE((u32)&ParamPtr->DblWord, *((u16 *) &BufPtr[XSA_CFPARM_DBL_WORD])); Xil_Out16LE((u32)&ParamPtr->Capabilities, *((u16 *) &BufPtr[XSA_CFPARM_CAPS])); Xil_Out16LE((u32)&ParamPtr->Reserved2, *((u16 *) &BufPtr[XSA_CFPARM_RESERVED2])); Xil_Out16LE((u32)&ParamPtr->PioMode, *((u16 *) &BufPtr[XSA_CFPARM_PIO_MODE])); Xil_Out16LE((u32)&ParamPtr->DmaMode, *((u16 *) &BufPtr[XSA_CFPARM_DMA_MODE])); Xil_Out16LE((u32)&ParamPtr->TranslationValid, *((u16 *) &BufPtr[XSA_CFPARM_TRANSLATE])); Xil_Out16LE((u32)&ParamPtr->CurNumCylinders, *((u16 *) &BufPtr[XSA_CFPARM_CURCYLS])); Xil_Out16LE((u32)&ParamPtr->CurNumHeads, *((u16 *) &BufPtr[XSA_CFPARM_CURHEADS])); Xil_Out16LE((u32)&ParamPtr->CurSectorsPerTrack, *((u16 *) &BufPtr[XSA_CFPARM_CURSECTS_TRK])); Xil_Out32LE((u32)&ParamPtr->CurSectorsPerCard, *((u32 *) &BufPtr[XSA_CFPARM_CURSECTS])); Xil_Out16LE((u32)&ParamPtr->MultipleSectors, *((u16 *) &BufPtr[XSA_CFPARM_MULTIPLE])); Xil_Out32LE((u32)&ParamPtr->LbaSectors, *((u32 *) &BufPtr[XSA_CFPARM_LBA_SECTS])); WordCopySwap(&BufPtr[XSA_CFPARM_RESERVED3], ParamPtr->Reserved3, 132); Xil_Out16LE((u32)&ParamPtr->SecurityStatus, *((u16 *) &BufPtr[XSA_CFPARM_SECURITY])); WordCopySwap(&BufPtr[XSA_CFPARM_VENDOR2], ParamPtr->VendorUniqueBytes, 62); Xil_Out16LE((u32)&ParamPtr->PowerDesc, *((u16 *) &BufPtr[XSA_CFPARM_POWER])); WordCopySwap(&BufPtr[XSA_CFPARM_RESERVED4], ParamPtr->Reserved4, 190); }