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

投稿

12月, 2020の投稿を表示しています

Nuttx on STM32F103RC にて CDCECM(usb ethernet)を駆動させlinuxに接続

令和2年12月現在では、OTGFSの載っているF407VBBではRNDISは動作しますが、NuttxのRNDISはSTM32F103系ではOTGFSがないため、残念ながら動作しません。そこで、他の方法はないかと調べたところ、RNDISではなくCDCECMがあり、こちらの場合は、STM32F103RCを搭載したボードでネットワーク接続できたので、linux/Debian 11に接続して使うまでを、メモ代わりに本稿を上げてみました。なお、一般的なUSB-Ethernetと異なり、コントローラ自体にアクセスするため、Linux側から見たデバイスにアドレスをあたえるのではなく、デバイス上のインターフェースにアドレスを付与する必要があります。このあたりが少しわかりにくいかもしれませんが、早速設定に入っていきたいと思います。 まず初めに、(2023/10追記: mkdir -p nuttx/boards/arm/stm32/f103rcbb/configs/cdcecm でディレクトリを作ってからの) cdcecm/defconfigですが、以下の様にしてみました。なお、IPアドレスはbridge経由でDHCPにて取得するようにしています。(固定IPの場合、bridge非経由・経由のいずれも、telnetdが自動的に起動しませんでした。) CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="f103rcbb" CONFIG_ARCH_BOARD_F103RCBB=y CONFIG_ARCH_CHIP="stm32" CONFIG_ARCH_CHIP_STM32=y CONFIG_ARCH_CHIP_STM32F103RC=y CONFIG_ARCH_STACKDUMP=y CONFIG_BOARD_LOOPSPERMSEC=5483 CONFIG_BOARDCTL_RESET=y CONFIG_BUILTIN=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_SYMBOLS=y CONFIG_DEFAULT_SMALL=y CONFIG_DEV_CONSOLE=y # 2023/10/20追記 12.2.1 CONFIG_DISABLE_PTHREAD=n CONF

Nuttx ttyACMにID_SERIAL_SHORTを付与

古いバージョンではわかりませんが、Nuttx-9.1.0の場合だと、make menuconfigでもttyACMのID_SERIAL_SHORTを付与する項目が出てきません。udevadm infoで確認してもID_SERIAL_SHORTは"0"で固定されており、このままでは、USB接続時、ID_SERIAL_SHORを識別しとした個別のudevルールを設定することができません。そこでどうなっているのかソースコードをみたところ、 #include/nuttx/usb/cdcacm.h.orig #undef CONFIG_CDCACM_SERIALSTR #define CONFIG_CDCACM_SERIALSTR "0" となっていて、やはり"0"に固定されており、このままだと一々シリアル番号ごとにソースコードをかきかえる必要があります。そこで、とりあえずmake menuconfigでシリアル番号を設定できるようにしてみました。とはいっても変更は二か所のみです。 変更箇所1 --- include/nuttx/usb/cdcacm.h.orig 2020-09-21 00:09:41.000000000 +0900 +++ include/nuttx/usb/cdcacm.h 2020-12-22 16:17:52.860000000 +0900 @@ -235,8 +235,9 @@ # define CONFIG_CDCACM_PRODUCTSTR "CDC ACM Serial" #endif -#undef CONFIG_CDCACM_SERIALSTR +#ifndef CONFIG_CDCACM_SERIALSTR #define CONFIG_CDCACM_SERIALSTR "0" +#endif #undef CONFIG_CDCACM_CONFIGSTR #define CONFIG_CDCACM_CONFIGSTR "Bulk" 変更箇所2 --- drivers/usbdev/Kconfig.orig 2020-09-21 00:09:41.000000000 +0900 +

Nucleo-64:Slip over VCPをudevにて自動設定

前回は、手動でSlip over VCPを設定していたのですが、複数台の異なるターゲットを接続する場合も想定すべきではと考えたものの、これを一々設定するのはミスもあるし面倒なので何か良い方法はないかと思案したところ、linux側でudevから接続設定を自動で行うようにすればよいのではと思い、トライしてみました。 まず最初に、全体の構成を記述しておきます。 1. udevにてNucleoのID_SERIAL_SHORTを識別子として利用。 2. udev rule から、systemd を呼び出す。 3. systemdから、さらに、前述のID_SERIAL_SHORT識別子ごとに異なるslip接続を立ち上げるスクリプトを呼び出す。 少しややこしいですね。というのも、実はudevから3のスクリプトを直接よびだしても、5秒ほどでスクリプトがkillされるからです。したがって、対処として、1と3の間に2のsystemdを入れました。こうすることで、udevが呼び出したsystemdスクリプトから呼び出したスクリプトの場合、udevがkillしない/killできないdaemonを実行すること(今回はslattach)ができるからです。説明してもややこしいのは変わりありませんが、設定は比較的簡単です。以下設定です。 1. /etc/udev/rules.d/80-slip-over-vcp.rules の作成 ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374e", \ RUN+="/bin/systemctl start slip-over-vcp@$env{ID_SERIAL_SHORT}-%n" ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", \ RUN+="/bin/systemctl start slip-over-vcp@$en

Nucloe-64にてSLIP over VCPを設定

Nucleo64には、ネットワークポートもUSBコネクタもついておらず、ネットワーク接続させる方法が限られています。一つの方法としては、SLIP(Serial Line IP)をNucleo64で実行させる方法がありますが、標準ではコンソールがVCP(バーチャルコムポート)経由なので、他のシリアルポートでtelnetを立ち上げてもよいのですが、別途接続・配線の手間がかかります。そこで、今回はNucleo-64のVCP接続されるシリアルポートをつかって、telnet経由で手軽にnshできるようにしてみました。なお今回はNucleo-F446を使用し、slip接続は、VCPで使うUSART2経由, シリアルコンソールはUSART3経由としました。 設定内容は以下の通りです。 IP Address IPADDR 10.0.0.2 DRADDR 10.0.0.1 NETMSK 255.255.255.0 DNSSRV 1.1.1.1 configs/slip_over_vcp/defconfigの編集 cd /usr/src/nuttx-9.1.0/nuttx cp -a boards/arm/stm32/nucleo-f446re/configs/nsh boards/arm/stm32/nucleo-f446re/configs/slip_over_vcp #編集:boards/arm/stm32/nucleo-f446re/configs/slip_over_vcp/defconfig # 1. #CONFIG_USART2_SERIAL_CONSOLEを #CONFIG_USART3_SERIAL_CONSOLEに変更 #CONFIG_USART2_SERIAL_CONSOLE=y CONFIG_USART3_SERIAL_CONSOLE=y # 2. 以下を追加 CONFIG_STM32_USART3=y CONFIG_BOARD_LATE_INITIALIZE=y CONFIG_FS_PROCFS=y CONFIG_SCHED_HPWORK=y CONFIG_SCHED_LPWORK=y CONFIG_NET=y CONFIG_NET_SLIP=y CONFIG_NET_LOOPBACK=y CONFIG_NET_SOCKOPTS=y CON