stm32h7/linum-stm32h753bi: Add support to littlefs and nxffs with flash mem. via quadspi

Signed-off-by: Jorge Guzman <jorge.gzm@gmail.com>
This commit is contained in:
Jorge Guzman 2024-03-06 20:36:58 -03:00 committed by Xiang Xiao
parent 81c8f902b6
commit 5e3cbd1165
11 changed files with 370 additions and 18 deletions

View File

@ -551,4 +551,42 @@ Transmiting a file to PC::
If you don't have a SDCard on your board, you can mount the TMPFS at /tmp and transfer files to it,
but you cannot transfer big files because TMPFS could use the free RAM of your board::
nsh> mount -t tmpfs /tmp
nsh> mount -t tmpfs /tmp
nxffs
-----
This example use the flash memory W25Q128JV via qspi with the nxffs file system::
NuttShell (NSH) NuttX-12.5.1-RC0
nsh> ls
/:
dev/
w25/
nsh> cd /w25
nsh> echo "hello world!" > message.txt
nsh> ls
/w25:
message.txt
nsh> cat message.txt
hello world!
littlefs
--------
This example use the flash memory W25Q128JV via qspi with the littlefs file system::
NuttShell (NSH) NuttX-12.5.1-RC0
nsh> ls
/:
dev/
w25/
nsh> cd /w25
nsh> mkdir folder1
nsh> cd folder1
nsh> echo "hello world!!!!" > message.txt
nsh> cat message.txt
hello world!!!!
nsh> ls
/w25/folder1:
.
..
message.txt

View File

@ -1851,7 +1851,7 @@ static uint32_t qspi_setfrequency(struct qspi_dev_s *dev, uint32_t frequency)
return 0;
}
spiinfo("frequency=%d\n", frequency);
spiinfo("frequency=%" PRId32 "\n", frequency);
DEBUGASSERT(priv);
/* Wait till BUSY flag reset */
@ -1905,14 +1905,14 @@ static uint32_t qspi_setfrequency(struct qspi_dev_s *dev, uint32_t frequency)
/* Calculate the new actual frequency */
actual = QSPI_CLK_FREQUENCY / prescaler;
spiinfo("prescaler=%d actual=%d\n", prescaler, actual);
spiinfo("prescaler=%" PRId32 " actual=%" PRId32 "\n", prescaler, actual);
/* Save the frequency setting */
priv->frequency = frequency;
priv->actual = actual;
spiinfo("Frequency %d->%d\n", frequency, actual);
spiinfo("Frequency %" PRId32 "->%" PRId32 "\n", frequency, actual);
return actual;
}
@ -1983,7 +1983,7 @@ static void qspi_setmode(struct qspi_dev_s *dev, enum qspi_mode_e mode)
}
qspi_putreg(priv, regval, STM32_QUADSPI_DCR_OFFSET);
spiinfo("DCR=%08x\n", regval);
spiinfo("DCR=%08" PRIx32 "\n", regval);
/* Save the mode so that subsequent re-configurations will be faster */

View File

@ -0,0 +1,69 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_NSH_DISABLE_IFCONFIG is not set
# CONFIG_NSH_DISABLE_PS is not set
# CONFIG_NSH_QUOTE is not set
# CONFIG_STANDARD_SERIAL is not set
# CONFIG_STM32H7_USE_LEGACY_PINMAP is not set
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="linum-stm32h753bi"
CONFIG_ARCH_BOARD_LINUM_STM32H753BI=y
CONFIG_ARCH_CHIP="stm32h7"
CONFIG_ARCH_CHIP_STM32H753BI=y
CONFIG_ARCH_CHIP_STM32H7=y
CONFIG_ARCH_CHIP_STM32H7_CORTEXM7=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARMV7M_DCACHE=y
CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
CONFIG_ARMV7M_DTCM=y
CONFIG_ARMV7M_ICACHE=y
CONFIG_BOARD_LOOPSPERMSEC=43103
CONFIG_BUILTIN=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEFAULT_TASK_STACKSIZE=4096
CONFIG_EXAMPLES_ALARM=y
CONFIG_EXAMPLES_ALARM_STACKSIZE=2048
CONFIG_FS_LITTLEFS=y
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBM=y
CONFIG_MM_DEFAULT_ALIGNMENT=4
CONFIG_MM_REGIONS=4
CONFIG_MTD=y
CONFIG_MTD_W25QXXXJV=y
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_LINELEN=64
CONFIG_NSH_READLINE=y
CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=2048
CONFIG_PREALLOC_TIMERS=4
CONFIG_PTHREAD_STACK_DEFAULT=2048
CONFIG_RAMMTD=y
CONFIG_RAM_SIZE=245760
CONFIG_RAM_START=0x20010000
CONFIG_RAW_BINARY=y
CONFIG_RR_INTERVAL=200
CONFIG_RTC_ALARM=y
CONFIG_RTC_DATETIME=y
CONFIG_RTC_DRIVER=y
CONFIG_SCHED_WAITPID=y
CONFIG_SPI=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
CONFIG_STM32H7_PWR=y
CONFIG_STM32H7_QSPI_INTERRUPTS=y
CONFIG_STM32H7_QUADSPI=y
CONFIG_STM32H7_RTC=y
CONFIG_STM32H7_USART1=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_STACKSIZE=2048
CONFIG_TASK_NAME_SIZE=0
CONFIG_USART1_SERIAL_CONSOLE=y
CONFIG_W25QXXXJV_QSPI_FREQUENCY=50000000

