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:
parent
97106bf95e
commit
a40e9d3762
6 changed files with 81 additions and 97 deletions
|
@ -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(¶m);
|
ret = m2m_wifi_init(¶m);
|
||||||
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,
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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_ */
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue