Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions boards/arm/cc1352r1_launchxl/cc1352r1_launchxl.dts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#include <ti/cc1352r.dtsi>

#define BTN_GPIO_FLAGS (GPIO_INT_ACTIVE_LOW | GPIO_PUD_PULL_UP)
#define BTN_GPIO_FLAGS (GPIO_ACTIVE_LOW | GPIO_PULL_UP)

/ {
model = "TI CC1352R1 LaunchXL";
Expand All @@ -31,11 +31,11 @@
leds {
compatible = "gpio-leds";
led0: led_0 {
gpios = <&gpio0 7 0>;
gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
label = "Green LED";
};
led1: led_1 {
gpios = <&gpio0 6 0>;
gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
label = "Red LED";
};
};
Expand Down
6 changes: 3 additions & 3 deletions boards/arm/cc26x2r1_launchxl/cc26x2r1_launchxl.dts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#include <ti/cc2652r.dtsi>

#define BTN_GPIO_FLAGS (GPIO_INT_ACTIVE_LOW | GPIO_PUD_PULL_UP)
#define BTN_GPIO_FLAGS (GPIO_ACTIVE_LOW | GPIO_PULL_UP)

/ {
model = "TI CC26x2R1 LaunchXL";
Expand All @@ -31,11 +31,11 @@
leds {
compatible = "gpio-leds";
led0: led_0 {
gpios = <&gpio0 7 0>;
gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
label = "Green LED";
};
led1: led_1 {
gpios = <&gpio0 6 0>;
gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
label = "Red LED";
};
};
Expand Down
10 changes: 5 additions & 5 deletions boards/arm/cc3220sf_launchxl/cc3220sf_launchxl.dts
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@
leds {
compatible = "gpio-leds";
led0: led_0 {
gpios = <&gpioa1 3 0>;
gpios = <&gpioa1 3 GPIO_ACTIVE_HIGH>;
label = "Green LED";
};
led1: led_1 {
gpios = <&gpioa1 2 0>;
gpios = <&gpioa1 2 GPIO_ACTIVE_HIGH>;
label = "Yellow LED";
};
led2: led_2 {
gpios = <&gpioa1 1 0>;
gpios = <&gpioa1 1 GPIO_ACTIVE_HIGH>;
label = "Red LED";
};
};
Expand All @@ -47,12 +47,12 @@
/* Push button 2 */
compatible = "gpio-keys";
sw2: button_0 {
gpios = <&gpioa2 6 GPIO_INT_ACTIVE_LOW>;
gpios = <&gpioa2 6 GPIO_ACTIVE_HIGH>;
label = "Push button switch 2";
};
/* Push button 3 */
sw3: button_1 {
gpios = <&gpioa1 5 GPIO_INT_ACTIVE_LOW>;
gpios = <&gpioa1 5 GPIO_ACTIVE_HIGH>;
label = "Push button switch 3";
};
};
Expand Down
10 changes: 5 additions & 5 deletions boards/arm/cc3235sf_launchxl/cc3235sf_launchxl.dts
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@
leds {
compatible = "gpio-leds";
led0: led_0 {
gpios = <&gpioa1 3 0>;
gpios = <&gpioa1 3 GPIO_ACTIVE_HIGH>;
label = "Green LED";
};
led1: led_1 {
gpios = <&gpioa1 2 0>;
gpios = <&gpioa1 2 GPIO_ACTIVE_HIGH>;
label = "Yellow LED";
};
led2: led_2 {
gpios = <&gpioa1 1 0>;
gpios = <&gpioa1 1 GPIO_ACTIVE_HIGH>;
label = "Red LED";
};
};
Expand All @@ -51,12 +51,12 @@
/* Push button 2 */
compatible = "gpio-keys";
sw2: button_0 {
gpios = <&gpioa2 6 GPIO_INT_ACTIVE_LOW>;
gpios = <&gpioa2 6 GPIO_ACTIVE_HIGH>;
label = "Push button switch 2";
};
/* Push button 3 */
sw3: button_1 {
gpios = <&gpioa1 5 GPIO_INT_ACTIVE_LOW>;
gpios = <&gpioa1 5 GPIO_ACTIVE_HIGH>;
label = "Push button switch 3";
};
};
Expand Down
150 changes: 118 additions & 32 deletions drivers/gpio/gpio_cc13xx_cc26xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@