View File

@ -0,0 +1,66 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_NSH_DISABLE_IFCONFIG is not set
# CONFIG_NSH_DISABLE_PS is not set
# CONFIG_NSH_QUOTE is not set
# CONFIG_STANDARD_SERIAL is not set
# CONFIG_STM32H7_USE_LEGACY_PINMAP is not set
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="linum-stm32h753bi"
CONFIG_ARCH_BOARD_LINUM_STM32H753BI=y
CONFIG_ARCH_CHIP="stm32h7"
CONFIG_ARCH_CHIP_STM32H753BI=y
CONFIG_ARCH_CHIP_STM32H7=y
CONFIG_ARCH_CHIP_STM32H7_CORTEXM7=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARMV7M_DCACHE=y
CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
CONFIG_ARMV7M_DTCM=y
CONFIG_ARMV7M_ICACHE=y
CONFIG_BOARD_LOOPSPERMSEC=43103
CONFIG_BUILTIN=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_EXAMPLES_ALARM=y
CONFIG_FS_NXFFS=y
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INTELHEX_BINARY=y
CONFIG_LIBM=y
CONFIG_MM_DEFAULT_ALIGNMENT=4
CONFIG_MM_REGIONS=4
CONFIG_MTD=y
CONFIG_MTD_W25QXXXJV=y
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_LINELEN=64
CONFIG_NSH_READLINE=y
CONFIG_PREALLOC_TIMERS=4
CONFIG_RAMMTD=y
CONFIG_RAM_SIZE=245760
CONFIG_RAM_START=0x20010000
CONFIG_RAW_BINARY=y
CONFIG_RR_INTERVAL=200
CONFIG_RTC_ALARM=y
CONFIG_RTC_DATETIME=y
CONFIG_RTC_DRIVER=y
CONFIG_SCHED_WAITPID=y
CONFIG_SPI=y
CONFIG_START_DAY=6
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2011
CONFIG_STM32H7_PWR=y
CONFIG_STM32H7_QSPI_INTERRUPTS=y
CONFIG_STM32H7_QUADSPI=y
CONFIG_STM32H7_RTC=y
CONFIG_STM32H7_USART1=y
CONFIG_SYSTEM_NSH=y
CONFIG_TASK_NAME_SIZE=0
CONFIG_TESTING_NXFFS=y
CONFIG_TESTING_NXFFS_MOUNTPT="/mnt"
CONFIG_USART1_SERIAL_CONSOLE=y
CONFIG_W25QXXXJV_QSPI_FREQUENCY=50000000

View File

