Xuint32 XSysAce_RegRead32(Xuint32 Address) { Xuint16 Data; Xuint16 ConvertedData; Xuint32 Value = 0; /* * Need to endian convert each 32-bit value. The ACE registers are little- * endian, so we read the two LSBs first, endian convert, then put them * in the LSB lanes of the 32-bit word. etc... */ Data = (Xuint16)XIo_In(Address); XIo_FromLittleEndian16(Data, &ConvertedData); Value = (Xuint32)ConvertedData; Data = (Xuint16)XIo_In(Address + (2 * XSA_ADDR_ALIGN)); XIo_FromLittleEndian16(Data, &ConvertedData); Value |= ((Xuint32)ConvertedData << 16); return Value; }
Xuint16 XSysAce_RegRead16(Xuint32 Address) { Xuint16 Data; Xuint16 ConvertedData; /* * Need to endian convert the 16-bit value. The ACE registers are little- * endian. */ Data = (Xuint16)XIo_In(Address); XIo_FromLittleEndian16(Data, &ConvertedData); return ConvertedData; }
/** * * 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; XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_SIGNATURE]), &ParamPtr->Signature); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_NUMCYLS]), &ParamPtr->NumCylinders); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_RESERVED1]), &ParamPtr->Reserved); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_NUMHEADS]), &ParamPtr->NumHeads); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_BYTES_TRACK]), &ParamPtr->NumBytesPerTrack); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_BYTES_SECT]), &ParamPtr->NumBytesPerSector); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_SECTS_TRK]), &ParamPtr->NumSectorsPerTrack); /* NumSectorsPerCard is stored as two half-words, MSW first */ XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_SECTS_HI]), &HiWord); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_SECTS_LO]), &LoWord); ParamPtr->NumSectorsPerCard = ((u32) HiWord << 16) | (u32) LoWord; XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_VENDOR1]), &ParamPtr->VendorUnique); WordCopySwap(&BufPtr[XSA_CFPARM_SERIAL_NO], ParamPtr->SerialNo, 20); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_BUFFER_TYPE]), &ParamPtr->BufferType); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_BUFFER_SIZE]), &ParamPtr->BufferSize); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_ECC_BYTES]), &ParamPtr->NumEccBytes); WordCopySwap(&BufPtr[XSA_CFPARM_FW_VERSION], ParamPtr->FwVersion, 8); WordCopySwap(&BufPtr[XSA_CFPARM_MODEL_NO], ParamPtr->ModelNo, 40); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_MAX_SECTORS]), &ParamPtr->MaxSectors); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_DBL_WORD]), &ParamPtr->DblWord); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_CAPS]), &ParamPtr->Capabilities); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_RESERVED2]), &ParamPtr->Reserved2); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_PIO_MODE]), &ParamPtr->PioMode); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_DMA_MODE]), &ParamPtr->DmaMode); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_TRANSLATE]), &ParamPtr->TranslationValid); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_CURCYLS]), &ParamPtr->CurNumCylinders); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_CURHEADS]), &ParamPtr->CurNumHeads); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_CURSECTS_TRK]), &ParamPtr->CurSectorsPerTrack); XIo_FromLittleEndian32(*((u32 *) &BufPtr[XSA_CFPARM_CURSECTS]), &ParamPtr->CurSectorsPerCard); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_MULTIPLE]), &ParamPtr->MultipleSectors); XIo_FromLittleEndian32(*((u32 *) &BufPtr[XSA_CFPARM_LBA_SECTS]), &ParamPtr->LbaSectors); WordCopySwap(&BufPtr[XSA_CFPARM_RESERVED3], ParamPtr->Reserved3, 132); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_SECURITY]), &ParamPtr->SecurityStatus); WordCopySwap(&BufPtr[XSA_CFPARM_VENDOR2], ParamPtr->VendorUniqueBytes, 62); XIo_FromLittleEndian16(*((u16 *) &BufPtr[XSA_CFPARM_POWER]), &ParamPtr->PowerDesc); WordCopySwap(&BufPtr[XSA_CFPARM_RESERVED4], ParamPtr->Reserved4, 190); }