スキップしてメイン コンテンツに移動

STM32F407VにてNUTTXを実行:その3 On board SPI flashとSDカードを同時に使う

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 
@@ -56,7 +56,7 @@

 #include "stm32_spi.h"

-#include "stm32f103_minimum.h"
+#include "stm32f4discovery.h"

 /****************************************************************************
  * Pre-processor Definitions
修正・追加は以上です。
4. コンパイル・書き込み・起動
説明は前回と同じなので省略します(失敬)。起動すると以下の様になります。
NuttShell (NSH) NuttX-9.1.0
nsh> ls /dev
/dev:
 console
 mmcsd0
 mtdblock0
 null
 ttyS0
mmcsd0に加えて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
高負荷テストはしていませんので、動いたよ程度ですが参考になれば幸いです。今回は以上です。それでは。

コメント

このブログの人気の投稿

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかもしれませ

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-