STM32F4Discoveryと異なり、F4VBBにはSPI接続のW25Q16 Nor Flashが載っています。この接続はSPI1で接続しているのですが、接続は、PA5,PA6,PA7ではなく、PB3,PB4,PB5で接続されていて、CSはPB0で接続されていますので、STM32F4discoveryのコードそのままでは動きません。
また、ソースコードをみたところ、W25Qの初期化コードもF4Discoveryのコードには入っておらず、これもソースコードを修正しなければいけません。そこでnuttxでのデバイス初期化について、ネットで調べたところ、https://groups.google.com/g/nuttx/c/y0x8ud02rxA によると、CSピンの初期化は以下の様にするとありました。
stm32_gpiowrite(GPIO_DEVICE_CS_PIN, !selected);また、SPIデバイスの初期化は、https://cwiki.apache.org/confluence/display/NUTTX/Using+SmartFS に、例えば、
int board_app_initialize(uintptr_t arg)
{
FAR struct spi_dev_s *spi;
FAR struct mtd_dev_s *mtd;
int minor = 0;
/* Initialize the SPI bus #3 with an M25P FLASH driver */
spi = stm32_spibus_initialize(3);
mtd = m25p_initialize(spi);
/* Initialize SMART MTD to work with M25P FLASH device */
smart_initialize(minor, mtd, NULL);
}
の様にすると記述がありました。そこで、ソースコードを見てみると、board_app_initializeは、stm32_bringup.cの
int stm32_bringup(void) に該当することがわかりました。これでとりあえず足掛かりはできたので、早速コードを修正して動作させたところ、とりあえず動いているようです。なお、fatfsだけを使うようにしています。
1. 前回のconfigurationの保存と再利用
前回までのコンフィグレーションは、nuttx-9.1.0/.configにあるので、まずは、これを例えば、boards/arm/stm32/stm32f4discovery/configs/nsh_mmcsd以下に保存しておきます。
cd /usr/src/nuttx-9.1.0 mkdir boards/arm/stm32/stm32f4discovery/configs/nsh_mmcsd cp -a .config boards/arm/stm32/stm32f4discovery/configs/nsh_mmcsd/defconfigこうすることで、distcleanしても、
tools/configure.sh stm32f4discovery/nsh_mmcsdで、設定を再利用できます。(無論、.configファイルを別名で保存して、それをmake menuconfigでロードする方法もあります。) 2. w25 configurationの追加 1の設定を再適用した後、w25の設定をconfigurationに追加します。
Device Drivers [*] Memory Technology Device (MTD) Support ---> [*] SPI-based W25 FLASH (0) W25 SPI Mode (NEW) (20000000) W25 SPI Frequency (NEW) [ ] W25 Read-Only FLASH (NEW) [*] Simulate 512 byte Erase Blocks (NEW)追加のconfiguration が済んだら、ひとまず .config にsaveしておいてください。 3. コードの修正と追加 修正箇所は、patchファイル形式だと以下の様になります。 boards/arm/stm32/stm32f4discovery/include/board.h
--- boards/arm/stm32/stm32f4discovery/include/board.h.orig 2020-09-21 00:09:41.194273021 +0900 +++ boards/arm/stm32/stm32f4discovery/include/board.h 2020-09-22 21:15:33.793430861 +0900 @@ -324,11 +324,18 @@ #define GPIO_TIM2_CH2OUT GPIO_TIM2_CH2OUT_1 #define GPIO_TIM3_CH3OUT GPIO_TIM3_CH3OUT_1 +#ifdef CONFIG_MTD_W25 +#define GPIO_SPI1_MISO GPIO_SPI1_MISO_2 +#define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_2 +#define GPIO_SPI1_SCK GPIO_SPI1_SCK_2 +#else + /* SPI - There is a MEMS device on SPI1 using these pins: */ #define GPIO_SPI1_MISO GPIO_SPI1_MISO_1 #define GPIO_SPI1_MOSI GPIO_SPI1_MOSI_1 #define GPIO_SPI1_SCK GPIO_SPI1_SCK_1 +#endif /* SPI DMA -- As used for I2S DMA transfer with the audio configuration */boards/arm/stm32/stm32f4discovery/src/stm32f4discovery.h
--- boards/arm/stm32/stm32f4discovery/src/stm32f4discovery.h.orig 2020-09-21 00:09:41.198272963 +0900
+++ boards/arm/stm32/stm32f4discovery/src/stm32f4discovery.h 2020-09-22 14:34:59.881038217 +0900
@@ -343,6 +343,11 @@
#define STM32_LCD_RS (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN8)
+#ifdef CONFIG_MTD_W25
+#define STM32_W25_CS (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
+ GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN0)
+#endif
+
/* STM32F4DIS-BB MicroSD
*
* ---------- ------------- ------------------------------
@@ -863,5 +868,17 @@
int stm32_gs2200m_initialize(FAR const char *devpath, int bus);
#endif
+/****************************************************************************
+ * Name: stm32_w25initialize
+ *
+ * Description:
+ * Called to initialize Winbond W25 memory
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_MTD_W25
+int stm32_w25initialize(int minor);
+#endif
+
#endif /* __ASSEMBLY__ */
#endif /* __BOARDS_ARM_STM32_STM32F4DISCOVERY_SRC_STM32F4DISCOVERY_H */
boards/arm/stm32/stm32f4discovery/src/stm32_spi.c
--- boards/arm/stm32/stm32f4discovery/src/stm32_spi.c.orig 2020-09-21 00:09:41.194273021 +0900
+++ boards/arm/stm32/stm32f4discovery/src/stm32_spi.c 2020-09-22 07:26:05.814053943 +0900
@@ -104,6 +104,9 @@
stm32_configgpio(GPIO_OLED_DC); /* OLED Command/Data */
# endif
#endif
+#if defined(STM32_W25_CS)
+ stm32_configgpio(STM32_W25_CS);
+#endif
}
/****************************************************************************
@@ -167,6 +170,13 @@
}
#endif
+#ifdef STM32_W25_CS
+ if (devid == SPIDEV_FLASH(0))
+ {
+ stm32_gpiowrite(STM32_W25_CS, !selected);
+ }
+#endif
+
#if defined(CONFIG_LCD_UG2864AMBAG01) || defined(CONFIG_LCD_UG2864HSWEG01) || \
defined(CONFIG_LCD_SSD1351)
if (devid == SPIDEV_DISPLAY(0))
boards/arm/stm32/stm32f4discovery/src/stm32_bringup.c
--- boards/arm/stm32/stm32f4discovery/src/stm32_bringup.c.orig 2020-09-21 00:09:41.194273021 +0900
+++ boards/arm/stm32/stm32f4discovery/src/stm32_bringup.c 2020-09-22 09:32:34.239627757 +0900
@@ -122,6 +122,10 @@
#include "stm32_xen1210.h"
#endif
+#if !defined(CONFIG_NSH_W25MINOR)
+# define CONFIG_NSH_W25MINOR 0
+#endif
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -223,6 +227,17 @@
}
#endif
+#ifdef CONFIG_MTD_W25
+ /* Initialize and register the W25 FLASH file system. */
+
+ ret = stm32_w25initialize(CONFIG_NSH_W25MINOR);
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: Failed to initialize W25 minor %d: %d\n",
+ CONFIG_NSH_W25MINOR, ret);
+ }
+#endif
+
#ifdef CONFIG_SENSORS_ZEROCROSS
/* Configure the zero-crossing driver */
boards/arm/stm32/stm32f4discovery/src/Make.defs
--- boards/arm/stm32/stm32f4discovery/src/Make.defs.orig 2020-09-21 00:09:41.194273021 +0900 +++ boards/arm/stm32/stm32f4discovery/src/Make.defs 2020-09-22 09:07:14.341615744 +0900 @@ -191,6 +191,10 @@ CSRCS += stm32_gs2200m.c endif +ifeq ($(CONFIG_MTD_W25),y) + CSRCS += stm32_w25.c +endif + DEPPATH += --dep-path board VPATH += :board CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)続いて、stm32_w25.cは、他のボード用にあるので、それを流用・修正します。
cp -a boards/arm/stm32/stm32f103-minimum/src/stm32_w25.c boards/arm/stm32/stm32f4discovery/src/ --- boards/arm/stm32/stm32f103-minimum/src/stm32_w25.c 2020-09-21 00:09:41.186273140 +0900 +++ boards/arm/stm32/stm32f4discovery/src/stm32_w25.c 2020-09-22 13:59:26.720407318 +0900 @@ -1,5 +1,5 @@ /**************************************************************************** - * boards/arm/stm32/stm32f103-minimum/src/stm32_w25.c + * boards/arm/stm32/stm32f4discovery/src/stm32_w25.c * * Copyright (C) 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt修正・追加は以上です。 4. コンパイル・書き込み・起動 説明は前回と同じなので省略します(失敬)。起動すると以下の様になります。@@ -56,7 +56,7 @@ #include "stm32_spi.h" -#include "stm32f103_minimum.h" +#include "stm32f4discovery.h" /**************************************************************************** * Pre-processor Definitions
NuttShell (NSH) NuttX-9.1.0 nsh> ls /dev /dev: console mmcsd0 mtdblock0 null ttyS0mmcsd0に加えてmtdblock0が見えていますね。mtdblock0をフォーマットしてマウントします。2MBですがフォーマットは少し時間がかかります。
nsh> mkfatfs /dev/mtdbloc0 nsh> mount -t vfat /dev/mtdblock0 /mnt/w25q16エラーメッセージがなければ、フォーマット、マウントは成功しています。続いて、sdcardをマウントし、テキストファイルをsd上に作成し、w25とsd間でファイルのコピーをしてみます。
nsh> mount -t vfat /dev/mmcsd0 /mnt/sd0 nsh> cd /mnt/sd0 nsh> echo "This is a test text file. Written 1st on sd card." > test.txt nsh> cp test.txt /mnt/w25q16/ nsh> cat /mnt/w25q16/test.txt This is a test text file. Written 1st on sd card.こちらもエラーメッセージがなければ、一応動作していることになります。 5. 今回のconfigurationの保存
cd /usr/src/nuttx-9.1.0 mkdir boards/arm/stm32/stm32f4discovery/configs/nsh_mmcsd_w25 cp -a .config boards/arm/stm32/stm32f4discovery/configs/nsh_mmcsd_w25/defconfig高負荷テストはしていませんので、動いたよ程度ですが参考になれば幸いです。今回は以上です。それでは。
コメント
コメントを投稿