diff --git a/bsps/include/dev/spi/xqspipsu-flash-helper.h b/bsps/include/dev/spi/xqspipsu-flash-helper.h index 5e4233e64e..1578fe8485 100644 --- a/bsps/include/dev/spi/xqspipsu-flash-helper.h +++ b/bsps/include/dev/spi/xqspipsu-flash-helper.h @@ -155,3 +155,18 @@ u32 QspiPsu_NOR_Get_Device_Size(XQspiPsu *QspiPsuPtr); * ******************************************************************************/ u32 QspiPsu_NOR_Get_Sector_Size(XQspiPsu *QspiPsuPtr); + +/*****************************************************************************/ +/** + * + * This function performs a read of the RDID configuration space. + * + * @param QspiPsuPtr is a pointer to the QSPIPSU driver component to use. + * @param ReadBfrPtr is a pointer to a buffer to be filled with + * configuration data. + * @param ReadLen is the total length of the configuration space to read. + * + * @return XST_SUCCESS if successful, else XST_FAILURE. + * + ******************************************************************************/ +int QspiPsu_NOR_RDID(XQspiPsu *QspiPsuPtr, u8 *ReadBfrPtr, u32 ReadLen); diff --git a/bsps/shared/dev/spi/xqspipsu-flash-helper.c b/bsps/shared/dev/spi/xqspipsu-flash-helper.c index c9d8273b87..0dd065f02e 100644 --- a/bsps/shared/dev/spi/xqspipsu-flash-helper.c +++ b/bsps/shared/dev/spi/xqspipsu-flash-helper.c @@ -274,6 +274,37 @@ static void QspiPsuHandler( } } +int QspiPsu_NOR_RDID(XQspiPsu *QspiPsuPtr, u8 *ReadBfrPtr, u32 ReadLen) +{ + int Status; + + /* + * Read ID + */ + TxBfrPtr = READ_ID; + FlashMsg[0].TxBfrPtr = &TxBfrPtr; + FlashMsg[0].RxBfrPtr = NULL; + FlashMsg[0].ByteCount = 1; + FlashMsg[0].BusWidth = XQSPIPSU_SELECT_MODE_SPI; + FlashMsg[0].Flags = XQSPIPSU_MSG_FLAG_TX; + + FlashMsg[1].TxBfrPtr = NULL; + FlashMsg[1].RxBfrPtr = ReadBfrPtr; + FlashMsg[1].ByteCount = ReadLen; + FlashMsg[1].BusWidth = XQSPIPSU_SELECT_MODE_SPI; + FlashMsg[1].Flags = XQSPIPSU_MSG_FLAG_RX; + + TransferInProgress = TRUE; + Status = XQspiPsu_InterruptTransfer(QspiPsuPtr, FlashMsg, 2); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + while (TransferInProgress); + + rtems_cache_invalidate_multiple_data_lines(ReadBfrPtr, ReadLen); + return XST_SUCCESS; +} + /*****************************************************************************/ /** * @@ -288,33 +319,15 @@ static void QspiPsuHandler( *****************************************************************************/ static int FlashReadID(XQspiPsu *QspiPsuPtr) { - int Status; u32 ReadId = 0; + u32 ReadLen = 3; + int Status; - /* - * Read ID - */ - TxBfrPtr = READ_ID; - FlashMsg[0].TxBfrPtr = &TxBfrPtr; - FlashMsg[0].RxBfrPtr = NULL; - FlashMsg[0].ByteCount = 1; - FlashMsg[0].BusWidth = XQSPIPSU_SELECT_MODE_SPI; - FlashMsg[0].Flags = XQSPIPSU_MSG_FLAG_TX; - - FlashMsg[1].TxBfrPtr = NULL; - FlashMsg[1].RxBfrPtr = ReadBfrPtr; - FlashMsg[1].ByteCount = 3; - FlashMsg[1].BusWidth = XQSPIPSU_SELECT_MODE_SPI; - FlashMsg[1].Flags = XQSPIPSU_MSG_FLAG_RX; - - TransferInProgress = TRUE; - Status = XQspiPsu_InterruptTransfer(QspiPsuPtr, FlashMsg, 2); + Status = QspiPsu_NOR_RDID(QspiPsuPtr, ReadBfrPtr, ReadLen); if (Status != XST_SUCCESS) { return XST_FAILURE; } - while (TransferInProgress); - rtems_cache_invalidate_multiple_data_lines(ReadBfrPtr, 3); /* In case of dual, read both and ensure they are same make/size */ /*