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 <tomasz.bursztyka@linux.intel.com>
Signed-off-by: Johann Fischer <j.fischer@phytec.de>
Signed-off-by: Peter Bigot <peter.bigot@nordicsemi.no>
This commit is contained in:
Tomasz Bursztyka 2020-01-24 09:24:59 +01:00 committed by Carles Cufí
commit a40e9d3762
6 changed files with 81 additions and 97 deletions

View file

@ -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)) { if (m2m_wifi_request_scan(M2M_WIFI_CH_ALL)) {
w1500_data.scan_cb = NULL; w1500_data.scan_cb = NULL;
LOG_ERR("Failed to request scan");
return -EIO; return -EIO;
} }
@ -1069,25 +1070,35 @@ static int winc1500_init(struct device *dev)
w1500_data.connected = false; w1500_data.connected = false;
ret = m2m_wifi_init(&param); ret = m2m_wifi_init(&param);
if (ret) { if (ret != M2M_SUCCESS) {
LOG_ERR("m2m_wifi_init return error!(%d)", ret); LOG_ERR("m2m_wifi_init return error!(%d)", ret);
return -EIO; return -EIO;
} }
m2m_wifi_set_scan_region(WINC1500_REGION);
socketInit(); socketInit();
registerSocketCallback(winc1500_socket_cb, NULL); 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) " LOG_DBG("WINC1500 MAC Address from OTP (%d) "
"%02X:%02X:%02X:%02X:%02X:%02X", "%02X:%02X:%02X:%02X:%02X:%02X",
is_valid, is_valid,
w1500_data.mac[0], w1500_data.mac[1], w1500_data.mac[2], w1500_data.mac[0], w1500_data.mac[1], w1500_data.mac[2],
w1500_data.mac[3], w1500_data.mac[4], w1500_data.mac[5]); w1500_data.mac[3], w1500_data.mac[4], w1500_data.mac[5]);
m2m_wifi_set_power_profile(PWR_LOW1); if (m2m_wifi_set_scan_region(WINC1500_REGION) != M2M_SUCCESS) {
m2m_wifi_set_tx_power(TX_PWR_LOW); 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 */ /* monitoring thread for winc wifi callbacks */
k_thread_create(&winc1500_thread_data, winc1500_stack, k_thread_create(&winc1500_thread_data, winc1500_stack,

View file

@ -17,7 +17,7 @@ void (*isr_function)(void);
static inline void chip_isr(struct device *port, static inline void chip_isr(struct device *port,
struct gpio_callback *cb, struct gpio_callback *cb,
uint32_t pins) gpio_port_pins_t pins)
{ {
if (isr_function) { if (isr_function) {
isr_function(); isr_function();
@ -42,18 +42,18 @@ s8_t nm_bsp_deinit(void)
void nm_bsp_reset(void) void nm_bsp_reset(void)
{ {
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev, gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev,
winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 0); winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 0);
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev, gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev,
winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 0); winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 0);
nm_bsp_sleep(100); nm_bsp_sleep(100);
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev, gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev,
winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 1); winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 1);
nm_bsp_sleep(10); nm_bsp_sleep(10);
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev, gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev,
winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 1); winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 1);
nm_bsp_sleep(10); 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) void nm_bsp_interrupt_ctrl(u8_t enable)
{ {
if (enable) { gpio_pin_interrupt_configure(
gpio_pin_enable_callback( winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev,
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev, winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin,
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin); enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE);
} else {
gpio_pin_disable_callback(
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev,
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin);
}
} }

View file

@ -11,8 +11,6 @@
#include <drivers/gpio.h> #include <drivers/gpio.h>
#include <drivers/spi.h> #include <drivers/spi.h>
#include <drivers/wifi/winc1500.h>
#include "wifi_winc1500_config.h" #include "wifi_winc1500_config.h"
#include <bus_wrapper/include/nm_bus_wrapper.h> #include <bus_wrapper/include/nm_bus_wrapper.h>
@ -23,6 +21,19 @@ extern tstrNmBusCapabilities egstrNmBusCapabilities;
#define NM_DEBUG CONF_WINC_DEBUG #define NM_DEBUG CONF_WINC_DEBUG
#define NM_BSP_PRINTF CONF_WINC_PRINTF #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_device {
struct winc1500_gpio_configuration *gpios; struct winc1500_gpio_configuration *gpios;
struct gpio_callback gpio_cb; struct gpio_callback gpio_cb;

View file

@ -22,6 +22,13 @@ LOG_MODULE_REGISTER(winc1500);
#include "wifi_winc1500_config.h" #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 #define NM_BUS_MAX_TRX_SZ 256
tstrNmBusCapabilities egstrNmBusCapabilities = { tstrNmBusCapabilities egstrNmBusCapabilities = {
@ -87,6 +94,37 @@ static s8_t spi_rw(u8_t *mosi, u8_t *miso, u16_t size)
#endif #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) s8_t nm_bus_init(void *pvinit)
{ {
/* configure GPIOs */ /* configure GPIOs */

View file

@ -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 <device.h>
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_ */

View file

@ -7,50 +7,6 @@
#include <zephyr.h> #include <zephyr.h>
#include <errno.h> #include <errno.h>
#ifdef CONFIG_WIFI_WINC1500
#include <device.h>
#include <drivers/gpio.h>
#include <drivers/wifi/winc1500.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 },
};
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) void main(void)
{ {