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
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,18 @@
/* On-board antenna pinmux states */
board_ant_tx_pa_off: board_ant_tx_pa_off {
pinmux = <29 IOC_PORT_GPIO>;
bias-disable;
};
board_ant_tx_pa_on: board_ant_tx_pa_on {
pinmux = <29 IOC_PORT_RFC_GPO3>;
bias-disable;
};
board_ant_subg_off: board_ant_subg_off {
pinmux = <30 IOC_PORT_GPIO>;
bias-disable;
};
board_ant_subg_on: board_ant_subg_on {
pinmux = <30 IOC_PORT_RFC_GPO0>;
bias-disable;
};
};
29 changes: 22 additions & 7 deletions boards/beagle/beagleconnect_freedom/beagleconnect_freedom.dts
Original file line number Diff line number Diff line change
Expand Up @@ -42,18 +42,33 @@
};
};

/**
* The BeagleConnect Freedom has an on-board antenna switch (SKY13317-373LF) used to select
* the appropriate RF signal port based on the currently-used PHY.
*
* Truth table:
*
* Path DIO29 DIO30
* =========== ===== =====
* Off 0 0
* Sub-1 GHz 0 1 // DIO30 mux to IOC_PORT_RFC_GPO0 for auto
* 20 dBm TX 1 0 // DIO29 mux to IOC_PORT_RFC_GPO3 for auto
*/
antenna_mux0: antenna_mux0 {
compatible = "skyworks,sky13317";
status = "okay";
gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>, <&gpio0 30 GPIO_ACTIVE_HIGH>;
pinctrl-0 = <&board_ant_tx_pa_off &board_ant_subg_off>;
pinctrl-1 = <&board_ant_tx_pa_off &board_ant_subg_on>;
pinctrl-2 = <&board_ant_tx_pa_on &board_ant_subg_on>;
pinctrl-names = "default", "ant_subg", "ant_subg_pa";
};

leds: leds {
compatible = "gpio-leds";
led0: led_0 {
gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>; // 2.4GHz TX/RX
};

/* U.FL connector switch */
rf_sw: rf_sw {
gpios =
<&gpio0 29 GPIO_ACTIVE_HIGH>, // SubG TX +20dB
<&gpio0 30 GPIO_ACTIVE_HIGH>; // SubG TX/RX 0dB
};
};

sens_i2c: sensor-switch {
Expand Down
124 changes: 63 additions & 61 deletions boards/beagle/beagleconnect_freedom/board_antenna.c
Original file line number Diff line number Diff line change
@@ -1,116 +1,118 @@
/* SPDX-License-Identifier: Apache-2.0
*
/*
* Copyright (c) 2021 Florin Stancu
* Copyright (c) 2021 Jason Kridner, BeagleBoard.org Foundation
* Copyright (c) 2024 Ayush Singh <[email protected]>
*
* SPDX-License-Identifier: Apache-2.0
*/

/*
* Implements the RF driver callback to configure the on-board antenna
* switch.
*/

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#define DT_DRV_COMPAT skyworks_sky13317

#include <zephyr/init.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/pinctrl.h>

#include <ti/drivers/rf/RF.h>
#include <driverlib/gpio.h>
#include <driverlib/ioc.h>
#include <driverlib/rom.h>
#include <driverlib/interrupt.h>

/* DIOs for RF antenna paths */
#define BOARD_RF_HIGH_PA 29 /* TODO: pull from DT */
#define BOARD_RF_SUB1GHZ 30 /* TODO: pull from DT */
/* custom pinctrl states for the antenna mux */
#define PINCTRL_STATE_ANT_SUBG 1
#define PINCTRL_STATE_ANT_SUBG_PA 2

static void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events,
void *arg);
#define BOARD_ANT_GPIO_PA 0
#define BOARD_ANT_GPIO_SUBG 1

static int board_antenna_init(const struct device *dev);
static void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg);

const RFCC26XX_HWAttrsV2 RFCC26XX_hwAttrs = {
.hwiPriority = INT_PRI_LEVEL7,
.swiPriority = 0,
.hwiPriority = INT_PRI_LEVEL7,
.swiPriority = 0,
.xoscHfAlwaysNeeded = true,
/* RF driver callback for custom antenna switching */
.globalCallback = board_cc13xx_rf_callback,
/* Subscribe to events */
.globalEventMask = (RF_GlobalEventRadioSetup |
RF_GlobalEventRadioPowerDown),
.globalEventMask = (RF_GlobalEventRadioSetup | RF_GlobalEventRadioPowerDown),
};

PINCTRL_DT_INST_DEFINE(0);
DEVICE_DT_INST_DEFINE(0, board_antenna_init, NULL, NULL, NULL, POST_KERNEL,
CONFIG_BOARD_ANTENNA_INIT_PRIO, NULL);

