mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Update Zynq MPSoC hardware definition and BSP files to be those shipped with the 2016.4 SDK.
This commit is contained in:
parent
992a3c8c71
commit
ff55eb920c
|
@ -56,7 +56,7 @@
|
|||
<listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/>
|
||||
</option>
|
||||
<option id="xilinx.gnu.c.linker.option.lscript.210457854" name="Linker Script" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/>
|
||||
<option id="xilinx.gnu.c.link.option.other.791632065" name="Other options (-XLinker [option])" superClass="xilinx.gnu.c.link.option.other" valueType="stringList"/>
|
||||
<option id="xilinx.gnu.c.link.option.other.791632065" name="Other options (-XLinker [option])" superClass="xilinx.gnu.c.link.option.other"/>
|
||||
<inputType id="xilinx.gnu.linker.input.294386883" superClass="xilinx.gnu.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="org.eclipse.cdt.core.default.config.691372241">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.691372241" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
|
||||
<cconfiguration id="org.eclipse.cdt.core.default.config.1652171495">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1652171495" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
|
||||
<externalSettings/>
|
||||
<extensions/>
|
||||
</storageModule>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>RTOSDemo_A53_bsp</name>
|
||||
<comment>Created by SDK v2016.1</comment>
|
||||
<comment>Created by SDK v2016.4</comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
|
|
|
@ -15,8 +15,17 @@
|
|||
|
||||
/******************************************************************/
|
||||
|
||||
/* Definition for PSS REF CLK FREQUENCY */
|
||||
#define XPAR_PSU_PSS_REF_CLK_FREQ_HZ 33333000U
|
||||
|
||||
#include "xparameters_ps.h"
|
||||
|
||||
#define XPS_BOARD_ZCU102
|
||||
|
||||
|
||||
/* Number of Fabric Resets */
|
||||
#define XPAR_NUM_FABRIC_RESETS 1
|
||||
|
||||
#define STDIN_BASEADDRESS 0xFF000000
|
||||
#define STDOUT_BASEADDRESS 0xFF000000
|
||||
|
||||
|
@ -250,6 +259,28 @@
|
|||
#define XPAR_XCSUDMA_0_CSUDMA_CLK_FREQ_HZ 0
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
/* Definitions for driver DDRCPSU */
|
||||
#define XPAR_XDDRCPSU_NUM_INSTANCES 1
|
||||
|
||||
/* Definitions for peripheral PSU_DDRC_0 */
|
||||
#define XPAR_PSU_DDRC_0_DEVICE_ID 0
|
||||
#define XPAR_PSU_DDRC_0_BASEADDR 0xFD070000
|
||||
#define XPAR_PSU_DDRC_0_HIGHADDR 0xFD070FFF
|
||||
#define XPAR_PSU_DDRC_0_HAS_ECC 0
|
||||
#define XPAR_PSU_DDRC_0_DDRC_CLK_FREQ_HZ 533328002
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
/* Canonical definitions for peripheral PSU_DDRC_0 */
|
||||
#define XPAR_DDRCPSU_0_DEVICE_ID XPAR_PSU_DDRC_0_DEVICE_ID
|
||||
#define XPAR_DDRCPSU_0_BASEADDR 0xFD070000
|
||||
#define XPAR_DDRCPSU_0_HIGHADDR 0xFD070FFF
|
||||
#define XPAR_DDRCPSU_0_DDRC_CLK_FREQ_HZ 533328002
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
/* Definitions for driver EMACPS */
|
||||
|
@ -326,11 +357,6 @@
|
|||
#define XPAR_PSU_APU_S_AXI_HIGHADDR 0xFD5CFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_BBRAM_0 */
|
||||
#define XPAR_PSU_BBRAM_0_S_AXI_BASEADDR 0xFFCD0000
|
||||
#define XPAR_PSU_BBRAM_0_S_AXI_HIGHADDR 0xFFCDFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_CCI_GPV */
|
||||
#define XPAR_PSU_CCI_GPV_S_AXI_BASEADDR 0xFD6E0000
|
||||
#define XPAR_PSU_CCI_GPV_S_AXI_HIGHADDR 0xFD6EFFFF
|
||||
|
@ -351,16 +377,16 @@
|
|||
#define XPAR_PSU_CRL_APB_S_AXI_HIGHADDR 0xFF85FFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_CSU_0 */
|
||||
#define XPAR_PSU_CSU_0_S_AXI_BASEADDR 0xFFCA0000
|
||||
#define XPAR_PSU_CSU_0_S_AXI_HIGHADDR 0xFFCAFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_DDR_0 */
|
||||
#define XPAR_PSU_DDR_0_S_AXI_BASEADDR 0x00000000
|
||||
#define XPAR_PSU_DDR_0_S_AXI_HIGHADDR 0xFFFFFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_DDR_1 */
|
||||
#define XPAR_PSU_DDR_1_S_AXI_BASEADDR 0x00000000
|
||||
#define XPAR_PSU_DDR_1_S_AXI_HIGHADDR 0x7FFFFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_DDR_PHY */
|
||||
#define XPAR_PSU_DDR_PHY_S_AXI_BASEADDR 0xFD080000
|
||||
#define XPAR_PSU_DDR_PHY_S_AXI_HIGHADDR 0xFD08FFFF
|
||||
|
@ -401,11 +427,6 @@
|
|||
#define XPAR_PSU_DDR_XMPU5_CFG_S_AXI_HIGHADDR 0xFD05FFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_DDRC_0 */
|
||||
#define XPAR_PSU_DDRC_0_S_AXI_BASEADDR 0xFD070000
|
||||
#define XPAR_PSU_DDRC_0_S_AXI_HIGHADDR 0xFD070FFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_DP */
|
||||
#define XPAR_PSU_DP_S_AXI_BASEADDR 0xFD4A0000
|
||||
#define XPAR_PSU_DP_S_AXI_HIGHADDR 0xFD4AFFFF
|
||||
|
@ -451,9 +472,6 @@
|
|||
#define XPAR_PSU_GPU_S_AXI_HIGHADDR 0xFD4BFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_IOU_S */
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_IOU_SCNTR */
|
||||
#define XPAR_PSU_IOU_SCNTR_S_AXI_BASEADDR 0xFF250000
|
||||
#define XPAR_PSU_IOU_SCNTR_S_AXI_HIGHADDR 0xFF25FFFF
|
||||
|
@ -509,9 +527,6 @@
|
|||
#define XPAR_PSU_OCM_RAM_0_S_AXI_HIGHADDR 0xFFFEFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_OCM_RAM_1 */
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_OCM_XMPU_CFG */
|
||||
#define XPAR_PSU_OCM_XMPU_CFG_S_AXI_BASEADDR 0xFFA70000
|
||||
#define XPAR_PSU_OCM_XMPU_CFG_S_AXI_HIGHADDR 0xFFA7FFFF
|
||||
|
@ -532,6 +547,16 @@
|
|||
#define XPAR_PSU_PCIE_DMA_S_AXI_HIGHADDR 0xFD0FFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_PCIE_HIGH */
|
||||
#define XPAR_PSU_PCIE_HIGH_S_AXI_BASEADDR 0x00000000
|
||||
#define XPAR_PSU_PCIE_HIGH_S_AXI_HIGHADDR 0xFFFFFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_PCIE_LOW */
|
||||
#define XPAR_PSU_PCIE_LOW_S_AXI_BASEADDR 0xE0000000
|
||||
#define XPAR_PSU_PCIE_LOW_S_AXI_HIGHADDR 0xEFFFFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_PMU_GLOBAL_0 */
|
||||
#define XPAR_PSU_PMU_GLOBAL_0_S_AXI_BASEADDR 0xFFD80000
|
||||
#define XPAR_PSU_PMU_GLOBAL_0_S_AXI_HIGHADDR 0xFFDBFFFF
|
||||
|
@ -542,16 +567,36 @@
|
|||
#define XPAR_PSU_PMU_IOMODULE_S_AXI_HIGHADDR 0xFFD5FFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_PMU_RAM */
|
||||
#define XPAR_PSU_PMU_RAM_S_AXI_BASEADDR 0xFFDC0000
|
||||
#define XPAR_PSU_PMU_RAM_S_AXI_HIGHADDR 0xFFDDFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_QSPI_LINEAR_0 */
|
||||
#define XPAR_PSU_QSPI_LINEAR_0_S_AXI_BASEADDR 0xC0000000
|
||||
#define XPAR_PSU_QSPI_LINEAR_0_S_AXI_HIGHADDR 0xDFFFFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_R5_0_ATCM_GLOBAL */
|
||||
#define XPAR_PSU_R5_0_ATCM_GLOBAL_S_AXI_BASEADDR 0xFFE00000
|
||||
#define XPAR_PSU_R5_0_ATCM_GLOBAL_S_AXI_HIGHADDR 0xFFE0FFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_R5_0_BTCM_GLOBAL */
|
||||
#define XPAR_PSU_R5_0_BTCM_GLOBAL_S_AXI_BASEADDR 0xFFE20000
|
||||
#define XPAR_PSU_R5_0_BTCM_GLOBAL_S_AXI_HIGHADDR 0xFFE2FFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_R5_1_ATCM_GLOBAL */
|
||||
#define XPAR_PSU_R5_1_ATCM_GLOBAL_S_AXI_BASEADDR 0xFFE90000
|
||||
#define XPAR_PSU_R5_1_ATCM_GLOBAL_S_AXI_HIGHADDR 0xFFE9FFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_R5_1_BTCM_GLOBAL */
|
||||
#define XPAR_PSU_R5_1_BTCM_GLOBAL_S_AXI_BASEADDR 0xFFEB0000
|
||||
#define XPAR_PSU_R5_1_BTCM_GLOBAL_S_AXI_HIGHADDR 0xFFEBFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_R5_TCM_RAM_GLOBAL */
|
||||
#define XPAR_PSU_R5_TCM_RAM_GLOBAL_S_AXI_BASEADDR 0xFFE00000
|
||||
#define XPAR_PSU_R5_TCM_RAM_GLOBAL_S_AXI_HIGHADDR 0xFFE3FFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_RPU */
|
||||
#define XPAR_PSU_RPU_S_AXI_BASEADDR 0xFF9A0000
|
||||
#define XPAR_PSU_RPU_S_AXI_HIGHADDR 0xFF9AFFFF
|
||||
|
@ -587,11 +632,6 @@
|
|||
#define XPAR_PSU_SMMU_REG_S_AXI_HIGHADDR 0xFD5FFFFF
|
||||
|
||||
|
||||
/* Definitions for peripheral PSU_USB_0 */
|
||||
#define XPAR_PSU_USB_0_S_AXI_BASEADDR 0xFE200000
|
||||
#define XPAR_PSU_USB_0_S_AXI_HIGHADDR 0xFE20FFFF
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
/* Definitions for driver GPIOPS */
|
||||
|
@ -647,7 +687,7 @@
|
|||
|
||||
/******************************************************************/
|
||||
|
||||
#define XPAR_XIPIPSU_NUM_INSTANCES 3
|
||||
#define XPAR_XIPIPSU_NUM_INSTANCES 1
|
||||
|
||||
/* Parameter definitions for peripheral psu_ipi_0 */
|
||||
#define XPAR_PSU_IPI_0_DEVICE_ID 0
|
||||
|
@ -656,20 +696,6 @@
|
|||
#define XPAR_PSU_IPI_0_BUFFER_INDEX 2
|
||||
#define XPAR_PSU_IPI_0_INT_ID 67
|
||||
|
||||
/* Parameter definitions for peripheral psu_ipi_1 */
|
||||
#define XPAR_PSU_IPI_1_DEVICE_ID 1
|
||||
#define XPAR_PSU_IPI_1_BASE_ADDRESS 0xFF310000
|
||||
#define XPAR_PSU_IPI_1_BIT_MASK 0x00000100
|
||||
#define XPAR_PSU_IPI_1_BUFFER_INDEX 0
|
||||
#define XPAR_PSU_IPI_1_INT_ID 65
|
||||
|
||||
/* Parameter definitions for peripheral psu_ipi_2 */
|
||||
#define XPAR_PSU_IPI_2_DEVICE_ID 2
|
||||
#define XPAR_PSU_IPI_2_BASE_ADDRESS 0xFF320000
|
||||
#define XPAR_PSU_IPI_2_BIT_MASK 0x00000200
|
||||
#define XPAR_PSU_IPI_2_BUFFER_INDEX 1
|
||||
#define XPAR_PSU_IPI_2_INT_ID 66
|
||||
|
||||
/* Canonical definitions for peripheral psu_ipi_0 */
|
||||
#define XPAR_XIPIPSU_0_DEVICE_ID XPAR_PSU_IPI_0_DEVICE_ID
|
||||
#define XPAR_XIPIPSU_0_BASE_ADDRESS XPAR_PSU_IPI_0_BASE_ADDRESS
|
||||
|
@ -677,20 +703,6 @@
|
|||
#define XPAR_XIPIPSU_0_BUFFER_INDEX XPAR_PSU_IPI_0_BUFFER_INDEX
|
||||
#define XPAR_XIPIPSU_0_INT_ID XPAR_PSU_IPI_0_INT_ID
|
||||
|
||||
/* Canonical definitions for peripheral psu_ipi_1 */
|
||||
#define XPAR_XIPIPSU_1_DEVICE_ID XPAR_PSU_IPI_1_DEVICE_ID
|
||||
#define XPAR_XIPIPSU_1_BASE_ADDRESS XPAR_PSU_IPI_1_BASE_ADDRESS
|
||||
#define XPAR_XIPIPSU_1_BIT_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPSU_1_BUFFER_INDEX XPAR_PSU_IPI_1_BUFFER_INDEX
|
||||
#define XPAR_XIPIPSU_1_INT_ID XPAR_PSU_IPI_1_INT_ID
|
||||
|
||||
/* Canonical definitions for peripheral psu_ipi_2 */
|
||||
#define XPAR_XIPIPSU_2_DEVICE_ID XPAR_PSU_IPI_2_DEVICE_ID
|
||||
#define XPAR_XIPIPSU_2_BASE_ADDRESS XPAR_PSU_IPI_2_BASE_ADDRESS
|
||||
#define XPAR_XIPIPSU_2_BIT_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPSU_2_BUFFER_INDEX XPAR_PSU_IPI_2_BUFFER_INDEX
|
||||
#define XPAR_XIPIPSU_2_INT_ID XPAR_PSU_IPI_2_INT_ID
|
||||
|
||||
#define XPAR_XIPIPSU_NUM_TARGETS 11
|
||||
|
||||
#define XPAR_PSU_IPI_0_BIT_MASK 0x00000001
|
||||
|
@ -719,54 +731,30 @@
|
|||
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_0_CH0_MASK XPAR_PSU_IPI_0_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_0_CH0_INDEX 0
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_0_CH1_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_0_CH1_INDEX 1
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_0_CH2_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_0_CH2_INDEX 2
|
||||
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_1_CH0_MASK XPAR_PSU_IPI_0_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_1_CH0_INDEX 0
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_1_CH1_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_1_CH1_INDEX 1
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_1_CH2_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_1_CH2_INDEX 2
|
||||
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_2_CH0_MASK XPAR_PSU_IPI_0_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_2_CH0_INDEX 0
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_2_CH1_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_2_CH1_INDEX 1
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_2_CH2_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_2_CH2_INDEX 2
|
||||
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_3_CH0_MASK XPAR_PSU_IPI_0_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_3_CH0_INDEX 0
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_3_CH1_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_3_CH1_INDEX 1
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_3_CH2_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXA53_3_CH2_INDEX 2
|
||||
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_0_CH0_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_0_CH0_INDEX 1
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_0_CH1_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_0_CH1_INDEX 2
|
||||
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_1_CH0_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_1_CH0_INDEX 1
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_1_CH1_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_1_CH1_INDEX 2
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_1_CH0_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_CORTEXR5_1_CH0_INDEX 2
|
||||
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH0_MASK XPAR_PSU_IPI_1_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH0_INDEX 1
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH1_MASK XPAR_PSU_IPI_2_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH1_INDEX 2
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH2_MASK XPAR_PSU_IPI_3_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH2_INDEX 3
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH3_MASK XPAR_PSU_IPI_4_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH3_INDEX 4
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH4_MASK XPAR_PSU_IPI_5_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH4_INDEX 5
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH5_MASK XPAR_PSU_IPI_6_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH5_INDEX 6
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH0_MASK XPAR_PSU_IPI_3_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH0_INDEX 3
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH1_MASK XPAR_PSU_IPI_4_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH1_INDEX 4
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH2_MASK XPAR_PSU_IPI_5_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH2_INDEX 5
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH3_MASK XPAR_PSU_IPI_6_BIT_MASK
|
||||
#define XPAR_XIPIPS_TARGET_PSU_PMU_0_CH3_INDEX 6
|
||||
|
||||
/* Definitions for driver QSPIPSU */
|
||||
#define XPAR_XQSPIPSU_NUM_INSTANCES 1
|
||||
|
@ -843,6 +831,9 @@
|
|||
#define XPAR_PSU_SD_1_SDIO_CLK_FREQ_HZ 199998006
|
||||
#define XPAR_PSU_SD_1_HAS_CD 1
|
||||
#define XPAR_PSU_SD_1_HAS_WP 1
|
||||
#define XPAR_PSU_SD_1_BUS_WIDTH 4
|
||||
#define XPAR_PSU_SD_1_MIO_BANK 1
|
||||
#define XPAR_PSU_SD_1_HAS_EMIO 0
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
@ -854,6 +845,9 @@
|
|||
#define XPAR_XSDPS_0_SDIO_CLK_FREQ_HZ 199998006
|
||||
#define XPAR_XSDPS_0_HAS_CD 1
|
||||
#define XPAR_XSDPS_0_HAS_WP 1
|
||||
#define XPAR_XSDPS_0_BUS_WIDTH 4
|
||||
#define XPAR_XSDPS_0_MIO_BANK 1
|
||||
#define XPAR_XSDPS_0_HAS_EMIO 0
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
@ -1045,6 +1039,25 @@
|
|||
#define XPAR_XUARTPS_1_HAS_MODEM 0
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
/* Definitions for driver USBPSU */
|
||||
#define XPAR_XUSBPSU_NUM_INSTANCES 1
|
||||
|
||||
/* Definitions for peripheral PSU_USB_0 */
|
||||
#define XPAR_PSU_USB_0_DEVICE_ID 0
|
||||
#define XPAR_PSU_USB_0_BASEADDR 0xFE200000
|
||||
#define XPAR_PSU_USB_0_HIGHADDR 0xFE20FFFF
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
/* Canonical definitions for peripheral PSU_USB_0 */
|
||||
#define XPAR_XUSBPSU_0_DEVICE_ID XPAR_PSU_USB_0_DEVICE_ID
|
||||
#define XPAR_XUSBPSU_0_BASEADDR 0xFE200000
|
||||
#define XPAR_XUSBPSU_0_HIGHADDR 0xFE20FFFF
|
||||
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
/* Definitions for driver WDTPS */
|
||||
|
|
|
@ -166,7 +166,7 @@ s32 XCanPs_SelfTest(XCanPs *InstancePtr)
|
|||
for (Index = 0U; Index < 8U; Index++) {
|
||||
if(*FramePtr != 0U) {
|
||||
*FramePtr = (u8)Index;
|
||||
*FramePtr++;
|
||||
FramePtr++;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2015-2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -51,12 +51,18 @@
|
|||
* 1.1 kvn 06/12/15 Add support for Zynq Ultrascale+ MP.
|
||||
* kvn 08/18/15 Modified Makefile according to compiler changes.
|
||||
* 1.2 kvn 10/09/15 Add support for IAR Compiler.
|
||||
* 1.3 asa 07/01/16 Made changes to ensure that the file does not compile
|
||||
* for MB BSPs. Instead it throws up a warning. This
|
||||
* fixes the CR#953056.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#ifdef __MICROBLAZE__
|
||||
#warning "The driver is supported only for ARM architecture"
|
||||
#else
|
||||
|
||||
#include <xil_types.h>
|
||||
#include <xpseudo_asm.h>
|
||||
|
@ -177,5 +183,6 @@ static INLINE u32 XCoresightPs_DccGetStatus(void)
|
|||
}
|
||||
#endif
|
||||
return Status;
|
||||
#endif
|
||||
}
|
||||
/** @} */
|
|
@ -55,16 +55,20 @@
|
|||
* 1.00 kvn 02/14/15 First release
|
||||
* 1.1 kvn 06/12/15 Add support for Zynq Ultrascale+ MP.
|
||||
* kvn 08/18/15 Modified Makefile according to compiler changes.
|
||||
* 1.3 asa 07/01/16 Made changes to ensure that the file does not compile
|
||||
* for MB BSPs. Instead it throws up a warning. This
|
||||
* fixes the CR#953056.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
|
||||
#ifndef __MICROBLAZE__
|
||||
#include <xil_types.h>
|
||||
|
||||
void XCoresightPs_DccSendByte(u32 BaseAddress, u8 Data);
|
||||
|
||||
u8 XCoresightPs_DccRecvByte(u32 BaseAddress);
|
||||
#endif
|
||||
/** @} */
|
|
@ -46,6 +46,8 @@
|
|||
* Ver Who Date Changes
|
||||
* ----- ------ -------- ---------------------------------------------------
|
||||
* 1.0 vnsld 22/10/14 First release
|
||||
* 1.1 adk 10/05/16 Fixed CR#951040 race condition in the recv path when
|
||||
* source and destination points to the same buffer.
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
@ -152,8 +154,12 @@ void XCsuDma_Transfer(XCsuDma *InstancePtr, XCsuDma_Channel Channel,
|
|||
}
|
||||
/* Invalidating cache memory */
|
||||
else {
|
||||
#if defined(__aarch64__)
|
||||
Xil_DCacheInvalidateRange(Addr, Size <<
|
||||
(u32)(XCSUDMA_SIZE_SHIFT));
|
||||
#else
|
||||
Xil_DCacheFlushRange(Addr, Size << (u32)(XCSUDMA_SIZE_SHIFT));
|
||||
#endif
|
||||
}
|
||||
|
||||
XCsuDma_WriteReg(InstancePtr->Config.BaseAddress,
|
|
@ -97,6 +97,8 @@
|
|||
* Ver Who Date Changes
|
||||
* ----- ------ -------- -----------------------------------------------------
|
||||
* 1.0 vnsld 22/10/14 First release
|
||||
* 1.1 adk 10/05/16 Fixed CR#951040 race condition in the recv path when
|
||||
* source and destination points to the same buffer.
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
|
@ -0,0 +1,40 @@
|
|||
COMPILER=
|
||||
ARCHIVER=
|
||||
CP=cp
|
||||
COMPILER_FLAGS=
|
||||
EXTRA_COMPILER_FLAGS=
|
||||
LIB=libxil.a
|
||||
|
||||
CC_FLAGS = $(COMPILER_FLAGS)
|
||||
ECC_FLAGS = $(EXTRA_COMPILER_FLAGS)
|
||||
|
||||
RELEASEDIR=../../../lib
|
||||
INCLUDEDIR=../../../include
|
||||
INCLUDES=-I./. -I${INCLUDEDIR}
|
||||
|
||||
OUTS = *.o
|
||||
|
||||
LIBSOURCES:=*.c
|
||||
INCLUDEFILES:=*.h
|
||||
|
||||
OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c)))
|
||||
|
||||
libs: banner xddrcpsu_libs clean
|
||||
|
||||
%.o: %.c
|
||||
${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $<
|
||||
|
||||
banner:
|
||||
echo "Compiling ddrcpsu"
|
||||
|
||||
xddrcpsu_libs: ${OBJECTS}
|
||||
$(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS}
|
||||
|
||||
.PHONY: include
|
||||
include: xddrcpsu_includes
|
||||
|
||||
xddrcpsu_includes:
|
||||
${CP} ${INCLUDEFILES} ${INCLUDEDIR}
|
||||
|
||||
clean:
|
||||
rm -rf ${OBJECTS}
|
|
@ -0,0 +1,66 @@
|
|||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* Use of the Software is limited solely to applications:
|
||||
* (a) running on a Xilinx device, or
|
||||
* (b) that interact with a Xilinx device through a bus or interconnect.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* XILINX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the Xilinx shall not be used
|
||||
* in advertising or otherwise to promote the sale, use or other dealings in
|
||||
* in advertising or otherwise to promote the sale, use or other dealings in
|
||||
* this Software without prior written authorization from Xilinx.
|
||||
*
|
||||
*******************************************************************************/
|
||||
/******************************************************************************/
|
||||
/**
|
||||
*
|
||||
* @file xddcrpsu.h
|
||||
* @addtogroup ddrcpsu_v1_0
|
||||
* @{
|
||||
* @details
|
||||
*
|
||||
* The Xilinx DdrcPsu driver. This driver supports the Xilinx ddrcpsu
|
||||
* IP core.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
* <pre>
|
||||
* MODIFICATION HISTORY:
|
||||
*
|
||||
* Ver Who Date Changes
|
||||
* ----- ---- -------- -----------------------------------------------
|
||||
* 1.0 ssc 04/28/16 First Release.
|
||||
* 1.1 adk 04/08/16 Export DDR freq to xparameters.h file.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef XDDRCPS_H_
|
||||
/* Prevent circular inclusions by using protection macros. */
|
||||
#define XDDRCPS_H_
|
||||
|
||||
/******************************* Include Files ********************************/
|
||||
|
||||
|
||||
#endif /* XDDRCPS_H_ */
|
||||
/** @} */
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -54,6 +54,7 @@
|
|||
* in XIicPs_Reset.
|
||||
* 12/06/14 Implemented Repeated start feature.
|
||||
* 01/31/15 Modified the code according to MISRAC 2012 Compliant.
|
||||
* 3.3 kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -228,7 +229,7 @@ void XIicPs_Abort(XIicPs *InstancePtr)
|
|||
* Reset the settings in config register and clear the FIFOs.
|
||||
*/
|
||||
XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET,
|
||||
XIICPS_CR_RESET_VALUE | XIICPS_CR_CLR_FIFO_MASK);
|
||||
(u32)XIICPS_CR_RESET_VALUE | (u32)XIICPS_CR_CLR_FIFO_MASK);
|
||||
|
||||
/*
|
||||
* Read, then write the interrupt status to make sure there are no
|
||||
|
@ -242,7 +243,7 @@ void XIicPs_Abort(XIicPs *InstancePtr)
|
|||
/*
|
||||
* Restore the interrupt state.
|
||||
*/
|
||||
IntrMaskReg = XIICPS_IXR_ALL_INTR_MASK & (~IntrMaskReg);
|
||||
IntrMaskReg = (u32)XIICPS_IXR_ALL_INTR_MASK & (~IntrMaskReg);
|
||||
XIicPs_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XIICPS_IER_OFFSET, IntrMaskReg);
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -183,6 +183,7 @@
|
|||
* 01/31/15 Modified the code according to MISRAC 2012 Compliant.
|
||||
* 02/18/15 Implemented larger data transfer using repeated start
|
||||
* in Zynq UltraScale MP.
|
||||
* 3.3 kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
|
||||
*
|
||||
* </pre>
|
||||
*
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -62,6 +62,7 @@
|
|||
* 01/31/15 Modified the code according to MISRAC 2012 Compliant.
|
||||
* 02/18/15 Implemented larger data transfer using repeated start
|
||||
* in Zynq UltraScale MP.
|
||||
* 3.3 kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -106,6 +107,7 @@ void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount,
|
|||
u16 SlaveAddr)
|
||||
{
|
||||
u32 BaseAddr;
|
||||
u32 Platform = XGetPlatform_Info();
|
||||
|
||||
/*
|
||||
* Assert validates the input arguments.
|
||||
|
@ -147,6 +149,16 @@ void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount,
|
|||
*/
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, (u32)SlaveAddr);
|
||||
|
||||
/* Clear the Hold bit in ZYNQ if receive byte count is less than
|
||||
* the FIFO depth to get the completion interrupt properly.
|
||||
*/
|
||||
if ((ByteCount < XIICPS_FIFO_DEPTH) && (Platform == (u32)XPLAT_ZYNQ))
|
||||
{
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET,
|
||||
XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) &
|
||||
(u32)(~XIICPS_CR_HOLD_MASK));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -182,10 +194,8 @@ void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount,
|
|||
BaseAddr = InstancePtr->Config.BaseAddress;
|
||||
InstancePtr->RecvBufferPtr = MsgPtr;
|
||||
InstancePtr->RecvByteCount = ByteCount;
|
||||
InstancePtr->CurrByteCount = ByteCount;
|
||||
InstancePtr->SendBufferPtr = NULL;
|
||||
InstancePtr->IsSend = 0;
|
||||
InstancePtr->UpdateTxSize = 0;
|
||||
|
||||
if ((ByteCount > XIICPS_FIFO_DEPTH) ||
|
||||
((InstancePtr->IsRepeatedStart) !=0))
|
||||
|
@ -203,14 +213,16 @@ void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount,
|
|||
* Setup the transfer size register so the slave knows how much
|
||||
* to send to us.
|
||||
*/
|
||||
if (ByteCount > XIICPS_MAX_TRANSFER_SIZE) {
|
||||
if (ByteCount > (s32)XIICPS_MAX_TRANSFER_SIZE) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET,
|
||||
XIICPS_MAX_TRANSFER_SIZE);
|
||||
InstancePtr->CurrByteCount = (s32)XIICPS_MAX_TRANSFER_SIZE;
|
||||
InstancePtr->UpdateTxSize = 1;
|
||||
}else {
|
||||
InstancePtr->CurrByteCount = ByteCount;
|
||||
XIicPs_WriteReg(BaseAddr, (u32)(XIICPS_TRANS_SIZE_OFFSET),
|
||||
(u32)ByteCount);
|
||||
InstancePtr->UpdateTxSize = 0;
|
||||
}
|
||||
|
||||
XIicPs_EnableInterrupts(BaseAddr,
|
||||
|
@ -251,8 +263,7 @@ s32 XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
u32 StatusReg;
|
||||
u32 BaseAddr;
|
||||
u32 Intrs;
|
||||
u32 Value;
|
||||
s32 Status;
|
||||
_Bool Value;
|
||||
|
||||
/*
|
||||
* Assert validates the input arguments.
|
||||
|
@ -260,7 +271,7 @@ s32 XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(MsgPtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY);
|
||||
Xil_AssertNonvoid(XIICPS_ADDR_MASK >= SlaveAddr);
|
||||
Xil_AssertNonvoid((u16)XIICPS_ADDR_MASK >= SlaveAddr);
|
||||
|
||||
BaseAddr = InstancePtr->Config.BaseAddress;
|
||||
InstancePtr->SendBufferPtr = MsgPtr;
|
||||
|
@ -302,7 +313,7 @@ s32 XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
*/
|
||||
Value = ((InstancePtr->SendByteCount > (s32)0) &&
|
||||
((IntrStatusReg & Intrs) == (u32)0U));
|
||||
while (Value != (u32)0x00U) {
|
||||
while (Value != FALSE) {
|
||||
StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET);
|
||||
|
||||
/*
|
||||
|
@ -374,14 +385,8 @@ s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
u32 Intrs;
|
||||
u32 StatusReg;
|
||||
u32 BaseAddr;
|
||||
s32 BytesToRecv;
|
||||
s32 BytesToRead;
|
||||
s32 TransSize;
|
||||
s32 Tmp = 0;
|
||||
u32 Status_Rcv;
|
||||
u32 Status;
|
||||
s32 Result;
|
||||
s32 IsHold = 0;
|
||||
s32 IsHold;
|
||||
s32 UpdateTxSize = 0;
|
||||
s32 ByteCountVar = ByteCount;
|
||||
u32 Platform;
|
||||
|
@ -407,6 +412,8 @@ s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) |
|
||||
(u32)XIICPS_CR_HOLD_MASK);
|
||||
IsHold = 1;
|
||||
} else {
|
||||
IsHold = 0;
|
||||
}
|
||||
|
||||
(void)XIicPs_SetupMaster(InstancePtr, RECVING_ROLE);
|
||||
|
@ -423,7 +430,7 @@ s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
* Set up the transfer size register so the slave knows how much
|
||||
* to send to us.
|
||||
*/
|
||||
if (ByteCountVar > XIICPS_MAX_TRANSFER_SIZE) {
|
||||
if (ByteCountVar > (s32)XIICPS_MAX_TRANSFER_SIZE) {
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET,
|
||||
XIICPS_MAX_TRANSFER_SIZE);
|
||||
ByteCountVar = (s32)XIICPS_MAX_TRANSFER_SIZE;
|
||||
|
@ -460,18 +467,18 @@ s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
XIicPs_RecvByte(InstancePtr);
|
||||
ByteCountVar --;
|
||||
|
||||
if (Platform == XPLAT_ZYNQ) {
|
||||
if (Platform == (u32)XPLAT_ZYNQ) {
|
||||
if ((UpdateTxSize != 0) &&
|
||||
((ByteCountVar == (XIICPS_FIFO_DEPTH + 1)) != 0U)) {
|
||||
(ByteCountVar == (XIICPS_FIFO_DEPTH + 1))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET);
|
||||
}
|
||||
if (Platform == XPLAT_ZYNQ) {
|
||||
if (Platform == (u32)XPLAT_ZYNQ) {
|
||||
if ((UpdateTxSize != 0) &&
|
||||
((ByteCountVar == (XIICPS_FIFO_DEPTH + 1)) != 0U)) {
|
||||
(ByteCountVar == (XIICPS_FIFO_DEPTH + 1))) {
|
||||
/* wait while fifo is full */
|
||||
while (XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_TRANS_SIZE_OFFSET) !=
|
||||
|
@ -479,7 +486,7 @@ s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
}
|
||||
|
||||
if ((InstancePtr->RecvByteCount - XIICPS_FIFO_DEPTH) >
|
||||
XIICPS_MAX_TRANSFER_SIZE) {
|
||||
(s32)XIICPS_MAX_TRANSFER_SIZE) {
|
||||
|
||||
XIicPs_WriteReg(BaseAddr,
|
||||
XIICPS_TRANS_SIZE_OFFSET,
|
||||
|
@ -507,7 +514,7 @@ s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr,
|
|||
XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr);
|
||||
|
||||
if ((InstancePtr->RecvByteCount) >
|
||||
XIICPS_MAX_TRANSFER_SIZE) {
|
||||
(s32)XIICPS_MAX_TRANSFER_SIZE) {
|
||||
|
||||
XIicPs_WriteReg(BaseAddr,
|
||||
XIICPS_TRANS_SIZE_OFFSET,
|
||||
|
@ -755,17 +762,17 @@ void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr)
|
|||
XIicPs_RecvByte(InstancePtr);
|
||||
ByteCnt--;
|
||||
|
||||
if (Platform == XPLAT_ZYNQ) {
|
||||
if (Platform == (u32)XPLAT_ZYNQ) {
|
||||
if ((InstancePtr->UpdateTxSize != 0) &&
|
||||
((ByteCnt == (XIICPS_FIFO_DEPTH + 1)) != 0U)) {
|
||||
(ByteCnt == (XIICPS_FIFO_DEPTH + 1))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Platform == XPLAT_ZYNQ) {
|
||||
if (Platform == (u32)XPLAT_ZYNQ) {
|
||||
if ((InstancePtr->UpdateTxSize != 0) &&
|
||||
((ByteCnt == (XIICPS_FIFO_DEPTH + 1))!= 0U)) {
|
||||
(ByteCnt == (XIICPS_FIFO_DEPTH + 1))) {
|
||||
/* wait while fifo is full */
|
||||
while (XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_TRANS_SIZE_OFFSET) !=
|
||||
|
@ -773,7 +780,7 @@ void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr)
|
|||
}
|
||||
|
||||
if ((InstancePtr->RecvByteCount - XIICPS_FIFO_DEPTH) >
|
||||
XIICPS_MAX_TRANSFER_SIZE) {
|
||||
(s32)XIICPS_MAX_TRANSFER_SIZE) {
|
||||
|
||||
XIicPs_WriteReg(BaseAddr,
|
||||
XIICPS_TRANS_SIZE_OFFSET,
|
||||
|
@ -798,11 +805,11 @@ void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr)
|
|||
IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET);
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg);
|
||||
|
||||
SlaveAddr = XIicPs_ReadReg(BaseAddr, (u32)XIICPS_ADDR_OFFSET);
|
||||
SlaveAddr = (u16)XIicPs_ReadReg(BaseAddr, (u32)XIICPS_ADDR_OFFSET);
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr);
|
||||
|
||||
if ((InstancePtr->RecvByteCount) >
|
||||
XIICPS_MAX_TRANSFER_SIZE) {
|
||||
(s32)XIICPS_MAX_TRANSFER_SIZE) {
|
||||
|
||||
XIicPs_WriteReg(BaseAddr,
|
||||
XIICPS_TRANS_SIZE_OFFSET,
|
||||
|
@ -910,7 +917,6 @@ static s32 XIicPs_SetupMaster(XIicPs *InstancePtr, s32 Role)
|
|||
{
|
||||
u32 ControlReg;
|
||||
u32 BaseAddr;
|
||||
u32 EnabledIntr = 0x0U;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
|
||||
|
@ -935,11 +941,9 @@ static s32 XIicPs_SetupMaster(XIicPs *InstancePtr, s32 Role)
|
|||
|
||||
if (Role == RECVING_ROLE) {
|
||||
ControlReg |= (u32)XIICPS_CR_RD_WR_MASK;
|
||||
EnabledIntr = (u32)XIICPS_IXR_DATA_MASK |(u32)XIICPS_IXR_RX_OVR_MASK;
|
||||
}else {
|
||||
ControlReg &= (u32)(~XIICPS_CR_RD_WR_MASK);
|
||||
}
|
||||
EnabledIntr |= (u32)XIICPS_IXR_COMP_MASK | (u32)XIICPS_IXR_ARB_LOST_MASK;
|
||||
|
||||
XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, ControlReg);
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -55,6 +55,7 @@
|
|||
* 2.3 sk 10/07/14 Repeated start feature removed.
|
||||
* 3.0 sk 12/06/14 Implemented Repeated start feature.
|
||||
* 01/31/15 Modified the code according to MISRAC 2012 Compliant.
|
||||
* 3.3 kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -135,7 +136,7 @@ s32 XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options)
|
|||
* The hold bit in CR will be written by driver when the next transfer
|
||||
* is initiated.
|
||||
*/
|
||||
if ((OptionsVar & XIICPS_REP_START_OPTION) != 0U ) {
|
||||
if ((OptionsVar & (u32)XIICPS_REP_START_OPTION) != (u32)0 ) {
|
||||
InstancePtr->IsRepeatedStart = 1;
|
||||
OptionsVar = OptionsVar & (~XIICPS_REP_START_OPTION);
|
||||
}
|
||||
|
@ -349,8 +350,8 @@ s32 XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz)
|
|||
u32 ControlReg;
|
||||
u32 CalcDivA;
|
||||
u32 CalcDivB;
|
||||
u32 BestDivA = 0;
|
||||
u32 BestDivB = 0;
|
||||
u32 BestDivA;
|
||||
u32 BestDivB;
|
||||
u32 FsclHzVar = FsclHz;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
|
@ -379,12 +380,12 @@ s32 XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz)
|
|||
* If frequency 100KHz is selected, 90KHz should be set.
|
||||
* This is due to a hardware limitation.
|
||||
*/
|
||||
if(FsclHzVar > 384600U) {
|
||||
FsclHzVar = 384600U;
|
||||
if(FsclHzVar > (u32)384600U) {
|
||||
FsclHzVar = (u32)384600U;
|
||||
}
|
||||
|
||||
if((FsclHzVar <= 100000U) && (FsclHzVar > 90000U)) {
|
||||
FsclHzVar = 90000U;
|
||||
if((FsclHzVar <= (u32)100000U) && (FsclHzVar > (u32)90000U)) {
|
||||
FsclHzVar = (u32)90000U;
|
||||
}
|
||||
|
||||
/*
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -44,6 +44,7 @@
|
|||
* 1.00a jz 01/30/10 First release
|
||||
* 1.04a kpc 08/30/13 Avoid buffer overwrite in SlaveRecvData function
|
||||
* 3.00 sk 01/31/15 Modified the code according to MISRAC 2012 Compliant.
|
||||
* 3.3 kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -210,7 +211,8 @@ s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount)
|
|||
s32 BytesToSend;
|
||||
s32 Error = 0;
|
||||
s32 Status = (s32)XST_SUCCESS;
|
||||
u32 Value;
|
||||
_Bool Value;
|
||||
_Bool Result;
|
||||
|
||||
/*
|
||||
* Assert validates the input arguments.
|
||||
|
@ -227,8 +229,9 @@ s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount)
|
|||
* Use RXRW bit in status register to wait master to start a read.
|
||||
*/
|
||||
StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET);
|
||||
while (((StatusReg & XIICPS_SR_RXRW_MASK) == 0U) &&
|
||||
((!Error) != 0)) {
|
||||
Result = (((u32)(StatusReg & XIICPS_SR_RXRW_MASK) == (u32)0x0U) &&
|
||||
(Error == 0));
|
||||
while (Result != FALSE) {
|
||||
|
||||
/*
|
||||
* If master tries to send us data, it is an error.
|
||||
|
@ -238,6 +241,8 @@ s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount)
|
|||
}
|
||||
|
||||
StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET);
|
||||
Result = (((u32)(StatusReg & XIICPS_SR_RXRW_MASK) == (u32)0x0U) &&
|
||||
(Error == 0));
|
||||
}
|
||||
|
||||
if (Error != 0) {
|
||||
|
@ -255,8 +260,8 @@ s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount)
|
|||
* there are no errors.
|
||||
*/
|
||||
Value = (InstancePtr->SendByteCount > (s32)0) &&
|
||||
((!Error) != 0);
|
||||
while (Value != (u32)0x00U) {
|
||||
((Error == 0));
|
||||
while (Value != FALSE) {
|
||||
|
||||
/*
|
||||
* Find out how many can be sent.
|
||||
|
@ -276,7 +281,7 @@ s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount)
|
|||
* Wait for master to read the data out of fifo.
|
||||
*/
|
||||
while (((StatusReg & XIICPS_SR_TXDV_MASK) != (u32)0x00U) &&
|
||||
((!Error) != 0)) {
|
||||
(Error == 0)) {
|
||||
|
||||
/*
|
||||
* If master terminates the transfer before all data is
|
||||
|
@ -296,8 +301,8 @@ s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount)
|
|||
StatusReg = XIicPs_ReadReg(BaseAddr,
|
||||
XIICPS_SR_OFFSET);
|
||||
}
|
||||
Value = (InstancePtr->SendByteCount > (s32)0U) &&
|
||||
((!Error) != 0);
|
||||
Value = ((InstancePtr->SendByteCount > (s32)0) &&
|
||||
(Error == 0));
|
||||
}
|
||||
}
|
||||
if (Error != 0) {
|
||||
|
@ -551,7 +556,7 @@ void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr)
|
|||
/*
|
||||
* Signal application if there are any events.
|
||||
*/
|
||||
if (0U != StatusEvent) {
|
||||
if ((u32)0U != StatusEvent) {
|
||||
InstancePtr->StatusHandler(InstancePtr->CallBackRef,
|
||||
StatusEvent);
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -47,6 +47,7 @@
|
|||
* 1.00 mjr 03/15/15 First Release
|
||||
* 2.0 mjr 01/22/16 Fixed response buffer address
|
||||
* calculation. CR# 932582.
|
||||
* 2.1 kvn 05/05/16 Modified code for MISRA-C:2012 Compliance
|
||||
* </pre>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
@ -85,7 +86,7 @@ XStatus XIpiPsu_CfgInitialize(XIpiPsu *InstancePtr, XIpiPsu_Config * CfgPtr,
|
|||
|
||||
InstancePtr->Config.TargetCount = CfgPtr->TargetCount;
|
||||
|
||||
for (Index = 0; Index < CfgPtr->TargetCount; Index++) {
|
||||
for (Index = 0U; Index < CfgPtr->TargetCount; Index++) {
|
||||
InstancePtr->Config.TargetList[Index].Mask =
|
||||
CfgPtr->TargetList[Index].Mask;
|
||||
InstancePtr->Config.TargetList[Index].BufferIndex =
|
||||
|
@ -167,7 +168,7 @@ XStatus XIpiPsu_PollForAck(XIpiPsu *InstancePtr, u32 DestCpuMask,
|
|||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
||||
PollCount = 0;
|
||||
PollCount = 0U;
|
||||
/* Poll the OBS register until the corresponding DestCpu bit is cleared */
|
||||
do {
|
||||
Flag = (XIpiPsu_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
|
@ -202,10 +203,10 @@ static u32 XIpiPsu_GetBufferIndex(XIpiPsu *InstancePtr, u32 CpuMask)
|
|||
u32 BufferIndex;
|
||||
u32 Index;
|
||||
/* Init Index with an invalid value */
|
||||
BufferIndex = XIPIPSU_MAX_BUFF_INDEX + 1;
|
||||
BufferIndex = XIPIPSU_MAX_BUFF_INDEX + 1U;
|
||||
|
||||
/*Search for CPU in the List */
|
||||
for (Index = 0; Index < InstancePtr->Config.TargetCount; Index++) {
|
||||
for (Index = 0U; Index < InstancePtr->Config.TargetCount; Index++) {
|
||||
/*If we find the CPU , then set the Index and break the loop*/
|
||||
if (InstancePtr->Config.TargetList[Index].Mask == CpuMask) {
|
||||
BufferIndex = InstancePtr->Config.TargetList[Index].BufferIndex;
|
||||
|
@ -276,29 +277,29 @@ static u32* XIpiPsu_GetBufferAddress(XIpiPsu *InstancePtr, u32 SrcCpuMask,
|
|||
* @param SrcCpuMask is the Device Mask for the CPU which has sent the message
|
||||
* @param MsgPtr is the pointer to Buffer to which the read message needs to be stored
|
||||
* @param MsgLength is the length of the buffer/message
|
||||
* @param BufType is the type of buffer (XIPIPSU_BUF_TYPE_MSG or XIPIPSU_BUF_TYPE_RESP)
|
||||
* @param BufferType is the type of buffer (XIPIPSU_BUF_TYPE_MSG or XIPIPSU_BUF_TYPE_RESP)
|
||||
*
|
||||
* @return XST_SUCCESS if successful
|
||||
* XST_FAILURE if an error occurred
|
||||
*/
|
||||
|
||||
XStatus XIpiPsu_ReadMessage(XIpiPsu *InstancePtr, u32 TargetMask, u32 *MsgPtr,
|
||||
XStatus XIpiPsu_ReadMessage(XIpiPsu *InstancePtr, u32 SrcCpuMask, u32 *MsgPtr,
|
||||
u32 MsgLength, u8 BufferType)
|
||||
{
|
||||
u32 *BufferPtr;
|
||||
u32 Index;
|
||||
u32 Status;
|
||||
XStatus Status;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
Xil_AssertNonvoid(MsgPtr != NULL);
|
||||
Xil_AssertNonvoid(MsgLength <= XIPIPSU_MAX_MSG_LEN);
|
||||
|
||||
BufferPtr = XIpiPsu_GetBufferAddress(InstancePtr, TargetMask,
|
||||
BufferPtr = XIpiPsu_GetBufferAddress(InstancePtr, SrcCpuMask,
|
||||
InstancePtr->Config.BitMask, BufferType);
|
||||
if (BufferPtr != NULL) {
|
||||
/* Copy the IPI Buffer contents into Users's Buffer*/
|
||||
for (Index = 0; Index < MsgLength; Index++) {
|
||||
for (Index = 0U; Index < MsgLength; Index++) {
|
||||
MsgPtr[Index] = BufferPtr[Index];
|
||||
}
|
||||
Status = XST_SUCCESS;
|
||||
|
@ -317,18 +318,18 @@ XStatus XIpiPsu_ReadMessage(XIpiPsu *InstancePtr, u32 TargetMask, u32 *MsgPtr,
|
|||
* @param DestCpuMask is the Device Mask for the destination CPU
|
||||
* @param MsgPtr is the pointer to Buffer which contains the message to be sent
|
||||
* @param MsgLength is the length of the buffer/message
|
||||
* @param BufType is the type of buffer (XIPIPSU_BUF_TYPE_MSG or XIPIPSU_BUF_TYPE_RESP)
|
||||
* @param BufferType is the type of buffer (XIPIPSU_BUF_TYPE_MSG or XIPIPSU_BUF_TYPE_RESP)
|
||||
*
|
||||
* @return XST_SUCCESS if successful
|
||||
* XST_FAILURE if an error occurred
|
||||
*/
|
||||
|
||||
XStatus XIpiPsu_WriteMessage(XIpiPsu *InstancePtr, u32 TargetMask, u32 *MsgPtr,
|
||||
XStatus XIpiPsu_WriteMessage(XIpiPsu *InstancePtr, u32 DestCpuMask, u32 *MsgPtr,
|
||||
u32 MsgLength, u8 BufferType)
|
||||
{
|
||||
u32 *BufferPtr;
|
||||
u32 Index;
|
||||
u32 Status;
|
||||
XStatus Status;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
@ -336,10 +337,10 @@ XStatus XIpiPsu_WriteMessage(XIpiPsu *InstancePtr, u32 TargetMask, u32 *MsgPtr,
|
|||
Xil_AssertNonvoid(MsgLength <= XIPIPSU_MAX_MSG_LEN);
|
||||
|
||||
BufferPtr = XIpiPsu_GetBufferAddress(InstancePtr,
|
||||
InstancePtr->Config.BitMask, TargetMask, BufferType);
|
||||
InstancePtr->Config.BitMask, DestCpuMask, BufferType);
|
||||
if (BufferPtr != NULL) {
|
||||
/* Copy the Message to IPI Buffer */
|
||||
for (Index = 0; Index < MsgLength; Index++) {
|
||||
for (Index = 0U; Index < MsgLength; Index++) {
|
||||
BufferPtr[Index] = MsgPtr[Index];
|
||||
}
|
||||
Status = XST_SUCCESS;
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -272,10 +272,10 @@ XStatus XIpiPsu_PollForAck(XIpiPsu *InstancePtr, u32 DestCpuMask,
|
|||
u32 TimeOutCount);
|
||||
|
||||
XStatus XIpiPsu_ReadMessage(XIpiPsu *InstancePtr, u32 SrcCpuMask, u32 *MsgPtr,
|
||||
u32 MsgLength, u8 BufType);
|
||||
u32 MsgLength, u8 BufferType);
|
||||
|
||||
XStatus XIpiPsu_WriteMessage(XIpiPsu *InstancePtr, u32 DestCpuMask, u32 *MsgPtr,
|
||||
u32 MsgLength, u8 BufType);
|
||||
u32 MsgLength, u8 BufferType);
|
||||
|
||||
#endif /* XIPIPSU_H_ */
|
||||
/** @} */
|
|
@ -101,117 +101,5 @@ XIpiPsu_Config XIpiPsu_ConfigTable[] =
|
|||
XPAR_PSU_IPI_10_BUFFER_INDEX
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
XPAR_PSU_IPI_1_DEVICE_ID,
|
||||
XPAR_PSU_IPI_1_BASE_ADDRESS,
|
||||
XPAR_PSU_IPI_1_BIT_MASK,
|
||||
XPAR_PSU_IPI_1_BUFFER_INDEX,
|
||||
XPAR_PSU_IPI_1_INT_ID,
|
||||
XPAR_XIPIPSU_NUM_TARGETS,
|
||||
{
|
||||
|
||||
{
|
||||
XPAR_PSU_IPI_0_BIT_MASK,
|
||||
XPAR_PSU_IPI_0_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_1_BIT_MASK,
|
||||
XPAR_PSU_IPI_1_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_2_BIT_MASK,
|
||||
XPAR_PSU_IPI_2_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_3_BIT_MASK,
|
||||
XPAR_PSU_IPI_3_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_4_BIT_MASK,
|
||||
XPAR_PSU_IPI_4_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_5_BIT_MASK,
|
||||
XPAR_PSU_IPI_5_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_6_BIT_MASK,
|
||||
XPAR_PSU_IPI_6_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_7_BIT_MASK,
|
||||
XPAR_PSU_IPI_7_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_8_BIT_MASK,
|
||||
XPAR_PSU_IPI_8_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_9_BIT_MASK,
|
||||
XPAR_PSU_IPI_9_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_10_BIT_MASK,
|
||||
XPAR_PSU_IPI_10_BUFFER_INDEX
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
XPAR_PSU_IPI_2_DEVICE_ID,
|
||||
XPAR_PSU_IPI_2_BASE_ADDRESS,
|
||||
XPAR_PSU_IPI_2_BIT_MASK,
|
||||
XPAR_PSU_IPI_2_BUFFER_INDEX,
|
||||
XPAR_PSU_IPI_2_INT_ID,
|
||||
XPAR_XIPIPSU_NUM_TARGETS,
|
||||
{
|
||||
|
||||
{
|
||||
XPAR_PSU_IPI_0_BIT_MASK,
|
||||
XPAR_PSU_IPI_0_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_1_BIT_MASK,
|
||||
XPAR_PSU_IPI_1_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_2_BIT_MASK,
|
||||
XPAR_PSU_IPI_2_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_3_BIT_MASK,
|
||||
XPAR_PSU_IPI_3_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_4_BIT_MASK,
|
||||
XPAR_PSU_IPI_4_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_5_BIT_MASK,
|
||||
XPAR_PSU_IPI_5_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_6_BIT_MASK,
|
||||
XPAR_PSU_IPI_6_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_7_BIT_MASK,
|
||||
XPAR_PSU_IPI_7_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_8_BIT_MASK,
|
||||
XPAR_PSU_IPI_8_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_9_BIT_MASK,
|
||||
XPAR_PSU_IPI_9_BUFFER_INDEX
|
||||
},
|
||||
{
|
||||
XPAR_PSU_IPI_10_BIT_MASK,
|
||||
XPAR_PSU_IPI_10_BUFFER_INDEX
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -43,6 +43,7 @@
|
|||
* Ver Who Date Changes
|
||||
* ----- --- -------- -----------------------------------------------.
|
||||
* 1.0 mjr 03/15/15 First release
|
||||
* 2.1 kvn 05/05/16 Modified code for MISRA-C:2012 Compliance
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -54,7 +55,7 @@
|
|||
/* Message RAM related params */
|
||||
#define XIPIPSU_MSG_RAM_BASE 0xFF990000U
|
||||
#define XIPIPSU_MSG_BUF_SIZE 8U /* Size in Words */
|
||||
#define XIPIPSU_MAX_BUFF_INDEX 7
|
||||
#define XIPIPSU_MAX_BUFF_INDEX 7U
|
||||
|
||||
/* EIGHT pairs of TWO buffers(msg+resp) of THIRTY TWO bytes each */
|
||||
#define XIPIPSU_BUFFER_OFFSET_GROUP (8U * 2U * 32U)
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -44,6 +44,7 @@
|
|||
* Ver Who Date Changes
|
||||
* ----- --- -------- -----------------------------------------------
|
||||
* 1.0 mjr 03/15/15 First release
|
||||
* 2.1 kvn 05/05/16 Modified code for MISRA-C:2012 Compliance
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
@ -76,9 +77,9 @@ extern XIpiPsu_Config XIpiPsu_ConfigTable[];
|
|||
XIpiPsu_Config *XIpiPsu_LookupConfig(u32 DeviceId)
|
||||
{
|
||||
XIpiPsu_Config *CfgPtr = NULL;
|
||||
int Index;
|
||||
u32 Index;
|
||||
|
||||
for (Index = 0; Index < XPAR_XIPIPSU_NUM_INSTANCES; Index++) {
|
||||
for (Index = 0U; Index < XPAR_XIPIPSU_NUM_INSTANCES; Index++) {
|
||||
if (XIpiPsu_ConfigTable[Index].DeviceId == DeviceId) {
|
||||
CfgPtr = &XIpiPsu_ConfigTable[Index];
|
||||
break;
|
|
@ -52,6 +52,14 @@
|
|||
* sk 04/24/15 Modified the code according to MISRAC-2012.
|
||||
* sk 06/17/15 Removed NULL checks for Rx/Tx buffers. As
|
||||
* writing/reading from 0x0 location is permitted.
|
||||
* 1.1 sk 04/12/16 Added debug message prints.
|
||||
* 1.2 nsk 07/01/16 Changed XQspiPsu_Select to support GQSPI and LQSPI
|
||||
* selection.
|
||||
* rk 07/15/16 Added support for TapDelays at different frequencies.
|
||||
* nsk 08/05/16 Added example support PollData and PollTimeout
|
||||
* 1.3 nsk 09/16/16 Update PollData and PollTimeout support for dual
|
||||
* parallel configurations, modified XQspiPsu_PollData()
|
||||
* and XQspiPsu_Create_PollConfigData()
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -83,6 +91,10 @@ static inline void XQspiPsu_GenFifoEntryData(XQspiPsu *InstancePtr,
|
|||
static inline void XQspiPsu_GenFifoEntryCSDeAssert(XQspiPsu *InstancePtr);
|
||||
static inline void XQspiPsu_ReadRxFifo(XQspiPsu *InstancePtr,
|
||||
XQspiPsu_Msg *Msg, s32 Size);
|
||||
static inline void XQspiPsu_PollData(XQspiPsu *QspiPsuPtr,
|
||||
XQspiPsu_Msg *FlashMsg);
|
||||
static inline u32 XQspiPsu_Create_PollConfigData(XQspiPsu *QspiPsuPtr,
|
||||
XQspiPsu_Msg *FlashMsg);
|
||||
|
||||
/************************** Variable Definitions *****************************/
|
||||
|
||||
|
@ -137,7 +149,7 @@ s32 XQspiPsu_CfgInitialize(XQspiPsu *InstancePtr, XQspiPsu_Config *ConfigPtr,
|
|||
InstancePtr->Config.ConnectionMode = ConfigPtr->ConnectionMode;
|
||||
InstancePtr->StatusHandler = StubStatusHandler;
|
||||
InstancePtr->Config.BusWidth = ConfigPtr->BusWidth;
|
||||
|
||||
InstancePtr->Config.InputClockHz = ConfigPtr->InputClockHz;
|
||||
/* Other instance variable initializations */
|
||||
InstancePtr->SendBufferPtr = NULL;
|
||||
InstancePtr->RecvBufferPtr = NULL;
|
||||
|
@ -152,7 +164,7 @@ s32 XQspiPsu_CfgInitialize(XQspiPsu *InstancePtr, XQspiPsu_Config *ConfigPtr,
|
|||
InstancePtr->IsManualstart = TRUE;
|
||||
|
||||
/* Select QSPIPSU */
|
||||
XQspiPsu_Select(InstancePtr);
|
||||
XQspiPsu_Select(InstancePtr, XQSPIPSU_SEL_GQSPI_MASK);
|
||||
|
||||
/*
|
||||
* Reset the QSPIPSU device to get it into its initial state. It is
|
||||
|
@ -343,12 +355,10 @@ void XQspiPsu_Abort(XQspiPsu *InstancePtr)
|
|||
s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
||||
u32 NumMsg)
|
||||
{
|
||||
u32 StatusReg;
|
||||
u32 ConfigReg;
|
||||
|
||||
s32 Index;
|
||||
u32 QspiPsuStatusReg, DmaStatusReg;
|
||||
u32 QspiPsuStatusReg;
|
||||
u32 BaseAddress;
|
||||
s32 Status;
|
||||
s32 RxThr;
|
||||
u32 IOPending = (u32)FALSE;
|
||||
|
||||
|
@ -391,6 +401,9 @@ s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
|||
XQspiPsu_GenFifoEntryData(InstancePtr, Msg, Index);
|
||||
|
||||
if (InstancePtr->IsManualstart == TRUE) {
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nManual Start\r\n");
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_CFG_OFFSET,
|
||||
XQspiPsu_ReadReg(BaseAddress,
|
||||
XQSPIPSU_CFG_OFFSET) |
|
||||
|
@ -484,6 +497,9 @@ s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
|||
XQspiPsu_GenFifoEntryCSDeAssert(InstancePtr);
|
||||
|
||||
if (InstancePtr->IsManualstart == TRUE) {
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nManual Start\r\n");
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_CFG_OFFSET,
|
||||
XQspiPsu_ReadReg(BaseAddress, XQSPIPSU_CFG_OFFSET) |
|
||||
XQSPIPSU_CFG_START_GEN_FIFO_MASK);
|
||||
|
@ -526,11 +542,9 @@ s32 XQspiPsu_PolledTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
|||
s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
||||
u32 NumMsg)
|
||||
{
|
||||
u32 StatusReg;
|
||||
u32 ConfigReg;
|
||||
|
||||
s32 Index;
|
||||
u32 BaseAddress;
|
||||
s32 Status;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
@ -543,6 +557,10 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
|||
return (s32)XST_DEVICE_BUSY;
|
||||
}
|
||||
|
||||
if (Msg[0].Flags & XQSPIPSU_MSG_FLAG_POLL) {
|
||||
InstancePtr->IsBusy = TRUE;
|
||||
XQspiPsu_PollData(InstancePtr, Msg);
|
||||
} else {
|
||||
/* Check for ByteCount upper limit - 2^28 for DMA */
|
||||
for (Index = 0; Index < (s32)NumMsg; Index++) {
|
||||
if ((Msg[Index].ByteCount > XQSPIPSU_DMA_BYTES_MAX) &&
|
||||
|
@ -574,6 +592,9 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
|||
XQspiPsu_GenFifoEntryData(InstancePtr, Msg, 0);
|
||||
|
||||
if (InstancePtr->IsManualstart == TRUE) {
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nManual Start\r\n");
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_CFG_OFFSET,
|
||||
XQspiPsu_ReadReg(BaseAddress, XQSPIPSU_CFG_OFFSET) |
|
||||
XQSPIPSU_CFG_START_GEN_FIFO_MASK);
|
||||
|
@ -589,7 +610,7 @@ s32 XQspiPsu_InterruptTransfer(XQspiPsu *InstancePtr, XQspiPsu_Msg *Msg,
|
|||
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_QSPIDMA_DST_I_EN_OFFSET,
|
||||
XQSPIPSU_QSPIDMA_DST_I_EN_DONE_MASK);
|
||||
}
|
||||
|
||||
}
|
||||
return XST_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -636,8 +657,7 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
|
|||
XQspiPsu_WriteReg(BaseAddress,
|
||||
XQSPIPSU_QSPIDMA_DST_I_STS_OFFSET, DmaIntrStatusReg);
|
||||
}
|
||||
if (((QspiPsuStatusReg & XQSPIPSU_ISR_POLL_TIME_EXPIRE_MASK) != FALSE) ||
|
||||
((DmaIntrStatusReg & XQSPIPSU_QSPIDMA_DST_INTR_ERR_MASK) != FALSE)) {
|
||||
if (((DmaIntrStatusReg & XQSPIPSU_QSPIDMA_DST_INTR_ERR_MASK) != FALSE)) {
|
||||
/* Call status handler to indicate error */
|
||||
InstancePtr->StatusHandler(InstancePtr->StatusRef,
|
||||
XST_SPI_COMMAND_ERROR, 0);
|
||||
|
@ -681,6 +701,9 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
|
|||
XQspiPsu_GenFifoEntryData(InstancePtr, Msg,
|
||||
MsgCnt);
|
||||
if(InstancePtr->IsManualstart == TRUE) {
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nManual Start\r\n");
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress,
|
||||
XQSPIPSU_CFG_OFFSET,
|
||||
XQspiPsu_ReadReg(BaseAddress,
|
||||
|
@ -727,6 +750,7 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
|
|||
if ((MsgCnt < NumMsg) && (DeltaMsgCnt == FALSE) &&
|
||||
((TxRxFlag & XQSPIPSU_MSG_FLAG_RX) == FALSE) &&
|
||||
((TxRxFlag & XQSPIPSU_MSG_FLAG_TX) == FALSE) &&
|
||||
((TxRxFlag & XQSPIPSU_MSG_FLAG_POLL) == FALSE) &&
|
||||
((QspiPsuStatusReg & XQSPIPSU_ISR_GENFIFOEMPTY_MASK) != FALSE)) {
|
||||
MsgCnt += 1;
|
||||
DeltaMsgCnt = 1U;
|
||||
|
@ -754,6 +778,9 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
|
|||
XQspiPsu_GenFifoEntryData(InstancePtr, Msg, MsgCnt);
|
||||
|
||||
if (InstancePtr->IsManualstart == TRUE) {
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nManual Start\r\n");
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress,
|
||||
XQSPIPSU_CFG_OFFSET,
|
||||
XQspiPsu_ReadReg(BaseAddress,
|
||||
|
@ -769,6 +796,9 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
|
|||
XQspiPsu_GenFifoEntryCSDeAssert(InstancePtr);
|
||||
|
||||
if (InstancePtr->IsManualstart == TRUE) {
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nManual Start\r\n");
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress,
|
||||
XQSPIPSU_CFG_OFFSET,
|
||||
XQspiPsu_ReadReg(BaseAddress,
|
||||
|
@ -800,7 +830,34 @@ s32 XQspiPsu_InterruptHandler(XQspiPsu *InstancePtr)
|
|||
XST_SPI_TRANSFER_DONE, 0);
|
||||
}
|
||||
}
|
||||
if ((TxRxFlag & XQSPIPSU_MSG_FLAG_POLL) != FALSE){
|
||||
if (QspiPsuStatusReg & XQSPIPSU_ISR_RXNEMPTY_MASK){
|
||||
/*
|
||||
* Read data from RXFIFO, since when data from the flash device
|
||||
* (status data) matched with configured value in poll_cfg, then
|
||||
* controller writes the matched data into RXFIFO.
|
||||
*/
|
||||
XQspiPsu_ReadReg(InstancePtr->Config.BaseAddress, XQSPIPSU_RXD_OFFSET);
|
||||
|
||||
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_IDR_OFFSET,
|
||||
(u32)XQSPIPSU_IER_TXNOT_FULL_MASK |
|
||||
(u32)XQSPIPSU_IER_TXEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_RXNEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_GENFIFOEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_RXEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_POLL_TIME_EXPIRE_MASK);
|
||||
InstancePtr->StatusHandler(InstancePtr->StatusRef, XST_SPI_POLL_DONE, 0);
|
||||
|
||||
InstancePtr->IsBusy = FALSE;
|
||||
/* Disable the device. */
|
||||
XQspiPsu_Disable(InstancePtr);
|
||||
|
||||
}
|
||||
if (QspiPsuStatusReg & XQSPIPSU_ISR_POLL_TIME_EXPIRE_MASK){
|
||||
InstancePtr->StatusHandler(InstancePtr->StatusRef,
|
||||
XST_FLASH_TIMEOUT_ERROR, 0);
|
||||
}
|
||||
}
|
||||
return XST_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -892,6 +949,11 @@ static void StubStatusHandler(void *CallBackRef, u32 StatusEvent,
|
|||
static inline u32 XQspiPsu_SelectSpiMode(u8 SpiMode)
|
||||
{
|
||||
u32 Mask;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_SelectSpiMode\r\n");
|
||||
#endif
|
||||
|
||||
switch (SpiMode) {
|
||||
case XQSPIPSU_SELECT_MODE_DUALSPI:
|
||||
Mask = XQSPIPSU_GENFIFO_MODE_DUALSPI;
|
||||
|
@ -906,6 +968,9 @@ static inline u32 XQspiPsu_SelectSpiMode(u8 SpiMode)
|
|||
Mask = XQSPIPSU_GENFIFO_MODE_SPI;
|
||||
break;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nSPIMode is %08x\r\n", SpiMode);
|
||||
#endif
|
||||
|
||||
return Mask;
|
||||
}
|
||||
|
@ -1014,6 +1079,10 @@ static inline void XQspiPsu_FillTxFifo(XQspiPsu *InstancePtr,
|
|||
|
||||
Xil_AssertVoid(InstancePtr != NULL);
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_FillTxFifo\r\n");
|
||||
#endif
|
||||
|
||||
while ((InstancePtr->TxBytes > 0) && (Count < Size)) {
|
||||
if (InstancePtr->TxBytes >= 4) {
|
||||
(void)memcpy(&Data, Msg->TxBfrPtr, 4);
|
||||
|
@ -1028,6 +1097,9 @@ static inline void XQspiPsu_FillTxFifo(XQspiPsu *InstancePtr,
|
|||
}
|
||||
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_TXD_OFFSET, Data);
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nData is %08x\r\n", Data);
|
||||
#endif
|
||||
|
||||
}
|
||||
if (InstancePtr->TxBytes < 0) {
|
||||
|
@ -1104,6 +1176,10 @@ static inline void XQspiPsu_GenFifoEntryCSAssert(XQspiPsu *InstancePtr)
|
|||
{
|
||||
u32 GenFifoEntry;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_GenFifoEntryCSAssert\r\n");
|
||||
#endif
|
||||
|
||||
GenFifoEntry = 0x0U;
|
||||
GenFifoEntry &= ~((u32)XQSPIPSU_GENFIFO_DATA_XFER | (u32)XQSPIPSU_GENFIFO_EXP);
|
||||
GenFifoEntry &= (u32)(~XQSPIPSU_GENFIFO_MODE_MASK);
|
||||
|
@ -1114,7 +1190,9 @@ static inline void XQspiPsu_GenFifoEntryCSAssert(XQspiPsu *InstancePtr)
|
|||
GenFifoEntry &= ~(XQSPIPSU_GENFIFO_TX | XQSPIPSU_GENFIFO_RX |
|
||||
XQSPIPSU_GENFIFO_STRIPE | XQSPIPSU_GENFIFO_POLL);
|
||||
GenFifoEntry |= XQSPIPSU_GENFIFO_CS_SETUP;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nFifoEntry=%08x\r\n",GenFifoEntry);
|
||||
#endif
|
||||
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_GEN_FIFO_OFFSET, GenFifoEntry);
|
||||
}
|
||||
|
@ -1144,6 +1222,10 @@ static inline void XQspiPsu_GenFifoEntryData(XQspiPsu *InstancePtr,
|
|||
u32 TempCount;
|
||||
u32 ImmData;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_GenFifoEntryData\r\n");
|
||||
#endif
|
||||
|
||||
BaseAddress = InstancePtr->Config.BaseAddress;
|
||||
|
||||
GenFifoEntry = 0x0U;
|
||||
|
@ -1177,6 +1259,9 @@ static inline void XQspiPsu_GenFifoEntryData(XQspiPsu *InstancePtr,
|
|||
if (Msg[Index].ByteCount < XQSPIPSU_GENFIFO_IMM_DATA_MASK) {
|
||||
GenFifoEntry &= (u32)(~XQSPIPSU_GENFIFO_IMM_DATA_MASK);
|
||||
GenFifoEntry |= Msg[Index].ByteCount;
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nFifoEntry=%08x\r\n",GenFifoEntry);
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress, XQSPIPSU_GEN_FIFO_OFFSET,
|
||||
GenFifoEntry);
|
||||
} else {
|
||||
|
@ -1190,6 +1275,9 @@ static inline void XQspiPsu_GenFifoEntryData(XQspiPsu *InstancePtr,
|
|||
if ((TempCount & XQSPIPSU_GENFIFO_EXP_START) != FALSE) {
|
||||
GenFifoEntry &= (u32)(~XQSPIPSU_GENFIFO_IMM_DATA_MASK);
|
||||
GenFifoEntry |= Exponent;
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nFifoEntry=%08x\r\n",GenFifoEntry);
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress,
|
||||
XQSPIPSU_GEN_FIFO_OFFSET,
|
||||
GenFifoEntry);
|
||||
|
@ -1203,6 +1291,9 @@ static inline void XQspiPsu_GenFifoEntryData(XQspiPsu *InstancePtr,
|
|||
if ((ImmData & 0xFFU) != FALSE) {
|
||||
GenFifoEntry &= (u32)(~XQSPIPSU_GENFIFO_IMM_DATA_MASK);
|
||||
GenFifoEntry |= ImmData & 0xFFU;
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nFifoEntry=%08x\r\n",GenFifoEntry);
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress,
|
||||
XQSPIPSU_GEN_FIFO_OFFSET, GenFifoEntry);
|
||||
}
|
||||
|
@ -1212,6 +1303,9 @@ static inline void XQspiPsu_GenFifoEntryData(XQspiPsu *InstancePtr,
|
|||
if ((InstancePtr->ReadMode == XQSPIPSU_READMODE_IO) &&
|
||||
((Msg[Index].Flags & XQSPIPSU_MSG_FLAG_RX) != FALSE)) {
|
||||
GenFifoEntry = 0x0U;
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nDummy FifoEntry=%08x\r\n",GenFifoEntry);
|
||||
#endif
|
||||
XQspiPsu_WriteReg(BaseAddress,
|
||||
XQSPIPSU_GEN_FIFO_OFFSET, GenFifoEntry);
|
||||
}
|
||||
|
@ -1233,6 +1327,10 @@ static inline void XQspiPsu_GenFifoEntryCSDeAssert(XQspiPsu *InstancePtr)
|
|||
{
|
||||
u32 GenFifoEntry;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_GenFifoEntryCSDeAssert\r\n");
|
||||
#endif
|
||||
|
||||
GenFifoEntry = 0x0U;
|
||||
GenFifoEntry &= ~((u32)XQSPIPSU_GENFIFO_DATA_XFER | (u32)XQSPIPSU_GENFIFO_EXP);
|
||||
GenFifoEntry &= (u32)(~XQSPIPSU_GENFIFO_MODE_MASK);
|
||||
|
@ -1242,7 +1340,9 @@ static inline void XQspiPsu_GenFifoEntryCSDeAssert(XQspiPsu *InstancePtr)
|
|||
GenFifoEntry &= ~(XQSPIPSU_GENFIFO_TX | XQSPIPSU_GENFIFO_RX |
|
||||
XQSPIPSU_GENFIFO_STRIPE | XQSPIPSU_GENFIFO_POLL);
|
||||
GenFifoEntry |= XQSPIPSU_GENFIFO_CS_HOLD;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nFifoEntry=%08x\r\n",GenFifoEntry);
|
||||
#endif
|
||||
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_GEN_FIFO_OFFSET, GenFifoEntry);
|
||||
}
|
||||
|
@ -1267,12 +1367,19 @@ static inline void XQspiPsu_ReadRxFifo(XQspiPsu *InstancePtr,
|
|||
s32 Count = 0;
|
||||
u32 Data;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_ReadRxFifo\r\n");
|
||||
#endif
|
||||
|
||||
Xil_AssertVoid(InstancePtr != NULL);
|
||||
Xil_AssertVoid(Msg != NULL);
|
||||
|
||||
while ((InstancePtr->RxBytes != 0) && (Count < Size)) {
|
||||
Data = XQspiPsu_ReadReg(InstancePtr->
|
||||
Config.BaseAddress, XQSPIPSU_RXD_OFFSET);
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nData is %08x\r\n", Data);
|
||||
#endif
|
||||
if (InstancePtr->RxBytes >= 4) {
|
||||
(void)memcpy(Msg->RxBfrPtr, &Data, 4);
|
||||
InstancePtr->RxBytes -= 4;
|
||||
|
@ -1287,4 +1394,121 @@ static inline void XQspiPsu_ReadRxFifo(XQspiPsu *InstancePtr,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* This function enables the polling functionality of controller
|
||||
*
|
||||
* @param QspiPsuPtr is a pointer to the XQspiPsu instance.
|
||||
*
|
||||
* @param Statuscommand is the status command which send by controller.
|
||||
*
|
||||
* @param FlashMsg is a pointer to the structure containing transfer data
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
void XQspiPsu_PollData(XQspiPsu *QspiPsuPtr, XQspiPsu_Msg *FlashMsg)
|
||||
{
|
||||
|
||||
u32 GenFifoEntry ;
|
||||
u32 Value;
|
||||
|
||||
Xil_AssertVoid(QspiPsuPtr != NULL);
|
||||
Xil_AssertVoid(FlashMsg != NULL );
|
||||
|
||||
Value = XQspiPsu_Create_PollConfigData(QspiPsuPtr, FlashMsg);
|
||||
XQspiPsu_WriteReg(QspiPsuPtr->Config.BaseAddress,
|
||||
XQSPIPSU_POLL_CFG_OFFSET, Value);
|
||||
XQspiPsu_WriteReg(QspiPsuPtr->Config.BaseAddress,
|
||||
XQSPIPSU_P_TO_OFFSET, FlashMsg->PollTimeout);
|
||||
|
||||
XQspiPsu_Enable(QspiPsuPtr);
|
||||
|
||||
GenFifoEntry = (u32)0;
|
||||
GenFifoEntry |= (u32)XQSPIPSU_GENFIFO_TX;
|
||||
GenFifoEntry |= QspiPsuPtr->GenFifoBus;
|
||||
GenFifoEntry |= QspiPsuPtr->GenFifoCS;
|
||||
GenFifoEntry |= (u32)XQSPIPSU_GENFIFO_MODE_SPI;
|
||||
GenFifoEntry |= (u32)FlashMsg->PollStatusCmd;
|
||||
|
||||
XQspiPsu_WriteReg(QspiPsuPtr->Config.BaseAddress,
|
||||
XQSPIPSU_GEN_FIFO_OFFSET, GenFifoEntry);
|
||||
XQspiPsu_WriteReg(QspiPsuPtr->Config.BaseAddress, XQSPIPSU_CFG_OFFSET,
|
||||
(XQSPIPSU_CFG_START_GEN_FIFO_MASK
|
||||
| XQSPIPSU_CFG_GEN_FIFO_START_MODE_MASK));
|
||||
|
||||
GenFifoEntry = (u32)0;
|
||||
GenFifoEntry = (u32)XQSPIPSU_GENFIFO_POLL;
|
||||
GenFifoEntry |= (u32)XQSPIPSU_GENFIFO_RX;
|
||||
GenFifoEntry |= QspiPsuPtr->GenFifoBus;
|
||||
GenFifoEntry |= QspiPsuPtr->GenFifoCS;
|
||||
GenFifoEntry |= (u32)XQSPIPSU_GENFIFO_MODE_SPI;
|
||||
if (((FlashMsg->Flags) & XQSPIPSU_MSG_FLAG_STRIPE) != FALSE)
|
||||
GenFifoEntry |= XQSPIPSU_GENFIFO_STRIPE;
|
||||
else
|
||||
GenFifoEntry &= ~XQSPIPSU_GENFIFO_STRIPE;
|
||||
|
||||
XQspiPsu_WriteReg(QspiPsuPtr->Config.BaseAddress,
|
||||
XQSPIPSU_GEN_FIFO_OFFSET, GenFifoEntry);
|
||||
|
||||
QspiPsuPtr->Msg = FlashMsg;
|
||||
QspiPsuPtr->NumMsg = (s32)1;
|
||||
QspiPsuPtr->MsgCnt = 0;
|
||||
|
||||
Value = XQspiPsu_ReadReg(QspiPsuPtr->Config.BaseAddress,
|
||||
XQSPIPSU_CFG_OFFSET);
|
||||
Value |= (XQSPIPSU_CFG_START_GEN_FIFO_MASK |
|
||||
XQSPIPSU_CFG_GEN_FIFO_START_MODE_MASK |
|
||||
XQSPIPSU_CFG_EN_POLL_TO_MASK);
|
||||
XQspiPsu_WriteReg(QspiPsuPtr->Config.BaseAddress, XQSPIPSU_CFG_OFFSET,
|
||||
Value);
|
||||
|
||||
/* Enable interrupts */
|
||||
Value = ((u32)XQSPIPSU_IER_TXNOT_FULL_MASK |
|
||||
(u32)XQSPIPSU_IER_TXEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_RXNEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_GENFIFOEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_RXEMPTY_MASK |
|
||||
(u32)XQSPIPSU_IER_POLL_TIME_EXPIRE_MASK);
|
||||
XQspiPsu_WriteReg(QspiPsuPtr->Config.BaseAddress, XQSPIPSU_IER_OFFSET,
|
||||
Value);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* This function creates Poll config register data to write
|
||||
*
|
||||
* @param BusMask is mask to enable/disable upper/lower data bus masks.
|
||||
*
|
||||
* @param DataBusMask is Data bus mask value during poll operation.
|
||||
*
|
||||
* @param Data is the poll data value to write into config regsiter.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
static inline u32 XQspiPsu_Create_PollConfigData(XQspiPsu *QspiPsuPtr,
|
||||
XQspiPsu_Msg *FlashMsg)
|
||||
{
|
||||
u32 ConfigData = 0;
|
||||
|
||||
if (QspiPsuPtr->GenFifoBus & XQSPIPSU_GENFIFO_BUS_UPPER)
|
||||
ConfigData = XQSPIPSU_SELECT_FLASH_BUS_LOWER <<
|
||||
XQSPIPSU_POLL_CFG_EN_MASK_UPPER_SHIFT;
|
||||
if (QspiPsuPtr->GenFifoBus & XQSPIPSU_GENFIFO_BUS_LOWER)
|
||||
ConfigData |= XQSPIPSU_SELECT_FLASH_BUS_LOWER <<
|
||||
XQSPIPSU_POLL_CFG_EN_MASK_LOWER_SHIFT;
|
||||
ConfigData |= ((FlashMsg->PollBusMask << XQSPIPSU_POLL_CFG_MASK_EN_SHIFT)
|
||||
& XQSPIPSU_POLL_CFG_MASK_EN_MASK);
|
||||
ConfigData |= ((FlashMsg->PollData << XQSPIPSU_POLL_CFG_DATA_VALUE_SHIFT)
|
||||
& XQSPIPSU_POLL_CFG_DATA_VALUE_MASK);
|
||||
return ConfigData;
|
||||
}
|
||||
/** @} */
|
|
@ -95,6 +95,23 @@
|
|||
* sk 04/24/15 Modified the code according to MISRAC-2012.
|
||||
* sk 06/17/15 Removed NULL checks for Rx/Tx buffers. As
|
||||
* writing/reading from 0x0 location is permitted.
|
||||
* 1.1 sk 04/12/16 Added debug message prints.
|
||||
* 1.2 nsk 07/01/16 Added LQSPI support
|
||||
* Modified XQspiPsu_Select() macro in xqspipsu.h
|
||||
* Added XQspiPsu_GetLqspiConfigReg() in xqspipsu.h
|
||||
* Added required macros in xqspipsu_hw.h
|
||||
* Modified XQspiPsu_SetOptions() to support
|
||||
* LQSPI options and updated OptionsTable in
|
||||
* xqspipsu_options.c
|
||||
* rk 07/15/16 Added support for TapDelays at different frequencies.
|
||||
* nsk 08/05/16 Added example support PollData and PollTimeout
|
||||
* Added XQSPIPSU_MSG_FLAG_POLL macro in xqspipsu.h
|
||||
* Added XQspiPsu_Create_PollConfigData and
|
||||
* XQspiPsu_PollData() functions in xqspipsu.c
|
||||
* 1.3 nsk 09/16/16 Update PollData and Polltimeout support for dual parallel
|
||||
* configuration. Updated XQspiPsu_PollData() and
|
||||
* XQspiPsu_Create_PollConfigData() functions in xqspipsu.c
|
||||
* and also modified the polldata example
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -143,6 +160,10 @@ typedef struct {
|
|||
u32 ByteCount;
|
||||
u32 BusWidth;
|
||||
u32 Flags;
|
||||
u8 PollData;
|
||||
u32 PollTimeout;
|
||||
u8 PollStatusCmd;
|
||||
u8 PollBusMask;
|
||||
} XQspiPsu_Msg;
|
||||
|
||||
/**
|
||||
|
@ -207,6 +228,7 @@ typedef struct {
|
|||
#define XQSPIPSU_CLK_ACTIVE_LOW_OPTION 0x2U
|
||||
#define XQSPIPSU_CLK_PHASE_1_OPTION 0x4U
|
||||
#define XQSPIPSU_MANUAL_START_OPTION 0x8U
|
||||
#define XQSPIPSU_LQSPI_MODE_OPTION 0x20U
|
||||
|
||||
#define XQSPIPSU_GENFIFO_EXP_START 0x100U
|
||||
|
||||
|
@ -226,17 +248,25 @@ typedef struct {
|
|||
#define XQSPIPSU_CONNECTION_MODE_STACKED 1U
|
||||
#define XQSPIPSU_CONNECTION_MODE_PARALLEL 2U
|
||||
|
||||
/*QSPI Frequencies*/
|
||||
#define XQSPIPSU_FREQ_40MHZ 40000000
|
||||
#define XQSPIPSU_FREQ_100MHZ 100000000
|
||||
#define XQSPIPSU_FREQ_150MHZ 150000000
|
||||
|
||||
/* Add more flags as required */
|
||||
#define XQSPIPSU_MSG_FLAG_STRIPE 0x1U
|
||||
#define XQSPIPSU_MSG_FLAG_RX 0x2U
|
||||
#define XQSPIPSU_MSG_FLAG_TX 0x4U
|
||||
#define XQSPIPSU_MSG_FLAG_POLL 0x8U
|
||||
|
||||
#define XQspiPsu_Select(InstancePtr) XQspiPsu_Out32(((InstancePtr)->Config.BaseAddress) + XQSPIPSU_SEL_OFFSET, XQSPIPSU_SEL_MASK)
|
||||
#define XQspiPsu_Select(InstancePtr, Mask) XQspiPsu_Out32(((InstancePtr)->Config.BaseAddress) + XQSPIPSU_SEL_OFFSET, Mask)
|
||||
|
||||
#define XQspiPsu_Enable(InstancePtr) XQspiPsu_Out32(((InstancePtr)->Config.BaseAddress) + XQSPIPSU_EN_OFFSET, XQSPIPSU_EN_MASK)
|
||||
|
||||
#define XQspiPsu_Disable(InstancePtr) XQspiPsu_Out32(((InstancePtr)->Config.BaseAddress) + XQSPIPSU_EN_OFFSET, 0x0U)
|
||||
|
||||
#define XQspiPsu_GetLqspiConfigReg(InstancePtr) XQspiPsu_In32((XQSPIPS_BASEADDR) + XQSPIPSU_LQSPI_CR_OFFSET)
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
|
||||
/* Initialization and reset */
|
|
@ -47,6 +47,8 @@
|
|||
* 1.0 hk 08/21/14 First release
|
||||
* hk 03/18/15 Add DMA status register masks required.
|
||||
* sk 04/24/15 Modified the code according to MISRAC-2012.
|
||||
* 1.2 nsk 07/01/16 Added LQSPI supported Masks
|
||||
* rk 07/15/16 Added support for TapDelays at different frequencies.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -91,6 +93,7 @@ extern "C" {
|
|||
* Register: XQSPIPSU_CFG
|
||||
*/
|
||||
#define XQSPIPSU_CFG_OFFSET 0X00000000U
|
||||
#define XQSPIPSU_LQSPI_CR_OFFSET 0X000000A0U
|
||||
|
||||
#define XQSPIPSU_CFG_MODE_EN_SHIFT 30
|
||||
#define XQSPIPSU_CFG_MODE_EN_WIDTH 2
|
||||
|
@ -129,6 +132,22 @@ extern "C" {
|
|||
#define XQSPIPSU_CFG_CLK_POL_WIDTH 1
|
||||
#define XQSPIPSU_CFG_CLK_POL_MASK 0X00000002U
|
||||
|
||||
/**
|
||||
* Register: XQSPIPSU_CFG
|
||||
*/
|
||||
#define XQSPIPSU_LQSPI_CR_OFFSET 0X000000A0U
|
||||
#define XQSPIPSU_LQSPI_CR_LINEAR_MASK 0x80000000 /**< LQSPI mode enable */
|
||||
#define XQSPIPSU_LQSPI_CR_TWO_MEM_MASK 0x40000000 /**< Both memories or one */
|
||||
#define XQSPIPSU_LQSPI_CR_SEP_BUS_MASK 0x20000000 /**< Seperate memory bus */
|
||||
#define XQSPIPSU_LQSPI_CR_U_PAGE_MASK 0x10000000 /**< Upper memory page */
|
||||
#define XQSPIPSU_LQSPI_CR_ADDR_32BIT_MASK 0x01000000 /**< Upper memory page */
|
||||
#define XQSPIPSU_LQSPI_CR_MODE_EN_MASK 0x02000000 /**< Enable mode bits */
|
||||
#define XQSPIPSU_LQSPI_CR_MODE_ON_MASK 0x01000000 /**< Mode on */
|
||||
#define XQSPIPSU_LQSPI_CR_MODE_BITS_MASK 0x00FF0000 /**< Mode value for dual I/O
|
||||
or quad I/O */
|
||||
#define XQSPIPS_LQSPI_CR_INST_MASK 0x000000FF /**< Read instr code */
|
||||
#define XQSPIPS_LQSPI_CR_RST_STATE 0x80000003 /**< Default LQSPI CR value */
|
||||
#define XQSPIPS_LQSPI_CFG_RST_STATE 0x800238C1 /**< Default LQSPI CFG value */
|
||||
/**
|
||||
* Register: XQSPIPSU_ISR
|
||||
*/
|
||||
|
@ -406,7 +425,8 @@ extern "C" {
|
|||
|
||||
#define XQSPIPSU_SEL_SHIFT 0
|
||||
#define XQSPIPSU_SEL_WIDTH 1
|
||||
#define XQSPIPSU_SEL_MASK 0X00000001U
|
||||
#define XQSPIPSU_SEL_LQSPI_MASK 0X0U
|
||||
#define XQSPIPSU_SEL_GQSPI_MASK 0X00000001U
|
||||
|
||||
/**
|
||||
* Register: XQSPIPSU_FIFO_CTRL
|
||||
|
@ -792,6 +812,23 @@ extern "C" {
|
|||
#define XQSPIPSU_GENFIFO_STRIPE 0x40000U
|
||||
#define XQSPIPSU_GENFIFO_POLL 0x80000U
|
||||
|
||||
/*QSPI Data delay register*/
|
||||
#define XQSPIPSU_DATA_DLY_ADJ_OFFSET 0X000000F8U
|
||||
|
||||
#define XQSPIPSU_DATA_DLY_ADJ_USE_DATA_DLY_SHIFT 31
|
||||
#define XQSPIPSU_DATA_DLY_ADJ_USE_DATA_DLY_WIDTH 1
|
||||
#define XQSPIPSU_DATA_DLY_ADJ_USE_DATA_DLY_MASK 0X80000000U
|
||||
|
||||
#define XQSPIPSU_DATA_DLY_ADJ_DLY_SHIFT 28
|
||||
#define XQSPIPSU_DATA_DLY_ADJ_DLY_WIDTH 3
|
||||
#define XQSPIPSU_DATA_DLY_ADJ_DLY_MASK 0X70000000U
|
||||
|
||||
/* Tapdelay Bypass register*/
|
||||
#define IOU_TAPDLY_BYPASS_OFFSET 0X00000390
|
||||
#define IOU_TAPDLY_BYPASS_LQSPI_RX_SHIFT 0X02
|
||||
#define IOU_TAPDLY_BYPASS_LQSPI_RX_WIDTH 0X01
|
||||
#define IOU_TAPDLY_BYPASS_LQSPI_RX_MASK 0x00000004
|
||||
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
|
||||
#define XQspiPsu_In32 Xil_In32
|
|
@ -47,6 +47,10 @@
|
|||
* 1.0 hk 08/21/14 First release
|
||||
* sk 03/13/15 Added IO mode support.
|
||||
* sk 04/24/15 Modified the code according to MISRAC-2012.
|
||||
* 1.1 sk 04/12/16 Added debug message prints.
|
||||
* 1.2 nsk 07/01/16 Modified XQspiPsu_SetOptions() to support
|
||||
* LQSPI options and updated OptionsTable
|
||||
* rk 07/15/16 Added support for TapDelays at different frequencies.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -62,8 +66,23 @@
|
|||
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
|
||||
#if defined (ARMR5) || (__aarch64__)
|
||||
#define TAPDLY_BYPASS_VALVE_40MHZ 0x01
|
||||
#define TAPDLY_BYPASS_VALVE_100MHZ 0x01
|
||||
#define USE_DLY_LPBK 0x01
|
||||
#define USE_DATA_DLY_ADJ 0x01
|
||||
#define DATA_DLY_ADJ_DLY 0X02
|
||||
#define LPBK_DLY_ADJ_DLY0 0X02
|
||||
#endif
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
|
||||
#if defined (ARMR5) || (__aarch64__)
|
||||
s32 XQspi_Set_TapDelay(XQspiPsu * InstancePtr,u32 TapdelayBypass,
|
||||
u32 LPBKDelay,u32 Datadelay);
|
||||
static s32 XQspipsu_Calculate_Tapdelay(XQspiPsu *InstancePtr, u8 Prescaler);
|
||||
#endif
|
||||
|
||||
/************************** Variable Definitions *****************************/
|
||||
|
||||
/*
|
||||
|
@ -80,6 +99,7 @@ static OptionsMap OptionsTable[] = {
|
|||
{XQSPIPSU_CLK_ACTIVE_LOW_OPTION, XQSPIPSU_CFG_CLK_POL_MASK},
|
||||
{XQSPIPSU_CLK_PHASE_1_OPTION, XQSPIPSU_CFG_CLK_PHA_MASK},
|
||||
{XQSPIPSU_MANUAL_START_OPTION, XQSPIPSU_CFG_GEN_FIFO_START_MODE_MASK},
|
||||
{XQSPIPSU_LQSPI_MODE_OPTION, XQSPIPSU_CFG_WP_HOLD_MASK},
|
||||
};
|
||||
|
||||
#define XQSPIPSU_NUM_OPTIONS (sizeof(OptionsTable) / sizeof(OptionsMap))
|
||||
|
@ -127,7 +147,8 @@ s32 XQspiPsu_SetOptions(XQspiPsu *InstancePtr, u32 Options)
|
|||
|
||||
ConfigReg = XQspiPsu_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_CFG_OFFSET);
|
||||
|
||||
QspiPsuOptions = Options & XQSPIPSU_LQSPI_MODE_OPTION;
|
||||
Options &= ~XQSPIPSU_LQSPI_MODE_OPTION;
|
||||
/*
|
||||
* Loop through the options table, turning the option on
|
||||
* depending on whether the bit is set in the incoming options flag.
|
||||
|
@ -136,9 +157,12 @@ s32 XQspiPsu_SetOptions(XQspiPsu *InstancePtr, u32 Options)
|
|||
if ((Options & OptionsTable[Index].Option) != FALSE) {
|
||||
/* Turn it on */
|
||||
ConfigReg |= OptionsTable[Index].Mask;
|
||||
}
|
||||
} else {
|
||||
/* Turn it off */
|
||||
ConfigReg &= ~(OptionsTable[Index].Mask);
|
||||
}
|
||||
|
||||
}
|
||||
/*
|
||||
* Now write the control register. Leave it to the upper layers
|
||||
* to restart the device.
|
||||
|
@ -149,6 +173,21 @@ s32 XQspiPsu_SetOptions(XQspiPsu *InstancePtr, u32 Options)
|
|||
if ((Options & XQSPIPSU_MANUAL_START_OPTION) != FALSE) {
|
||||
InstancePtr->IsManualstart = TRUE;
|
||||
}
|
||||
/*
|
||||
* Check for the LQSPI configuration options.
|
||||
*/
|
||||
ConfigReg = XQspiPsu_ReadReg(XQSPIPS_BASEADDR,XQSPIPSU_LQSPI_CR_OFFSET);
|
||||
|
||||
if (QspiPsuOptions & XQSPIPSU_LQSPI_MODE_OPTION) {
|
||||
XQspiPsu_WriteReg(XQSPIPS_BASEADDR,XQSPIPSU_LQSPI_CR_OFFSET,XQSPIPS_LQSPI_CR_RST_STATE);
|
||||
XQspiPsu_WriteReg(XQSPIPS_BASEADDR,XQSPIPSU_CFG_OFFSET,XQSPIPS_LQSPI_CFG_RST_STATE);
|
||||
/* Enable the QSPI controller */
|
||||
XQspiPsu_WriteReg(XQSPIPS_BASEADDR,XQSPIPSU_EN_OFFSET,XQSPIPSU_EN_MASK);
|
||||
}
|
||||
else {
|
||||
ConfigReg &= ~(XQSPIPSU_LQSPI_CR_LINEAR_MASK);
|
||||
XQspiPsu_WriteReg(XQSPIPS_BASEADDR,XQSPIPSU_LQSPI_CR_OFFSET, ConfigReg);
|
||||
}
|
||||
|
||||
Status = XST_SUCCESS;
|
||||
}
|
||||
|
@ -183,7 +222,6 @@ s32 XQspiPsu_ClearOptions(XQspiPsu *InstancePtr, u32 Options)
|
|||
{
|
||||
u32 ConfigReg;
|
||||
u32 Index;
|
||||
u32 QspiPsuOptions;
|
||||
s32 Status;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
|
@ -270,6 +308,119 @@ u32 XQspiPsu_GetOptions(XQspiPsu *InstancePtr)
|
|||
return OptionsFlag;
|
||||
}
|
||||
|
||||
#if defined (ARMR5) || (__aarch64__)
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* This function sets the Tapdelay values for the QSPIPSU device driver.The device
|
||||
* must be idle rather than busy transferring data before setting Tapdelay.
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XQspiPsu instance.
|
||||
* @param TapdelayBypss contains the IOU_TAPDLY_BYPASS register value.
|
||||
* @param LPBKDelay contains the GQSPI_LPBK_DLY_ADJ register value.
|
||||
* @param Datadelay contains the QSPI_DATA_DLY_ADJ register value.
|
||||
*
|
||||
* @return
|
||||
* - XST_SUCCESS if options are successfully set.
|
||||
* - XST_DEVICE_BUSY if the device is currently transferring data.
|
||||
* The transfer must complete or be aborted before setting TapDelay.
|
||||
*
|
||||
* @note
|
||||
* This function is not thread-safe.
|
||||
*
|
||||
******************************************************************************/
|
||||
s32 XQspi_Set_TapDelay(XQspiPsu * InstancePtr,u32 TapdelayBypass,
|
||||
u32 LPBKDelay,u32 Datadelay)
|
||||
{
|
||||
s32 Status;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
||||
/*
|
||||
* Do not allow to modify the Control Register while a transfer is in
|
||||
* progress. Not thread-safe.
|
||||
*/
|
||||
if (InstancePtr->IsBusy == TRUE) {
|
||||
Status = XST_DEVICE_BUSY;
|
||||
} else {
|
||||
XQspiPsu_WriteReg(XPS_SYS_CTRL_BASEADDR,IOU_TAPDLY_BYPASS_OFFSET,
|
||||
TapdelayBypass);
|
||||
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_LPBK_DLY_ADJ_OFFSET,LPBKDelay);
|
||||
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_DATA_DLY_ADJ_OFFSET,Datadelay);
|
||||
Status = XST_SUCCESS;
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Configures the clock according to the prescaler passed.
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XQspiPsu instance.
|
||||
* @param Prescaler - clock prescaler.
|
||||
*
|
||||
* @return
|
||||
* - XST_SUCCESS if successful.
|
||||
* - XST_DEVICE_BUSY if the device is currently transferring data.
|
||||
* The transfer must complete or be aborted before setting Tapdelay.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
static s32 XQspipsu_Calculate_Tapdelay(XQspiPsu *InstancePtr, u8 Prescaler)
|
||||
{
|
||||
u32 FreqDiv, Divider, Tapdelay, LBkModeReg, delayReg;
|
||||
s32 Status;
|
||||
|
||||
Divider = (1 << (Prescaler+1));
|
||||
|
||||
FreqDiv = (InstancePtr->Config.InputClockHz)/Divider;
|
||||
Tapdelay = XQspiPsu_ReadReg(XPS_SYS_CTRL_BASEADDR,
|
||||
IOU_TAPDLY_BYPASS_OFFSET);
|
||||
|
||||
Tapdelay = Tapdelay & (~IOU_TAPDLY_BYPASS_LQSPI_RX_MASK);
|
||||
|
||||
LBkModeReg = XQspiPsu_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_LPBK_DLY_ADJ_OFFSET);
|
||||
|
||||
LBkModeReg = (LBkModeReg &
|
||||
(~(XQSPIPSU_LPBK_DLY_ADJ_USE_LPBK_MASK))) &
|
||||
(LBkModeReg & (~(XQSPIPSU_LPBK_DLY_ADJ_DLY1_MASK))) &
|
||||
(LBkModeReg & (~(XQSPIPSU_LPBK_DLY_ADJ_DLY0_MASK)));
|
||||
|
||||
delayReg = XQspiPsu_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_DATA_DLY_ADJ_OFFSET);
|
||||
|
||||
delayReg = (delayReg &
|
||||
(~(XQSPIPSU_DATA_DLY_ADJ_USE_DATA_DLY_MASK))) &
|
||||
(delayReg & (~( XQSPIPSU_DATA_DLY_ADJ_DLY_MASK)));
|
||||
|
||||
if(FreqDiv < XQSPIPSU_FREQ_40MHZ){
|
||||
Tapdelay = Tapdelay |
|
||||
(TAPDLY_BYPASS_VALVE_40MHZ << IOU_TAPDLY_BYPASS_LQSPI_RX_SHIFT);
|
||||
} else if (FreqDiv <= XQSPIPSU_FREQ_100MHZ) {
|
||||
Tapdelay = Tapdelay | (TAPDLY_BYPASS_VALVE_100MHZ << IOU_TAPDLY_BYPASS_LQSPI_RX_SHIFT);
|
||||
LBkModeReg = LBkModeReg |
|
||||
(USE_DLY_LPBK << XQSPIPSU_LPBK_DLY_ADJ_USE_LPBK_SHIFT);
|
||||
delayReg = delayReg |
|
||||
(USE_DATA_DLY_ADJ << XQSPIPSU_DATA_DLY_ADJ_USE_DATA_DLY_SHIFT) |
|
||||
(DATA_DLY_ADJ_DLY << XQSPIPSU_DATA_DLY_ADJ_DLY_SHIFT);
|
||||
} else if (FreqDiv <= XQSPIPSU_FREQ_150MHZ) {
|
||||
LBkModeReg = LBkModeReg |
|
||||
(USE_DLY_LPBK << XQSPIPSU_LPBK_DLY_ADJ_USE_LPBK_SHIFT ) |
|
||||
(LPBK_DLY_ADJ_DLY0 << XQSPIPSU_LPBK_DLY_ADJ_DLY0_SHIFT);
|
||||
}
|
||||
Status = XQspi_Set_TapDelay(InstancePtr, Tapdelay, LBkModeReg, delayReg);
|
||||
|
||||
return Status;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
|
@ -282,6 +433,7 @@ u32 XQspiPsu_GetOptions(XQspiPsu *InstancePtr)
|
|||
* @return
|
||||
* - XST_SUCCESS if successful.
|
||||
* - XST_DEVICE_IS_STARTED if the device is already started.
|
||||
* - XST_DEVICE_BUSY if the device is currently transferring data.
|
||||
* It must be stopped to re-initialize.
|
||||
*
|
||||
* @note None.
|
||||
|
@ -319,7 +471,11 @@ s32 XQspiPsu_SetClkPrescaler(XQspiPsu *InstancePtr, u8 Prescaler)
|
|||
XQspiPsu_WriteReg(InstancePtr->Config.BaseAddress,
|
||||
XQSPIPSU_CFG_OFFSET, ConfigReg);
|
||||
|
||||
#if defined (ARMR5) || (__aarch64__)
|
||||
Status = XQspipsu_Calculate_Tapdelay(InstancePtr,Prescaler);
|
||||
#else
|
||||
Status = XST_SUCCESS;
|
||||
#endif
|
||||
}
|
||||
|
||||
return Status;
|
||||
|
@ -351,6 +507,10 @@ void XQspiPsu_SelectFlash(XQspiPsu *InstancePtr, u8 FlashCS, u8 FlashBus)
|
|||
{
|
||||
Xil_AssertVoid(InstancePtr != NULL);
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_SelectFlash\r\n");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Bus and CS lines selected here will be updated in the instance and
|
||||
* used for subsequent GENFIFO entries during transfer.
|
||||
|
@ -389,6 +549,11 @@ void XQspiPsu_SelectFlash(XQspiPsu *InstancePtr, u8 FlashCS, u8 FlashBus)
|
|||
InstancePtr->GenFifoBus = XQSPIPSU_GENFIFO_BUS_LOWER;
|
||||
break;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nGenFifoCS is %08x and GenFifoBus is %08x\r\n",
|
||||
InstancePtr->GenFifoCS, InstancePtr->GenFifoBus);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -416,6 +581,10 @@ s32 XQspiPsu_SetReadMode(XQspiPsu *InstancePtr, u32 Mode)
|
|||
u32 ConfigReg;
|
||||
s32 Status;
|
||||
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nXQspiPsu_SetReadMode\r\n");
|
||||
#endif
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
||||
|
@ -444,6 +613,9 @@ s32 XQspiPsu_SetReadMode(XQspiPsu *InstancePtr, u32 Mode)
|
|||
|
||||
Status = XST_SUCCESS;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
xil_printf("\nRead Mode is %08x\r\n", InstancePtr->ReadMode);
|
||||
#endif
|
||||
return Status;
|
||||
}
|
||||
/** @} */
|
|
@ -52,6 +52,7 @@
|
|||
* switching when vcc_psaux is not available.
|
||||
* 1.2 02/15/16 Corrected Calibration mask and Fractional
|
||||
* mask in CalculateCalibration API.
|
||||
* 1.3 vak 04/25/16 Corrected the RTC read and write time logic(cr#948833).
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
@ -59,6 +60,7 @@
|
|||
/***************************** Include Files *********************************/
|
||||
|
||||
#include "xrtcpsu.h"
|
||||
#include "xrtcpsu_hw.h"
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
|
||||
|
@ -139,6 +141,10 @@ s32 XRtcPsu_CfgInitialize(XRtcPsu *InstancePtr, XRtcPsu_Config *ConfigPtr,
|
|||
/* Indicate the component is now ready to use. */
|
||||
InstancePtr->IsReady = XIL_COMPONENT_IS_READY;
|
||||
|
||||
/* Clear TimeUpdated and CurrTimeUpdated */
|
||||
InstancePtr->TimeUpdated = 0;
|
||||
InstancePtr->CurrTimeUpdated = 0;
|
||||
|
||||
Status = XST_SUCCESS;
|
||||
return Status;
|
||||
}
|
||||
|
@ -166,6 +172,90 @@ static void XRtcPsu_StubHandler(void *CallBackRef, u32 Event)
|
|||
Xil_AssertVoidAlways();
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* This function sets the RTC time by writing into rtc write register.
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XRtcPsu instance.
|
||||
* @param Time that should be updated into RTC write register.
|
||||
*
|
||||
* @return None.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
*****************************************************************************/
|
||||
void XRtcPsu_SetTime(XRtcPsu *InstancePtr,u32 Time)
|
||||
{
|
||||
/* Set the calibration value in calibration register, so that
|
||||
* next Second is triggered exactly at 1 sec period
|
||||
*/
|
||||
XRtcPsu_WriteReg(InstancePtr->RtcConfig.BaseAddr + XRTC_CALIB_WR_OFFSET,
|
||||
InstancePtr->CalibrationValue);
|
||||
/* clear the RTC secs interrupt from status register */
|
||||
XRtcPsu_WriteReg(InstancePtr->RtcConfig.BaseAddr + XRTC_INT_STS_OFFSET,
|
||||
XRTC_INT_STS_SECS_MASK);
|
||||
InstancePtr->CurrTimeUpdated = 0;
|
||||
/* Update the flag before setting the time */
|
||||
InstancePtr->TimeUpdated = 1;
|
||||
/* Since RTC takes 1 sec to update the time into current time register, write
|
||||
* load time + 1sec into the set time register.
|
||||
*/
|
||||
XRtcPsu_WriteSetTime(InstancePtr, Time + 1);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* This function gets the current RTC time.
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XRtcPsu instance.
|
||||
*
|
||||
* @return RTC Current time.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
*****************************************************************************/
|
||||
u32 XRtcPsu_GetCurrentTime(XRtcPsu *InstancePtr)
|
||||
{
|
||||
u32 Status, IntMask, CurrTime;
|
||||
|
||||
IntMask = XRtcPsu_ReadReg(InstancePtr->RtcConfig.BaseAddr + XRTC_INT_MSK_OFFSET);
|
||||
|
||||
if((IntMask & XRTC_INT_STS_SECS_MASK) != (u32)0) {
|
||||
/* We come here if interrupts are disabled */
|
||||
Status = XRtcPsu_ReadReg(InstancePtr->RtcConfig.BaseAddr + XRTC_INT_STS_OFFSET);
|
||||
if((InstancePtr->TimeUpdated == (u32)1) &&
|
||||
(Status & XRTC_INT_STS_SECS_MASK) == (u32)0) {
|
||||
/* Give the previous written time */
|
||||
CurrTime = XRtcPsu_GetLastSetTime(InstancePtr) - 1;
|
||||
} else {
|
||||
/* Clear TimeUpdated */
|
||||
if((InstancePtr->TimeUpdated == (u32)1) &&
|
||||
((Status & XRTC_INT_STS_SECS_MASK) == (u32)1)) {
|
||||
InstancePtr->TimeUpdated = (u32)0;
|
||||
}
|
||||
|
||||
/* RTC time got updated */
|
||||
CurrTime = XRtcPsu_ReadCurrentTime(InstancePtr);
|
||||
}
|
||||
} else {
|
||||
/* We come here if interrupts are enabled */
|
||||
if((InstancePtr->TimeUpdated == (u32)1) &&
|
||||
(InstancePtr->CurrTimeUpdated == (u32)0)) {
|
||||
/* Give the previous written time -1 sec */
|
||||
CurrTime = XRtcPsu_GetLastSetTime(InstancePtr) - 1;
|
||||
} else {
|
||||
/* Clear TimeUpdated */
|
||||
if(InstancePtr->TimeUpdated == (u32)1)
|
||||
InstancePtr->TimeUpdated = (u32)0;
|
||||
/* RTC time got updated */
|
||||
CurrTime = XRtcPsu_ReadCurrentTime(InstancePtr);
|
||||
}
|
||||
}
|
||||
return CurrTime;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/**
|
||||
*
|
|
@ -100,6 +100,7 @@
|
|||
* 1.00 kvn 04/21/15 First release
|
||||
* 1.1 kvn 09/25/15 Modify control register to enable battery
|
||||
* switching when vcc_psaux is not available.
|
||||
* 1.3 vak 04/25/16 Corrected the RTC read and write time logic(cr#948833).
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
@ -179,6 +180,8 @@ typedef struct {
|
|||
u32 CalibrationValue;
|
||||
XRtcPsu_Handler Handler;
|
||||
void *CallBackRef; /**< Callback reference for event handler */
|
||||
u32 TimeUpdated;
|
||||
u32 CurrTimeUpdated;
|
||||
} XRtcPsu;
|
||||
|
||||
/**
|
||||
|
@ -217,7 +220,7 @@ typedef struct {
|
|||
* void XRtcPsu_SetTime(XRtcPsu *InstancePtr, u32 Time)
|
||||
*
|
||||
*****************************************************************************/
|
||||
#define XRtcPsu_SetTime(InstancePtr,Time) \
|
||||
#define XRtcPsu_WriteSetTime(InstancePtr,Time) \
|
||||
XRtcPsu_WriteReg(((InstancePtr)->RtcConfig.BaseAddr + \
|
||||
XRTC_SET_TIME_WR_OFFSET),(Time))
|
||||
|
||||
|
@ -264,10 +267,10 @@ typedef struct {
|
|||
* @return Current Time. This current time will be in seconds.
|
||||
*
|
||||
* @note C-Style signature:
|
||||
* u32 XRtcPsu_GetCurrentTime(XRtcPsu *InstancePtr)
|
||||
* u32 XRtcPsu_ReadCurrentTime(XRtcPsu *InstancePtr)
|
||||
*
|
||||
*****************************************************************************/
|
||||
#define XRtcPsu_GetCurrentTime(InstancePtr) \
|
||||
#define XRtcPsu_ReadCurrentTime(InstancePtr) \
|
||||
XRtcPsu_ReadReg((InstancePtr)->RtcConfig.BaseAddr+XRTC_CUR_TIME_OFFSET)
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -368,6 +371,8 @@ void XRtcPsu_CalculateCalibration(XRtcPsu *InstancePtr,u32 TimeReal,
|
|||
u32 CrystalOscFreq);
|
||||
u32 XRtcPsu_IsSecondsEventGenerated(XRtcPsu *InstancePtr);
|
||||
u32 XRtcPsu_IsAlarmEventGenerated(XRtcPsu *InstancePtr);
|
||||
u32 XRtcPsu_GetCurrentTime(XRtcPsu *InstancePtr);
|
||||
void XRtcPsu_SetTime(XRtcPsu *InstancePtr,u32 Time);
|
||||
|
||||
/* interrupt functions in xrtcpsu_intr.c */
|
||||
void XRtcPsu_SetInterruptMask(XRtcPsu *InstancePtr, u32 Mask);
|
|
@ -44,6 +44,8 @@
|
|||
* Ver Who Date Changes
|
||||
* ----- ----- -------- -----------------------------------------------
|
||||
* 1.00 kvn 04/21/15 First release
|
||||
* 1.3 vak 04/25/16 Changed the XRtcPsu_InterruptHandler() for updating RTC
|
||||
* read and write time logic(cr#948833).
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
@ -219,6 +221,14 @@ void XRtcPsu_InterruptHandler(XRtcPsu *InstancePtr)
|
|||
|
||||
/* Seconds interrupt */
|
||||
if((IsrStatus & XRTC_INT_STS_SECS_MASK) != (u32)0) {
|
||||
/* Set the CurrTimeUpdated flag to 1 */
|
||||
InstancePtr->CurrTimeUpdated = 1;
|
||||
|
||||
if(InstancePtr->TimeUpdated == (u32)1) {
|
||||
/* Clear the TimeUpdated */
|
||||
InstancePtr->TimeUpdated = (u32)0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Call the application handler to indicate that there is an
|
||||
* seconds interrupt. If the application cares about this seconds
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -84,6 +84,29 @@
|
|||
* initialized with the corresponding CPU ID on which the application
|
||||
* built over the scugic driver runs.
|
||||
* These changes fix CR#937243.
|
||||
* 3.3 pkp 05/12/16 Modified XScuGic_InterruptMaptoCpu to write proper value
|
||||
* to interrupt target register to fix CR#951848
|
||||
*
|
||||
* 3.4 asa 04/07/16 Created a new static function DoDistributorInit to simplify
|
||||
* the flow and avoid code duplication. Changes are made for
|
||||
* USE_AMP use case for R5. In a scenario (in R5 split mode) when
|
||||
* one R5 is operating with A53 in open amp config and other
|
||||
* R5 running baremetal app, the existing code
|
||||
* had the potential to stop the whole AMP solution to work (if
|
||||
* for some reason the R5 running the baremetal app tasked to
|
||||
* initialize the Distributor hangs or crashes before initializing).
|
||||
* Changes are made so that the R5 under AMP first checks if
|
||||
* the distributor is enabled or not and if not, it does the
|
||||
* standard Distributor initialization.
|
||||
* This fixes the CR#952962.
|
||||
* 3.4 mus 09/08/16 Added assert to avoid invalid access of GIC from CPUID 1
|
||||
* for single core zynq-7000s
|
||||
* 3.5 mus 10/05/16 Modified DistributorInit function to avoid re-initialization of
|
||||
* distributor,If it is already initialized by other CPU.
|
||||
* 3.5 pkp 10/17/16 Modified XScuGic_InterruptMaptoCpu to correct the CPU Id value
|
||||
* and properly mask interrupt target processor value to modify
|
||||
* interrupt target processor register for a given interrupt ID
|
||||
* and cpu ID
|
||||
*
|
||||
*
|
||||
* </pre>
|
||||
|
@ -94,7 +117,6 @@
|
|||
#include "xil_types.h"
|
||||
#include "xil_assert.h"
|
||||
#include "xscugic.h"
|
||||
#include "xparameters.h"
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
|
||||
|
@ -113,7 +135,7 @@ static void StubHandler(void *CallBackRef);
|
|||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* DistributorInit initializes the distributor of the GIC. The
|
||||
* DoDistributorInit initializes the distributor of the GIC. The
|
||||
* initialization entails:
|
||||
*
|
||||
* - Write the trigger mode, priority and target CPU
|
||||
|
@ -128,35 +150,11 @@ static void StubHandler(void *CallBackRef);
|
|||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
static void DistributorInit(XScuGic *InstancePtr, u32 CpuID)
|
||||
static void DoDistributorInit(XScuGic *InstancePtr, u32 CpuID)
|
||||
{
|
||||
u32 Int_Id;
|
||||
u32 LocalCpuID = CpuID;
|
||||
|
||||
#if USE_AMP==1
|
||||
#warning "Building GIC for AMP"
|
||||
#ifdef ARMR5
|
||||
u32 RegValue;
|
||||
|
||||
/*
|
||||
* The overall distributor should not be initialized in AMP case where
|
||||
* another CPU is taking care of it.
|
||||
*/
|
||||
LocalCpuID |= LocalCpuID << 8U;
|
||||
LocalCpuID |= LocalCpuID << 16U;
|
||||
for (Int_Id = 32U; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id=Int_Id+4U) {
|
||||
RegValue = XScuGic_DistReadReg(InstancePtr,
|
||||
XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id));
|
||||
RegValue |= LocalCpuID;
|
||||
XScuGic_DistWriteReg(InstancePtr,
|
||||
XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id),
|
||||
RegValue);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
#endif
|
||||
|
||||
Xil_AssertVoid(InstancePtr != NULL);
|
||||
XScuGic_DistWriteReg(InstancePtr, XSCUGIC_DIST_EN_OFFSET, 0U);
|
||||
|
||||
/*
|
||||
|
@ -224,7 +222,58 @@ static void DistributorInit(XScuGic *InstancePtr, u32 CpuID)
|
|||
|
||||
XScuGic_DistWriteReg(InstancePtr, XSCUGIC_DIST_EN_OFFSET,
|
||||
XSCUGIC_EN_INT_MASK);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* DistributorInit initializes the distributor of the GIC. It calls
|
||||
* DoDistributorInit to finish the initialization.
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XScuGic instance.
|
||||
* @param CpuID is the Cpu ID to be initialized.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
static void DistributorInit(XScuGic *InstancePtr, u32 CpuID)
|
||||
{
|
||||
u32 Int_Id;
|
||||
u32 LocalCpuID = CpuID;
|
||||
u32 RegValue;
|
||||
|
||||
#if USE_AMP==1 && (defined (ARMA9) || defined(__aarch64__))
|
||||
#warning "Building GIC for AMP"
|
||||
/*
|
||||
* GIC initialization is taken care by master CPU in
|
||||
* openamp configuration, so do nothing and return.
|
||||
*/
|
||||
return;
|
||||
#endif
|
||||
|
||||
RegValue = XScuGic_DistReadReg(InstancePtr, XSCUGIC_DIST_EN_OFFSET);
|
||||
if (!(RegValue & XSCUGIC_EN_INT_MASK)) {
|
||||
Xil_AssertVoid(InstancePtr != NULL);
|
||||
DoDistributorInit(InstancePtr, CpuID);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* The overall distributor should not be initialized in AMP case where
|
||||
* another CPU is taking care of it.
|
||||
*/
|
||||
LocalCpuID |= LocalCpuID << 8U;
|
||||
LocalCpuID |= LocalCpuID << 16U;
|
||||
for (Int_Id = 32U; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id=Int_Id+4U) {
|
||||
RegValue = XScuGic_DistReadReg(InstancePtr,
|
||||
XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id));
|
||||
RegValue |= LocalCpuID;
|
||||
XScuGic_DistWriteReg(InstancePtr,
|
||||
XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id),
|
||||
RegValue);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -309,10 +358,21 @@ s32 XScuGic_CfgInitialize(XScuGic *InstancePtr,
|
|||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(ConfigPtr != NULL);
|
||||
/*
|
||||
* Detect Zynq-7000 base silicon configuration,Dual or Single CPU.
|
||||
* If it is single CPU cnfiguration then invoke assert for CPU ID=1
|
||||
*/
|
||||
#ifdef ARMA9
|
||||
if ( XPAR_CPU_ID == 0x01 )
|
||||
{
|
||||
Xil_AssertNonvoid((Xil_In32(XPS_EFUSE_BASEADDR + EFUSE_STATUS_OFFSET)
|
||||
& EFUSE_STATUS_CPU_MASK ) == 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
if(InstancePtr->IsReady != XIL_COMPONENT_IS_READY) {
|
||||
|
||||
InstancePtr->IsReady = 0;
|
||||
InstancePtr->IsReady = 0U;
|
||||
InstancePtr->Config = ConfigPtr;
|
||||
|
||||
|
||||
|
@ -757,10 +817,11 @@ void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id)
|
|||
RegValue = XScuGic_DistReadReg(InstancePtr,
|
||||
XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id));
|
||||
|
||||
Offset = (Int_Id & 0x3);
|
||||
Offset = (Int_Id & 0x3U);
|
||||
Cpu_Id = (0x1U << Cpu_Id);
|
||||
|
||||
RegValue = (RegValue | (~(0xFF << (Offset*8))) );
|
||||
RegValue |= ((Cpu_Id) << (Offset*8));
|
||||
RegValue = (RegValue & (~(0xFFU << (Offset*8U))) );
|
||||
RegValue |= ((Cpu_Id) << (Offset*8U));
|
||||
|
||||
XScuGic_DistWriteReg(InstancePtr,
|
||||
XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id),
|
|
@ -145,6 +145,19 @@
|
|||
* built over the scugic driver runs.
|
||||
* These changes fix CR#937243.
|
||||
*
|
||||
* 3.4 asa 04/07/16 Created a new static function DoDistributorInit to simplify
|
||||
* the flow and avoid code duplication. Changes are made for
|
||||
* USE_AMP use case for R5. In a scenario (in R5 split mode) when
|
||||
* one R5 is operating with A53 in open amp config and other
|
||||
* R5 running baremetal app, the existing code
|
||||
* had the potential to stop the whole AMP solution to work (if
|
||||
* for some reason the R5 running the baremetal app tasked to
|
||||
* initialize the Distributor hangs or crashes before initializing).
|
||||
* Changes are made so that the R5 under AMP first checks if
|
||||
* the distributor is enabled or not and if not, it does the
|
||||
* standard Distributor initialization.
|
||||
* This fixes the CR#952962.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
@ -166,7 +179,12 @@ extern "C" {
|
|||
|
||||
/************************** Constant Definitions *****************************/
|
||||
|
||||
#define EFUSE_STATUS_OFFSET 0x10
|
||||
#define EFUSE_STATUS_CPU_MASK 0x80
|
||||
|
||||
#if !defined (ARMR5) && !defined (__aarch64__) && !defined (ARMA53_32)
|
||||
#define ARMA9
|
||||
#endif
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
/* The following data type defines each entry in an interrupt vector table.
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -64,28 +64,24 @@
|
|||
* sk 12/10/15 Added support for MMC cards.
|
||||
* sk 02/16/16 Corrected the Tuning logic.
|
||||
* sk 03/01/16 Removed Bus Width check for eMMC. CR# 938311.
|
||||
* 2.8 sk 05/03/16 Standard Speed for SD to 19MHz in ZynqMPSoC. CR#951024
|
||||
* 3.0 sk 06/09/16 Added support for mkfs to calculate sector count.
|
||||
* sk 07/16/16 Added support for UHS modes.
|
||||
* sk 07/07/16 Used usleep API for both arm and microblaze.
|
||||
* sk 07/16/16 Added Tap delays accordingly to different SD/eMMC
|
||||
* operating modes.
|
||||
* 3.1 mi 09/07/16 Removed compilation warnings with extra compiler flags.
|
||||
* sk 10/13/16 Reduced the delay during power cycle to 1ms as per spec
|
||||
* sk 10/19/16 Used emmc_hwreset pin to reset eMMC.
|
||||
* sk 11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
#include "xsdps.h"
|
||||
/*
|
||||
* The header sleep.h and API usleep() can only be used with an arm design.
|
||||
* MB_Sleep() is used for microblaze design.
|
||||
*/
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
#include "sleep.h"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __MICROBLAZE__
|
||||
|
||||
#include "microblaze_sleep.h"
|
||||
|
||||
#endif
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
#define XSDPS_CMD8_VOL_PATTERN 0x1AAU
|
||||
#define XSDPS_RESPOCR_READY 0x80000000U
|
||||
|
@ -96,8 +92,10 @@
|
|||
#define HIGH_SPEED_SUPPORT 0x2U
|
||||
#define WIDTH_4_BIT_SUPPORT 0x4U
|
||||
#define SD_CLK_25_MHZ 25000000U
|
||||
#define SD_CLK_19_MHZ 19000000U
|
||||
#define SD_CLK_26_MHZ 26000000U
|
||||
#define EXT_CSD_DEVICE_TYPE_BYTE 196U
|
||||
#define EXT_CSD_SEC_COUNT 212U
|
||||
#define EXT_CSD_DEVICE_TYPE_HIGH_SPEED 0x2U
|
||||
#define EXT_CSD_DEVICE_TYPE_DDR_1V8_HIGH_SPEED 0x4U
|
||||
#define EXT_CSD_DEVICE_TYPE_DDR_1V2_HIGH_SPEED 0x8U
|
||||
|
@ -118,7 +116,9 @@ s32 XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt);
|
|||
void XSdPs_SetupADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff);
|
||||
extern s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode);
|
||||
static s32 XSdPs_IdentifyCard(XSdPs *InstancePtr);
|
||||
#ifndef UHS_BROKEN
|
||||
static s32 XSdPs_Switch_Voltage(XSdPs *InstancePtr);
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
|
@ -163,28 +163,31 @@ s32 XSdPs_CfgInitialize(XSdPs *InstancePtr, XSdPs_Config *ConfigPtr,
|
|||
Xil_AssertNonvoid(ConfigPtr != NULL);
|
||||
|
||||
/* Set some default values. */
|
||||
InstancePtr->Config.DeviceId = ConfigPtr->DeviceId;
|
||||
InstancePtr->Config.BaseAddress = EffectiveAddr;
|
||||
InstancePtr->Config.InputClockHz = ConfigPtr->InputClockHz;
|
||||
InstancePtr->IsReady = XIL_COMPONENT_IS_READY;
|
||||
InstancePtr->Config.CardDetect = ConfigPtr->CardDetect;
|
||||
InstancePtr->Config.WriteProtect = ConfigPtr->WriteProtect;
|
||||
InstancePtr->Config.BusWidth = ConfigPtr->BusWidth;
|
||||
InstancePtr->Config.BankNumber = ConfigPtr->BankNumber;
|
||||
InstancePtr->Config.HasEMIO = ConfigPtr->HasEMIO;
|
||||
InstancePtr->SectorCount = 0;
|
||||
InstancePtr->Mode = XSDPS_DEFAULT_SPEED_MODE;
|
||||
InstancePtr->Config_TapDelay = NULL;
|
||||
|
||||
/* Disable bus power */
|
||||
/* Disable bus power and issue emmc hw reset */
|
||||
if ((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_HOST_CTRL_VER_OFFSET) & XSDPS_HC_SPEC_VER_MASK) ==
|
||||
XSDPS_HC_SPEC_V3)
|
||||
XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_POWER_CTRL_OFFSET, 0U);
|
||||
XSDPS_POWER_CTRL_OFFSET, XSDPS_PC_EMMC_HW_RST_MASK);
|
||||
else
|
||||
XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_POWER_CTRL_OFFSET, 0x0);
|
||||
|
||||
/* Delay to poweroff card */
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
(void)sleep(1U);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __MICROBLAZE__
|
||||
|
||||
MB_Sleep(1000U);
|
||||
|
||||
#endif
|
||||
(void)usleep(1000U);
|
||||
|
||||
/* "Software reset for all" is initiated */
|
||||
XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, XSDPS_SW_RST_OFFSET,
|
||||
|
@ -210,10 +213,22 @@ s32 XSdPs_CfgInitialize(XSdPs *InstancePtr, XSdPs_Config *ConfigPtr,
|
|||
XSDPS_CAPS_OFFSET);
|
||||
|
||||
/* Select voltage and enable bus power. */
|
||||
if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3)
|
||||
XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_POWER_CTRL_OFFSET,
|
||||
(XSDPS_PC_BUS_VSEL_3V3_MASK | XSDPS_PC_BUS_PWR_MASK) &
|
||||
~XSDPS_PC_EMMC_HW_RST_MASK);
|
||||
else
|
||||
XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_POWER_CTRL_OFFSET,
|
||||
XSDPS_PC_BUS_VSEL_3V3_MASK | XSDPS_PC_BUS_PWR_MASK);
|
||||
|
||||
/* Delay before issuing the command after emmc reset */
|
||||
if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3)
|
||||
if ((InstancePtr->Host_Caps & XSDPS_CAPS_SLOT_TYPE_MASK) ==
|
||||
XSDPS_CAPS_EMB_SLOT)
|
||||
usleep(200);
|
||||
|
||||
/* Change the clock frequency to 400 KHz */
|
||||
Status = XSdPs_Change_ClkFreq(InstancePtr, XSDPS_CLK_400_KHZ);
|
||||
if (Status != XST_SUCCESS) {
|
||||
|
@ -308,6 +323,7 @@ s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr)
|
|||
u32 CSD[4];
|
||||
u32 Arg;
|
||||
u8 ReadReg;
|
||||
u32 BlkLen, DeviceSize, Mult;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
@ -470,6 +486,19 @@ s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr)
|
|||
CSD[3] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_RESP3_OFFSET);
|
||||
|
||||
if (((CSD[3] & CSD_STRUCT_MASK) >> 22U) == 0U) {
|
||||
BlkLen = 1 << ((CSD[2] & READ_BLK_LEN_MASK) >> 8U);
|
||||
Mult = 1 << (((CSD[1] & C_SIZE_MULT_MASK) >> 7U) + 2U);
|
||||
DeviceSize = (CSD[1] & C_SIZE_LOWER_MASK) >> 22U;
|
||||
DeviceSize |= (CSD[2] & C_SIZE_UPPER_MASK) << 10U;
|
||||
DeviceSize = (DeviceSize + 1U) * Mult;
|
||||
DeviceSize = DeviceSize * BlkLen;
|
||||
InstancePtr->SectorCount = (DeviceSize/XSDPS_BLK_SIZE_512_MASK);
|
||||
} else if (((CSD[3] & CSD_STRUCT_MASK) >> 22U) == 1U) {
|
||||
InstancePtr->SectorCount = (((CSD[1] & CSD_V2_C_SIZE_MASK) >> 8U) +
|
||||
1U) * 1024U;
|
||||
}
|
||||
|
||||
Status = XST_SUCCESS;
|
||||
|
||||
RETURN_PATH:
|
||||
|
@ -495,12 +524,8 @@ RETURN_PATH:
|
|||
*
|
||||
*
|
||||
******************************************************************************/
|
||||
s32 XSdPs_CardInitialize(XSdPs *InstancePtr) {
|
||||
u8 Tmp;
|
||||
u32 Cnt;
|
||||
u32 PresentStateReg;
|
||||
u32 CtrlReg;
|
||||
u32 CSD[4];
|
||||
s32 XSdPs_CardInitialize(XSdPs *InstancePtr)
|
||||
{
|
||||
#ifdef __ICCARM__
|
||||
#pragma data_alignment = 32
|
||||
static u8 ExtCsd[512];
|
||||
|
@ -511,6 +536,7 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
|
|||
u8 SCR[8] = { 0U };
|
||||
u8 ReadBuff[64] = { 0U };
|
||||
s32 Status;
|
||||
u32 Arg;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
@ -547,6 +573,14 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
|
|||
}
|
||||
|
||||
/* Change clock to default clock 25MHz */
|
||||
/*
|
||||
* SD default speed mode timing should be closed at 19 MHz.
|
||||
* The reason for this is SD requires a voltage level shifter.
|
||||
* This limitation applies to ZynqMPSoC.
|
||||
*/
|
||||
if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3)
|
||||
InstancePtr->BusSpeed = SD_CLK_19_MHZ;
|
||||
else
|
||||
InstancePtr->BusSpeed = SD_CLK_25_MHZ;
|
||||
Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed);
|
||||
if (Status != XST_SUCCESS) {
|
||||
|
@ -601,33 +635,39 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
|
|||
}
|
||||
}
|
||||
|
||||
/* Get speed supported by device */
|
||||
Status = XSdPs_Get_BusSpeed(InstancePtr, ReadBuff);
|
||||
if (Status != XST_SUCCESS) {
|
||||
goto RETURN_PATH;
|
||||
}
|
||||
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
if ((InstancePtr->Switch1v8 != 0U) &&
|
||||
(InstancePtr->BusWidth == XSDPS_4_BIT_WIDTH)) {
|
||||
|
||||
/* Identify the UHS mode supported by card */
|
||||
XSdPs_Identify_UhsMode(InstancePtr, ReadBuff);
|
||||
|
||||
/* Set UHS-I SDR104 mode */
|
||||
Status = XSdPs_Uhs_ModeInit(InstancePtr,
|
||||
XSDPS_UHS_SPEED_MODE_SDR104);
|
||||
Status = XSdPs_Uhs_ModeInit(InstancePtr, InstancePtr->Mode);
|
||||
if (Status != XST_SUCCESS) {
|
||||
Status = XST_FAILURE;
|
||||
goto RETURN_PATH;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
#endif
|
||||
/*
|
||||
* card supports CMD6 when SD_SPEC field in SCR register
|
||||
* indicates that the Physical Layer Specification Version
|
||||
* is 1.10 or later. So for SD v1.0 cmd6 is not supported.
|
||||
*/
|
||||
if (SCR[0] != 0U) {
|
||||
/* Get speed supported by device */
|
||||
Status = XSdPs_Get_BusSpeed(InstancePtr, ReadBuff);
|
||||
if (Status != XST_SUCCESS) {
|
||||
Status = XST_FAILURE;
|
||||
goto RETURN_PATH;
|
||||
}
|
||||
|
||||
/* Check for high speed support */
|
||||
if ((ReadBuff[13] & HIGH_SPEED_SUPPORT) != 0U) {
|
||||
InstancePtr->Mode = XSDPS_HIGH_SPEED_MODE;
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
InstancePtr->Config_TapDelay = XSdPs_hsd_sdr25_tapdelay;
|
||||
#endif
|
||||
Status = XSdPs_Change_BusSpeed(InstancePtr);
|
||||
if (Status != XST_SUCCESS) {
|
||||
Status = XST_FAILURE;
|
||||
|
@ -635,7 +675,9 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
|
|||
}
|
||||
}
|
||||
}
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
}
|
||||
#endif
|
||||
|
||||
} else if (((InstancePtr->CardType == XSDPS_CARD_MMC) &&
|
||||
(InstancePtr->Card_Version > CSD_SPEC_VER_3)) &&
|
||||
|
@ -653,8 +695,11 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
|
|||
goto RETURN_PATH;
|
||||
}
|
||||
|
||||
InstancePtr->SectorCount = *(u32 *)&ExtCsd[EXT_CSD_SEC_COUNT];
|
||||
|
||||
if ((ExtCsd[EXT_CSD_DEVICE_TYPE_BYTE] &
|
||||
EXT_CSD_DEVICE_TYPE_HIGH_SPEED) != 0U) {
|
||||
InstancePtr->Mode = XSDPS_HIGH_SPEED_MODE;
|
||||
Status = XSdPs_Change_BusSpeed(InstancePtr);
|
||||
if (Status != XST_SUCCESS) {
|
||||
Status = XST_FAILURE;
|
||||
|
@ -687,9 +732,15 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
|
|||
goto RETURN_PATH;
|
||||
}
|
||||
|
||||
InstancePtr->SectorCount = *(u32 *)&ExtCsd[EXT_CSD_SEC_COUNT];
|
||||
|
||||
if ((ExtCsd[EXT_CSD_DEVICE_TYPE_BYTE] &
|
||||
(EXT_CSD_DEVICE_TYPE_SDR_1V8_HS200 |
|
||||
EXT_CSD_DEVICE_TYPE_SDR_1V2_HS200)) != 0U) {
|
||||
InstancePtr->Mode = XSDPS_HS200_MODE;
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
InstancePtr->Config_TapDelay = XSdPs_sdr104_hs200_tapdelay;
|
||||
#endif
|
||||
Status = XSdPs_Change_BusSpeed(InstancePtr);
|
||||
if (Status != XST_SUCCESS) {
|
||||
Status = XST_FAILURE;
|
||||
|
@ -707,6 +758,16 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
|
|||
goto RETURN_PATH;
|
||||
}
|
||||
}
|
||||
|
||||
/* Enable Rst_n_Fun bit if it is disabled */
|
||||
if(ExtCsd[EXT_CSD_RST_N_FUN_BYTE] == EXT_CSD_RST_N_FUN_TEMP_DIS) {
|
||||
Arg = XSDPS_MMC_RST_FUN_EN_ARG;
|
||||
Status = XSdPs_Set_Mmc_ExtCsd(InstancePtr, Arg);
|
||||
if (Status != XST_SUCCESS) {
|
||||
Status = XST_FAILURE;
|
||||
goto RETURN_PATH;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Status = XSdPs_SetBlkSize(InstancePtr, XSDPS_BLK_SIZE_512_MASK);
|
||||
|
@ -731,26 +792,14 @@ RETURN_PATH:
|
|||
static s32 XSdPs_IdentifyCard(XSdPs *InstancePtr)
|
||||
{
|
||||
s32 Status;
|
||||
u32 OperCondReg;
|
||||
u8 ReadReg;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
||||
/* 74 CLK delay after card is powered up, before the first command. */
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
usleep(XSDPS_INIT_DELAY);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __MICROBLAZE__
|
||||
|
||||
/* 2 msec delay */
|
||||
MB_Sleep(2);
|
||||
|
||||
#endif
|
||||
|
||||
/* CMD0 no response expected */
|
||||
Status = XSdPs_CmdTransfer(InstancePtr, CMD0, 0U, 0U);
|
||||
if (Status != XST_SUCCESS) {
|
||||
|
@ -790,6 +839,7 @@ RETURN_PATH:
|
|||
return Status;
|
||||
}
|
||||
|
||||
#ifndef UHS_BROKEN
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
|
@ -828,18 +878,8 @@ static s32 XSdPs_Switch_Voltage(XSdPs *InstancePtr)
|
|||
CtrlReg);
|
||||
|
||||
/* Wait minimum 5mSec */
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
(void)usleep(5000U);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __MICROBLAZE__
|
||||
|
||||
MB_Sleep(5U);
|
||||
|
||||
#endif
|
||||
|
||||
/* Enabling 1.8V in controller */
|
||||
CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_HOST_CTRL2_OFFSET);
|
||||
|
@ -866,6 +906,7 @@ static s32 XSdPs_Switch_Voltage(XSdPs *InstancePtr)
|
|||
RETURN_PATH:
|
||||
return Status;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
|
@ -1398,6 +1439,7 @@ s32 XSdPs_MmcCardInitialize(XSdPs *InstancePtr)
|
|||
s32 Status;
|
||||
u32 RespOCR;
|
||||
u32 CSD[4];
|
||||
u32 BlkLen, DeviceSize, Mult;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
@ -1498,6 +1540,16 @@ s32 XSdPs_MmcCardInitialize(XSdPs *InstancePtr)
|
|||
|
||||
InstancePtr->Card_Version = (CSD[3] & CSD_SPEC_VER_MASK) >>18U;
|
||||
|
||||
/* Calculating the memory capacity */
|
||||
BlkLen = 1 << ((CSD[2] & READ_BLK_LEN_MASK) >> 8U);
|
||||
Mult = 1 << (((CSD[1] & C_SIZE_MULT_MASK) >> 7U) + 2U);
|
||||
DeviceSize = (CSD[1] & C_SIZE_LOWER_MASK) >> 22U;
|
||||
DeviceSize |= (CSD[2] & C_SIZE_UPPER_MASK) << 10U;
|
||||
DeviceSize = (DeviceSize + 1U) * Mult;
|
||||
DeviceSize = DeviceSize * BlkLen;
|
||||
|
||||
InstancePtr->SectorCount = (DeviceSize/XSDPS_BLK_SIZE_512_MASK);
|
||||
|
||||
Status = XST_SUCCESS;
|
||||
|
||||
RETURN_PATH:
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -125,6 +125,20 @@
|
|||
* of SDR50, SDR104 and HS200.
|
||||
* sk 02/16/16 Corrected the Tuning logic.
|
||||
* sk 03/01/16 Removed Bus Width check for eMMC. CR# 938311.
|
||||
* 2.8 sk 04/20/16 Added new workaround for auto tuning.
|
||||
* 05/03/16 Standard Speed for SD to 19MHz in ZynqMPSoC. CR#951024
|
||||
* 3.0 sk 06/09/16 Added support for mkfs to calculate sector count.
|
||||
* sk 07/16/16 Added support for UHS modes.
|
||||
* sk 07/07/16 Used usleep API for both arm and microblaze.
|
||||
* sk 07/16/16 Added Tap delays accordingly to different SD/eMMC
|
||||
* operating modes.
|
||||
* sk 08/13/16 Removed sleep.h from xsdps.h as a temporary fix for
|
||||
* CR#956899.
|
||||
* 3.1 mi 09/07/16 Removed compilation warnings with extra compiler flags.
|
||||
* sk 10/13/16 Reduced the delay during power cycle to 1ms as per spec
|
||||
* sk 10/19/16 Used emmc_hwreset pin to reset eMMC.
|
||||
* sk 11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
|
||||
* sk 11/16/16 Issue DLL reset at 31 iteration to load new zero value.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -150,6 +164,9 @@ extern "C" {
|
|||
#define MAX_TUNING_COUNT 40U /**< Maximum Tuning count */
|
||||
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
typedef void (*XSdPs_ConfigTap) (u32 Bank, u32 DeviceId, u32 CardType);
|
||||
|
||||
/**
|
||||
* This typedef contains configuration information for the device.
|
||||
*/
|
||||
|
@ -159,6 +176,9 @@ typedef struct {
|
|||
u32 InputClockHz; /**< Input clock frequency */
|
||||
u32 CardDetect; /**< Card Detect */
|
||||
u32 WriteProtect; /**< Write Protect */
|
||||
u32 BusWidth; /**< Bus Width */
|
||||
u32 BankNumber; /**< MIO Bank selection for SD */
|
||||
u32 HasEMIO; /**< If SD is connected to EMIO */
|
||||
} XSdPs_Config;
|
||||
|
||||
/* ADMA2 descriptor table */
|
||||
|
@ -188,7 +208,10 @@ typedef struct {
|
|||
u32 CardID[4]; /**< Card ID Register */
|
||||
u32 RelCardAddr; /**< Relative Card Address */
|
||||
u32 CardSpecData[4]; /**< Card Specific Data Register */
|
||||
u32 SectorCount; /**< Sector Count */
|
||||
u32 SdCardConfig; /**< Sd Card Configuration Register */
|
||||
u32 Mode; /**< Bus Speed Mode */
|
||||
XSdPs_ConfigTap Config_TapDelay; /**< Configuring the tap delays */
|
||||
/**< ADMA Descriptors */
|
||||
#ifdef __ICCARM__
|
||||
#pragma data_alignment = 32
|
||||
|
@ -219,6 +242,12 @@ s32 XSdPs_Pullup(XSdPs *InstancePtr);
|
|||
s32 XSdPs_MmcCardInitialize(XSdPs *InstancePtr);
|
||||
s32 XSdPs_CardInitialize(XSdPs *InstancePtr);
|
||||
s32 XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff);
|
||||
s32 XSdPs_Set_Mmc_ExtCsd(XSdPs *InstancePtr, u32 Arg);
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
void XSdPs_Identify_UhsMode(XSdPs *InstancePtr, u8 *ReadBuff);
|
||||
void XSdPs_hsd_sdr25_tapdelay(u32 Bank, u32 DeviceId, u32 CardType);
|
||||
void XSdPs_sdr104_hs200_tapdelay(u32 Bank, u32 DeviceId, u32 CardType);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
|
@ -51,7 +51,10 @@ XSdPs_Config XSdPs_ConfigTable[] =
|
|||
XPAR_PSU_SD_1_BASEADDR,
|
||||
XPAR_PSU_SD_1_SDIO_CLK_FREQ_HZ,
|
||||
XPAR_PSU_SD_1_HAS_CD,
|
||||
XPAR_PSU_SD_1_HAS_WP
|
||||
XPAR_PSU_SD_1_HAS_WP,
|
||||
XPAR_PSU_SD_1_BUS_WIDTH,
|
||||
XPAR_PSU_SD_1_MIO_BANK,
|
||||
XPAR_PSU_SD_1_HAS_EMIO
|
||||
}
|
||||
};
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -50,6 +50,12 @@
|
|||
* kvn 07/15/15 Modified the code according to MISRAC-2012.
|
||||
* 2.7 sk 12/10/15 Added support for MMC cards.
|
||||
* sk 03/02/16 Configured the Tap Delay values for eMMC HS200 mode.
|
||||
* 2.8 sk 04/20/16 Added new workaround for auto tuning.
|
||||
* 3.0 sk 06/09/16 Added support for mkfs to calculate sector count.
|
||||
* sk 07/16/16 Added support for UHS modes.
|
||||
* sk 07/16/16 Added Tap delays accordingly to different SD/eMMC
|
||||
* operating modes.
|
||||
* 3.1 sk 11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
|
||||
* </pre>
|
||||
*
|
||||
******************************************************************************/
|
||||
|
@ -796,6 +802,12 @@ extern "C" {
|
|||
#define XSDPS_CUR_LIM_800 3U
|
||||
|
||||
#define CSD_SPEC_VER_MASK 0x3C0000U
|
||||
#define READ_BLK_LEN_MASK 0x00000F00U
|
||||
#define C_SIZE_MULT_MASK 0x00000380U
|
||||
#define C_SIZE_LOWER_MASK 0xFFC00000U
|
||||
#define C_SIZE_UPPER_MASK 0x00000003U
|
||||
#define CSD_STRUCT_MASK 0x00C00000U
|
||||
#define CSD_V2_C_SIZE_MASK 0x3FFFFF00U
|
||||
|
||||
/* EXT_CSD field definitions */
|
||||
#define XSDPS_EXT_CSD_SIZE 512U
|
||||
|
@ -842,6 +854,10 @@ extern "C" {
|
|||
#define EXT_CSD_HS_TIMING_HIGH 1U /* Card is in high speed mode */
|
||||
#define EXT_CSD_HS_TIMING_HS200 2U /* Card is in HS200 mode */
|
||||
|
||||
#define EXT_CSD_RST_N_FUN_BYTE 162U
|
||||
#define EXT_CSD_RST_N_FUN_TEMP_DIS 0U /* RST_n signal is temporarily disabled */
|
||||
#define EXT_CSD_RST_N_FUN_PERM_EN 1U /* RST_n signal is permanently enabled */
|
||||
#define EXT_CSD_RST_N_FUN_PERM_DIS 2U /* RST_n signal is permanently disabled */
|
||||
|
||||
#define XSDPS_EXT_CSD_CMD_SET 0U
|
||||
#define XSDPS_EXT_CSD_SET_BITS 1U
|
||||
|
@ -880,6 +896,10 @@ extern "C" {
|
|||
| ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \
|
||||
| ((u32)EXT_CSD_BUS_WIDTH_DDR_8_BIT << 8))
|
||||
|
||||
#define XSDPS_MMC_RST_FUN_EN_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \
|
||||
| ((u32)EXT_CSD_RST_N_FUN_BYTE << 16) \
|
||||
| ((u32)EXT_CSD_RST_N_FUN_PERM_EN << 8))
|
||||
|
||||
#define XSDPS_MMC_DELAY_FOR_SWITCH 1000U
|
||||
|
||||
/* @} */
|
||||
|
@ -930,6 +950,9 @@ extern "C" {
|
|||
#define XSDPS_UHS_SPEED_MODE_SDR50 0x2U
|
||||
#define XSDPS_UHS_SPEED_MODE_SDR104 0x3U
|
||||
#define XSDPS_UHS_SPEED_MODE_DDR50 0x4U
|
||||
#define XSDPS_HIGH_SPEED_MODE 0x5U
|
||||
#define XSDPS_DEFAULT_SPEED_MODE 0x6U
|
||||
#define XSDPS_HS200_MODE 0x7U
|
||||
#define XSDPS_SWITCH_CMD_BLKCNT 1U
|
||||
#define XSDPS_SWITCH_CMD_BLKSIZE 64U
|
||||
#define XSDPS_SWITCH_CMD_HS_GET 0x00FFFFF0U
|
||||
|
@ -987,15 +1010,43 @@ extern "C" {
|
|||
#define XSDPS_SLOT_REM 0U
|
||||
#define XSDPS_SLOT_EMB 1U
|
||||
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
#define SD_DLL_CTRL 0x00000358U
|
||||
#define SD_ITAPDLY 0x00000314U
|
||||
#define SD_OTAPDLYSEL 0x00000318U
|
||||
#define SD_OTAPDLY 0x00000318U
|
||||
#define SD0_DLL_RST 0x00000004U
|
||||
#define SD1_DLL_RST 0x00040000U
|
||||
#define SD0_ITAPCHGWIN 0x00000200U
|
||||
#define SD0_ITAPDLYENA 0x00000100U
|
||||
#define SD0_OTAPDLYENA 0x00000040U
|
||||
#define SD0_OTAPDLYSEL_HS200 0x00000003U
|
||||
#define SD1_ITAPCHGWIN 0x02000000U
|
||||
#define SD1_ITAPDLYENA 0x01000000U
|
||||
#define SD1_OTAPDLYENA 0x00400000U
|
||||
|
||||
#define SD0_OTAPDLYSEL_HS200_B0 0x00000003U
|
||||
#define SD0_OTAPDLYSEL_HS200_B2 0x00000002U
|
||||
#define SD0_ITAPDLYSEL_SD50 0x00000014U
|
||||
#define SD0_OTAPDLYSEL_SD50 0x00000003U
|
||||
#define SD0_ITAPDLYSEL_SD_DDR50 0x0000003DU
|
||||
#define SD0_ITAPDLYSEL_EMMC_DDR50 0x00000012U
|
||||
#define SD0_OTAPDLYSEL_SD_DDR50 0x00000004U
|
||||
#define SD0_OTAPDLYSEL_EMMC_DDR50 0x00000006U
|
||||
#define SD0_ITAPDLYSEL_HSD 0x00000015U
|
||||
#define SD0_OTAPDLYSEL_SD_HSD 0x00000005U
|
||||
#define SD0_OTAPDLYSEL_EMMC_HSD 0x00000006U
|
||||
|
||||
#define SD1_OTAPDLYSEL_HS200_B0 0x00030000U
|
||||
#define SD1_OTAPDLYSEL_HS200_B2 0x00020000U
|
||||
#define SD1_ITAPDLYSEL_SD50 0x00140000U
|
||||
#define SD1_OTAPDLYSEL_SD50 0x00030000U
|
||||
#define SD1_ITAPDLYSEL_SD_DDR50 0x003D0000U
|
||||
#define SD1_ITAPDLYSEL_EMMC_DDR50 0x00120000U
|
||||
#define SD1_OTAPDLYSEL_SD_DDR50 0x00040000U
|
||||
#define SD1_OTAPDLYSEL_EMMC_DDR50 0x00060000U
|
||||
#define SD1_ITAPDLYSEL_HSD 0x00150000U
|
||||
#define SD1_OTAPDLYSEL_SD_HSD 0x00050000U
|
||||
#define SD1_OTAPDLYSEL_EMMC_HSD 0x00060000U
|
||||
|
||||
#endif
|
||||
|
||||
/**************************** Type Definitions *******************************/
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -55,6 +55,14 @@
|
|||
* of SDR50, SDR104 and HS200.
|
||||
* sk 02/16/16 Corrected the Tuning logic.
|
||||
* sk 03/02/16 Configured the Tap Delay values for eMMC HS200 mode.
|
||||
* 2.8 sk 04/20/16 Added new workaround for auto tuning.
|
||||
* 3.0 sk 07/07/16 Used usleep API for both arm and microblaze.
|
||||
* sk 07/16/16 Added support for UHS modes.
|
||||
* sk 07/16/16 Added Tap delays accordingly to different SD/eMMC
|
||||
* operating modes.
|
||||
* 3.1 mi 09/07/16 Removed compilation warnings with extra compiler flags.
|
||||
* sk 11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
|
||||
* sk 11/16/16 Issue DLL reset at 31 iteration to load new zero value.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -62,24 +70,14 @@
|
|||
|
||||
/***************************** Include Files *********************************/
|
||||
#include "xsdps.h"
|
||||
/*
|
||||
* The header sleep.h and API usleep() can only be used with an arm design.
|
||||
* MB_Sleep() is used for microblaze design.
|
||||
*/
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
#include "sleep.h"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __MICROBLAZE__
|
||||
|
||||
#include "microblaze_sleep.h"
|
||||
|
||||
#endif
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
|
||||
#define UHS_SDR12_SUPPORT 0x1U
|
||||
#define UHS_SDR25_SUPPORT 0x2U
|
||||
#define UHS_SDR50_SUPPORT 0x4U
|
||||
#define UHS_SDR104_SUPPORT 0x8U
|
||||
#define UHS_DDR50_SUPPORT 0x10U
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
|
@ -87,11 +85,13 @@
|
|||
/************************** Function Prototypes ******************************/
|
||||
s32 XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt);
|
||||
void XSdPs_SetupADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff);
|
||||
s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode);
|
||||
static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr);
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode);
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
static void XSdPs_sdr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType);
|
||||
static void XSdPs_ddr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType);
|
||||
void XSdPs_SetTapDelay(XSdPs *InstancePtr);
|
||||
static void XSdPs_DllReset(XSdPs *InstancePtr);
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -320,19 +320,8 @@ s32 XSdPs_Change_BusWidth(XSdPs *InstancePtr)
|
|||
XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK);
|
||||
}
|
||||
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
usleep(XSDPS_MMC_DELAY_FOR_SWITCH);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __MICROBLAZE__
|
||||
|
||||
/* 2 msec delay */
|
||||
MB_Sleep(2);
|
||||
|
||||
#endif
|
||||
|
||||
StatusReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_HOST_CTRL1_OFFSET);
|
||||
|
||||
|
@ -463,7 +452,6 @@ s32 XSdPs_Change_BusSpeed(XSdPs *InstancePtr)
|
|||
s32 Status;
|
||||
u32 StatusReg;
|
||||
u32 Arg;
|
||||
u32 ClockReg;
|
||||
u16 BlkCnt;
|
||||
u16 BlkSize;
|
||||
u8 ReadBuff[64];
|
||||
|
@ -610,25 +598,10 @@ s32 XSdPs_Change_BusSpeed(XSdPs *InstancePtr)
|
|||
Status = XST_FAILURE;
|
||||
goto RETURN_PATH;
|
||||
}
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
/* Program the Tap delays */
|
||||
XSdPs_SetTapDelay(InstancePtr);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
|
||||
usleep(XSDPS_MMC_DELAY_FOR_SWITCH);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __MICROBLAZE__
|
||||
|
||||
/* 2 msec delay */
|
||||
MB_Sleep(2);
|
||||
|
||||
#endif
|
||||
|
||||
StatusReg = (s32)XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_HOST_CTRL1_OFFSET);
|
||||
StatusReg |= XSDPS_HC_SPEED_MASK;
|
||||
|
@ -667,7 +640,6 @@ s32 XSdPs_Change_ClkFreq(XSdPs *InstancePtr, u32 SelFreq)
|
|||
u16 DivCnt;
|
||||
u16 Divisor = 0U;
|
||||
u16 ExtDivisor;
|
||||
u16 ClkLoopCnt;
|
||||
s32 Status;
|
||||
u16 ReadReg;
|
||||
|
||||
|
@ -682,6 +654,12 @@ s32 XSdPs_Change_ClkFreq(XSdPs *InstancePtr, u32 SelFreq)
|
|||
XSDPS_CLK_CTRL_OFFSET, ClockReg);
|
||||
|
||||
if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) {
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
if ((InstancePtr->Mode != XSDPS_DEFAULT_SPEED_MODE) &&
|
||||
(InstancePtr->Mode != XSDPS_UHS_SPEED_MODE_SDR12))
|
||||
/* Program the Tap delays */
|
||||
XSdPs_SetTapDelay(InstancePtr);
|
||||
#endif
|
||||
/* Calculate divisor */
|
||||
for (DivCnt = 0x1U; DivCnt <= XSDPS_CC_EXT_MAX_DIV_CNT;DivCnt++) {
|
||||
if (((InstancePtr->Config.InputClockHz) / DivCnt) <= SelFreq) {
|
||||
|
@ -890,6 +868,110 @@ s32 XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff)
|
|||
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* API to write EXT_CSD register of eMMC.
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XSdPs instance.
|
||||
* @param Arg is the argument to be sent along with the command
|
||||
*
|
||||
* @return
|
||||
* - XST_SUCCESS if successful.
|
||||
* - XST_FAILURE if fail.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
s32 XSdPs_Set_Mmc_ExtCsd(XSdPs *InstancePtr, u32 Arg)
|
||||
{
|
||||
s32 Status;
|
||||
u32 StatusReg;
|
||||
|
||||
Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 0U);
|
||||
if (Status != XST_SUCCESS) {
|
||||
Status = XST_FAILURE;
|
||||
goto RETURN_PATH;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for transfer complete
|
||||
*/
|
||||
do {
|
||||
StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_NORM_INTR_STS_OFFSET);
|
||||
if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) {
|
||||
/*
|
||||
* Write to clear error bits
|
||||
*/
|
||||
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_ERR_INTR_STS_OFFSET,
|
||||
XSDPS_ERROR_INTR_ALL_MASK);
|
||||
Status = XST_FAILURE;
|
||||
goto RETURN_PATH;
|
||||
}
|
||||
} while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U);
|
||||
|
||||
/* Write to clear bit */
|
||||
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK);
|
||||
|
||||
Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_RESP0_OFFSET);
|
||||
|
||||
Status = XST_SUCCESS;
|
||||
|
||||
RETURN_PATH:
|
||||
return Status;
|
||||
|
||||
}
|
||||
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* API to Identify the supported UHS mode. This API will assign the
|
||||
* corresponding tap delay API to the Config_TapDelay pointer based on the
|
||||
* supported bus speed.
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XSdPs instance.
|
||||
* @param ReadBuff contains the response for CMD6
|
||||
*
|
||||
* @return None.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
void XSdPs_Identify_UhsMode(XSdPs *InstancePtr, u8 *ReadBuff)
|
||||
{
|
||||
|
||||
Xil_AssertVoid(InstancePtr != NULL);
|
||||
|
||||
if (((ReadBuff[13] & UHS_SDR104_SUPPORT) != 0U) &&
|
||||
(InstancePtr->Config.InputClockHz >= XSDPS_MMC_HS200_MAX_CLK)) {
|
||||
InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR104;
|
||||
InstancePtr->Config_TapDelay = XSdPs_sdr104_hs200_tapdelay;
|
||||
}
|
||||
else if (((ReadBuff[13] & UHS_SDR50_SUPPORT) != 0U) &&
|
||||
(InstancePtr->Config.InputClockHz >= XSDPS_SD_SDR50_MAX_CLK)) {
|
||||
InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR50;
|
||||
InstancePtr->Config_TapDelay = XSdPs_sdr50_tapdelay;
|
||||
}
|
||||
else if (((ReadBuff[13] & UHS_DDR50_SUPPORT) != 0U) &&
|
||||
(InstancePtr->Config.InputClockHz >= XSDPS_SD_DDR50_MAX_CLK)) {
|
||||
InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_DDR50;
|
||||
InstancePtr->Config_TapDelay = XSdPs_ddr50_tapdelay;
|
||||
}
|
||||
else if (((ReadBuff[13] & UHS_SDR25_SUPPORT) != 0U) &&
|
||||
(InstancePtr->Config.InputClockHz >= XSDPS_SD_SDR25_MAX_CLK)) {
|
||||
InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR25;
|
||||
InstancePtr->Config_TapDelay = XSdPs_hsd_sdr25_tapdelay;
|
||||
}
|
||||
else
|
||||
InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR12;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
|
@ -1008,7 +1090,7 @@ s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode)
|
|||
}
|
||||
|
||||
if((Mode == XSDPS_UHS_SPEED_MODE_SDR104) ||
|
||||
(Mode == XSDPS_UHS_SPEED_MODE_DDR50)) {
|
||||
(Mode == XSDPS_UHS_SPEED_MODE_SDR50)) {
|
||||
/* Send tuning pattern */
|
||||
Status = XSdPs_Execute_Tuning(InstancePtr);
|
||||
if (Status != XST_SUCCESS) {
|
||||
|
@ -1022,22 +1104,18 @@ s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode)
|
|||
RETURN_PATH:
|
||||
return Status;
|
||||
}
|
||||
#endif
|
||||
|
||||
static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr)
|
||||
{
|
||||
s32 Status;
|
||||
u32 StatusReg;
|
||||
u32 Arg;
|
||||
u16 BlkCnt;
|
||||
u16 BlkSize;
|
||||
s32 LoopCnt;
|
||||
u16 CtrlReg;
|
||||
u8 TuningCount;
|
||||
|
||||
Xil_AssertNonvoid(InstancePtr != NULL);
|
||||
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
|
||||
|
||||
BlkCnt = XSDPS_TUNING_CMD_BLKCNT;
|
||||
BlkSize = XSDPS_TUNING_CMD_BLKSIZE;
|
||||
if(InstancePtr->BusWidth == XSDPS_8_BIT_WIDTH)
|
||||
{
|
||||
|
@ -1056,6 +1134,18 @@ static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr)
|
|||
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_HOST_CTRL2_OFFSET, CtrlReg);
|
||||
|
||||
/*
|
||||
* workaround which can work for 1.0/2.0 silicon for auto tuning.
|
||||
* This can be revisited for 3.0 silicon if necessary.
|
||||
*/
|
||||
/* Wait for ~60 clock cycles to reset the tap values */
|
||||
(void)usleep(1U);
|
||||
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
/* Issue DLL Reset to load new SDHC tuned tap values */
|
||||
XSdPs_DllReset(InstancePtr);
|
||||
#endif
|
||||
|
||||
for (TuningCount = 0U; TuningCount < MAX_TUNING_COUNT; TuningCount++) {
|
||||
|
||||
if (InstancePtr->CardType == XSDPS_CARD_SD) {
|
||||
|
@ -1073,6 +1163,13 @@ static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr)
|
|||
XSDPS_HOST_CTRL2_OFFSET) & XSDPS_HC2_EXEC_TNG_MASK) == 0U) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (TuningCount == 31) {
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
/* Issue DLL Reset to load new SDHC tuned tap values */
|
||||
XSdPs_DllReset(InstancePtr);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if ((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
|
@ -1081,25 +1178,13 @@ static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr)
|
|||
goto RETURN_PATH;
|
||||
}
|
||||
|
||||
/*
|
||||
* As per controller erratum, program the "SDCLK Frequency
|
||||
* Select" of clock control register with a value, say
|
||||
* clock/2. Wait for the Internal clock stable and program
|
||||
* the desired frequency.
|
||||
*/
|
||||
CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_HOST_CTRL2_OFFSET);
|
||||
if ((CtrlReg & XSDPS_HC2_SAMP_CLK_SEL_MASK) != 0U) {
|
||||
Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed/2);
|
||||
if (Status != XST_SUCCESS) {
|
||||
goto RETURN_PATH ;
|
||||
}
|
||||
Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed);
|
||||
if (Status != XST_SUCCESS) {
|
||||
goto RETURN_PATH ;
|
||||
}
|
||||
/* Wait for ~12 clock cycles to synchronize the new tap values */
|
||||
(void)usleep(1U);
|
||||
|
||||
}
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
/* Issue DLL Reset to load new SDHC tuned tap values */
|
||||
XSdPs_DllReset(InstancePtr);
|
||||
#endif
|
||||
|
||||
Status = XST_SUCCESS;
|
||||
|
||||
|
@ -1107,7 +1192,226 @@ static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr)
|
|||
|
||||
}
|
||||
|
||||
#if defined (__arm__) || defined (__aarch64__)
|
||||
#if defined (ARMR5) || defined (__aarch64__)
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* API to set Tap Delay for SDR104 and HS200 modes
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XSdPs instance.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
void XSdPs_sdr104_hs200_tapdelay(u32 Bank, u32 DeviceId, u32 CardType)
|
||||
{
|
||||
u32 TapDelay;
|
||||
(void) CardType;
|
||||
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
if (DeviceId == 0U) {
|
||||
/* Program the OTAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD0_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
if (Bank == 2)
|
||||
TapDelay |= SD0_OTAPDLYSEL_HS200_B2;
|
||||
else
|
||||
TapDelay |= SD0_OTAPDLYSEL_HS200_B0;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
} else {
|
||||
#endif
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD1_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
if (Bank == 2)
|
||||
TapDelay |= SD1_OTAPDLYSEL_HS200_B2;
|
||||
else
|
||||
TapDelay |= SD1_OTAPDLYSEL_HS200_B0;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* API to set Tap Delay for SDR50 mode
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XSdPs instance.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
void XSdPs_sdr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType)
|
||||
{
|
||||
u32 TapDelay;
|
||||
(void) Bank;
|
||||
(void) CardType;
|
||||
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
if (DeviceId == 0U) {
|
||||
/* Program the OTAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD0_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
TapDelay |= SD0_OTAPDLYSEL_SD50;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
} else {
|
||||
#endif
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD1_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
TapDelay |= SD1_OTAPDLYSEL_SD50;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* API to set Tap Delay for DDR50 mode
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XSdPs instance.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
void XSdPs_ddr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType)
|
||||
{
|
||||
u32 TapDelay;
|
||||
(void) Bank;
|
||||
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
if (DeviceId == 0U) {
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY);
|
||||
TapDelay |= SD0_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the ITAPDLY */
|
||||
TapDelay |= SD0_ITAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
if (CardType== XSDPS_CARD_SD)
|
||||
TapDelay |= SD0_ITAPDLYSEL_SD_DDR50;
|
||||
else
|
||||
TapDelay |= SD0_ITAPDLYSEL_EMMC_DDR50;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay &= ~SD0_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the OTAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD0_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
if (CardType == XSDPS_CARD_SD)
|
||||
TapDelay |= SD0_OTAPDLYSEL_SD_DDR50;
|
||||
else
|
||||
TapDelay |= SD0_OTAPDLYSEL_EMMC_DDR50;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
} else {
|
||||
#endif
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY);
|
||||
TapDelay |= SD1_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the ITAPDLY */
|
||||
TapDelay |= SD1_ITAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
if (CardType == XSDPS_CARD_SD)
|
||||
TapDelay |= SD1_ITAPDLYSEL_SD_DDR50;
|
||||
else
|
||||
TapDelay |= SD1_ITAPDLYSEL_EMMC_DDR50;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay &= ~SD1_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the OTAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD1_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
if (CardType == XSDPS_CARD_SD)
|
||||
TapDelay |= SD1_OTAPDLYSEL_SD_DDR50;
|
||||
else
|
||||
TapDelay |= SD1_OTAPDLYSEL_EMMC_DDR50;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* API to set Tap Delay for HSD and SDR25 mode
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XSdPs instance.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
void XSdPs_hsd_sdr25_tapdelay(u32 Bank, u32 DeviceId, u32 CardType)
|
||||
{
|
||||
u32 TapDelay;
|
||||
(void) Bank;
|
||||
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
if (DeviceId == 0U) {
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY);
|
||||
TapDelay |= SD0_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the ITAPDLY */
|
||||
TapDelay |= SD0_ITAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay |= SD0_ITAPDLYSEL_HSD;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay &= ~SD0_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the OTAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD0_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
if (CardType == XSDPS_CARD_SD)
|
||||
TapDelay |= SD0_OTAPDLYSEL_SD_HSD;
|
||||
else
|
||||
TapDelay |= SD0_OTAPDLYSEL_EMMC_HSD;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
} else {
|
||||
#endif
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY);
|
||||
TapDelay |= SD1_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the ITAPDLY */
|
||||
TapDelay |= SD1_ITAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay |= SD1_ITAPDLYSEL_HSD;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay &= ~SD1_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the OTAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY);
|
||||
TapDelay |= SD1_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
if (CardType == XSDPS_CARD_SD)
|
||||
TapDelay |= SD1_OTAPDLYSEL_SD_HSD;
|
||||
else
|
||||
TapDelay |= SD1_OTAPDLYSEL_EMMC_HSD;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay);
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
|
@ -1123,30 +1427,91 @@ static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr)
|
|||
******************************************************************************/
|
||||
void XSdPs_SetTapDelay(XSdPs *InstancePtr)
|
||||
{
|
||||
u32 DllCtrl, TapDelay;
|
||||
if (InstancePtr->Config.DeviceId == XPAR_XSDPS_0_DEVICE_ID) {
|
||||
u32 DllCtrl, BankNum, DeviceId, CardType;
|
||||
|
||||
BankNum = InstancePtr->Config.BankNumber;
|
||||
DeviceId = InstancePtr->Config.DeviceId ;
|
||||
CardType = InstancePtr->CardType ;
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
if (DeviceId == 0U) {
|
||||
DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL);
|
||||
DllCtrl |= SD0_DLL_RST;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl);
|
||||
if(InstancePtr->BusSpeed == XSDPS_MMC_HS200_MAX_CLK) {
|
||||
/* Program the ITAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY);
|
||||
TapDelay |= SD0_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay |= SD0_ITAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
TapDelay &= ~SD0_ITAPCHGWIN;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay);
|
||||
/* Program the OTAPDLY */
|
||||
TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLYSEL);
|
||||
TapDelay |= SD0_OTAPDLYENA;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLYSEL, TapDelay);
|
||||
TapDelay |= SD0_OTAPDLYSEL_HS200;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLYSEL, TapDelay);
|
||||
}
|
||||
InstancePtr->Config_TapDelay(BankNum, DeviceId, CardType);
|
||||
DllCtrl &= ~SD0_DLL_RST;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl);
|
||||
} else {
|
||||
#endif
|
||||
DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL);
|
||||
DllCtrl |= SD1_DLL_RST;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl);
|
||||
InstancePtr->Config_TapDelay(BankNum, DeviceId, CardType);
|
||||
DllCtrl &= ~SD1_DLL_RST;
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl);
|
||||
#ifdef XPAR_PSU_SD_0_DEVICE_ID
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* API to reset the DLL
|
||||
*
|
||||
*
|
||||
* @param InstancePtr is a pointer to the XSdPs instance.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
static void XSdPs_DllReset(XSdPs *InstancePtr)
|
||||
{
|
||||
u32 ClockReg, DllCtrl;
|
||||
|
||||
/* Disable clock */
|
||||
ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_CLK_CTRL_OFFSET);
|
||||
ClockReg &= ~XSDPS_CC_SD_CLK_EN_MASK;
|
||||
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_CLK_CTRL_OFFSET, ClockReg);
|
||||
|
||||
/* Issue DLL Reset to load zero tap values */
|
||||
DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL);
|
||||
if (InstancePtr->Config.DeviceId == 0U) {
|
||||
DllCtrl |= SD0_DLL_RST;
|
||||
} else {
|
||||
DllCtrl |= SD1_DLL_RST;
|
||||
}
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl);
|
||||
|
||||
/* Wait for 2 micro seconds */
|
||||
(void)usleep(2U);
|
||||
|
||||
/* Release the DLL out of reset */
|
||||
DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL);
|
||||
if (InstancePtr->Config.DeviceId == 0U) {
|
||||
DllCtrl &= ~SD0_DLL_RST;
|
||||
} else {
|
||||
DllCtrl &= ~SD1_DLL_RST;
|
||||
}
|
||||
XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl);
|
||||
|
||||
/* Wait for internal clock to stabilize */
|
||||
ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_CLK_CTRL_OFFSET);
|
||||
while((ClockReg & XSDPS_CC_INT_CLK_STABLE_MASK) == 0U) {
|
||||
ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_CLK_CTRL_OFFSET);
|
||||
}
|
||||
|
||||
/* Enable SD clock */
|
||||
ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_CLK_CTRL_OFFSET);
|
||||
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
|
||||
XSDPS_CLK_CTRL_OFFSET,
|
||||
ClockReg | XSDPS_CC_SD_CLK_EN_MASK);
|
||||
}
|
||||
#endif
|
||||
/** @} */
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
|
@ -1,240 +0,0 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2014 - 2015 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* Use of the Software is limited solely to applications:
|
||||
* (a) running on a Xilinx device, or
|
||||
* (b) that interact with a Xilinx device through a bus or interconnect.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the Xilinx shall not be used
|
||||
* in advertising or otherwise to promote the sale, use or other dealings in
|
||||
* this Software without prior written authorization from Xilinx.
|
||||
*
|
||||
******************************************************************************/
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* @file xil_io.h
|
||||
*
|
||||
* This file contains the interface for the general IO component, which
|
||||
* encapsulates the Input/Output functions for processors that do not
|
||||
* require any special I/O handling.
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* MODIFICATION HISTORY:
|
||||
*
|
||||
* Ver Who Date Changes
|
||||
* ----- -------- -------- -----------------------------------------------
|
||||
* 5.00 pkp 05/29/14 First release
|
||||
* </pre>
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef XIL_IO_H /* prevent circular inclusions */
|
||||
#define XIL_IO_H /* by using protection macros */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************** Include Files *********************************/
|
||||
|
||||
#include "xil_types.h"
|
||||
#include "xpseudo_asm.h"
|
||||
#include "xil_printf.h"
|
||||
|
||||
/************************** Constant Definitions *****************************/
|
||||
|
||||
/**************************** Type Definitions *******************************/
|
||||
|
||||
/***************** Macros (Inline Functions) Definitions *********************/
|
||||
|
||||
# define SYNCHRONIZE_IO dmb()
|
||||
# define INST_SYNC isb()
|
||||
# define DATA_SYNC dsb()
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Perform an big-endian input operation for a 16-bit memory location
|
||||
* by reading from the specified address and returning the Value read from
|
||||
* that address.
|
||||
*
|
||||
* @param Addr contains the address to perform the input operation at.
|
||||
*
|
||||
* @return The Value read from the specified input address with the
|
||||
* proper endianness. The return Value has the same endianness
|
||||
* as that of the processor, i.e. if the processor is
|
||||
* little-engian, the return Value is the byte-swapped Value read
|
||||
* from the address.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_In16LE(Addr) Xil_In16((Addr))
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Perform a big-endian input operation for a 32-bit memory location
|
||||
* by reading from the specified address and returning the Value read from
|
||||
* that address.
|
||||
*
|
||||
* @param Addr contains the address to perform the input operation at.
|
||||
*
|
||||
* @return The Value read from the specified input address with the
|
||||
* proper endianness. The return Value has the same endianness
|
||||
* as that of the processor, i.e. if the processor is
|
||||
* little-engian, the return Value is the byte-swapped Value read
|
||||
* from the address.
|
||||
*
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_In32LE(Addr) Xil_In32((Addr))
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Perform a big-endian output operation for a 16-bit memory location
|
||||
* by writing the specified Value to the specified address.
|
||||
*
|
||||
* @param Addr contains the address to perform the output operation at.
|
||||
* @param Value contains the Value to be output at the specified address.
|
||||
* The Value has the same endianness as that of the processor.
|
||||
* If the processor is little-endian, the byte-swapped Value is
|
||||
* written to the address.
|
||||
*
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_Out16LE(Addr, Value) Xil_Out16((Addr), (Value))
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Perform a big-endian output operation for a 32-bit memory location
|
||||
* by writing the specified Value to the specified address.
|
||||
*
|
||||
* @param Addr contains the address to perform the output operation at.
|
||||
* @param Value contains the Value to be output at the specified address.
|
||||
* The Value has the same endianness as that of the processor.
|
||||
* If the processor is little-endian, the byte-swapped Value is
|
||||
* written to the address.
|
||||
*
|
||||
* @return None
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_Out32LE(Addr, Value) Xil_Out32((Addr), (Value))
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Convert a 32-bit number from host byte order to network byte order.
|
||||
*
|
||||
* @param Data the 32-bit number to be converted.
|
||||
*
|
||||
* @return The converted 32-bit number in network byte order.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_Htonl(Data) Xil_EndianSwap32((Data))
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Convert a 16-bit number from host byte order to network byte order.
|
||||
*
|
||||
* @param Data the 16-bit number to be converted.
|
||||
*
|
||||
* @return The converted 16-bit number in network byte order.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_Htons(Data) Xil_EndianSwap16((Data))
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Convert a 32-bit number from network byte order to host byte order.
|
||||
*
|
||||
* @param Data the 32-bit number to be converted.
|
||||
*
|
||||
* @return The converted 32-bit number in host byte order.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_Ntohl(Data) Xil_EndianSwap32((Data))
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
*
|
||||
* Convert a 16-bit number from network byte order to host byte order.
|
||||
*
|
||||
* @param Data the 16-bit number to be converted.
|
||||
*
|
||||
* @return The converted 16-bit number in host byte order.
|
||||
*
|
||||
* @note None.
|
||||
*
|
||||
******************************************************************************/
|
||||
#define Xil_Ntohs(Data) Xil_EndianSwap16((Data))
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
|
||||
/* The following functions allow the software to be transportable across
|
||||
* processors which may use memory mapped I/O or I/O which is mapped into a
|
||||
* seperate address space.
|
||||
*/
|
||||
u8 Xil_In8(INTPTR Addr);
|
||||
u16 Xil_In16(INTPTR Addr);
|
||||
u32 Xil_In32(INTPTR Addr);
|
||||
u64 Xil_In64(INTPTR Addr);
|
||||
|
||||
void Xil_Out8(INTPTR Addr, u8 Value);
|
||||
void Xil_Out16(INTPTR Addr, u16 Value);
|
||||
void Xil_Out32(INTPTR Addr, u32 Value);
|
||||
void Xil_Out64(INTPTR Addr, u64 Value);
|
||||
|
||||
|
||||
u16 Xil_In16BE(INTPTR Addr);
|
||||
u32 Xil_In32BE(INTPTR Addr);
|
||||
void Xil_Out16BE(INTPTR Addr, u16 Value);
|
||||
void Xil_Out32BE(INTPTR Addr, u32 Value);
|
||||
|
||||
u16 Xil_EndianSwap16(u16 Data);
|
||||
u32 Xil_EndianSwap32(u32 Data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* end of protection macro */
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2014 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -38,8 +38,7 @@
|
|||
__attribute__((weak)) void _exit (sint32 status)
|
||||
{
|
||||
(void)status;
|
||||
while (1)
|
||||
{
|
||||
__asm__("wfi");
|
||||
while (1) {
|
||||
;
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright (C) 2014 - 2015 Xilinx, Inc. All rights reserved.
|
||||
* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -29,7 +29,7 @@
|
|||
* this Software without prior written authorization from Xilinx.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef UNDEFINE_FILE_OPS
|
||||
#include <errno.h>
|
||||
#include "xil_types.h"
|
||||
|
||||
|
@ -51,3 +51,4 @@ __attribute__((weak)) s32 _open(const char8 *buf, s32 flags, s32 mode)
|
|||
errno = EIO;
|
||||
return (-1);
|
||||
}
|
||||
#endif
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue