From a40e9d376254e1b475550e8b6e0558f6bc8bf19a Mon Sep 17 00:00:00 2001 From: Tomasz Bursztyka Date: Fri, 24 Jan 2020 09:24:59 +0100 Subject: [PATCH] drivers/wifi: Switch WINC1500 to new GPIO API Use new API to configure and interact with GPIOs. Move GPIO initialization from sample into driver. The existing physical/line level control has been kept rather than converting to logical level signals. Also improve error messages. Signed-off-by: Tomasz Bursztyka Signed-off-by: Johann Fischer Signed-off-by: Peter Bigot --- drivers/wifi/winc1500/wifi_winc1500.c | 23 +++++++--- drivers/wifi/winc1500/wifi_winc1500_nm_bsp.c | 31 ++++++------- .../winc1500/wifi_winc1500_nm_bsp_internal.h | 15 ++++++- .../winc1500/wifi_winc1500_nm_bus_wrapper.c | 38 ++++++++++++++++ include/drivers/wifi/winc1500.h | 27 ------------ samples/net/wifi/src/wifi_test.c | 44 ------------------- 6 files changed, 81 insertions(+), 97 deletions(-) delete mode 100644 include/drivers/wifi/winc1500.h diff --git a/drivers/wifi/winc1500/wifi_winc1500.c b/drivers/wifi/winc1500/wifi_winc1500.c index 87ecf7d5b00..40f3e7372a2 100644 --- a/drivers/wifi/winc1500/wifi_winc1500.c +++ b/drivers/wifi/winc1500/wifi_winc1500.c @@ -968,6 +968,7 @@ static int winc1500_mgmt_scan(struct device *dev, scan_result_cb_t cb) if (m2m_wifi_request_scan(M2M_WIFI_CH_ALL)) { w1500_data.scan_cb = NULL; + LOG_ERR("Failed to request scan"); return -EIO; } @@ -1069,25 +1070,35 @@ static int winc1500_init(struct device *dev) w1500_data.connected = false; ret = m2m_wifi_init(¶m); - if (ret) { + if (ret != M2M_SUCCESS) { LOG_ERR("m2m_wifi_init return error!(%d)", ret); return -EIO; } - m2m_wifi_set_scan_region(WINC1500_REGION); - socketInit(); registerSocketCallback(winc1500_socket_cb, NULL); - m2m_wifi_get_otp_mac_address(w1500_data.mac, &is_valid); + if (m2m_wifi_get_otp_mac_address(w1500_data.mac, &is_valid) != M2M_SUCCESS) { + LOG_ERR("Failed to get MAC address"); + } + LOG_DBG("WINC1500 MAC Address from OTP (%d) " "%02X:%02X:%02X:%02X:%02X:%02X", is_valid, w1500_data.mac[0], w1500_data.mac[1], w1500_data.mac[2], w1500_data.mac[3], w1500_data.mac[4], w1500_data.mac[5]); - m2m_wifi_set_power_profile(PWR_LOW1); - m2m_wifi_set_tx_power(TX_PWR_LOW); + if (m2m_wifi_set_scan_region(WINC1500_REGION) != M2M_SUCCESS) { + LOG_ERR("Failed set scan region"); + } + + if (m2m_wifi_set_power_profile(PWR_LOW1) != M2M_SUCCESS) { + LOG_ERR("Failed set power profile"); + } + + if (m2m_wifi_set_tx_power(TX_PWR_LOW) != M2M_SUCCESS) { + LOG_ERR("Failed set tx power"); + } /* monitoring thread for winc wifi callbacks */ k_thread_create(&winc1500_thread_data, winc1500_stack, diff --git a/drivers/wifi/winc1500/wifi_winc1500_nm_bsp.c b/drivers/wifi/winc1500/wifi_winc1500_nm_bsp.c index 432d2ad8e11..f73a6f2e50c 100644 --- a/drivers/wifi/winc1500/wifi_winc1500_nm_bsp.c +++ b/drivers/wifi/winc1500/wifi_winc1500_nm_bsp.c @@ -17,7 +17,7 @@ void (*isr_function)(void); static inline void chip_isr(struct device *port, struct gpio_callback *cb, - uint32_t pins) + gpio_port_pins_t pins) { if (isr_function) { isr_function(); @@ -42,18 +42,18 @@ s8_t nm_bsp_deinit(void) void nm_bsp_reset(void) { - gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev, - winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 0); - gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev, - winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 0); + gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev, + winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 0); + gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev, + winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 0); nm_bsp_sleep(100); - gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev, - winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 1); + gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev, + winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 1); nm_bsp_sleep(10); - gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev, - winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 1); + gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev, + winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 1); nm_bsp_sleep(10); } @@ -76,13 +76,8 @@ void nm_bsp_register_isr(void (*isr_fun)(void)) void nm_bsp_interrupt_ctrl(u8_t enable) { - if (enable) { - gpio_pin_enable_callback( - winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev, - winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin); - } else { - gpio_pin_disable_callback( - winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev, - winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin); - } + gpio_pin_interrupt_configure( + winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev, + winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin, + enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE); } diff --git a/drivers/wifi/winc1500/wifi_winc1500_nm_bsp_internal.h b/drivers/wifi/winc1500/wifi_winc1500_nm_bsp_internal.h index 550905cbdc5..90968187a9c 100644 --- a/drivers/wifi/winc1500/wifi_winc1500_nm_bsp_internal.h +++ b/drivers/wifi/winc1500/wifi_winc1500_nm_bsp_internal.h @@ -11,8 +11,6 @@ #include #include -#include - #include "wifi_winc1500_config.h" #include @@ -23,6 +21,19 @@ extern tstrNmBusCapabilities egstrNmBusCapabilities; #define NM_DEBUG CONF_WINC_DEBUG #define NM_BSP_PRINTF CONF_WINC_PRINTF +enum winc1500_gpio_index { + WINC1500_GPIO_IDX_CHIP_EN = 0, + WINC1500_GPIO_IDX_IRQN, + WINC1500_GPIO_IDX_RESET_N, + + WINC1500_GPIO_IDX_MAX +}; + +struct winc1500_gpio_configuration { + struct device *dev; + u32_t pin; +}; + struct winc1500_device { struct winc1500_gpio_configuration *gpios; struct gpio_callback gpio_cb; diff --git a/drivers/wifi/winc1500/wifi_winc1500_nm_bus_wrapper.c b/drivers/wifi/winc1500/wifi_winc1500_nm_bus_wrapper.c index 58942d4da92..dbbc424d17e 100644 --- a/drivers/wifi/winc1500/wifi_winc1500_nm_bus_wrapper.c +++ b/drivers/wifi/winc1500/wifi_winc1500_nm_bus_wrapper.c @@ -22,6 +22,13 @@ LOG_MODULE_REGISTER(winc1500); #include "wifi_winc1500_config.h" +static +struct winc1500_gpio_configuration winc1500_gpios[WINC1500_GPIO_IDX_MAX] = { + { .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_PIN }, + { .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_PIN }, + { .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_PIN }, +}; + #define NM_BUS_MAX_TRX_SZ 256 tstrNmBusCapabilities egstrNmBusCapabilities = { @@ -87,6 +94,37 @@ static s8_t spi_rw(u8_t *mosi, u8_t *miso, u16_t size) #endif +struct winc1500_gpio_configuration *winc1500_configure_gpios(void) +{ + struct device *gpio_en, *gpio_irq, *gpio_reset; + + gpio_en = device_get_binding( + DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_CONTROLLER); + gpio_irq = device_get_binding( + DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_CONTROLLER); + gpio_reset = device_get_binding( + DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_CONTROLLER); + + gpio_pin_configure(gpio_en, + winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, + GPIO_OUTPUT_LOW | + DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_FLAGS); + gpio_pin_configure(gpio_irq, + winc1500_gpios[WINC1500_GPIO_IDX_IRQN].pin, + GPIO_INPUT | + DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_FLAGS); + gpio_pin_configure(gpio_reset, + winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].pin, + GPIO_OUTPUT_LOW | + DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_FLAGS); + + winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].dev = gpio_en; + winc1500_gpios[WINC1500_GPIO_IDX_IRQN].dev = gpio_irq; + winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].dev = gpio_reset; + + return winc1500_gpios; +} + s8_t nm_bus_init(void *pvinit) { /* configure GPIOs */ diff --git a/include/drivers/wifi/winc1500.h b/include/drivers/wifi/winc1500.h deleted file mode 100644 index d0f816388f4..00000000000 --- a/include/drivers/wifi/winc1500.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2016 Intel Corporation - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#ifndef ZEPHYR_INCLUDE_DRIVERS_WIFI_WINC1500_H_ -#define ZEPHYR_INCLUDE_DRIVERS_WIFI_WINC1500_H_ - -#include - -enum winc1500_gpio_index { - WINC1500_GPIO_IDX_CHIP_EN = 0, - WINC1500_GPIO_IDX_IRQN, - WINC1500_GPIO_IDX_RESET_N, - - WINC1500_GPIO_IDX_MAX -}; - -struct winc1500_gpio_configuration { - struct device *dev; - u32_t pin; -}; - -struct winc1500_gpio_configuration *winc1500_configure_gpios(void); - -#endif /* ZEPHYR_INCLUDE_DRIVERS_WIFI_WINC1500_H_ */ diff --git a/samples/net/wifi/src/wifi_test.c b/samples/net/wifi/src/wifi_test.c index a1d74c61fb2..f9a6089a96d 100644 --- a/samples/net/wifi/src/wifi_test.c +++ b/samples/net/wifi/src/wifi_test.c @@ -7,50 +7,6 @@ #include #include -#ifdef CONFIG_WIFI_WINC1500 - -#include -#include -#include - -static -struct winc1500_gpio_configuration winc1500_gpios[WINC1500_GPIO_IDX_MAX] = { - { .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_PIN }, - { .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_PIN }, - { .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_PIN }, -}; - -struct winc1500_gpio_configuration *winc1500_configure_gpios(void) -{ - const int flags_int_in = (GPIO_DIR_IN | GPIO_INT | - GPIO_INT_ACTIVE_LOW | GPIO_INT_DEBOUNCE | - GPIO_INT_EDGE); - const int flags_noint_out = GPIO_DIR_OUT; - struct device *gpio_en, *gpio_irq, *gpio_reset; - - gpio_en = device_get_binding(DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_CONTROLLER); - gpio_irq = device_get_binding(DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_CONTROLLER); - gpio_reset = device_get_binding(DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_CONTROLLER); - - gpio_pin_configure(gpio_en, - winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, - flags_noint_out); - gpio_pin_configure(gpio_irq, - winc1500_gpios[WINC1500_GPIO_IDX_IRQN].pin, - flags_int_in); - gpio_pin_configure(gpio_reset, - winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].pin, - flags_noint_out); - - winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].dev = gpio_en; - winc1500_gpios[WINC1500_GPIO_IDX_IRQN].dev = gpio_irq; - winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].dev = gpio_reset; - - return winc1500_gpios; -} - -#endif /* CONFIG_WIFI_WINC1500 */ - void main(void) {