static const struct pinctrl_dev_config *ant_pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(0);
static const struct gpio_dt_spec ant_gpios[] = {
DT_FOREACH_PROP_ELEM_SEP(DT_NODELABEL(antenna_mux0), gpios, GPIO_DT_SPEC_GET_BY_IDX, (,))};

/**
* Antenna switch GPIO init routine.
*/
static int board_antenna_init(void)
static int board_antenna_init(const struct device *dev)
{
ARG_UNUSED(dev);
int i;

/* set all paths to low */
IOCPinTypeGpioOutput(BOARD_RF_HIGH_PA);
GPIO_setOutputEnableDio(BOARD_RF_HIGH_PA, GPIO_OUTPUT_DISABLE);
IOCPinTypeGpioOutput(BOARD_RF_SUB1GHZ);
GPIO_setOutputEnableDio(BOARD_RF_SUB1GHZ, GPIO_OUTPUT_DISABLE);
/* default pinctrl configuration: set all antenna mux control pins as GPIOs */
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_DEFAULT);
/* set all GPIOs to 0 (all RF paths disabled) */
for (i = 0; i < ARRAY_SIZE(ant_gpios); i++) {
gpio_pin_configure_dt(&ant_gpios[i], 0);
}
return 0;
}

SYS_INIT(board_antenna_init, POST_KERNEL, CONFIG_BOARD_ANTENNA_INIT_PRIO);

void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg)
/**
* Custom TI RFCC26XX callback for switching the on-board antenna mux on radio setup.
*/
static void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg)
{
bool sub1GHz = false;
bool sub1GHz = false;
uint8_t loDivider = 0;
int i;

/* Switch off all paths first. Needs to be done anyway in every sub-case below. */
GPIO_setOutputEnableDio(BOARD_RF_HIGH_PA, GPIO_OUTPUT_DISABLE);
GPIO_setOutputEnableDio(BOARD_RF_SUB1GHZ, GPIO_OUTPUT_DISABLE);
/* Clear all antenna switch GPIOs (for all cases). */
for (i = 0; i < ARRAY_SIZE(ant_gpios); i++) {
gpio_pin_configure_dt(&ant_gpios[i], 0);
}

if (events & RF_GlobalEventRadioSetup) {
/* Decode the current PA configuration. */
RF_TxPowerTable_PAType paType = (RF_TxPowerTable_PAType)
RF_getTxPower(client).paType;
RF_TxPowerTable_PAType paType =
(RF_TxPowerTable_PAType)RF_getTxPower(client).paType;
/* Decode the generic argument as a setup command. */
RF_RadioSetup *setupCommand = (RF_RadioSetup *)arg;

switch (setupCommand->common.commandNo) {
case (CMD_RADIO_SETUP):
case (CMD_BLE5_RADIO_SETUP):
case CMD_RADIO_SETUP:
case CMD_BLE5_RADIO_SETUP:
loDivider = RF_LODIVIDER_MASK & setupCommand->common.loDivider;
/* Sub-1GHz front-end. */
if (loDivider != 0)
sub1GHz = true;
break;
case (CMD_PROP_RADIO_DIV_SETUP):
case CMD_PROP_RADIO_DIV_SETUP:
loDivider = RF_LODIVIDER_MASK & setupCommand->prop_div.loDivider;
/* Sub-1GHz front-end. */
if (loDivider != 0)
sub1GHz = true;
break;
default:
break;
}
sub1GHz = (loDivider != 0);

/* Sub-1 GHz */
if (paType == RF_TxPowerTable_HighPA) {
/* PA enable --> HIGH PA */
/* LNA enable --> Sub-1 GHz */
/* Note: RFC_GPO3 is a work-around because the RFC_GPO1 */
/* is sometimes not de-asserted on CC1352 Rev A. */
IOCPortConfigureSet(BOARD_RF_HIGH_PA,
IOC_PORT_RFC_GPO3, IOC_IOMODE_NORMAL);
IOCPortConfigureSet(BOARD_RF_SUB1GHZ,
IOC_PORT_RFC_GPO0, IOC_IOMODE_NORMAL);
} else {
/* RF core active --> Sub-1 GHz */
IOCPortConfigureSet(BOARD_RF_HIGH_PA,
IOC_PORT_GPIO, IOC_IOMODE_NORMAL);
IOCPortConfigureSet(BOARD_RF_SUB1GHZ,
IOC_PORT_GPIO, IOC_IOMODE_NORMAL);
GPIO_setOutputEnableDio(BOARD_RF_SUB1GHZ, GPIO_OUTPUT_ENABLE);
if (sub1GHz) {
if (paType == RF_TxPowerTable_HighPA) {
/* Note: RFC_GPO3 is a work-around because the RFC_GPO1 */
/* is sometimes not de-asserted on CC1352 Rev A. */
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_ANT_SUBG_PA);
} else {
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_ANT_SUBG);
/* Manually set the sub-GHZ antenna switch DIO */
gpio_pin_configure_dt(&ant_gpios[BOARD_ANT_GPIO_SUBG], 1);
}
}
} else {
/* Reset the IO multiplexer to GPIO functionality */
IOCPortConfigureSet(BOARD_RF_HIGH_PA,
IOC_PORT_GPIO, IOC_IOMODE_NORMAL);
IOCPortConfigureSet(BOARD_RF_SUB1GHZ,
IOC_PORT_GPIO, IOC_IOMODE_NORMAL);
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_DEFAULT);
}
}
32 changes: 12 additions & 20 deletions boards/ti/cc1352p1_launchxl/board_antenna.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,39 +30,31 @@
#define BOARD_ANT_GPIO_PA 1
#define BOARD_ANT_GPIO_SUBG 2

