zephyr/drivers/memc/memc_mcux_flexspi.h

109 lines
3.3 KiB
C

/*
* Copyright 2020,2023 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/device.h>
#include <sys/types.h>
#include <fsl_flexspi.h>
enum memc_flexspi_clock_t {
/* Flexspi clock 332M, DDR mode, internal clock 166M. */
MEMC_FLEXSPI_CLOCK_166M,
/* Flexspi clock 83M, DDR mode, internal clock 42M. */
MEMC_FLEXSPI_CLOCK_42M,
};
/* Size of a command in the LUT table */
#define MEMC_FLEXSPI_CMD_SIZE 4U
/**
* @brief Wait for the FlexSPI bus to be idle
*
* Waits for the FlexSPI bus to be idle. Can be used when reconfiguring
* the FlexSPI to make sure no flash access is occurring before changing
* settings.
*
* @param dev: FlexSPI device
*/
void memc_flexspi_wait_bus_idle(const struct device *dev);
/**
* @brief Check if FlexSPI is being used in XIP mode.
*
* Checks if the FlexSPI is being used for code execution in the current
* application.
*
* @param dev: FlexSPI device
* @retval true if FlexSPI being used for XIP
*/
bool memc_flexspi_is_running_xip(const struct device *dev);
/**
* @brief Update clock selection of the FlexSPI device
*
* Updates clock selection of the FlexSPI device to a new clock speed.
*
* @param dev: FlexSPI device
* @param device_config: External device configuration.
* @param port: FlexSPI port to use for this external device
* @param clock: new clock selection to apply
* @return 0 on success, negative value on failure
*/
int memc_flexspi_update_clock(const struct device *dev,
flexspi_device_config_t *device_config,
flexspi_port_t port, enum memc_flexspi_clock_t clock);
/**
* @brief configure new FlexSPI device
*
* Configures new device on the FlexSPI bus.
* @param dev: FlexSPI device
* @param device_config: External device configuration.
* @param lut_array: Lookup table of FlexSPI flash commands for device
* @param lut_count: number of command entries (16 bytes each) in LUT
* @param port: FlexSPI port to use for this external device
* @return 0 on success, negative value on failure
*/
int memc_flexspi_set_device_config(const struct device *dev,
const flexspi_device_config_t *device_config,
const uint32_t *lut_array,
uint8_t lut_count,
flexspi_port_t port);
/**
* @brief Perform software reset of FlexSPI
*
* Software reset of FlexSPI. Does not clear configuration registers.
* @param dev: FlexSPI device
* @return 0 on success, negative value on failure
*/
int memc_flexspi_reset(const struct device *dev);
/**
* @brief Send blocking IP transfer
*
* Send blocking IP transfer using FlexSPI.
* @param dev: FlexSPI device
* @param transfer: FlexSPI transfer. seqIndex should be set as though the
* LUT array was loaded at offset 0.
* @return 0 on success, negative value on failure
*/
int memc_flexspi_transfer(const struct device *dev,
flexspi_transfer_t *transfer);
/**
* @brief Get AHB address for FlexSPI port
*
* Get AHB address for FlexSPI port. This address is memory mapped, and can be
* read from (and written to, for PSRAM) as though it were internal memory.
* @param dev: FlexSPI device
* @param port: FlexSPI port external device is on
* @param offset: byte offset from start of device to get AHB address for
* @return 0 on success, negative value on failure
*/
void *memc_flexspi_get_ahb_address(const struct device *dev,
flexspi_port_t port, off_t offset);