From 6945598b6406ab0c8a568e0be079569b9bbd9f7b Mon Sep 17 00:00:00 2001 From: chenjiafan Date: Wed, 2 Sep 2020 09:31:18 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[ADD]=E6=B7=BB=E5=8A=A0=E4=BA=86RW007?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E5=92=8CLWIP=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E7=BC=96=E8=AF=91=E8=BF=90=E8=A1=8C=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E6=97=A0=E6=B3=95=E4=B8=8ERW007=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - firmware/.config | 184 +++- firmware/Hal_lib/inc/HAL_device.h | 1 + firmware/Kconfig | 7 +- firmware/applications/main.c | 78 +- firmware/drivers/drv_spi.h | 1 + firmware/packages/SConscript | 12 + firmware/packages/packages.dbsqlite | Bin 0 -> 2048 bytes firmware/packages/pkgs.json | 7 + firmware/packages/pkgs_error.json | 1 + firmware/packages/rw007-latest/.gitignore | 52 ++ firmware/packages/rw007-latest/LICENSE | 201 ++++ firmware/packages/rw007-latest/README.md | 57 ++ firmware/packages/rw007-latest/SConscript | 87 ++ .../rw007-latest/example/rw007_stm32_port.c | 70 ++ .../rw007-latest/inc/spi_wifi_rw007.h | 221 +++++ .../rw007-latest/src/spi_wifi_rw007.c | 873 ++++++++++++++++++ firmware/project.uvprojx | 311 ++++++- firmware/rtconfig.h | 71 +- 19 files changed, 2181 insertions(+), 54 deletions(-) create mode 100644 firmware/packages/SConscript create mode 100644 firmware/packages/packages.dbsqlite create mode 100644 firmware/packages/pkgs.json create mode 100644 firmware/packages/pkgs_error.json create mode 100644 firmware/packages/rw007-latest/.gitignore create mode 100644 firmware/packages/rw007-latest/LICENSE create mode 100644 firmware/packages/rw007-latest/README.md create mode 100644 firmware/packages/rw007-latest/SConscript create mode 100644 firmware/packages/rw007-latest/example/rw007_stm32_port.c create mode 100644 firmware/packages/rw007-latest/inc/spi_wifi_rw007.h create mode 100644 firmware/packages/rw007-latest/src/spi_wifi_rw007.c diff --git a/.gitignore b/.gitignore index 2f02054..6bd4a15 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,6 @@ documentation/html *.i *.d tools/kconfig-frontends/kconfig-mconf -packages cconfig.h GPUCache diff --git a/firmware/.config b/firmware/.config index cda0ec4..14c9ecc 100644 --- a/firmware/.config +++ b/firmware/.config @@ -129,6 +129,7 @@ CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_RAMFS is not set # CONFIG_RT_USING_DFS_UFFS is not set # CONFIG_RT_USING_DFS_JFFS2 is not set +# CONFIG_RT_USING_DFS_NFS is not set # # Device Drivers @@ -154,7 +155,14 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set # CONFIG_RT_USING_SDIO is not set -# CONFIG_RT_USING_SPI is not set +CONFIG_RT_USING_SPI=y +# CONFIG_RT_USING_QSPI is not set +# CONFIG_RT_USING_SPI_MSD is not set +# CONFIG_RT_USING_SFUD is not set +# CONFIG_RT_USING_W25QXX is not set +# CONFIG_RT_USING_GD is not set +# CONFIG_RT_USING_ENC28J60 is not set +# CONFIG_RT_USING_SPI_WIFI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set @@ -162,7 +170,22 @@ CONFIG_RT_USING_PIN=y # # Using WiFi # -# CONFIG_RT_USING_WIFI is not set +CONFIG_RT_USING_WIFI=y +CONFIG_RT_WLAN_DEVICE_STA_NAME="wlan0" +CONFIG_RT_WLAN_DEVICE_AP_NAME="wlan1" +CONFIG_RT_WLAN_DEFAULT_PROT="lwip" +CONFIG_RT_WLAN_SCAN_WAIT_MS=10000 +CONFIG_RT_WLAN_CONNECT_WAIT_MS=10000 +CONFIG_RT_WLAN_SSID_MAX_LENGTH=32 +CONFIG_RT_WLAN_PASSWORD_MAX_LENGTH=32 +CONFIG_RT_WLAN_SCAN_SORT=y +CONFIG_RT_WLAN_CFG_INFO_MAX=3 +CONFIG_RT_WLAN_WORKQUEUE_THREAD_NAME="wlan_job" +CONFIG_RT_WLAN_WORKQUEUE_THREAD_SIZE=2048 +CONFIG_RT_WLAN_WORKQUEUE_THREAD_PRIO=22 +CONFIG_RT_WLAN_DEV_EVENT_NUM=2 +# CONFIG_RT_WLAN_PROT_LWIP_PBUF_FORCE is not set +# CONFIG_RT_WLAN_DEBUG is not set # # Using USB @@ -194,14 +217,63 @@ CONFIG_RT_USING_POSIX=y # Network interface device # # CONFIG_RT_USING_NETDEV is not set +CONFIG_NETDEV_USING_PING=y # # light weight TCP/IP stack # -# CONFIG_RT_USING_LWIP is not set +CONFIG_RT_USING_LWIP=y # CONFIG_RT_USING_LWIP141 is not set -# CONFIG_RT_USING_LWIP202 is not set +CONFIG_RT_USING_LWIP202=y # CONFIG_RT_USING_LWIP210 is not set +# CONFIG_RT_USING_LWIP_IPV6 is not set +CONFIG_RT_LWIP_IGMP=y +CONFIG_RT_LWIP_ICMP=y +# CONFIG_RT_LWIP_SNMP is not set +CONFIG_RT_LWIP_DNS=y +CONFIG_RT_LWIP_DHCP=y +CONFIG_IP_SOF_BROADCAST=1 +CONFIG_IP_SOF_BROADCAST_RECV=1 + +# +# Static IPv4 Address +# +CONFIG_RT_LWIP_IPADDR="192.168.1.30" +CONFIG_RT_LWIP_GWADDR="192.168.1.1" +CONFIG_RT_LWIP_MSKADDR="255.255.255.0" +CONFIG_RT_LWIP_UDP=y +CONFIG_RT_LWIP_TCP=y +CONFIG_RT_LWIP_RAW=y +# CONFIG_RT_LWIP_PPP is not set +CONFIG_RT_MEMP_NUM_NETCONN=8 +CONFIG_RT_LWIP_PBUF_NUM=16 +CONFIG_RT_LWIP_RAW_PCB_NUM=4 +CONFIG_RT_LWIP_UDP_PCB_NUM=4 +CONFIG_RT_LWIP_TCP_PCB_NUM=4 +CONFIG_RT_LWIP_TCP_SEG_NUM=40 +CONFIG_RT_LWIP_TCP_SND_BUF=8196 +CONFIG_RT_LWIP_TCP_WND=8196 +CONFIG_RT_LWIP_TCPTHREAD_PRIORITY=10 +CONFIG_RT_LWIP_TCPTHREAD_MBOX_SIZE=8 +CONFIG_RT_LWIP_TCPTHREAD_STACKSIZE=1024 +# CONFIG_LWIP_NO_RX_THREAD is not set +# CONFIG_LWIP_NO_TX_THREAD is not set +CONFIG_RT_LWIP_ETHTHREAD_PRIORITY=12 +CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=1024 +CONFIG_RT_LWIP_ETHTHREAD_MBOX_SIZE=8 +# CONFIG_RT_LWIP_REASSEMBLY_FRAG is not set +CONFIG_LWIP_NETIF_STATUS_CALLBACK=1 +CONFIG_LWIP_NETIF_LINK_CALLBACK=1 +CONFIG_SO_REUSE=1 +CONFIG_LWIP_SO_RCVTIMEO=1 +CONFIG_LWIP_SO_SNDTIMEO=1 +CONFIG_LWIP_SO_RCVBUF=1 +# CONFIG_RT_LWIP_NETIF_LOOPBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=0 +# CONFIG_RT_LWIP_STATS is not set +# CONFIG_RT_LWIP_USING_HW_CHECKSUM is not set +CONFIG_RT_LWIP_USING_PING=y +# CONFIG_RT_LWIP_DEBUG is not set # # Modbus master and slave stack @@ -212,6 +284,7 @@ CONFIG_RT_USING_POSIX=y # AT commands # # CONFIG_RT_USING_AT is not set +# CONFIG_LWIP_USING_DHCPD is not set # # VBUS(Virtual Software BUS) @@ -232,10 +305,15 @@ CONFIG_RT_USING_POSIX=y # # IoT - internet of things # +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set # CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set # CONFIG_PKG_USING_WEBCLIENT is not set # CONFIG_PKG_USING_WEBNET is not set # CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set # CONFIG_PKG_USING_WEBTERMINAL is not set # CONFIG_PKG_USING_CJSON is not set # CONFIG_PKG_USING_JSMN is not set @@ -258,10 +336,27 @@ CONFIG_RT_USING_POSIX=y # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set -# CONFIG_PKG_USING_RW007 is not set +CONFIG_PKG_USING_RW007=y +CONFIG_PKG_RW007_PATH="/packages/iot/WiFi/rw007" +# CONFIG_PKG_USING_RW007_V111 is not set +# CONFIG_PKG_USING_RW007_V110 is not set +# CONFIG_PKG_USING_RW007_V100 is not set +CONFIG_PKG_USING_RW007_LATEST_VERSION=y +CONFIG_PKG_RW007_VER="latest" +# CONFIG_RW007_NOT_USE_EXAMPLE_DRIVERS is not set +CONFIG_RW007_USING_STM32_DRIVERS=y +CONFIG_RW007_SPI_MAX_HZ=30000000 +CONFIG_RW007_SPI_BUS_NAME="spi2" +CONFIG_RW007_CS_PIN=54 +CONFIG_RW007_BOOT0_PIN=175 +CONFIG_RW007_BOOT1_PIN=102 +CONFIG_RW007_INT_BUSY_PIN=64 +CONFIG_RW007_RST_PIN=65 # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set # CONFIG_PKG_USING_AT_DEVICE is not set # CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set @@ -273,13 +368,30 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_GAGENT_CLOUD is not set # CONFIG_PKG_USING_ALI_IOTKIT is not set # CONFIG_PKG_USING_AZURE is not set -# CONFIG_PKG_USING_TENCENT_IOTHUB is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set # CONFIG_PKG_USING_IPMSG is not set # CONFIG_PKG_USING_LSSDP is not set # CONFIG_PKG_USING_AIRKISS_OPEN is not set # CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set # # security packages @@ -287,6 +399,8 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_MBEDTLS is not set # CONFIG_PKG_USING_libsodium is not set # CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set # # language packages @@ -301,6 +415,8 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set # CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set # # tools packages @@ -311,9 +427,17 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_SYSTEMVIEW is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_QRCODE is not set -# CONFIG_PKG_USING_ZBAR is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set # CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set # # system packages @@ -324,6 +448,7 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_LWEXT4 is not set # CONFIG_PKG_USING_PARTITION is not set # CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_FLASHDB is not set # CONFIG_PKG_USING_SQLITE is not set # CONFIG_PKG_USING_RTI is not set # CONFIG_PKG_USING_LITTLEVGL2RTT is not set @@ -331,6 +456,15 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set # CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set # # peripheral libraries and drivers @@ -338,6 +472,7 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set @@ -346,10 +481,16 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_SX12XX is not set # CONFIG_PKG_USING_SIGNAL_LED is not set # CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set # CONFIG_PKG_USING_INFRARED is not set # CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set # CONFIG_PKG_USING_AD7746 is not set @@ -357,6 +498,25 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set # CONFIG_PKG_USING_TOUCH_DRIVERS is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set # # miscellaneous packages @@ -367,12 +527,15 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_MINILZO is not set # CONFIG_PKG_USING_QUICKLZ is not set # CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set # CONFIG_PKG_USING_CANFESTIVAL is not set # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set # CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set # # samples: kernel and components samples @@ -385,6 +548,12 @@ CONFIG_RT_USING_POSIX=y # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_NNOM is not set # CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_CRCLIB is not set CONFIG_SOC_GD32450Z=y CONFIG_BSP_USING_SDRAM=y CONFIG_BSP_USING_UART0=y @@ -394,3 +563,4 @@ CONFIG_BSP_USING_UART0=y # CONFIG_BSP_USING_UART4 is not set # CONFIG_BSP_USING_UART5 is not set # CONFIG_BSP_USING_LPUART1 is not set +CONFIG_BSP_USING_SPI2=y diff --git a/firmware/Hal_lib/inc/HAL_device.h b/firmware/Hal_lib/inc/HAL_device.h index 786a6ea..64419b4 100644 --- a/firmware/Hal_lib/inc/HAL_device.h +++ b/firmware/Hal_lib/inc/HAL_device.h @@ -21,6 +21,7 @@ #include "tk499.h" +#include "HAL_spi.h" #endif /* __HAL_device_H */ diff --git a/firmware/Kconfig b/firmware/Kconfig index 018047f..0ec9d7e 100644 --- a/firmware/Kconfig +++ b/firmware/Kconfig @@ -58,4 +58,9 @@ config BSP_USING_UART5 config BSP_USING_LPUART1 bool "using lpuart1" select RT_USING_SERIAL - default n \ No newline at end of file + default n + +config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + select RT_USING_SPI2 + default n diff --git a/firmware/applications/main.c b/firmware/applications/main.c index fd256cd..e9ee39a 100644 --- a/firmware/applications/main.c +++ b/firmware/applications/main.c @@ -26,45 +26,45 @@ int main(int argc, char **argv) return 0; } -int spi_init() -{ - GPIO_TypeDef *cs_gpiox; - uint16_t cs_pin; - struct rt_spi_device *spi_device; - - cs_gpiox = (GPIO_TypeDef *)((rt_base_t)GPIOA + (rt_base_t)(RW007_CS_PIN / 16) * 0x0400UL); - cs_pin = (uint16_t)(1 << RW007_CS_PIN % 16); - - rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, RW007_DEV_NAME, cs_gpiox, cs_pin); - - spi_device = (struct rt_spi_device *)rt_device_find(RW007_DEV_NAME); - - if (spi_device == RT_NULL) - { - rt_kprintf("spi device %s not found!\r", RW007_SPI_BUS_NAME); - return -RT_ENOSYS; - } - - /* config spi */ - { - struct rt_spi_configuration cfg; - cfg.data_width = 8; - cfg.mode = RT_SPI_MODE_MASK; /* SPI Compatible: Mode 0. */ - cfg.max_hz = 30 * 1000000; /* 15M 007 max 30M */ - rt_spi_configure(spi_device, &cfg); - } - - return 0; -} -INIT_DEVICE_EXPORT(spi_init); - -void spi_send_data() -{ - char send[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xa0}; - struct rt_spi_device *rt_spi_device = (struct rt_spi_device *)rt_device_find(RW007_DEV_NAME); +// int spi_init() +// { +// GPIO_TypeDef *cs_gpiox; +// uint16_t cs_pin; +// struct rt_spi_device *spi_device; + +// cs_gpiox = (GPIO_TypeDef *)((rt_base_t)GPIOA + (rt_base_t)(RW007_CS_PIN / 16) * 0x0400UL); +// cs_pin = (uint16_t)(1 << RW007_CS_PIN % 16); + +// rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, RW007_DEV_NAME, cs_gpiox, cs_pin); + +// spi_device = (struct rt_spi_device *)rt_device_find(RW007_DEV_NAME); + +// if (spi_device == RT_NULL) +// { +// rt_kprintf("spi device %s not found!\r", RW007_SPI_BUS_NAME); +// return -RT_ENOSYS; +// } + +// /* config spi */ +// { +// struct rt_spi_configuration cfg; +// cfg.data_width = 8; +// cfg.mode = RT_SPI_MODE_MASK; /* SPI Compatible: Mode 0. */ +// cfg.max_hz = 30 * 1000000; /* 15M 007 max 30M */ +// rt_spi_configure(spi_device, &cfg); +// } + +// return 0; +// } +// INIT_DEVICE_EXPORT(spi_init); + +// void spi_send_data() +// { +// char send[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xa0}; +// struct rt_spi_device *rt_spi_device = (struct rt_spi_device *)rt_device_find(RW007_DEV_NAME); - rt_spi_transfer(rt_spi_device, send, RT_NULL, 10); +// rt_spi_transfer(rt_spi_device, send, RT_NULL, 10); -} -MSH_CMD_EXPORT(spi_send_data, spi_send_data); +// } +// MSH_CMD_EXPORT(spi_send_data, spi_send_data); diff --git a/firmware/drivers/drv_spi.h b/firmware/drivers/drv_spi.h index ed566ee..65cda6b 100644 --- a/firmware/drivers/drv_spi.h +++ b/firmware/drivers/drv_spi.h @@ -14,6 +14,7 @@ #include #include "rtdevice.h" #include +#include "HAL_device.h" rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef* cs_gpiox, uint16_t cs_gpio_pin); diff --git a/firmware/packages/SConscript b/firmware/packages/SConscript new file mode 100644 index 0000000..ca95be1 --- /dev/null +++ b/firmware/packages/SConscript @@ -0,0 +1,12 @@ +import os +from building import * + +objs = [] +cwd = GetCurrentDir() +list = os.listdir(cwd) + +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + objs = objs + SConscript(os.path.join(item, 'SConscript')) + +Return('objs') diff --git a/firmware/packages/packages.dbsqlite b/firmware/packages/packages.dbsqlite new file mode 100644 index 0000000000000000000000000000000000000000..f93bffdf6f9d40eb0be91b5262cfcd60899550ee GIT binary patch literal 2048 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU| + +#ifdef RW007_USING_STM32_DRIVERS +#include +#include +#include +#include + +extern void spi_wifi_isr(int vector); + +static void rw007_gpio_init(void) +{ + /* Configure IO */ + rt_pin_mode(RW007_RST_PIN, PIN_MODE_OUTPUT); + rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLDOWN); + + /* Reset rw007 and config mode */ + rt_pin_write(RW007_RST_PIN, PIN_LOW); + rt_thread_delay(rt_tick_from_millisecond(100)); + rt_pin_write(RW007_RST_PIN, PIN_HIGH); + + /* Wait rw007 ready(exit busy stat) */ + // while(!rt_pin_read(RW007_INT_BUSY_PIN)) + // { + // rt_thread_delay(5); + // } + + rt_thread_delay(rt_tick_from_millisecond(200)); + rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLUP); +} + +int wifi_spi_device_init(void) +{ + char sn_version[32]; + + GPIO_TypeDef *cs_gpiox; + uint16_t cs_pin; + + cs_gpiox = (GPIO_TypeDef *)((rt_base_t)GPIOA + (rt_base_t)(RW007_CS_PIN / 16) * 0x0400UL); + cs_pin = (uint16_t)(1 << RW007_CS_PIN % 16); + + rw007_gpio_init(); + rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, "wspi", cs_gpiox, cs_pin); + rt_hw_wifi_init("wspi"); + + rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION); + rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP); + + rw007_sn_get(sn_version); + rt_kprintf("\nrw007 sn: [%s]\n", sn_version); + rw007_version_get(sn_version); + rt_kprintf("rw007 ver: [%s]\n\n", sn_version); + + return 0; +} +INIT_APP_EXPORT(wifi_spi_device_init); + +static void int_wifi_irq(void * p) +{ + ((void)p); + spi_wifi_isr(0); +} + +void spi_wifi_hw_init(void) +{ + rt_pin_attach_irq(RW007_INT_BUSY_PIN, PIN_IRQ_MODE_FALLING, int_wifi_irq, 0); + rt_pin_irq_enable(RW007_INT_BUSY_PIN, RT_TRUE); +} + +#endif /* RW007_USING_STM32_DRIVERS */ diff --git a/firmware/packages/rw007-latest/inc/spi_wifi_rw007.h b/firmware/packages/rw007-latest/inc/spi_wifi_rw007.h new file mode 100644 index 0000000..cc65b0d --- /dev/null +++ b/firmware/packages/rw007-latest/inc/spi_wifi_rw007.h @@ -0,0 +1,221 @@ +/* + * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2014-07-31 aozima the first version + * 2014-09-18 aozima update command & response. + */ + +#ifndef SPI_WIFI_H_INCLUDED +#define SPI_WIFI_H_INCLUDED + +#include +#include +typedef enum +{ + master_cmd_phase = 0x01, + master_data_phase, + slave_cmd_phase, + slave_data_phase, +}phase_type; + +typedef enum +{ + TRANSFER_DATA_SUCCESS = 0x00, + TRANSFER_DATA_ERROR, + TRANSFER_DATA_CONTINUE, +}rw007_transfer_state; +/* little-endian */ +struct spi_master_request +{ + uint8_t reserve1; + uint8_t flag: 4; + uint8_t type: 4; + uint16_t reserve2; + uint16_t seq; + uint16_t M2S_len; // master to slave data len. + uint32_t magic1; + uint32_t magic2; +}; + +#define MASTER_MAGIC1 (0x67452301) +#define MASTER_MAGIC2 (0xEFCDAB89) + +#define MASTER_FLAG_MRDY (0x01) + +/* little-endian */ +struct spi_slave_response +{ + uint8_t reserve1; + uint8_t flag: 4; + uint8_t type: 4; + uint8_t slave_rx_buf: 4; + uint8_t slave_tx_buf: 4; + uint8_t reserve2; + uint16_t seq; + uint16_t S2M_len; // slave to master data len. + uint32_t magic1; + uint32_t magic2; +}; + +#define SLAVE_MAGIC1 (0x98BADCFE) +#define SLAVE_MAGIC2 (0x10325476) +#define SLAVE_FLAG_SRDY (0x01) + +#define SLAVE_DATA_FULL (0x01) + +/* spi buffer configure. */ +#define SPI_MAX_DATA_LEN 1520 +#define SPI_TX_POOL_SIZE 4 +#define SPI_RX_POOL_SIZE 4 +/* The slave interrupts wait timeout */ +#define SLAVE_INT_TIMEOUT 100 + +typedef enum +{ + RW007_SLAVE_INT = 1, + RW007_MASTER_DATA = 1<<1, +} wifi_event; + +typedef enum +{ + DATA_TYPE_STA_ETH_DATA = 1, + DATA_TYPE_AP_ETH_DATA, + DATA_TYPE_PROMISC_ETH_DATA, + DATA_TYPE_CMD, + DATA_TYPE_RESP, + DATA_TYPE_CB, +} app_data_type_t; + +struct spi_data_packet +{ + uint32_t data_len; /* length for buffer */ + uint32_t data_type; /* app_data_type_t */ + char buffer[SPI_MAX_DATA_LEN]; +}; + +typedef struct rw007_ap_info_value +{ + struct rt_wlan_info info; + char passwd[RT_WLAN_PASSWORD_MAX_LENGTH]; +} * rw007_ap_info_value_t; + +/* littel endian */ +typedef struct rw007_cmd +{ + uint32_t cmd; + uint32_t len; + + /* command parameter */ + union + { + uint32_t int_value; + uint8_t mac_value[8]; /* padding 2bytes */ + struct rw007_ap_info_value ap_info_value; + char string_value[UINT16_MAX]; + } value; +} * rw007_cmd_t; + +struct rw007_resp +{ + uint32_t cmd; + uint32_t len; + + int32_t result; /* result of CMD. */ + + /* response value */ + union + { + uint32_t int_value; + uint8_t mac_value[8]; /* padding 2bytes */ + struct rw007_ap_info_value ap_info_value; + char string_value[UINT16_MAX]; + } value; +}; + +/* tools */ +#define node_entry(node, type, member) ((type *)((char *)(node) - (unsigned long)(&((type *)0)->member))) +#define member_offset(type, member) ((unsigned long)(&((type *)0)->member)) + +#define MAX_SPI_PACKET_SIZE (member_offset(struct spi_data_packet, buffer) + SPI_MAX_DATA_LEN) + +typedef enum +{ + RW00x_CMD_INIT = 0x00, + RW00x_CMD_SET_MODE, + RW00x_CMD_MAC_GET, + RW00x_CMD_MAC_SET, + RW00x_CMD_GET_SN, + RW00x_CMD_GET_VSR, + RW00x_CMD_SCAN, + RW00x_CMD_JOIN, + RW00x_CMD_SOFTAP, + RW00x_CMD_DISCONNECT, + RW00x_CMD_AP_STOP, + RW00x_CMD_AP_DEAUTH, + RW00x_CMD_SCAN_STOP, + RW00x_CMD_GET_RSSI, + RW00x_CMD_SET_PWR_SAVE, + RW00x_CMD_GET_PWR_SAVE, + RW00x_CMD_CFG_PROMISC, + RW00x_CMD_CFG_FILTER, + RW00x_CMD_SET_CHANNEL, + RW00x_CMD_GET_CHANNEL, + RW00x_CMD_SET_COUNTRY, + RW00x_CMD_GET_COUNTRY, + RW00x_CMD_AP_MAC_GET, + RW00x_CMD_AP_MAC_SET, + RW00x_CMD_MAX_NUM +}RW00x_CMD; + +struct rw007_spi +{ + /* Device handle for spi device */ + struct rt_spi_device *spi_device; + + /* Tx mempool and mailbox */ + struct rt_mempool spi_tx_mp; + ALIGN(4) + rt_uint8_t spi_tx_mempool[(sizeof(struct spi_data_packet) + 4) * SPI_TX_POOL_SIZE]; + struct rt_mailbox spi_tx_mb; + int spi_tx_mb_pool[SPI_TX_POOL_SIZE + 1]; + + /* Rx mempool and mailbox */ + struct rt_mempool spi_rx_mp; + ALIGN(4) + rt_uint8_t spi_rx_mempool[(sizeof(struct spi_data_packet) + 4) * SPI_RX_POOL_SIZE]; + struct rt_mailbox spi_rx_mb; + int spi_rx_mb_pool[SPI_RX_POOL_SIZE + 1]; + + /* response event */ + rt_event_t rw007_cmd_event; + /* response data */ + struct rw007_resp * resp[RW00x_CMD_MAX_NUM]; +}; + +#define RW00x_CMD_RESP_EVENT(n) (0x01UL << n) + +struct rw007_wifi +{ + /* inherit from ethernet device */ + struct rt_wlan_device *wlan; + /* spi transfer layer handle */ + struct rw007_spi * hspi; +}; + +/* porting */ +extern void spi_wifi_hw_init(void); + +/* end porting */ + +/* api exclude in wlan framework */ +extern rt_err_t rw007_sn_get(char sn[24]); +extern rt_err_t rw007_version_get(char version[16]); +/* end api exclude in wlan framework */ + +extern rt_err_t rt_hw_wifi_init(const char *spi_device_name); + +#endif /* SPI_WIFI_H_INCLUDED */ diff --git a/firmware/packages/rw007-latest/src/spi_wifi_rw007.c b/firmware/packages/rw007-latest/src/spi_wifi_rw007.c new file mode 100644 index 0000000..c725a46 --- /dev/null +++ b/firmware/packages/rw007-latest/src/spi_wifi_rw007.c @@ -0,0 +1,873 @@ +/* + * COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2014-07-31 aozima the first version + * 2014-09-18 aozima update command & response. + * 2017-07-28 armink fix auto reconnect feature + * 2018-12-24 zyh porting rw007 from rw009 + * 2019-02-25 zyh porting rw007 to wlan + * 2020-02-28 shaoguoji add spi transfer retry + * 2020-07-09 zj refactor the rw007 + */ +#include +#include + +#ifndef RW007_LOG_LEVEL +#define RW007_LOG_LEVEL DBG_LOG +#endif + +#define DBG_ENABLE +#define DBG_SECTION_NAME "[RW007]" +#define DBG_LEVEL RW007_LOG_LEVEL +#define DBG_COLOR +#include + +#include "spi_wifi_rw007.h" + +static struct rw007_spi rw007_spi; +static struct rw007_wifi wifi_sta, wifi_ap; +static struct rt_event spi_wifi_data_event; +static rt_bool_t inited = RT_FALSE; + +#ifdef WLAN_DEV_MONITOR +typedef struct +{ + rt_uint32_t total; + rt_uint32_t lose; + rt_uint32_t retry; + rt_uint32_t first_stage_err; + rt_uint32_t second_stage_err; +} net_packet; +net_packet packet; +#endif + +static int wifi_data_transfer(struct rw007_spi *dev, uint16_t seq, uint8_t *rx_buffer) +{ + static const struct spi_data_packet *send_packet = RT_NULL; + struct spi_master_request cmd; + struct spi_slave_response resp; + struct rt_spi_message message; + struct rt_spi_device *rt_spi_device = dev->spi_device; + rt_uint32_t max_data_len = 0; + + /* Clear cmd */ + rt_memset(&cmd, 0, sizeof(cmd)); + cmd.type = master_cmd_phase; + cmd.seq = seq; + /* Set magic word */ + cmd.magic1 = MASTER_MAGIC1; + cmd.magic2 = MASTER_MAGIC2; + + /* If the buffer is not full, Set master ready flag bit */ + if(rx_buffer != RT_NULL) + { + cmd.flag |= MASTER_FLAG_MRDY; + } + + if (send_packet == RT_NULL) + { + /* Check to see if any data needs to be sent */ + if (rt_mb_recv(&dev->spi_tx_mb, (rt_ubase_t *)&send_packet, RT_WAITING_NO) != RT_EOK) + { + send_packet = RT_NULL; + } + } + + /* Set length for master to slave when data ready*/ + if (send_packet != RT_NULL) + { + /* Invalid data packet */ + if((send_packet->data_len == 0) || (send_packet->data_len > SPI_MAX_DATA_LEN)) + { + rt_mp_free((void *)send_packet); + send_packet = RT_NULL; + } + else + { + cmd.M2S_len = send_packet->data_len + member_offset(struct spi_data_packet, buffer); + } + } + + /* Stage 1: Send command to rw007 */ + rt_memset(&resp, 0, sizeof(resp)); + rt_spi_transfer(rt_spi_device, &cmd, &resp, sizeof(resp)); + + /* Clear event */ + rt_event_recv(&spi_wifi_data_event, + RW007_SLAVE_INT, + RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, + RT_WAITING_NO, + RT_NULL); + /* checkout Stage 1 slave status */ + if ((resp.magic1 != SLAVE_MAGIC1) || (resp.magic2 != SLAVE_MAGIC2) || (resp.type != slave_cmd_phase)) + { +#ifdef WLAN_DEV_MONITOR + packet.first_stage_err++; +#endif + LOG_E("The wifi Stage 1 status %x %x %x %d\r", resp.magic1, resp.magic2, resp.type, cmd.seq); + goto _cmderr; + } + + /* receive first event */ + if (rt_event_recv(&spi_wifi_data_event, + RW007_SLAVE_INT, + RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, + SLAVE_INT_TIMEOUT, + RT_NULL) != RT_EOK) + { + LOG_E("The wifi slave response timed out\r"); + } + + /* Stage 2: Receive response from rw007 */ + cmd.type = master_data_phase; //data Stage + rt_memset(&resp, 0, sizeof(resp)); + message.send_buf = &cmd; + message.recv_buf = &resp; + message.length = sizeof(resp); + message.cs_take = 1; + message.cs_release = 0; + + /* Start a SPI transmit */ + rt_spi_take_bus(rt_spi_device); + + /* Receive response from rw007 */ + rt_spi_device->bus->ops->xfer(rt_spi_device, &message); + + /* Check response's magic word and seq */ + if ((resp.magic1 != SLAVE_MAGIC1) || (resp.magic2 != SLAVE_MAGIC2) || (resp.seq != seq) || (resp.type != slave_data_phase)) + { +#ifdef WLAN_DEV_MONITOR + packet.second_stage_err++; +#endif + LOG_E("The wifi Stage 2 status %x %x %x %x %d %d\r", resp.magic1, resp.magic2, resp.seq, resp.type, resp.S2M_len, cmd.seq); + goto _txerr; + } + + /* Check rw007's data ready flag */ + if (resp.flag & SLAVE_FLAG_SRDY) + { + max_data_len = cmd.M2S_len; + } + + if (resp.S2M_len > MAX_SPI_PACKET_SIZE) + { + /* Drop error data */ + resp.S2M_len = 0; + } + + if (resp.S2M_len > max_data_len) + { + max_data_len = resp.S2M_len; + } + + /* Setup message */ + if((resp.S2M_len == 0) && (rx_buffer != RT_NULL)) + { + rt_mp_free(rx_buffer); + rx_buffer = RT_NULL; + } + + message.send_buf = send_packet; + message.recv_buf = rx_buffer; + message.length = RT_ALIGN(max_data_len, 4);/* align clk to word */ + message.cs_take = 0; + message.cs_release = 1; + + /* Transmit data */ + rt_spi_device->bus->ops->xfer(rt_spi_device, &message); + + /* End a SPI transmit */ + rt_spi_release_bus(rt_spi_device); + + /* Free send data space */ + if ((resp.flag & SLAVE_FLAG_SRDY) && (send_packet != RT_NULL)) + { + rt_mp_free((void *)send_packet); + send_packet = RT_NULL; + } + + /* Parse recevied data */ + if(rx_buffer) + { + rt_mb_send(&dev->spi_rx_mb, (rt_ubase_t)rx_buffer); + } + + /* receive data end event */ + if (rt_event_recv(&spi_wifi_data_event, + RW007_SLAVE_INT, + RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, + SLAVE_INT_TIMEOUT, + RT_NULL) != RT_EOK) + { + LOG_E("The wifi slave data response timed out\r"); + } + + /* The slave has data */ + if (resp.slave_tx_buf > 0) + { + return TRANSFER_DATA_CONTINUE; + } + return TRANSFER_DATA_SUCCESS; +_txerr: + /* END SPI transfer */ + message.send_buf = RT_NULL; + message.recv_buf = RT_NULL; + message.length = 0; + message.cs_take = 0; + message.cs_release = 1; + rt_spi_device->bus->ops->xfer(rt_spi_device, &message); + + rt_spi_release_bus(rt_spi_device); // End a SPI transmit +_cmderr: + rt_thread_delay(1); + return TRANSFER_DATA_ERROR; +} + +static int spi_wifi_transfer(struct rw007_spi *dev) +{ + static uint16_t cmd_seq = 0; + int result = TRANSFER_DATA_SUCCESS; + uint8_t * rx_buffer = rt_mp_alloc(&dev->spi_rx_mp, RT_WAITING_NO); + int32_t retry; + + /* Generate the transmission sequence number */ + cmd_seq++; + if (cmd_seq >= 65534) + { + cmd_seq = 1; + } +#ifdef WLAN_DEV_MONITOR + packet.total++; +#endif + /* set retry count */ + retry = 3; + while (retry > 0) + { + result = wifi_data_transfer(dev, cmd_seq, rx_buffer); + if (result != TRANSFER_DATA_ERROR) + { + break; + } + retry--; +#ifdef WLAN_DEV_MONITOR + packet.retry++; +#endif + } + + /* Receive response from rw007 error */ + if (retry <= 0) + { +#ifdef WLAN_DEV_MONITOR + packet.lose++; +#endif + LOG_E("rw007 transfer failed\r"); + goto _err; + } + + return result; +_err: + if(rx_buffer) + { + rt_mp_free((void *)rx_buffer); + } + return TRANSFER_DATA_ERROR; +} + +static void wifi_data_process_thread_entry(void *parameter) +{ + const struct spi_data_packet *data_packet = RT_NULL; + struct rw007_spi *dev = (struct rw007_spi *)parameter; + + while(1) + { + /* get the mempool memory for recv data package */ + if(rt_mb_recv(&dev->spi_rx_mb, (rt_ubase_t *)&data_packet, RT_WAITING_FOREVER) == RT_EOK) + { + if (data_packet->data_type == DATA_TYPE_STA_ETH_DATA) + { + /* Ethernet package from station device */ + rt_wlan_dev_report_data(wifi_sta.wlan, (void *)data_packet->buffer, data_packet->data_len); + } + else if (data_packet->data_type == DATA_TYPE_AP_ETH_DATA) + { + /* Ethernet package from ap device */ + rt_wlan_dev_report_data(wifi_ap.wlan, (void *)data_packet->buffer, data_packet->data_len); + } + else if (data_packet->data_type == DATA_TYPE_PROMISC_ETH_DATA) + { + /* air wifi package from promisc */ + rt_wlan_dev_promisc_handler(wifi_sta.wlan, (void *)data_packet->buffer, data_packet->data_len); + } + /* event callback */ + else if(data_packet->data_type == DATA_TYPE_CB) + { + struct rw007_resp * resp = (struct rw007_resp *)data_packet->buffer; + if(resp->cmd == RT_WLAN_DEV_EVT_SCAN_REPORT) + { + /* parse scan report event data */ + struct rt_wlan_buff buff; + struct rt_wlan_info * wlan_info; + wlan_info = (struct rt_wlan_info *)&resp->value; + buff.data = wlan_info; + buff.len = sizeof(struct rt_wlan_info); + + /* indicate scan report event */ + rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, RT_WLAN_DEV_EVT_SCAN_REPORT, &buff); + } + else + { + if(resp->cmd == RT_WLAN_DEV_EVT_AP_START || resp->cmd == RT_WLAN_DEV_EVT_AP_STOP || + resp->cmd == RT_WLAN_DEV_EVT_AP_ASSOCIATED || resp->cmd == RT_WLAN_DEV_EVT_AP_DISASSOCIATED) + { + /* indicate ap device event */ + rt_wlan_dev_indicate_event_handle(wifi_ap.wlan, (rt_wlan_dev_event_t)resp->cmd, RT_NULL); + } + else + { + /* indicate sta device event */ + rt_wlan_dev_indicate_event_handle(wifi_sta.wlan, (rt_wlan_dev_event_t)resp->cmd, RT_NULL); + } + } + } + else if (data_packet->data_type == DATA_TYPE_RESP) + { + /* parse cmd's response */ + struct rw007_resp * resp = (struct rw007_resp *)data_packet->buffer; + if(resp->cmd < RW00x_CMD_MAX_NUM) + { + if(dev->resp[resp->cmd]) + { + rt_free(dev->resp[resp->cmd]); + } + + /* stash response result */ + dev->resp[resp->cmd] = rt_malloc(MAX_SPI_PACKET_SIZE); + if(dev->resp[resp->cmd]) + { + rt_memcpy(dev->resp[resp->cmd], resp, MAX_SPI_PACKET_SIZE); + + /* notify response arrived */ + rt_event_send(dev->rw007_cmd_event, RW00x_CMD_RESP_EVENT(resp->cmd)); + } + } + } + /* free recv mempool memory */ + rt_mp_free((void *)data_packet); + } + } +} + +static void spi_wifi_data_thread_entry(void *parameter) +{ + rt_bool_t empty_read = RT_TRUE; + rt_uint32_t event; + int state; + + while (1) + { + /* receive first event */ + if (rt_event_recv(&spi_wifi_data_event, + RW007_MASTER_DATA| + RW007_SLAVE_INT, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + RT_WAITING_FOREVER, + &event) != RT_EOK) + + { + continue; + } + /* transfer */ + state = spi_wifi_transfer(&rw007_spi); + + /* Try reading again */ + if(state == TRANSFER_DATA_CONTINUE) + { + rt_event_send(&spi_wifi_data_event, RW007_SLAVE_INT); + empty_read = RT_TRUE; + } + else + { + if ((state == TRANSFER_DATA_SUCCESS) && (empty_read == RT_TRUE)) + { + rt_event_send(&spi_wifi_data_event, RW007_SLAVE_INT); + empty_read = RT_FALSE; + } + else + { + empty_read = RT_TRUE; + } + } + } +} + +rt_inline struct rw007_wifi *wifi_get_dev_by_wlan(struct rt_wlan_device *wlan) +{ + if (wlan == wifi_sta.wlan) + { + return &wifi_sta; + } + if (wlan == wifi_ap.wlan) + { + return &wifi_ap; + } + return RT_NULL; +} + +rt_inline void spi_send_cmd(struct rw007_spi * hspi, RW00x_CMD COMMAND, void * buffer, rt_uint32_t len) +{ + struct spi_data_packet * data_packet; + struct rw007_cmd * cmd; + + data_packet = rt_mp_alloc(&hspi->spi_tx_mp, RT_WAITING_FOREVER); + data_packet->data_type = DATA_TYPE_CMD; + + cmd = (struct rw007_cmd *)data_packet->buffer; + cmd->cmd = COMMAND; + cmd->len = len; + if(cmd->len) + { + rt_memcpy(&cmd->value, buffer, cmd->len); + } + + data_packet->data_len = member_offset(struct rw007_cmd, value) + cmd->len; + + rt_mb_send(&hspi->spi_tx_mb, (rt_uint32_t)data_packet); + rt_event_send(&spi_wifi_data_event, RW007_MASTER_DATA); +} + +rt_inline rt_err_t spi_set_data(struct rt_wlan_device *wlan, RW00x_CMD COMMAND, void * buffer, rt_uint32_t len) +{ + struct rw007_spi * hspi = wifi_get_dev_by_wlan(wlan)->hspi; + rt_uint32_t result_event; + rt_err_t result = RT_EOK; + spi_send_cmd(hspi, COMMAND, buffer, len); + if(rt_event_recv(hspi->rw007_cmd_event, + RW00x_CMD_RESP_EVENT(COMMAND), + RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(10000), + &result_event) != RT_EOK) + { + return -RT_ETIMEOUT; + } + + if(hspi->resp[COMMAND]) + { + result = hspi->resp[COMMAND]->result; + rt_free(hspi->resp[COMMAND]); + hspi->resp[COMMAND] = RT_NULL; + return result; + } + return RT_EOK; +} + +rt_inline rt_err_t spi_get_data(struct rt_wlan_device *wlan, RW00x_CMD COMMAND, void * buffer, rt_uint32_t *len) +{ + struct rw007_spi * hspi = wifi_get_dev_by_wlan(wlan)->hspi; + rt_uint32_t result_event; + rt_err_t result = RT_EOK; + spi_send_cmd(hspi, COMMAND, RT_NULL, 0); + if(rt_event_recv(hspi->rw007_cmd_event, + RW00x_CMD_RESP_EVENT(COMMAND), + RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(10000), + &result_event) != RT_EOK) + { + return -RT_ETIMEOUT; + } + + if(hspi->resp[COMMAND]) + { + *len = hspi->resp[COMMAND]->len; + rt_memcpy(buffer, &hspi->resp[COMMAND]->value, hspi->resp[COMMAND]->len); + result = hspi->resp[COMMAND]->result; + rt_free(hspi->resp[COMMAND]); + hspi->resp[COMMAND] = RT_NULL; + return result; + } + return RT_EOK; +} + +rt_err_t rw007_sn_get(char sn[24]) +{ + rt_uint32_t size_of_data; + return spi_get_data(wifi_sta.wlan, RW00x_CMD_GET_SN, sn, &size_of_data); +} + +rt_err_t rw007_version_get(char version[16]) +{ + rt_uint32_t size_of_data; + return spi_get_data(wifi_sta.wlan, RW00x_CMD_GET_VSR, version, &size_of_data); +} + +static rt_err_t wlan_init(struct rt_wlan_device *wlan) +{ + if(inited == RT_FALSE) + { + inited = RT_TRUE; + return spi_set_data(wlan, RW00x_CMD_INIT, RT_NULL, 0); + } + return RT_EOK; +} + +static rt_err_t wlan_mode(struct rt_wlan_device *wlan, rt_wlan_mode_t mode) +{ + return spi_set_data(wlan, RW00x_CMD_SET_MODE, &mode, sizeof(mode)); +} + +static rt_err_t wlan_scan(struct rt_wlan_device *wlan, struct rt_scan_info *scan_info) +{ + return spi_set_data(wlan, RW00x_CMD_SCAN, RT_NULL, 0); +} + +static rt_err_t wlan_join(struct rt_wlan_device *wlan, struct rt_sta_info *sta_info) +{ + struct rw007_ap_info_value value; + value.info.security = sta_info->security; + value.info.band = RT_802_11_BAND_2_4GHZ; + value.info.datarate = 0; + value.info.channel = sta_info->channel; + value.info.hidden = 0; + value.info.rssi = 0; + value.info.ssid = sta_info->ssid; + rt_memcpy(value.info.bssid, sta_info->bssid, 6); + strncpy(value.passwd, (const char *)&sta_info->key.val[0], sta_info->key.len); + value.passwd[sta_info->key.len] = '\0'; + return spi_set_data(wlan, RW00x_CMD_JOIN, &value, sizeof(value)); +} + +static rt_err_t wlan_softap(struct rt_wlan_device *wlan, struct rt_ap_info *ap_info) +{ + struct rw007_ap_info_value value; + value.info.security = ap_info->security; + value.info.band = RT_802_11_BAND_2_4GHZ; + value.info.datarate = 0; + value.info.channel = ap_info->channel; + value.info.hidden = ap_info->hidden; + value.info.rssi = 0; + value.info.ssid = ap_info->ssid; + strncpy(value.passwd, (const char *)&ap_info->key.val[0], ap_info->key.len); + value.passwd[ap_info->key.len] = '\0'; + return spi_set_data(wlan, RW00x_CMD_SOFTAP, &value, sizeof(value)); +} + +static rt_err_t wlan_disconnect(struct rt_wlan_device *wlan) +{ + return spi_set_data(wlan, RW00x_CMD_DISCONNECT, RT_NULL, 0); +} + +static rt_err_t wlan_ap_stop(struct rt_wlan_device *wlan) +{ + return spi_set_data(wlan, RW00x_CMD_AP_STOP, RT_NULL, 0); +} + +static rt_err_t wlan_ap_deauth(struct rt_wlan_device *wlan, rt_uint8_t mac[]) +{ + return spi_set_data(wlan, RW00x_CMD_AP_DEAUTH, mac, 6); +} + +static rt_err_t wlan_scan_stop(struct rt_wlan_device *wlan) +{ + return spi_set_data(wlan, RW00x_CMD_SCAN_STOP, RT_NULL, 0); +} + +static int wlan_get_rssi(struct rt_wlan_device *wlan) +{ + int rssi = -1; + rt_uint32_t size_of_data; + spi_get_data(wlan, RW00x_CMD_GET_RSSI, &rssi, &size_of_data); + return rssi; +} + +static rt_err_t wlan_set_powersave(struct rt_wlan_device *wlan, int level) +{ + return spi_set_data(wlan, RW00x_CMD_SET_PWR_SAVE, &level, sizeof(level)); +} + +static int wlan_get_powersave(struct rt_wlan_device *wlan) +{ + int level = -1; + rt_uint32_t size_of_data; + spi_get_data(wlan, RW00x_CMD_GET_PWR_SAVE, &level, &size_of_data); + return level; +} + +static rt_err_t wlan_cfg_promisc(struct rt_wlan_device *wlan, rt_bool_t start) +{ + return spi_set_data(wlan, RW00x_CMD_CFG_PROMISC, &start, sizeof(start)); +} + +static rt_err_t wlan_cfg_filter(struct rt_wlan_device *wlan, struct rt_wlan_filter *filter) +{ + return -RT_ENOSYS; +} + +static rt_err_t wlan_set_channel(struct rt_wlan_device *wlan, int channel) +{ + return spi_set_data(wlan, RW00x_CMD_SET_CHANNEL, &channel, sizeof(channel)); +} + +static int wlan_get_channel(struct rt_wlan_device *wlan) +{ + int channel = -1; + rt_uint32_t size_of_data; + spi_get_data(wlan, RW00x_CMD_GET_CHANNEL, &channel, &size_of_data); + return channel; +} + +static rt_err_t wlan_set_country(struct rt_wlan_device *wlan, rt_country_code_t country_code) +{ + return spi_set_data(wlan, RW00x_CMD_SET_COUNTRY, &country_code, sizeof(country_code)); +} + +static rt_country_code_t wlan_get_country(struct rt_wlan_device *wlan) +{ + rt_country_code_t code; + rt_uint32_t size_of_data; + spi_get_data(wlan, RW00x_CMD_GET_COUNTRY, &code, &size_of_data); + return code; +} + +static rt_err_t wlan_set_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[]) +{ + if(wlan == wifi_sta.wlan) + { + return spi_set_data(wlan, RW00x_CMD_MAC_SET, mac, 6); + } + return spi_set_data(wlan, RW00x_CMD_AP_MAC_SET, mac, 6); +} + +static rt_err_t wlan_get_mac(struct rt_wlan_device *wlan, rt_uint8_t mac[]) +{ + rt_uint32_t size_of_data; + if(wlan == wifi_sta.wlan) + { + return spi_get_data(wlan, RW00x_CMD_MAC_GET, mac, &size_of_data); + } + return spi_get_data(wlan, RW00x_CMD_AP_MAC_GET, mac, &size_of_data); +} + +static int wlan_send(struct rt_wlan_device *wlan, void *buff, int len) +{ + struct rw007_spi * hspi = wifi_get_dev_by_wlan(wlan)->hspi; + struct spi_data_packet * data_packet; + + if(wlan == RT_NULL) + { + return -1; + } + + data_packet = rt_mp_alloc(&hspi->spi_tx_mp, RT_WAITING_FOREVER); + + if (wlan == wifi_sta.wlan) + { + data_packet->data_type = DATA_TYPE_STA_ETH_DATA; + } + else + { + data_packet->data_type = DATA_TYPE_AP_ETH_DATA; + } + data_packet->data_len = len; + + rt_memcpy(data_packet->buffer, buff, len); + + rt_mb_send(&hspi->spi_tx_mb, (rt_uint32_t)data_packet); + rt_event_send(&spi_wifi_data_event, RW007_MASTER_DATA); + return len; +} + +const static struct rt_wlan_dev_ops ops = +{ + .wlan_init = wlan_init, + .wlan_mode = wlan_mode, + .wlan_scan = wlan_scan, + .wlan_join = wlan_join, + .wlan_softap = wlan_softap, + .wlan_disconnect = wlan_disconnect, + .wlan_ap_stop = wlan_ap_stop, + .wlan_ap_deauth = wlan_ap_deauth, + .wlan_scan_stop = wlan_scan_stop, + .wlan_get_rssi = wlan_get_rssi, + .wlan_set_powersave = wlan_set_powersave, + .wlan_get_powersave = wlan_get_powersave, + .wlan_cfg_promisc = wlan_cfg_promisc, + .wlan_cfg_filter = wlan_cfg_filter, + .wlan_set_channel = wlan_set_channel, + .wlan_get_channel = wlan_get_channel, + .wlan_set_country = wlan_set_country, + .wlan_get_country = wlan_get_country, + .wlan_set_mac = wlan_set_mac, + .wlan_get_mac = wlan_get_mac, + .wlan_recv = RT_NULL, + .wlan_send = wlan_send, +}; + +rt_err_t rt_hw_wifi_init(const char *spi_device_name) +{ + static struct rt_wlan_device wlan_sta, wlan_ap; + rt_err_t ret; + wifi_sta.wlan = &wlan_sta; + wifi_sta.hspi = &rw007_spi; + wifi_ap.wlan = &wlan_ap; + wifi_ap.hspi = &rw007_spi; + /* align and struct size check. */ + RT_ASSERT((SPI_MAX_DATA_LEN & 0x03) == 0); + + memset(&rw007_spi, 0, sizeof(struct rw007_spi)); + + rw007_spi.spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); + + if (rw007_spi.spi_device == RT_NULL) + { + LOG_E("spi device %s not found!\r", spi_device_name); + return -RT_ENOSYS; + } + + /* config spi */ + { + struct rt_spi_configuration cfg; + cfg.data_width = 8; + cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0. */ + cfg.max_hz = 30 * 1000000; /* 15M 007 max 30M */ + rt_spi_configure(rw007_spi.spi_device, &cfg); + } + + /* init spi send mempool */ + rt_mp_init(&rw007_spi.spi_tx_mp, + "spi_tx", + &rw007_spi.spi_tx_mempool[0], + sizeof(rw007_spi.spi_tx_mempool), + sizeof(struct spi_data_packet)); + + /* init spi send mailbox */ + rt_mb_init(&rw007_spi.spi_tx_mb, + "spi_tx", + &rw007_spi.spi_tx_mb_pool[0], + SPI_TX_POOL_SIZE, + RT_IPC_FLAG_PRIO); + + /* init spi recv mempool */ + rt_mp_init(&rw007_spi.spi_rx_mp, + "spi_rx", + &rw007_spi.spi_rx_mempool[0], + sizeof(rw007_spi.spi_rx_mempool), + sizeof(struct spi_data_packet)); + + /* init spi recv mailbox */ + rt_mb_init(&rw007_spi.spi_rx_mb, + "spi_rx", + &rw007_spi.spi_rx_mb_pool[0], + SPI_TX_POOL_SIZE, + RT_IPC_FLAG_PRIO); + + /* init spi data notify event */ + rt_event_init(&spi_wifi_data_event, "wifi", RT_IPC_FLAG_FIFO); + + rw007_spi.rw007_cmd_event = rt_event_create("wifi_cmd", RT_IPC_FLAG_FIFO); + + /* register wlan device for ap */ + ret = rt_wlan_dev_register(&wlan_ap, RT_WLAN_DEVICE_AP_NAME, &ops, 0, &wifi_ap); + if (ret != RT_EOK) + { + return ret; + } + + /* register wlan device for sta */ + ret = rt_wlan_dev_register(&wlan_sta, RT_WLAN_DEVICE_STA_NAME, &ops, 0, &wifi_sta); + if (ret != RT_EOK) + { + return ret; + } + + { + rt_thread_t tid; + + /* Create package parse thread */ + tid = rt_thread_create("wifi_handle", + wifi_data_process_thread_entry, + &rw007_spi, + 2048, + 8, + 20); + if(!tid) + { + return -RT_ERROR; + } + rt_thread_startup(tid); + + /* Create wifi transfer thread */ + tid = rt_thread_create("wifi_xfer", + spi_wifi_data_thread_entry, + RT_NULL, + 2048, + 9, + 20); + if(!tid) + { + return -RT_ERROR; + } + rt_thread_startup(tid); + } + + spi_wifi_hw_init(); + + return RT_EOK; +} + +void spi_wifi_isr(int vector) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + /* device has a package to ready transfer */ + rt_event_send(&spi_wifi_data_event, RW007_SLAVE_INT); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +#ifdef WLAN_DEV_MONITOR +int rw007_dump(int argc, char **argv) +{ + if (argc == 1) + { + goto __usage; + } + + if (strcmp(argv[1], "--show") == 0) + { + rt_kprintf("Wifi Device transmission information:\n"); + rt_kprintf("Total packets : %d\n", packet.total); + rt_kprintf("Failed packets : %d\n", packet.lose); + rt_kprintf("Retry count : %d\n", packet.retry); + rt_kprintf("Stage 1 error : %d\n", packet.first_stage_err); + rt_kprintf("Stage 2 error : %d\n", packet.second_stage_err); + } + else if (strcmp(argv[1], "-h") == 0) + { + goto __usage; + } + else if (strcmp(argv[1], "-c") == 0) + { + rt_memset(&packet, 0, sizeof(packet)); + } + return 0; +__usage: + rt_kprintf("Usage: wifi_dump [-s|-c]\n"); + rt_kprintf("\n"); + rt_kprintf("Miscellaneous:\n"); + rt_kprintf(" -h print this message and quit\n"); + rt_kprintf(" --show show information\n"); + rt_kprintf(" -c Clear record data\n"); + return 0; +} + +#ifdef RT_USING_FINSH + #include + MSH_CMD_EXPORT(rw007_dump, the rw007 Informations Viewer); +#endif +#endif + diff --git a/firmware/project.uvprojx b/firmware/project.uvprojx index 03ae502..865eaba 100644 --- a/firmware/project.uvprojx +++ b/firmware/project.uvprojx @@ -338,7 +338,7 @@ --c99 RT_USING_ARM_LIBC - .;rt-thread\include;applications;CMSIS_and_startup;CMSIS_and_startup\CMSIS;drivers;drivers\config;Hal_lib\inc;test;rt-thread\libcpu\arm\cortex-m4;rt-thread\libcpu\arm\common;rt-thread\components\dfs\include;rt-thread\components\dfs\filesystems\devfs;rt-thread\components\dfs\filesystems\elmfat;rt-thread\components\drivers\include;rt-thread\components\drivers\include;rt-thread\components\drivers\spi;rt-thread\components\drivers\include;rt-thread\components\drivers\include;rt-thread\components\finsh;rt-thread\components\libc\compilers\armlibc;rt-thread\components\libc\compilers\common + .;rt-thread\include;applications;CMSIS_and_startup;CMSIS_and_startup\CMSIS;drivers;drivers\config;Hal_lib\inc;packages\rw007-latest;packages\rw007-latest\inc;test;rt-thread\libcpu\arm\cortex-m4;rt-thread\libcpu\arm\common;rt-thread\components\dfs\include;rt-thread\components\dfs\filesystems\devfs;rt-thread\components\dfs\filesystems\elmfat;rt-thread\components\drivers\include;rt-thread\components\drivers\include;rt-thread\components\drivers\spi;rt-thread\components\drivers\include;rt-thread\components\drivers\include;rt-thread\components\drivers\wlan;rt-thread\components\finsh;rt-thread\components\libc\compilers\armlibc;rt-thread\components\libc\compilers\common;rt-thread\components\net\lwip-2.0.2\src;rt-thread\components\net\lwip-2.0.2\src\include;rt-thread\components\net\lwip-2.0.2\src\include\ipv4;rt-thread\components\net\lwip-2.0.2\src\arch\include;rt-thread\components\net\lwip-2.0.2\src\include\netif;rt-thread\components\net\lwip-2.0.2\src\include\posix @@ -579,6 +579,90 @@ + + rw007 + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + spi_wifi_rw007.c + 1 + packages\rw007-latest\src\spi_wifi_rw007.c + + + rw007_stm32_port.c + 1 + packages\rw007-latest\example\rw007_stm32_port.c + + + test @@ -796,6 +880,41 @@ 1 rt-thread\components\drivers\src\workqueue.c + + wlan_cfg.c + 1 + rt-thread\components\drivers\wlan\wlan_cfg.c + + + wlan_cmd.c + 1 + rt-thread\components\drivers\wlan\wlan_cmd.c + + + wlan_dev.c + 1 + rt-thread\components\drivers\wlan\wlan_dev.c + + + wlan_lwip.c + 1 + rt-thread\components\drivers\wlan\wlan_lwip.c + + + wlan_mgnt.c + 1 + rt-thread\components\drivers\wlan\wlan_mgnt.c + + + wlan_prot.c + 1 + rt-thread\components\drivers\wlan\wlan_prot.c + + + wlan_workqueue.c + 1 + rt-thread\components\drivers\wlan\wlan_workqueue.c + @@ -868,6 +987,196 @@ + + lwIP + + + sys_arch.c + 1 + rt-thread\components\net\lwip-2.0.2\src\arch\sys_arch.c + + + api_lib.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\api_lib.c + + + api_msg.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\api_msg.c + + + err.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\err.c + + + netbuf.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\netbuf.c + + + netdb.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\netdb.c + + + netifapi.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\netifapi.c + + + sockets.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\sockets.c + + + tcpip.c + 1 + rt-thread\components\net\lwip-2.0.2\src\api\tcpip.c + + + def.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\def.c + + + dns.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\dns.c + + + inet_chksum.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\inet_chksum.c + + + init.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\init.c + + + ip.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ip.c + + + memp.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\memp.c + + + netif.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\netif.c + + + pbuf.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\pbuf.c + + + raw.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\raw.c + + + stats.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\stats.c + + + core_sys.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\sys.c + + + tcp.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\tcp.c + + + tcp_in.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\tcp_in.c + + + tcp_out.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\tcp_out.c + + + timeouts.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\timeouts.c + + + udp.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\udp.c + + + ethernet.c + 1 + rt-thread\components\net\lwip-2.0.2\src\netif\ethernet.c + + + ethernetif.c + 1 + rt-thread\components\net\lwip-2.0.2\src\netif\ethernetif.c + + + lowpan6.c + 1 + rt-thread\components\net\lwip-2.0.2\src\netif\lowpan6.c + + + autoip.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\autoip.c + + + dhcp.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\dhcp.c + + + etharp.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\etharp.c + + + icmp.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\icmp.c + + + igmp.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\igmp.c + + + ip4.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\ip4.c + + + ip4_addr.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\ip4_addr.c + + + ip4_frag.c + 1 + rt-thread\components\net\lwip-2.0.2\src\core\ipv4\ip4_frag.c + + + ping.c + 1 + rt-thread\components\net\lwip-2.0.2\src\apps\ping\ping.c + + + diff --git a/firmware/rtconfig.h b/firmware/rtconfig.h index 990847f..62cc22c 100644 --- a/firmware/rtconfig.h +++ b/firmware/rtconfig.h @@ -99,9 +99,24 @@ #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +#define RT_USING_SPI /* Using WiFi */ +#define RT_USING_WIFI +#define RT_WLAN_DEVICE_STA_NAME "wlan0" +#define RT_WLAN_DEVICE_AP_NAME "wlan1" +#define RT_WLAN_DEFAULT_PROT "lwip" +#define RT_WLAN_SCAN_WAIT_MS 10000 +#define RT_WLAN_CONNECT_WAIT_MS 10000 +#define RT_WLAN_SSID_MAX_LENGTH 32 +#define RT_WLAN_PASSWORD_MAX_LENGTH 32 +#define RT_WLAN_SCAN_SORT +#define RT_WLAN_CFG_INFO_MAX 3 +#define RT_WLAN_WORKQUEUE_THREAD_NAME "wlan_job" +#define RT_WLAN_WORKQUEUE_THREAD_SIZE 2048 +#define RT_WLAN_WORKQUEUE_THREAD_PRIO 22 +#define RT_WLAN_DEV_EVENT_NUM 2 /* Using USB */ @@ -118,9 +133,49 @@ /* Network interface device */ +#define NETDEV_USING_PING /* light weight TCP/IP stack */ +#define RT_USING_LWIP +#define RT_USING_LWIP202 +#define RT_LWIP_IGMP +#define RT_LWIP_ICMP +#define RT_LWIP_DNS +#define RT_LWIP_DHCP +#define IP_SOF_BROADCAST 1 +#define IP_SOF_BROADCAST_RECV 1 + +/* Static IPv4 Address */ + +#define RT_LWIP_IPADDR "192.168.1.30" +#define RT_LWIP_GWADDR "192.168.1.1" +#define RT_LWIP_MSKADDR "255.255.255.0" +#define RT_LWIP_UDP +#define RT_LWIP_TCP +#define RT_LWIP_RAW +#define RT_MEMP_NUM_NETCONN 8 +#define RT_LWIP_PBUF_NUM 16 +#define RT_LWIP_RAW_PCB_NUM 4 +#define RT_LWIP_UDP_PCB_NUM 4 +#define RT_LWIP_TCP_PCB_NUM 4 +#define RT_LWIP_TCP_SEG_NUM 40 +#define RT_LWIP_TCP_SND_BUF 8196 +#define RT_LWIP_TCP_WND 8196 +#define RT_LWIP_TCPTHREAD_PRIORITY 10 +#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8 +#define RT_LWIP_TCPTHREAD_STACKSIZE 1024 +#define RT_LWIP_ETHTHREAD_PRIORITY 12 +#define RT_LWIP_ETHTHREAD_STACKSIZE 1024 +#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8 +#define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_NETIF_LINK_CALLBACK 1 +#define SO_REUSE 1 +#define LWIP_SO_RCVTIMEO 1 +#define LWIP_SO_SNDTIMEO 1 +#define LWIP_SO_RCVBUF 1 +#define LWIP_NETIF_LOOPBACK 0 +#define RT_LWIP_USING_PING /* Modbus master and slave stack */ @@ -146,6 +201,16 @@ /* Wiced WiFi */ +#define PKG_USING_RW007 +#define PKG_USING_RW007_LATEST_VERSION +#define RW007_USING_STM32_DRIVERS +#define RW007_SPI_MAX_HZ 30000000 +#define RW007_SPI_BUS_NAME "spi2" +#define RW007_CS_PIN 54 +#define RW007_BOOT0_PIN 175 +#define RW007_BOOT1_PIN 102 +#define RW007_INT_BUSY_PIN 64 +#define RW007_RST_PIN 65 /* IoT Cloud */ @@ -173,13 +238,9 @@ /* samples: kernel and components samples */ -#define SOC_TKM32F499 +#define SOC_GD32450Z #define BSP_USING_SDRAM #define BSP_USING_UART0 -#define RT_USING_SPI #define BSP_USING_SPI2 -#define RW007_CS_PIN 54 -#define RW007_SPI_BUS_NAME "spi2" -#define RW007_DEV_NAME "rw007" #endif -- Gitee From 0fea56621727bbb1a5e64a4bfdc22d2c90f78d1f Mon Sep 17 00:00:00 2001 From: chenjiafan Date: Thu, 3 Sep 2020 13:52:00 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[update]=20rw007=20WIFI=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=8F=AF=E4=BB=A5=E8=BF=90=E8=A1=8C=E8=B5=B7=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/.config | 4 +- firmware/drivers/drv_spi.c | 56 ++++++++++--------- .../rw007-latest/example/rw007_stm32_port.c | 8 +-- firmware/rtconfig.h | 4 +- 4 files changed, 38 insertions(+), 34 deletions(-) diff --git a/firmware/.config b/firmware/.config index 14c9ecc..dc732a9 100644 --- a/firmware/.config +++ b/firmware/.config @@ -350,8 +350,8 @@ CONFIG_RW007_SPI_BUS_NAME="spi2" CONFIG_RW007_CS_PIN=54 CONFIG_RW007_BOOT0_PIN=175 CONFIG_RW007_BOOT1_PIN=102 -CONFIG_RW007_INT_BUSY_PIN=64 -CONFIG_RW007_RST_PIN=65 +CONFIG_RW007_INT_BUSY_PIN=14 +CONFIG_RW007_RST_PIN=67 # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set diff --git a/firmware/drivers/drv_spi.c b/firmware/drivers/drv_spi.c index d65c11d..3aeaeb1 100644 --- a/firmware/drivers/drv_spi.c +++ b/firmware/drivers/drv_spi.c @@ -133,27 +133,16 @@ rt_err_t tk499_spi_init(struct tk499_spi *spi_drv, struct rt_spi_configuration * return RT_EOK; } -static void spi_transmit(SPI_TypeDef* SPIx, const rt_uint8_t *data, rt_uint16_t size) +static rt_uint8_t spi_read_write_byte(SPI_TypeDef* SPIx, rt_uint8_t data) { - while(size) + SPI_SendData(SPIx, data); + while (1) { - size--; - SPI_SendData(SPIx, *data); - while(!(SPIx->CSTAT&0x01)) {} - data++; - } -} - -static void spi_receive(SPI_TypeDef* SPIx, rt_uint8_t *data, rt_uint16_t size) -{ - while(size) - { - size--; - if(SPI_GetFlagStatus(SPIx, SPI_FLAG_RXAVL)) + if(SPI_GetFlagStatus(SPIx, SPI_FLAG_RXAVL)) { - *data = SPI_ReceiveData(SPIx); + return SPI_ReceiveData(SPIx); } - data++; + } } @@ -172,15 +161,31 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * { GPIO_WriteBit(cs->GPIOx, cs->GPIO_Pin, Bit_RESET); } - - if(message->recv_buf) - { - spi_receive(spi_handle->Instance, message->recv_buf, message->length); - } - if(message->send_buf) + const rt_uint8_t *send_ptr = message->send_buf; + rt_uint8_t *recv_ptr = message->recv_buf; + rt_size_t size = message->length; + + while(size--) { - spi_transmit(spi_handle->Instance, message->send_buf, message->length); + rt_uint8_t data = 0xFF; + + if(send_ptr != RT_NULL && recv_ptr != RT_NULL) + { + data = *send_ptr++; + *recv_ptr = spi_read_write_byte(spi_handle->Instance, data); + recv_ptr++; + } + else if(send_ptr != RT_NULL) + { + data = *send_ptr++; + spi_read_write_byte(spi_handle->Instance, data); + } + else if(recv_ptr != RT_NULL) + { + *recv_ptr = spi_read_write_byte(spi_handle->Instance, data); + *recv_ptr++; + } } if(message->cs_release) @@ -218,7 +223,6 @@ static int rt_hw_spi_bus_init(void) for (i = 0; i < sizeof(spi_config) / sizeof(spi_config[0]); i++) { - RCC_AHBPeriphClockCmd(spi_config[i].RCC_AHBPeriph ,ENABLE); RCC_APB2PeriphClockCmd(spi_config[i].RCC_APB2Periph, ENABLE); GPIO_InitStructure.GPIO_Pin = spi_config[i].CLK_GPIO_Pin | spi_config[i].MOSI_GPIO_Pin; @@ -231,7 +235,7 @@ static int rt_hw_spi_bus_init(void) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(spi_config[i].GPIOx, &GPIO_InitStructure); - GPIO_PinAFConfig(spi_config[i].GPIOx, spi_config[i].CLK_GPIO_Pin | spi_config[i].MOSI_GPIO_Pin, GPIO_AF_SPI); + GPIO_PinAFConfig(spi_config[i].GPIOx, spi_config[i].CLK_GPIO_Pin | spi_config[i].MOSI_GPIO_Pin | spi_config[i].MISO_GPIO_Pin, GPIO_AF_SPI); spi_bus_obj[i].config = &spi_config[i]; spi_bus_obj[i].spi_bus.parent.user_data = &spi_config[i]; diff --git a/firmware/packages/rw007-latest/example/rw007_stm32_port.c b/firmware/packages/rw007-latest/example/rw007_stm32_port.c index b1939a7..f9369d5 100644 --- a/firmware/packages/rw007-latest/example/rw007_stm32_port.c +++ b/firmware/packages/rw007-latest/example/rw007_stm32_port.c @@ -20,10 +20,10 @@ static void rw007_gpio_init(void) rt_pin_write(RW007_RST_PIN, PIN_HIGH); /* Wait rw007 ready(exit busy stat) */ - // while(!rt_pin_read(RW007_INT_BUSY_PIN)) - // { - // rt_thread_delay(5); - // } + while(!rt_pin_read(RW007_INT_BUSY_PIN)) + { + rt_thread_delay(5); + } rt_thread_delay(rt_tick_from_millisecond(200)); rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLUP); diff --git a/firmware/rtconfig.h b/firmware/rtconfig.h index 62cc22c..312752c 100644 --- a/firmware/rtconfig.h +++ b/firmware/rtconfig.h @@ -209,8 +209,8 @@ #define RW007_CS_PIN 54 #define RW007_BOOT0_PIN 175 #define RW007_BOOT1_PIN 102 -#define RW007_INT_BUSY_PIN 64 -#define RW007_RST_PIN 65 +#define RW007_INT_BUSY_PIN 14 +#define RW007_RST_PIN 67 /* IoT Cloud */ -- Gitee