#include "gpio_utils.h"

/* bits 16-18 in iocfg registers correspond to interrupt settings */
#define IOCFG_INT_MASK 0x00070000

/* the rest are for general (non-interrupt) config */
#define IOCFG_GEN_MASK (~IOCFG_INT_MASK)

struct gpio_cc13xx_cc26xx_data {
/* gpio_driver_data needs to be first */
struct gpio_driver_data common;
Expand All @@ -26,48 +32,42 @@ struct gpio_cc13xx_cc26xx_data {

static struct gpio_cc13xx_cc26xx_data gpio_cc13xx_cc26xx_data_0;

static int gpio_cc13xx_cc26xx_port_set_bits_raw(struct device *port,
u32_t mask);
static int gpio_cc13xx_cc26xx_port_clear_bits_raw(struct device *port,
u32_t mask);

static int gpio_cc13xx_cc26xx_config(struct device *port, int access_op,
u32_t pin, int flags)
{
u32_t config;
u32_t config = 0;

if (access_op != GPIO_ACCESS_BY_PIN) {
return -ENOTSUP;
}

__ASSERT_NO_MSG(pin < NUM_IO_MAX);

config = IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_SLEW_DISABLE |
IOC_NO_WAKE_UP;

if (flags & GPIO_INT) {
__ASSERT_NO_MSG((flags & GPIO_DIR_MASK) == GPIO_DIR_IN);

config |= IOC_INT_ENABLE | IOC_INPUT_ENABLE;
switch (flags & (GPIO_INPUT | GPIO_OUTPUT)) {
case GPIO_INPUT:
config = IOC_INPUT_ENABLE;
break;
case GPIO_OUTPUT:
config = IOC_INPUT_DISABLE;
break;
case 0: /* disconnected */
IOCPortConfigureSet(pin, IOC_PORT_GPIO, IOC_NO_IOPULL);
GPIO_setOutputEnableDio(pin, GPIO_OUTPUT_DISABLE);
return 0;
default:
return -ENOTSUP;
}

if (flags & GPIO_INT_EDGE) {
if (flags & GPIO_INT_DOUBLE_EDGE) {
config |= IOC_BOTH_EDGES;
} else if (flags & GPIO_INT_ACTIVE_HIGH) {
config |= IOC_RISING_EDGE;
} else { /* GPIO_INT_ACTIVE_LOW */
config |= IOC_FALLING_EDGE;
}
} else {
return -ENOTSUP;
}
config |= IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_SLEW_DISABLE |
IOC_NO_WAKE_UP;

config |= (flags & GPIO_INT_DEBOUNCE) ? IOC_HYST_ENABLE :
config |= (flags & GPIO_INT_DEBOUNCE) ? IOC_HYST_ENABLE :
IOC_HYST_DISABLE;
} else {
config |= IOC_INT_DISABLE | IOC_NO_EDGE | IOC_HYST_DISABLE;
config |= (flags & GPIO_DIR_MASK) == GPIO_DIR_IN ?
IOC_INPUT_ENABLE :
IOC_INPUT_DISABLE;
}

config |= (flags & GPIO_POL_MASK) == GPIO_POL_INV ? IOC_IOMODE_INV :
IOC_IOMODE_NORMAL;

switch (flags & GPIO_PUD_MASK) {
case GPIO_PUD_NORMAL:
Expand All @@ -83,12 +83,18 @@ static int gpio_cc13xx_cc26xx_config(struct device *port, int access_op,
return -EINVAL;
}

config |= IOCPortConfigureGet(pin) & IOCFG_INT_MASK;
IOCPortConfigureSet(pin, IOC_PORT_GPIO, config);

if ((flags & GPIO_DIR_MASK) == GPIO_DIR_IN) {
GPIO_setOutputEnableDio(pin, GPIO_OUTPUT_DISABLE);
} else {
if ((flags & GPIO_OUTPUT) != 0) {
if ((flags & GPIO_OUTPUT_INIT_HIGH) != 0) {
gpio_cc13xx_cc26xx_port_set_bits_raw(port, BIT(pin));
} else if ((flags & GPIO_OUTPUT_INIT_LOW) != 0) {
gpio_cc13xx_cc26xx_port_clear_bits_raw(port, BIT(pin));
}
GPIO_setOutputEnableDio(pin, GPIO_OUTPUT_ENABLE);
} else {
GPIO_setOutputEnableDio(pin, GPIO_OUTPUT_DISABLE);
}

return 0;
Expand Down Expand Up @@ -140,6 +146,80 @@ static int gpio_cc13xx_cc26xx_read(struct device *port, int access_op,
return 0;
}

static int gpio_cc13xx_cc26xx_port_get_raw(struct device *port, u32_t *value)
{
__ASSERT_NO_MSG(value != NULL);

*value = GPIO_readMultiDio(GPIO_DIO_ALL_MASK);

return 0;
}

static int gpio_cc13xx_cc26xx_port_set_masked_raw(struct device *port,
u32_t mask, u32_t value)
{
GPIO_setMultiDio(mask & value);
GPIO_clearMultiDio(mask & ~value);

return 0;
}

static int gpio_cc13xx_cc26xx_port_set_bits_raw(struct device *port, u32_t mask)
{
GPIO_setMultiDio(mask);

return 0;
}

static int gpio_cc13xx_cc26xx_port_clear_bits_raw(struct device *port,
u32_t mask)
{
GPIO_clearMultiDio(mask);

return 0;
}

static int gpio_cc13xx_cc26xx_port_toggle_bits(struct device *port, u32_t mask)
{
GPIO_toggleMultiDio(mask);

return 0;
}

static int gpio_cc13xx_cc26xx_pin_interrupt_configure(struct device *port,
unsigned int pin, enum gpio_int_mode mode,
enum gpio_int_trig trig)
{
struct gpio_cc13xx_cc26xx_data *data = port->driver_data;
u32_t config = 0;

if (mode != GPIO_INT_MODE_DISABLED) {
if (mode == GPIO_INT_MODE_EDGE) {
if (trig == GPIO_INT_TRIG_BOTH) {
config |= IOC_BOTH_EDGES;
} else if (trig == GPIO_INT_TRIG_HIGH) {
config |= IOC_RISING_EDGE;
} else { /* GPIO_INT_TRIG_LOW */
config |= IOC_FALLING_EDGE;
}
} else {
return -ENOTSUP;
}

config |= IOC_INT_ENABLE;
} else {
config |= IOC_INT_DISABLE | IOC_NO_EDGE;
}

config |= IOCPortConfigureGet(pin) & IOCFG_GEN_MASK;
IOCPortConfigureSet(pin, IOC_PORT_GPIO, config);

WRITE_BIT(data->pin_callback_enables, pin,
mode != GPIO_INT_MODE_DISABLED);

return 0;
}

static int gpio_cc13xx_cc26xx_manage_callback(struct device *port,
struct gpio_callback *callback,
bool set)
Expand Down Expand Up @@ -247,6 +327,12 @@ static const struct gpio_driver_api gpio_cc13xx_cc26xx_driver_api = {
.config = gpio_cc13xx_cc26xx_config,
.write = gpio_cc13xx_cc26xx_write,
.read = gpio_cc13xx_cc26xx_read,
.port_get_raw = gpio_cc13xx_cc26xx_port_get_raw,
.port_set_masked_raw = gpio_cc13xx_cc26xx_port_set_masked_raw,
.port_set_bits_raw = gpio_cc13xx_cc26xx_port_set_bits_raw,
.port_clear_bits_raw = gpio_cc13xx_cc26xx_port_clear_bits_raw,
.port_toggle_bits = gpio_cc13xx_cc26xx_port_toggle_bits,
.pin_interrupt_configure = gpio_cc13xx_cc26xx_pin_interrupt_configure,
.manage_callback = gpio_cc13xx_cc26xx_manage_callback,
.enable_callback = gpio_cc13xx_cc26xx_enable_callback,
.disable_callback = gpio_cc13xx_cc26xx_disable_callback,
Expand Down
Loading