mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-02 02:46:44 +08:00
bsp/atsam: Support QSPI flash
This commit is contained in:
committed by
Sebastian Huber
parent
15f0f9b448
commit
033443c869
@@ -18,6 +18,7 @@ project_lib_DATA += startup/linkcmds
|
||||
project_lib_DATA += startup/linkcmds.memory
|
||||
project_lib_DATA += startup/linkcmds.intsram
|
||||
project_lib_DATA += startup/linkcmds.sdram
|
||||
project_lib_DATA += startup/linkcmds.qspiflash
|
||||
|
||||
###############################################################################
|
||||
# Header #
|
||||
|
||||
@@ -41,6 +41,9 @@ Use ATSAM_MEMORY_INTSRAM_SIZE=XYZ to set the size of internal SRAM in bytes
|
||||
Use ATSAM_MEMORY_SDRAM_SIZE=XYZ to set the size of external SDRAM in bytes
|
||||
(default 0x00200000).
|
||||
|
||||
Use ATSAM_MEMORY_QSPIFLASH_SIZE=XYZ to set the size of QSPI flash in bytes
|
||||
(default 0x00200000).
|
||||
|
||||
The pins may be configured by the application at link-time. See
|
||||
<bsp/pin-config.h>.
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ ATSAM_LINKCMD([ATSAM_MEMORY_TCM_SIZE],[size of tightly coupled memories (TCM) in
|
||||
ATSAM_LINKCMD([ATSAM_MEMORY_INTFLASH_SIZE],[size of internal flash in bytes],[${INTFLASH}])
|
||||
ATSAM_LINKCMD([ATSAM_MEMORY_INTSRAM_SIZE],[size of internal SRAM in bytes],[${INTSRAM}])
|
||||
ATSAM_LINKCMD([ATSAM_MEMORY_SDRAM_SIZE],[size of external SDRAM in bytes],[0x00200000])
|
||||
ATSAM_LINKCMD([ATSAM_MEMORY_QSPIFLASH_SIZE],[size of QSPI flash in bytes],[0x00200000])
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
|
||||
@@ -211,6 +211,35 @@ __STATIC_INLINE void QSPI_ScrambleData(Qspi *pQspi, uint32_t wKey,
|
||||
pQspi->QSPI_SMR = (EnableFlag | (Random << 1));
|
||||
}
|
||||
|
||||
static void do_copy(uint8_t *dst, const uint8_t *src, size_t n, bool aligned)
|
||||
{
|
||||
if (aligned) {
|
||||
while (n > 3) {
|
||||
*(uint32_t *)dst = *(uint32_t *)src;
|
||||
dst += 4;
|
||||
src += 4;
|
||||
n -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
while (n > 0) {
|
||||
*dst = *src;
|
||||
++dst;
|
||||
++src;
|
||||
--n;
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_to_io(void *dst, const void *src, size_t n)
|
||||
{
|
||||
do_copy(dst, src, n, ((uintptr_t)dst) % 4 == 0);
|
||||
}
|
||||
|
||||
static void copy_from_io(void *dst, const void *src, size_t n)
|
||||
{
|
||||
do_copy(dst, src, n, ((uintptr_t)src) % 4 == 0);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
@@ -721,11 +750,11 @@ QspidStatus_t QSPI_ReadWriteMem(Qspid_t *pQspid, Access_t const ReadWrite)
|
||||
assert(((ReadWrite > CmdAccess)
|
||||
&& (ReadWrite <= WriteAccess)) ? true : false);
|
||||
|
||||
if (ReadWrite == WriteAccess)
|
||||
memcpy(pQspiMem, pBuffer.pDataTx , pBuffer.TxDataSize);
|
||||
else
|
||||
memcpy(pBuffer.pDataRx, pQspiMem, pBuffer.RxDataSize);
|
||||
|
||||
if (ReadWrite == WriteAccess) {
|
||||
copy_to_io(pQspiMem, pBuffer.pDataTx , pBuffer.TxDataSize);
|
||||
} else {
|
||||
copy_from_io(pBuffer.pDataRx, pQspiMem, pBuffer.RxDataSize);
|
||||
}
|
||||
memory_sync();
|
||||
QSPI_EndTransfer(pQspid->pQspiHw);
|
||||
|
||||
|
||||
@@ -52,6 +52,10 @@ $(PROJECT_LIB)/linkcmds.sdram: startup/linkcmds.sdram $(PROJECT_LIB)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.sdram
|
||||
TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds.sdram
|
||||
|
||||
$(PROJECT_LIB)/linkcmds.qspiflash: startup/linkcmds.qspiflash $(PROJECT_LIB)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.qspiflash
|
||||
TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds.qspiflash
|
||||
|
||||
$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
|
||||
|
||||
@@ -5,4 +5,5 @@ MEMORY {
|
||||
INTSRAM : ORIGIN = 0x20400000, LENGTH = @ATSAM_MEMORY_INTSRAM_SIZE@ - 2 * @ATSAM_MEMORY_TCM_SIZE@ - 4K
|
||||
NOCACHE : ORIGIN = 0x20400000 + @ATSAM_MEMORY_INTSRAM_SIZE@ - 2 * @ATSAM_MEMORY_TCM_SIZE@ - 4K, LENGTH = 4K
|
||||
SDRAM : ORIGIN = 0x70000000, LENGTH = @ATSAM_MEMORY_SDRAM_SIZE@
|
||||
QSPIFLASH : ORIGIN = 0x80000000, LENGTH = @ATSAM_MEMORY_QSPIFLASH_SIZE@
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
INCLUDE linkcmds.memory
|
||||
|
||||
REGION_ALIAS ("REGION_START", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_VECTOR", INTSRAM);
|
||||
REGION_ALIAS ("REGION_TEXT", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_TEXT_LOAD", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_RODATA", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_RODATA_LOAD", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_DATA", INTSRAM);
|
||||
REGION_ALIAS ("REGION_DATA_LOAD", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_FAST_TEXT", ITCM);
|
||||
REGION_ALIAS ("REGION_FAST_TEXT_LOAD", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_FAST_DATA", DTCM);
|
||||
REGION_ALIAS ("REGION_FAST_DATA_LOAD", QSPIFLASH);
|
||||
REGION_ALIAS ("REGION_BSS", INTSRAM);
|
||||
REGION_ALIAS ("REGION_WORK", INTSRAM);
|
||||
REGION_ALIAS ("REGION_STACK", INTSRAM);
|
||||
REGION_ALIAS ("REGION_NOCACHE", NOCACHE);
|
||||
REGION_ALIAS ("REGION_NOCACHE_LOAD", QSPIFLASH);
|
||||
|
||||
INCLUDE linkcmds.armv7m
|
||||
Reference in New Issue
Block a user