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.1configs/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 CONFIG_NET_TCP=y CONFIG_NET_TCP_WRITE_BUFFERS=y CONFIG_NET_UDP=y CONFIG_NET_BROADCAST=y CONFIG_NET_ICMP=y CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_ARP_SEND=y CONFIG_NETDB_DNSCLIENT=y CONFIG_NETINIT_NETLOCAL=y CONFIG_NETINIT_DNS=y CONFIG_NETINIT_DNSIPADDR=0x01010101 CONFIG_NETINIT_IPADDR=0x0a000002 CONFIG_NETINIT_DRIPADDR=0x01000001 CONFIG_NETINIT_NETMASK=0xffffff00 CONFIG_NETUTILS_PING=y CONFIG_SYSTEM_PING=y CONFIG_NETUTILS_TELNETD=y CONFIG_NSH_DISABLE_TELNETD=n CONFIG_NSH_DISABLE_IFUPDOWN=n CONFIG_NETDEVICES=y CONFIG_NETDEV_PHY_IOCTL=y CONFIG_NETDEV_IFINDEX=y編集: boards/arm/stm32/nucleo-f446re/include/board.h
//以下を追加 #define GPIO_USART3_RX GPIO_USART3_RX_2 /* PC11 */ #define GPIO_USART3_TX GPIO_USART3_TX_2 /* PC10 */boards/arm/stm32/stm32f4discovery/src/stm32_netinit.c をnucleo-f446re/srcにコピー
cp boards/arm/stm32/stm32f4discovery/src/stm32_netinit.c boards/arm/stm32/nucleo-f446re/src/stm32_netinit.c編集: boards/arm/stm32/nucleo-f446re/src/Make.defs
#以下を追加 ifeq ($(CONFIG_NET),y) CSRCS += stm32_netinit.c endif編集: boards/arm/stm32/nucleo-f446re/src/stm32_boot.c
#以下を追加・編集 #ifdef CONFIG_NET_SLIP # include "../../../../../apps/include/netutils/netlib.h" # include <arpa/inet.h> # include <netinet/in.h> # include <nuttx/net/net.h> # include <nuttx/net/slip.h> #endif void board_late_initialize(void) { int ret; #ifdef CONFIG_FS_PROCFS /* Mount the procfs file system */ ret = mount(NULL, STM32_PROCFS_MOUNTPOINT, "procfs", 0, NULL); if (ret < 0) { syslog(LOG_ERR, "ERROR: Failed to mount the PROC filesystem: %d (%d)\n", ret, errno); } #endif /* CONFIG_FS_PROCFS */ #ifdef CONFIG_NET_SLIP ret = slip_initialize(0, "/dev/ttyS1"); if (ret < 0) { syslog(LOG_ERR, "ERROR: SLIP initialization failed: %d\n", ret, errno); } else { struct in_addr addr; addr.s_addr = HTONL(CONFIG_NETINIT_IPADDR); netlib_set_ipv4addr("sl0", &addr); addr.s_addr = HTONL(CONFIG_NETINIT_DRIPADDR); netlib_set_dripv4addr("sl0", &addr); addr.s_addr = HTONL(CONFIG_NETINIT_NETMASK); netlib_set_ipv4netmask("sl0", &addr); #ifdef CONFIG_NETINIT_DNS addr.s_addr = HTONL(CONFIG_NETINIT_DNSIPADDR); netlib_set_ipv4dnsaddr(&addr); #endif netlib_ifup("sl0"); } #endif編集: boards/arm/stm32/nucleo-f446re/include/board.h
#以下を追加 #define GPIO_USART3_RX GPIO_USART3_RX_2 /* PC11 */ #define GPIO_USART3_TX GPIO_USART3_TX_2 /* PC10 */編集: boards/arm/stm32/nucleo-f446re/src/nucleo-f446re.h
#以下を追加 #ifdef CONFIG_FS_PROCFS # ifdef CONFIG_NSH_PROC_MOUNTPOINT # define STM32_PROCFS_MOUNTPOINT CONFIG_NSH_PROC_MOUNTPOINT # else # define STM32_PROCFS_MOUNTPOINT "/proc" # endif #endif設定は以上です。設定が済んだら、make clean;makeし、出来上がったbinaryをボードに焼きます。続いて、ボードをLinuxに接続します。(残念ながらWindows7以降はSlipの機能がありませんので)linux側で以下のコマンドを実行します。
#シリアルポートの確認 # ls -la /dev/ttyACM* crw-rw---- 1 root dialout 166, 0 Dec 14 08:28 /dev/ttyACM0 # slip接続 1. # slattach -L -d -p slip -s 115200 /dev/ttyACM0 & # slip接続 2. # ifconfig sl0 10.0.0.1 netmask 255.255.255.0 pointtopoint 10.0.0.2 up # telnet接続 # telnet 10.0.0.2 Trying 10.0.0.2... Connected to 10.0.0.2. Escape character is '^]'. NuttShell (NSH) NuttX-9.1.0 nsh> ls /dev /dev: console null telnet telnet0 ttyS0 ttyS1 nsh> ping -c4 www.google.com PING 216.58.197.228 56 bytes of data 56 bytes from 216.58.197.228: icmp_seq=0 time=40 ms 56 bytes from 216.58.197.228: icmp_seq=1 time=20 ms 56 bytes from 216.58.197.228: icmp_seq=2 time=20 ms 56 bytes from 216.58.197.228: icmp_seq=3 time=20 ms 4 packets transmitted, 4 received, 0% packet loss, time 4040 ms nsh>とりあえずネット機能をNucleo-64/32で手軽に実現したいという場合、有効かもしれませんね。今回は以上です。それでは。
コメント
コメントを投稿