@ -379,8 +379,8 @@
/* OTGFS */
#define GPIO_OTGFS_DM (GPIO_OTGFS_DM_0 | GPIO_SPEED_100MHz)
#define GPIO_OTGFS_DP (GPIO_OTGFS_DP_0 | GPIO_SPEED_100MHz)
#define GPIO_OTGFS_DM (GPIO_OTGFS_DM_0 | GPIO_SPEED_100MHz) /* PA11 */
#define GPIO_OTGFS_DP (GPIO_OTGFS_DP_0 | GPIO_SPEED_100MHz) /* PA12 */
/* SDMMC1 - Used SD Card memory */
@ -411,6 +411,18 @@
#define GPIO_CAN2_RX (GPIO_CAN2_RX_2|GPIO_SPEED_50MHz) /* PB5 - D11 */
#define GPIO_CAN2_TX (GPIO_CAN2_TX_2|GPIO_SPEED_50MHz) /* PB6 - D1 */
/* QSPI Mapping */
#define GPIO_QSPI_CS (GPIO_QUADSPI_BK1_NCS_2 | GPIO_FLOAT | GPIO_PUSHPULL | GPIO_SPEED_100MHz) /* PG6 */
#define GPIO_QSPI_IO0 (GPIO_QUADSPI_BK1_IO0_1 | GPIO_FLOAT | GPIO_PUSHPULL | GPIO_SPEED_100MHz) /* PF8 */
#define GPIO_QSPI_IO1 (GPIO_QUADSPI_BK1_IO1_1 | GPIO_FLOAT | GPIO_PUSHPULL | GPIO_SPEED_100MHz) /* PF9 */
#define GPIO_QSPI_IO2 (GPIO_QUADSPI_BK1_IO2_2 | GPIO_FLOAT | GPIO_PUSHPULL | GPIO_SPEED_100MHz) /* PF7 */
#define GPIO_QSPI_IO3 (GPIO_QUADSPI_BK1_IO3_3 | GPIO_FLOAT | GPIO_PUSHPULL | GPIO_SPEED_100MHz) /* PF6 */
#define GPIO_QSPI_SCK (GPIO_QUADSPI_CLK_2 | GPIO_FLOAT | GPIO_PUSHPULL | GPIO_SPEED_100MHz) /* PF10 */
/* Select PLL2R to source clock of QSPI */
#define BOARD_QSPI_CLK RCC_D1CCIPR_QSPISEL_PLL2
/****************************************************************************
* Public Data
****************************************************************************/

View File

@ -52,6 +52,10 @@ if(CONFIG_PWM)
list(APPEND SRCS stm32_pwm.c)
endif()
if(CONFIG_MTD_W25QXXXJV)
list(APPEND SRCS stm32_w25q.c)
endif()
target_sources(board PRIVATE ${SRCS})
set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/flash.ld")

View File

@ -24,10 +24,10 @@ CSRCS = stm32_boot.c stm32_bringup.c
ifeq ($(CONFIG_ARCH_LEDS),y)
CSRCS += stm32_autoleds.c
endif
ifeq ($(CONFIG_USERLED),y)
CSRCS += stm32_userleds.c
else
ifeq ($(CONFIG_USERLED),y)
CSRCS += stm32_userleds.c
endif
endif
ifeq ($(CONFIG_STM32H7_OTGFS),y)
@ -50,6 +50,10 @@ ifeq ($(CONFIG_PWM),y)
CSRCS += stm32_pwm.c
endif
ifeq ($(CONFIG_MTD_W25QXXXJV),y)
CSRCS += stm32_w25q.c
endif
ifeq ($(CONFIG_BOARDCTL),y)
CSRCS += stm32_appinitialize.c
endif

View File

@ -141,7 +141,7 @@ void weak_function stm32_usbinitialize(void);
* Name: stm32_dma_alloc_init
*
* Description:
* Called to create a FAT DMA allocator
* Called to create a FAT DMA allocator.
*
* Returned Value:
* 0 on success or -ENOMEM
@ -156,7 +156,7 @@ int stm32_dma_alloc_init(void);
* Name: stm32_sdio_initialize
*
* Description:
* Initialize SDIO-based MMC/SD card support
* Initialize SDIO-based MMC/SD card support.
*
****************************************************************************/
@ -168,7 +168,7 @@ int stm32_sdio_initialize(void);
* Name: stm32_at24_init
*
* Description:
* Initialize and register the EEPROM for 24XX driver.
* Initialize and register the EEPROM for 24XX driver.
*
****************************************************************************/
@ -187,5 +187,16 @@ int stm32_at24_init(char *path);
#ifdef CONFIG_PWM
int stm32_pwm_setup(void);
#endif
/****************************************************************************
* Name: stm32_n25qxxx_setup
*
* Description:
* Initialize and register the FLash for N25QXXX driver.
*
****************************************************************************/
#ifdef CONFIG_MTD_W25QXXXJV
int stm32_w25qxxx_setup(void);
#endif
#endif /* __BOARDS_ARM_STM32H7_LINUM_STM32H753BI_SRC_LINUM_STM32H753BI_H */

View File

@ -232,6 +232,14 @@ int stm32_bringup(void)
stm32_fdcansockinitialize(1);
# endif
#endif
#ifdef CONFIG_MTD_W25QXXXJV
ret = stm32_w25qxxx_setup();
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: stm32_n25qxxx_setup failed: %d\n", ret);
}
#endif
return OK;

View File

