boards: beagle: beagleconnect_freedom: Use sky13317
- Use antenna switch sky13317 instead of hack - Base the board_antenna file on cc1352p1_launchxl/board_antenna.c Signed-off-by: Ayush Singh <ayush@beagleboard.org>
This commit is contained in:
parent
49436854c8
commit
2efe8765a3
3 changed files with 78 additions and 56 deletions
|
@ -81,14 +81,18 @@
|
||||||
/* On-board antenna pinmux states */
|
/* On-board antenna pinmux states */
|
||||||
board_ant_tx_pa_off: board_ant_tx_pa_off {
|
board_ant_tx_pa_off: board_ant_tx_pa_off {
|
||||||
pinmux = <29 IOC_PORT_GPIO>;
|
pinmux = <29 IOC_PORT_GPIO>;
|
||||||
|
bias-disable;
|
||||||
};
|
};
|
||||||
board_ant_tx_pa_on: board_ant_tx_pa_on {
|
board_ant_tx_pa_on: board_ant_tx_pa_on {
|
||||||
pinmux = <29 IOC_PORT_RFC_GPO3>;
|
pinmux = <29 IOC_PORT_RFC_GPO3>;
|
||||||
|
bias-disable;
|
||||||
};
|
};
|
||||||
board_ant_subg_off: board_ant_subg_off {
|
board_ant_subg_off: board_ant_subg_off {
|
||||||
pinmux = <30 IOC_PORT_GPIO>;
|
pinmux = <30 IOC_PORT_GPIO>;
|
||||||
|
bias-disable;
|
||||||
};
|
};
|
||||||
board_ant_subg_on: board_ant_subg_on {
|
board_ant_subg_on: board_ant_subg_on {
|
||||||
pinmux = <30 IOC_PORT_RFC_GPO0>;
|
pinmux = <30 IOC_PORT_RFC_GPO0>;
|
||||||
|
bias-disable;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
leds: leds {
|
||||||
compatible = "gpio-leds";
|
compatible = "gpio-leds";
|
||||||
led0: led_0 {
|
led0: led_0 {
|
||||||
gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>; // 2.4GHz TX/RX
|
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 {
|
sens_i2c: sensor-switch {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (c) 2021 Florin Stancu
|
* Copyright (c) 2021 Florin Stancu
|
||||||
* Copyright (c) 2021 Jason Kridner, BeagleBoard.org Foundation
|
* Copyright (c) 2021 Jason Kridner, BeagleBoard.org Foundation
|
||||||
|
* Copyright (c) 2024 Ayush Singh <ayush@beagleboard.org>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -10,22 +11,26 @@
|
||||||
* switch.
|
* switch.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <zephyr/kernel.h>
|
#define DT_DRV_COMPAT skyworks_sky13317
|
||||||
#include <zephyr/device.h>
|
|
||||||
#include <zephyr/init.h>
|
#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 <ti/drivers/rf/RF.h>
|
||||||
#include <driverlib/gpio.h>
|
|
||||||
#include <driverlib/ioc.h>
|
|
||||||
#include <driverlib/rom.h>
|
#include <driverlib/rom.h>
|
||||||
|
#include <driverlib/interrupt.h>
|
||||||
|
|
||||||
/* DIOs for RF antenna paths */
|
/* custom pinctrl states for the antenna mux */
|
||||||
#define BOARD_RF_HIGH_PA 29 /* TODO: pull from DT */
|
#define PINCTRL_STATE_ANT_SUBG 1
|
||||||
#define BOARD_RF_SUB1GHZ 30 /* TODO: pull from DT */
|
#define PINCTRL_STATE_ANT_SUBG_PA 2
|
||||||
|
|
||||||
static void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events,
|
#define BOARD_ANT_GPIO_PA 0
|
||||||
void *arg);
|
#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 = {
|
const RFCC26XX_HWAttrsV2 RFCC26XX_hwAttrs = {
|
||||||
.hwiPriority = INT_PRI_LEVEL7,
|
.hwiPriority = INT_PRI_LEVEL7,
|
||||||
|
@ -38,30 +43,44 @@ const RFCC26XX_HWAttrsV2 RFCC26XX_hwAttrs = {
|
||||||
RF_GlobalEventRadioPowerDown),
|
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.
|
* 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 */
|
/* default pinctrl configuration: set all antenna mux control pins as GPIOs */
|
||||||
IOCPinTypeGpioOutput(BOARD_RF_HIGH_PA);
|
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_DEFAULT);
|
||||||
GPIO_setOutputEnableDio(BOARD_RF_HIGH_PA, GPIO_OUTPUT_DISABLE);
|
/* set all GPIOs to 0 (all RF paths disabled) */
|
||||||
IOCPinTypeGpioOutput(BOARD_RF_SUB1GHZ);
|
for (i = 0; i < ARRAY_SIZE(ant_gpios); i++) {
|
||||||
GPIO_setOutputEnableDio(BOARD_RF_SUB1GHZ, GPIO_OUTPUT_DISABLE);
|
gpio_pin_configure_dt(&ant_gpios[i], 0);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SYS_INIT(board_antenna_init, POST_KERNEL, CONFIG_BOARD_ANTENNA_INIT_PRIO);
|
/**
|
||||||
|
* 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;
|
uint8_t loDivider = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Switch off all paths first. Needs to be done anyway in every sub-case below. */
|
/* Clear all antenna switch GPIOs (for all cases). */
|
||||||
GPIO_setOutputEnableDio(BOARD_RF_HIGH_PA, GPIO_OUTPUT_DISABLE);
|
for (i = 0; i < ARRAY_SIZE(ant_gpios); i++) {
|
||||||
GPIO_setOutputEnableDio(BOARD_RF_SUB1GHZ, GPIO_OUTPUT_DISABLE);
|
gpio_pin_configure_dt(&ant_gpios[i], 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (events & RF_GlobalEventRadioSetup) {
|
if (events & RF_GlobalEventRadioSetup) {
|
||||||
/* Decode the current PA configuration. */
|
/* Decode the current PA configuration. */
|
||||||
|
@ -74,43 +93,27 @@ void board_cc13xx_rf_callback(RF_Handle client, RF_GlobalEvent events, void *arg
|
||||||
case (CMD_RADIO_SETUP):
|
case (CMD_RADIO_SETUP):
|
||||||
case (CMD_BLE5_RADIO_SETUP):
|
case (CMD_BLE5_RADIO_SETUP):
|
||||||
loDivider = RF_LODIVIDER_MASK & setupCommand->common.loDivider;
|
loDivider = RF_LODIVIDER_MASK & setupCommand->common.loDivider;
|
||||||
/* Sub-1GHz front-end. */
|
|
||||||
if (loDivider != 0)
|
|
||||||
sub1GHz = true;
|
|
||||||
break;
|
break;
|
||||||
case (CMD_PROP_RADIO_DIV_SETUP):
|
case (CMD_PROP_RADIO_DIV_SETUP):
|
||||||
loDivider = RF_LODIVIDER_MASK & setupCommand->prop_div.loDivider;
|
loDivider = RF_LODIVIDER_MASK & setupCommand->prop_div.loDivider;
|
||||||
/* Sub-1GHz front-end. */
|
|
||||||
if (loDivider != 0)
|
|
||||||
sub1GHz = true;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
sub1GHz = (loDivider != 0);
|
||||||
|
|
||||||
/* Sub-1 GHz */
|
if (sub1GHz) {
|
||||||
if (paType == RF_TxPowerTable_HighPA) {
|
if (paType == RF_TxPowerTable_HighPA) {
|
||||||
/* PA enable --> HIGH PA */
|
/* Note: RFC_GPO3 is a work-around because the RFC_GPO1 */
|
||||||
/* LNA enable --> Sub-1 GHz */
|
/* is sometimes not de-asserted on CC1352 Rev A. */
|
||||||
/* Note: RFC_GPO3 is a work-around because the RFC_GPO1 */
|
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_ANT_SUBG_PA);
|
||||||
/* is sometimes not de-asserted on CC1352 Rev A. */
|
} else {
|
||||||
IOCPortConfigureSet(BOARD_RF_HIGH_PA,
|
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_ANT_SUBG);
|
||||||
IOC_PORT_RFC_GPO3, IOC_IOMODE_NORMAL);
|
/* Manually set the sub-GHZ antenna switch DIO */
|
||||||
IOCPortConfigureSet(BOARD_RF_SUB1GHZ,
|
gpio_pin_configure_dt(&ant_gpios[BOARD_ANT_GPIO_SUBG], 1);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Reset the IO multiplexer to GPIO functionality */
|
pinctrl_apply_state(ant_pcfg, PINCTRL_STATE_DEFAULT);
|
||||||
IOCPortConfigureSet(BOARD_RF_HIGH_PA,
|
|
||||||
IOC_PORT_GPIO, IOC_IOMODE_NORMAL);
|
|
||||||
IOCPortConfigureSet(BOARD_RF_SUB1GHZ,
|
|
||||||
IOC_PORT_GPIO, IOC_IOMODE_NORMAL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue