Skip to content

Commit f5baaab

Browse files
Tomasz Bursztykapabigot
authored andcommitted
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 <[email protected]> Signed-off-by: Johann Fischer <[email protected]> Signed-off-by: Peter Bigot <[email protected]>
1 parent c117842 commit f5baaab

File tree

6 files changed

+81
-97
lines changed

6 files changed

+81
-97
lines changed

drivers/wifi/winc1500/wifi_winc1500.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,7 @@ static int winc1500_mgmt_scan(struct device *dev, scan_result_cb_t cb)
968968

969969
if (m2m_wifi_request_scan(M2M_WIFI_CH_ALL)) {
970970
w1500_data.scan_cb = NULL;
971+
LOG_ERR("Failed to request scan");
971972
return -EIO;
972973
}
973974

@@ -1069,25 +1070,35 @@ static int winc1500_init(struct device *dev)
10691070
w1500_data.connected = false;
10701071

10711072
ret = m2m_wifi_init(&param);
1072-
if (ret) {
1073+
if (ret != M2M_SUCCESS) {
10731074
LOG_ERR("m2m_wifi_init return error!(%d)", ret);
10741075
return -EIO;
10751076
}
10761077

1077-
m2m_wifi_set_scan_region(WINC1500_REGION);
1078-
10791078
socketInit();
10801079
registerSocketCallback(winc1500_socket_cb, NULL);
10811080

1082-
m2m_wifi_get_otp_mac_address(w1500_data.mac, &is_valid);
1081+
if (m2m_wifi_get_otp_mac_address(w1500_data.mac, &is_valid) != M2M_SUCCESS) {
1082+
LOG_ERR("Failed to get MAC address");
1083+
}
1084+
10831085
LOG_DBG("WINC1500 MAC Address from OTP (%d) "
10841086
"%02X:%02X:%02X:%02X:%02X:%02X",
10851087
is_valid,
10861088
w1500_data.mac[0], w1500_data.mac[1], w1500_data.mac[2],
10871089
w1500_data.mac[3], w1500_data.mac[4], w1500_data.mac[5]);
10881090

1089-
m2m_wifi_set_power_profile(PWR_LOW1);
1090-
m2m_wifi_set_tx_power(TX_PWR_LOW);
1091+
if (m2m_wifi_set_scan_region(WINC1500_REGION) != M2M_SUCCESS) {
1092+
LOG_ERR("Failed set scan region");
1093+
}
1094+
1095+
if (m2m_wifi_set_power_profile(PWR_LOW1) != M2M_SUCCESS) {
1096+
LOG_ERR("Failed set power profile");
1097+
}
1098+
1099+
if (m2m_wifi_set_tx_power(TX_PWR_LOW) != M2M_SUCCESS) {
1100+
LOG_ERR("Failed set tx power");
1101+
}
10911102

10921103
/* monitoring thread for winc wifi callbacks */
10931104
k_thread_create(&winc1500_thread_data, winc1500_stack,

drivers/wifi/winc1500/wifi_winc1500_nm_bsp.c

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void (*isr_function)(void);
1717

1818
static inline void chip_isr(struct device *port,
1919
struct gpio_callback *cb,
20-
uint32_t pins)
20+
gpio_port_pins_t pins)
2121
{
2222
if (isr_function) {
2323
isr_function();
@@ -42,18 +42,18 @@ s8_t nm_bsp_deinit(void)
4242

4343
void nm_bsp_reset(void)
4444
{
45-
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev,
46-
winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 0);
47-
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev,
48-
winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 0);
45+
gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev,
46+
winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 0);
47+
gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev,
48+
winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 0);
4949
nm_bsp_sleep(100);
5050

51-
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev,
52-
winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 1);
51+
gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].dev,
52+
winc1500.gpios[WINC1500_GPIO_IDX_CHIP_EN].pin, 1);
5353
nm_bsp_sleep(10);
5454

55-
gpio_pin_write(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev,
56-
winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 1);
55+
gpio_pin_set_raw(winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].dev,
56+
winc1500.gpios[WINC1500_GPIO_IDX_RESET_N].pin, 1);
5757
nm_bsp_sleep(10);
5858
}
5959

@@ -76,13 +76,8 @@ void nm_bsp_register_isr(void (*isr_fun)(void))
7676

7777
void nm_bsp_interrupt_ctrl(u8_t enable)
7878
{
79-
if (enable) {
80-
gpio_pin_enable_callback(
81-
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev,
82-
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin);
83-
} else {
84-
gpio_pin_disable_callback(
85-
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev,
86-
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin);
87-
}
79+
gpio_pin_interrupt_configure(
80+
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].dev,
81+
winc1500.gpios[WINC1500_GPIO_IDX_IRQN].pin,
82+
enable ? GPIO_INT_EDGE_TO_ACTIVE : GPIO_INT_DISABLE);
8883
}

drivers/wifi/winc1500/wifi_winc1500_nm_bsp_internal.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
#include <drivers/gpio.h>
1212
#include <drivers/spi.h>
1313

14-
#include <drivers/wifi/winc1500.h>
15-
1614
#include "wifi_winc1500_config.h"
1715
#include <bus_wrapper/include/nm_bus_wrapper.h>
1816

@@ -23,6 +21,19 @@ extern tstrNmBusCapabilities egstrNmBusCapabilities;
2321
#define NM_DEBUG CONF_WINC_DEBUG
2422
#define NM_BSP_PRINTF CONF_WINC_PRINTF
2523