@ -0,0 +1,138 @@
/****************************************************************************
* boards/arm/stm32h7/linum-stm32h753bi/src/stm32_w25q.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/types.h>
#include <stdio.h>
#include <syslog.h>
#include <errno.h>
#include <debug.h>
#include <string.h>
#include <stdlib.h>
#include <nuttx/arch.h>
#include <nuttx/board.h>
#include <nuttx/fs/fs.h>
#include <arch/board/board.h>
#include <nuttx/mtd/mtd.h>
#include <nuttx/drivers/drivers.h>
#include <nuttx/drivers/ramdisk.h>
#ifdef CONFIG_FS_NXFFS
#include <nuttx/fs/nxffs.h>
#endif
#ifdef CONFIG_FS_SMARTFS
#include <nuttx/fs/smart.h>
#endif
#include "linum-stm32h753bi.h"
#include "stm32_qspi.h"
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: stm32_w25qxxx_setup
*
* Description:
* This function is called by board-bringup logic to configure the
* flash device.
*
* Returned Value:
* Zero is returned on success. Otherwise, a negated errno value is
* returned to indicate the nature of the failure.
*
****************************************************************************/
int stm32_w25qxxx_setup(void)
{
struct qspi_dev_s *qspi_dev;
struct mtd_dev_s *mtd_dev;
int ret = -1;
qspi_dev = stm32h7_qspi_initialize(0);
if (!qspi_dev)
{
_err("ERROR: Failed to initialize W25 minor %d: %d\n",
0, ret);
return -1;
}
mtd_dev = w25qxxxjv_initialize(qspi_dev, true);
if (!mtd_dev)
{
_err("ERROR: w25qxxxjv_initialize() failed!\n");
return -1;
}
#if defined(CONFIG_FS_NXFFS) && !defined(CONFIG_FS_LITTLEFS)
/* Initialize to provide NXFFS on the W25QXXX MTD interface */
ret = nxffs_initialize(mtd_dev);
if (ret < 0)
{
_err("ERROR: NXFFS initialization failed: %d\n", ret);
return ret;
}
ret = nx_mount(NULL, "/w25", "nxffs", 0, "autoformat");
if (ret < 0)
{
_err("ERROR: Failed to mount the NXFFS volume: %d\n", ret);
return ret;
}
#endif
#if !defined(CONFIG_FS_NXFFS) && defined(CONFIG_FS_LITTLEFS)
/* Register the MTD driver so that it can be accessed from the
* VFS.
*/
ret = register_mtddriver("/dev/w25", mtd_dev, 0755, NULL);
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: Failed to register MTD driver: %d\n",
ret);
}
/* Mount the LittleFS file system */
ret = nx_mount("/dev/w25", "/w25", "littlefs", 0, "autoformat");
if (ret < 0)
{
syslog(LOG_ERR,
"ERROR: Failed to mount LittleFS at /w25: %d\n",
ret);
}
#endif
return 0;
}

View File

@ -61,7 +61,7 @@ struct nxffs_blkinfo_s
#if defined(CONFIG_DEBUG_FEATURES) && defined(CONFIG_DEBUG_FS)
static const char g_hdrformat[] = " BLOCK:OFFS TYPE STATE LENGTH\n";
static const char g_format[] = " %5d:%-5d %s %s %5d\n";
static const char g_format[] = " %5"PRIi32":%-5d %s %s %5"PRIu32"\n";
#endif
/****************************************************************************
@ -263,7 +263,8 @@ static inline ssize_t nxffs_analyzedata(FAR struct nxffs_blkinfo_s *blkinfo,
if (crc != ecrc)
{
syslog(LOG_NOTICE, g_format,
blkinfo->block, offset, "DATA ", "CRC BAD", datlen);
blkinfo->block, offset, "DATA ", "CRC BAD",
(long unsigned int)datlen);
return ERROR;
}
@ -272,7 +273,8 @@ static inline ssize_t nxffs_analyzedata(FAR struct nxffs_blkinfo_s *blkinfo,
if (blkinfo->verbose)
{
syslog(LOG_NOTICE, g_format,
blkinfo->block, offset, "DATA ", "OK ", datlen);
blkinfo->block, offset, "DATA ", "OK ",
(long unsigned int)datlen);
}
return SIZEOF_NXFFS_DATA_HDR + datlen;
@ -489,7 +491,7 @@ int nxffs_dump(FAR struct mtd_dev_s *mtd, bool verbose)
}
}
syslog(LOG_NOTICE, "%d blocks analyzed\n", blkinfo.nblocks);
syslog(LOG_NOTICE, "%" PRIi32 " blocks analyzed\n", blkinfo.nblocks);
kmm_free(blkinfo.buffer);
return OK;