#define ANTENNA_MUX DT_NODELABEL(antenna_mux0)

static int board_antenna_init(const struct device *dev);
static void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events,
void *arg);
static void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg);

const RFCC26XX_HWAttrsV2 RFCC26XX_hwAttrs = {
.hwiPriority = INT_PRI_LEVEL7,
.swiPriority = 0,
.hwiPriority = INT_PRI_LEVEL7,
.swiPriority = 0,
.xoscHfAlwaysNeeded = true,
/* RF driver callback for custom antenna switching */
.globalCallback = board_cc13xx_rf_callback,
/* Subscribe to events */
.globalEventMask = (RF_GlobalEventRadioSetup |
RF_GlobalEventRadioPowerDown),
.globalEventMask = (RF_GlobalEventRadioSetup | RF_GlobalEventRadioPowerDown),
};

PINCTRL_DT_INST_DEFINE(0);
DEVICE_DT_INST_DEFINE(0, board_antenna_init, NULL, NULL, NULL,
POST_KERNEL, CONFIG_BOARD_ANTENNA_INIT_PRIO, NULL);
DEVICE_DT_INST_DEFINE(0, board_antenna_init, NULL, NULL, NULL, POST_KERNEL,
CONFIG_BOARD_ANTENNA_INIT_PRIO, NULL);

static const struct pinctrl_dev_config *ant_pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(0);
static const struct gpio_dt_spec ant_gpios[] = {
GPIO_DT_SPEC_GET_BY_IDX_OR(ANTENNA_MUX, gpios, BOARD_ANT_GPIO_24G, {0}),
GPIO_DT_SPEC_GET_BY_IDX_OR(ANTENNA_MUX, gpios, BOARD_ANT_GPIO_PA, {0}),
GPIO_DT_SPEC_GET_BY_IDX_OR(ANTENNA_MUX, gpios, BOARD_ANT_GPIO_SUBG, {0}),
};

DT_FOREACH_PROP_ELEM_SEP(DT_NODELABEL(antenna_mux0), gpios, GPIO_DT_SPEC_GET_BY_IDX, (,))};

/**
* Antenna switch GPIO init routine.
*/
int board_antenna_init(const struct device *dev)
static int board_antenna_init(const struct device *dev)
{
ARG_UNUSED(dev);
int i;
Expand All @@ -79,9 +71,9 @@ int board_antenna_init(const struct device *dev)
/**
* Custom TI RFCC26XX callback for switching the on-board antenna mux on radio setup.
*/
void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg)
static void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg)
{
bool sub1GHz = false;
bool sub1GHz = false;
uint8_t loDivider = 0;
int i;

Expand All @@ -92,8 +84,8 @@ void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg

if (events & RF_GlobalEventRadioSetup) {
/* Decode the current PA configuration. */
RF_TxPowerTable_PAType paType = (RF_TxPowerTable_PAType)
RF_getTxPower(client).paType;
RF_TxPowerTable_PAType paType =
(RF_TxPowerTable_PAType)RF_getTxPower(client).paType;
/* Decode the generic argument as a setup command. */
RF_RadioSetup *setupCommand = (RF_RadioSetup *)arg;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Copyright (c) 2022 Stancu Florin
# Copyright (c) 2024 Ayush Singh, BeagleBoard.org Foundation
# SPDX-License-Identifier: Apache-2.0

description: Skyworks SKY13317 pHEMT GaAs SP3T Antenna Switch
Expand All @@ -11,4 +12,6 @@ properties:
gpios:
type: phandle-array
required: true
description: Antenna mux control pins
description: Antenna mux control pins. Length 1-3
pinctrl-0:
required: true