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高負荷テストはしていませんので、動いたよ程度ですが参考になれば幸いです。今回は以上です。それでは。
コメント
コメントを投稿