24+
enum winc1500_gpio_index {
25+
WINC1500_GPIO_IDX_CHIP_EN = 0,
26+
WINC1500_GPIO_IDX_IRQN,
27+
WINC1500_GPIO_IDX_RESET_N,
28+
29+
WINC1500_GPIO_IDX_MAX
30+
};
31+
32+
struct winc1500_gpio_configuration {
33+
struct device *dev;
34+
u32_t pin;
35+
};
36+
2637
struct winc1500_device {
2738
struct winc1500_gpio_configuration *gpios;
2839
struct gpio_callback gpio_cb;

drivers/wifi/winc1500/wifi_winc1500_nm_bus_wrapper.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ LOG_MODULE_REGISTER(winc1500);
2222

2323
#include "wifi_winc1500_config.h"
2424

25+
static
26+
struct winc1500_gpio_configuration winc1500_gpios[WINC1500_GPIO_IDX_MAX] = {
27+
{ .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_PIN },
28+
{ .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_PIN },
29+
{ .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_PIN },
30+
};
31+
2532
#define NM_BUS_MAX_TRX_SZ 256
2633

2734
tstrNmBusCapabilities egstrNmBusCapabilities = {
@@ -87,6 +94,37 @@ static s8_t spi_rw(u8_t *mosi, u8_t *miso, u16_t size)
8794

8895
#endif
8996

97+
struct winc1500_gpio_configuration *winc1500_configure_gpios(void)
98+
{
99+
struct device *gpio_en, *gpio_irq, *gpio_reset;
100+
101+
gpio_en = device_get_binding(
102+
DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_CONTROLLER);
103+
gpio_irq = device_get_binding(
104+
DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_CONTROLLER);
105+
gpio_reset = device_get_binding(
106+
DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_CONTROLLER);
107+
108+
gpio_pin_configure(gpio_en,
109+
winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].pin,
110+
GPIO_OUTPUT_LOW |
111+
DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_FLAGS);
112+
gpio_pin_configure(gpio_irq,
113+
winc1500_gpios[WINC1500_GPIO_IDX_IRQN].pin,
114+
GPIO_INPUT |
115+
DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_FLAGS);
116+
gpio_pin_configure(gpio_reset,
117+
winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].pin,
118+
GPIO_OUTPUT_LOW |
119+
DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_FLAGS);
120+
121+
winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].dev = gpio_en;
122+
winc1500_gpios[WINC1500_GPIO_IDX_IRQN].dev = gpio_irq;
123+
winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].dev = gpio_reset;
124+
125+
return winc1500_gpios;
126+
}
127+
90128
s8_t nm_bus_init(void *pvinit)
91129
{
92130
/* configure GPIOs */

include/drivers/wifi/winc1500.h

Lines changed: 0 additions & 27 deletions
This file was deleted.

samples/net/wifi/src/wifi_test.c

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,6 @@
77
#include <zephyr.h>
88
#include <errno.h>
99

10-
#ifdef CONFIG_WIFI_WINC1500
11-
12-
#include <device.h>
13-
#include <drivers/gpio.h>
14-
#include <drivers/wifi/winc1500.h>
15-
16-
static
17-
struct winc1500_gpio_configuration winc1500_gpios[WINC1500_GPIO_IDX_MAX] = {
18-
{ .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_PIN },
19-
{ .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_PIN },
20-
{ .dev = NULL, .pin = DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_PIN },
21-
};
22-
23-
struct winc1500_gpio_configuration *winc1500_configure_gpios(void)
24-
{
25-
const int flags_int_in = (GPIO_DIR_IN | GPIO_INT |
26-
GPIO_INT_ACTIVE_LOW | GPIO_INT_DEBOUNCE |
27-
GPIO_INT_EDGE);
28-
const int flags_noint_out = GPIO_DIR_OUT;
29-
struct device *gpio_en, *gpio_irq, *gpio_reset;
30-
31-
gpio_en = device_get_binding(DT_INST_0_ATMEL_WINC1500_ENABLE_GPIOS_CONTROLLER);
32-
gpio_irq = device_get_binding(DT_INST_0_ATMEL_WINC1500_IRQ_GPIOS_CONTROLLER);
33-
gpio_reset = device_get_binding(DT_INST_0_ATMEL_WINC1500_RESET_GPIOS_CONTROLLER);
34-
35-
gpio_pin_configure(gpio_en,
36-
winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].pin,
37-
flags_noint_out);
38-
gpio_pin_configure(gpio_irq,
39-
winc1500_gpios[WINC1500_GPIO_IDX_IRQN].pin,
40-
flags_int_in);
41-
gpio_pin_configure(gpio_reset,
42-
winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].pin,
43-
flags_noint_out);
44-
45-
winc1500_gpios[WINC1500_GPIO_IDX_CHIP_EN].dev = gpio_en;
46-
winc1500_gpios[WINC1500_GPIO_IDX_IRQN].dev = gpio_irq;
47-
winc1500_gpios[WINC1500_GPIO_IDX_RESET_N].dev = gpio_reset;
48-
49-
return winc1500_gpios;
50-
}
51-
52-
#endif /* CONFIG_WIFI_WINC1500 */
53-
5410
void main(void)
5511
{
5612

0 commit comments

Comments
 (0)