 |
思澈科技软件开发工具包
2.20
|
|
MPI HAL 提供用于访问 MPI 外设寄存器的基本 API,它用作 PRO 上的FLASH/PSRAM控制器。 有 2 级 HAL 接口,bf0_hal_mpi 和 bf0_hal_mpi_ex。
Hal_mpi 用于访问硬件寄存器的接口,只包含很少的逻辑,对于 XIP 模式,这个文件应该放在 RAM 中。 Hal_mpi_ex 用于基本 NAND/NOR/PSRAM 功能包装器,包括初始化/页面读取/页面写入/扇区擦除和一些其他功能。
主要功能包括:
- 最多支持 5 个实例(其中MPI5可挂载到LCPU)。
- 可支持NAND/NOR/PSRAM。
- DMA 支持。
- 通过寄存器命令表支持多芯片。
内存地址映射:
- MPI1: C-BUS from 0x10000000 to 0x11FFFFFF(total 32MB). S-BUS: from 0x60000000 to 0x61FFFFFF(total 32MB)
- MPI2: C-BUS from 0x12000000 to 0x13FFFFFF(total 32MB). S-BUS: from 0x62000000 to 0x63FFFFFF(total 32MB).
- MPI3: C-BUS from 0x14000000 to 0x17FFFFFF(total 64MB). S-BUS: from 0x64000000 to 0x67FFFFFF(total 64MB)
- MPI4: C-BUS from 0x18000000 to 0x1BFFFFFF(total 64MB). S-BUS: from 0x68000000 to 0x9FFFFFFF(total 896MB)
- MPI5: C-BUS from 0x1C000000 to 0x1FFFFFFF(total 64MB).
使用 MPI HAL 驱动程序
MPI 可用于控制 NOR-FLASH、NAND-FLASH、8-LINE PSRAM、16-LINE PSRAM。 以下是 NOR-FLASH 的示例:
spi_flash_register_cmd();
flash_cfg.
base = MPI1_MEM_BASE;
flash_dma.
dma_rcc = FLASH1_DMA_RCC;
flash_dma.
Instance = FLASH1_DMA_INSTANCE;
flash_dma.
dma_irq = FLASH1_DMA_IRQ;
flash_dma.
request = FLASH1_DMA_REQUEST;
res =
HAL_FLASH_Init(&(spi_flash_handle[0]), &flash_cfg, &spi_flash_dma_handle[0], &flash_dma, BSP_GetFlash1DIV());
return error;
if (res < 0)
return error;
if (res != size)
return error;
res = nor_read_rom(hflash, addr, buf, size);
...
以下是 NAND-FLASH 的示例:
spi_flash_register_cmd();
flash_cfg.
base = MPI4_MEM_BASE;
flash_dma.
dma_rcc = FLASH4_DMA_RCC;
flash_dma.
Instance = FLASH4_DMA_INSTANCE;
flash_dma.
dma_irq = FLASH4_DMA_IRQ;
flash_dma.
request = FLASH4_DMA_REQUEST;
res =
HAL_FLASH_Init(&(spi_flash_handle[3]), &flash_cfg, &spi_flash_dma_handle[1], &flash_dma, BSP_GetFlash2DIV());
return error;
if (res < 0)
return error;
if (res != size)
return error;
...
以下是 OPI PSRAM 的示例:
flash_cfg.
base = MPI2_MEM_BASE;
sys_clk /= 2;
if (sys_clk <= 66 * 1000000)
w_lat = 3;
else if (sys_clk <= 109 * 1000000)
w_lat = 4;
else if (sys_clk <= 133 * 1000000)
w_lat = 5;
else if (sys_clk <= 166 * 1000000)
w_lat = 6;
else if (sys_clk <= 200 * 1000000)
w_lat = 7;
else
RT_ASSERT(0);
if (fix_lat)
r_lat = w_lat * 2;
else
r_lat = w_lat;
int *buf = (int *)MPI2_MEM_BASE;
int i;
for(i=0; i<1000; i++)
buf[i] = i*6543;
int value = *buf;
int *src = (int *)MPI2_MEM_BASE;
int *dst = (int *)(MPI2_MEM_BASE + 0x100000);
memcpy(dst, src, 1000);
...
#define SPI_MODE_NOR
Definition: bf0_hal_mpi_ex.h:149
int HAL_NAND_READ_WITHOOB(FLASH_HandleTypeDef *handle, uint32_t addr, uint8_t *dbuff, uint32_t dlen, uint8_t *oob_buf, uint32_t olen)
Read nand flash with oob.
#define FLASH_MAX_INSTANCE
SPI_FLASHEx configure tyep.
Definition: bf0_hal_mpi_ex.h:78
Definition: bf0_hal_dma.h:73
@ HAL_OK
Definition: bf0_hal_def.h:75
HAL_StatusTypeDef HAL_FLASH_Init(QSPI_FLASH_CTX_T *ctx, qspi_configure_t *cfg, DMA_HandleTypeDef *dma, struct dma_config *dma_cfg, uint16_t clk_div)
Initial QSPI for flash mode.
FLASH_HandleTypeDef handle
Definition: bf0_hal_mpi_ex.h:163
int HAL_NAND_WRITE_WITHOOB(FLASH_HandleTypeDef *handle, uint32_t addr, const uint8_t *buff, uint32_t len, const uint8_t *oob_buf, uint32_t olen)
Write nand with oob, oob not emtpy only when ECC not enable !!!
@ SPI_MODE_OPSRAM
Definition: bf0_hal_mpi.h:254
HAL_StatusTypeDef HAL_FLASH_SET_AHB_RCMD(FLASH_HandleTypeDef *hflash, uint8_t cmd)
SPI_FLASH set ahb read command.
DMA_Channel_TypeDef * Instance
Definition: bf0_hal_dma.h:74
HAL_StatusTypeDef HAL_MPI_SET_FIXLAT(FLASH_HandleTypeDef *hflash, uint32_t fix, uint8_t r_lat, uint8_t w_lat)
Set OPI PSRAM fix latency.
#define SPI_MODE_NAND
Definition: bf0_hal_mpi_ex.h:150
void HAL_FLASH_CFG_AHB_WCMD(FLASH_HandleTypeDef *hflash, int8_t data_mod, int8_t dum_cyc, int8_t ab_size, int8_t ab_mod, int8_t addr_size, int8_t addr_mod, int8_t cmd_mode)
SPI_FLASH config AHB write command.
int HAL_NAND_ERASE_BLK(FLASH_HandleTypeDef *handle, uint32_t addr)
nand erase a block
HAL_StatusTypeDef HAL_MPI_MR_WRITE(FLASH_HandleTypeDef *hflash, uint32_t addr, uint8_t value)
Write OPI PSRAM mode register.
SPI_FLASH initial structure definition.
Definition: bf0_hal_mpi.h:275
SPI_FLASHEx spi flash context.
Definition: bf0_hal_mpi_ex.h:162
HAL_StatusTypeDef HAL_OPI_PSRAM_Init(FLASH_HandleTypeDef *hflash, qspi_configure_t *cfg, uint16_t clk_div)
Initial OPI PSRAM.
HAL_StatusTypeDef HAL_FLASH_SET_AHB_WCMD(FLASH_HandleTypeDef *hflash, uint8_t cmd)
SPI_FLASH set ahb write command.
int HAL_QSPIEX_WRITE_PAGE(FLASH_HandleTypeDef *hflash, uint32_t addr, const uint8_t *buf, uint32_t size)
nor flash write a page
uint32_t HAL_QSPI_GET_CLK(FLASH_HandleTypeDef *fhandle)
get qspi clock divider
uint32_t dma_rcc
Definition: bf0_hal_dma.h:75
int HAL_QSPIEX_SECT_ERASE(FLASH_HandleTypeDef *hflash, uint32_t addr)
nor flash sector erase
uint32_t request
Definition: bf0_hal_dma.h:77
void HAL_FLASH_CFG_AHB_RCMD(FLASH_HandleTypeDef *hflash, int8_t data_mod, int8_t dum_cyc, int8_t ab_size, int8_t ab_mod, int8_t addr_size, int8_t addr_mod, int8_t cmd_mode)
SPI_FLASH configure AHB read command.
IRQn_Type dma_irq
Definition: bf0_hal_dma.h:76