Working prop-mode
This commit is contained in:
parent
f9fcbd6a77
commit
f6b016c5d4
@ -56,12 +56,10 @@
|
|||||||
#define CC2650_FAST_RADIO_STARTUP (MAC_CONF_WITH_TSCH)
|
#define CC2650_FAST_RADIO_STARTUP (MAC_CONF_WITH_TSCH)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RF_CHANNEL
|
#ifdef RF_CORE_CONF_CHANNEL
|
||||||
#define RF_CORE_CONF_CHANNEL RF_CHANNEL
|
#define RF_CHANNEL RF_CORE_CONF_CHANNEL
|
||||||
#endif
|
#else
|
||||||
|
#define RF_CHANNEL 25
|
||||||
#ifndef RF_CORE_CONF_CHANNEL
|
|
||||||
#define RF_CORE_CONF_CHANNEL 25
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Number of Prop Mode RX buffers */
|
/* Number of Prop Mode RX buffers */
|
||||||
@ -70,54 +68,59 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Configure Radio mode, i.e. prop or ieee */
|
/* Configure Radio mode, i.e. prop or ieee */
|
||||||
|
|
||||||
|
|
||||||
|
/*----- CC13xx Device Line --------------------------------------------------*/
|
||||||
/* CC13xx supports both IEEE and Prop mode, depending on which device */
|
/* CC13xx supports both IEEE and Prop mode, depending on which device */
|
||||||
/* CC26xx only supports IEEE mode */
|
|
||||||
#if defined(DEVICE_LINE_CC13XX)
|
#if defined(DEVICE_LINE_CC13XX)
|
||||||
|
|
||||||
/* Default mode should be prop for prop-only devices (CC1310, CC1312);
|
/* Default mode should be prop for prop-only devices (CC1310, CC1312R);
|
||||||
* Else, IEEE mode is default. */
|
* Else, IEEE mode is default. */
|
||||||
# ifndef CC13XX_CONF_PROP_MODE
|
# ifndef CC13XX_CONF_PROP_MODE
|
||||||
# if (SUPPORTS_IEEE_MODE == 0)
|
# if (SUPPORTS_IEEE_MODE == 0)
|
||||||
# define CC13XX_CONF_PROP_MODE 1
|
# define CC13XX_CONF_PROP_MODE 1
|
||||||
# else
|
|
||||||
# define CC13XX_CONF_PROP_MODE 0
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
|
|
||||||
# if (CC13XX_CONF_PROP_MODE == 1) && (SUPPORTS_PROP_MODE == 1)
|
|
||||||
/*----- CC13xx Prop Mode ----------------------------------------------------*/
|
|
||||||
# define NETSTACK_CONF_RADIO prop_mode_driver
|
|
||||||
|
|
||||||
# define CSMA_CONF_ACK_WAIT_TIME (RTIMER_SECOND / 400)
|
|
||||||
# define CSMA_CONF_AFTER_ACK_DETECTED_WAIT_TIME \
|
|
||||||
(RTIMER_SECOND / 1000)
|
|
||||||
# define CSMA_CONF_SEND_SOFT_ACK 1
|
|
||||||
|
|
||||||
# elif (CC13XX_CONF_PROP_MODE == 0) && (SUPPORTS_IEEE_MODE == 1)
|
|
||||||
/*----- CC13xx IEEE Mode ----------------------------------------------------*/
|
|
||||||
# define NETSTACK_CONF_RADIO ieee_mode_driver
|
|
||||||
|
|
||||||
# define CSMA_CONF_SEND_SOFT_ACK 0
|
|
||||||
|
|
||||||
# else
|
# else
|
||||||
# error "Invalid radio mode configuration of CC13xx device"
|
# define CC13XX_CONF_PROP_MODE 0
|
||||||
# endif /* (CC13XX_CONF_PROP_MODE == 1) && (SUPPORTS_PROP_MODE == 1) */
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if (CC13XX_CONF_PROP_MODE == 1) && (SUPPORTS_PROP_MODE == 1)
|
||||||
|
/*----- CC13xx Prop Mode ----------------------------------------------------*/
|
||||||
|
# define NETSTACK_CONF_RADIO prop_mode_driver
|
||||||
|
|
||||||
|
# define CSMA_CONF_ACK_WAIT_TIME (RTIMER_SECOND / 300)
|
||||||
|
# define CSMA_CONF_AFTER_ACK_DETECTED_WAIT_TIME (RTIMER_SECOND / 1000)
|
||||||
|
# define CSMA_CONF_SEND_SOFT_ACK 1
|
||||||
|
|
||||||
|
# elif (CC13XX_CONF_PROP_MODE == 0) && (SUPPORTS_IEEE_MODE == 1)
|
||||||
|
/*----- CC13xx IEEE Mode ----------------------------------------------------*/
|
||||||
|
# define NETSTACK_CONF_RADIO ieee_mode_driver
|
||||||
|
|
||||||
|
# define CSMA_CONF_SEND_SOFT_ACK 0
|
||||||
|
|
||||||
|
# else
|
||||||
|
/*----- CC13xx Non-supported Mode -------------------------------------------*/
|
||||||
|
# error "Invalid radio mode configuration of CC13xx device"
|
||||||
|
# endif /* (CC13XX_CONF_PROP_MODE == 1) && (SUPPORTS_PROP_MODE == 1) */
|
||||||
|
|
||||||
|
/*----- CC26xx Device Line --------------------------------------------------*/
|
||||||
|
/* CC26xx only supports IEEE mode */
|
||||||
#elif defined(DEVICE_LINE_CC26XX)
|
#elif defined(DEVICE_LINE_CC26XX)
|
||||||
|
|
||||||
# if (SUPPORTS_IEEE_MODE == 1)
|
# if (SUPPORTS_IEEE_MODE == 1)
|
||||||
/*----- CC26xx IEEE Mode ----------------------------------------------------*/
|
/*----- CC26xx IEEE Mode ----------------------------------------------------*/
|
||||||
# define NETSTACK_CONF_RADIO ieee_mode_driver
|
# define NETSTACK_CONF_RADIO ieee_mode_driver
|
||||||
|
|
||||||
# define CSMA_CONF_SEND_SOFT_ACK 0
|
# define CSMA_CONF_SEND_SOFT_ACK 0
|
||||||
|
|
||||||
# else
|
# else
|
||||||
# error "IEEE mode only supported by CC26xx devices"
|
/*----- CC26xx Non-supported Mode -------------------------------------------*/
|
||||||
# endif /* (SUPPORTS_IEEE_MODE == 1) */
|
# error "IEEE mode only supported by CC26xx devices"
|
||||||
|
# endif /* (SUPPORTS_IEEE_MODE == 1) */
|
||||||
|
|
||||||
|
/*----- Unsupported device line ---------------------------------------------*/
|
||||||
#else
|
#else
|
||||||
# error "Unsupported Device Line defined"
|
# error "Unsupported Device Line defined"
|
||||||
#endif /* defined(DEVICE_LINE_CC13xx) */
|
#endif /* defined(DEVICE_LINE_CC13xx) */
|
||||||
|
|
||||||
#define NETSTACK_RADIO_MAX_PAYLOAD_LEN 125
|
#define NETSTACK_RADIO_MAX_PAYLOAD_LEN 125
|
||||||
|
@ -39,25 +39,18 @@
|
|||||||
#include <contiki.h>
|
#include <contiki.h>
|
||||||
#include <dev/watchdog.h>
|
#include <dev/watchdog.h>
|
||||||
#include <sys/process.h>
|
#include <sys/process.h>
|
||||||
#include <sys/energest.h>
|
|
||||||
#include <net/netstack.h>
|
#include <net/netstack.h>
|
||||||
#include <net/packetbuf.h>
|
#include <net/packetbuf.h>
|
||||||
#include <net/mac/mac.h>
|
#include <net/mac/mac.h>
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <assert.h>
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
/* Log configuration */
|
/* Log configuration */
|
||||||
#include "sys/log.h"
|
#include "sys/log.h"
|
||||||
#define LOG_MODULE "RF"
|
#define LOG_MODULE "RF"
|
||||||
#define LOG_LEVEL LOG_LEVEL_DBG
|
#define LOG_LEVEL LOG_LEVEL_DBG
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
PROCESS(RF_coreProcess, "SimpleLink RF process");
|
PROCESS(rf_process, "SimpleLink RF Process");
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
PROCESS_THREAD(RF_coreProcess, ev, data)
|
PROCESS_THREAD(rf_process, ev, data)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
|
@ -43,34 +43,12 @@
|
|||||||
#ifndef RF_COMMON_H_
|
#ifndef RF_COMMON_H_
|
||||||
#define RF_COMMON_H_
|
#define RF_COMMON_H_
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Contiki API */
|
|
||||||
#include <sys/rtimer.h>
|
|
||||||
#include <dev/radio.h>
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
/* Standard library */
|
|
||||||
#include <stdint.h>
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
#ifdef RF_CORE_CONF_CHANNEL
|
|
||||||
# define RF_CORE_CHANNEL RF_CORE_CONF_CHANNEL
|
|
||||||
#else
|
|
||||||
# define RF_CORE_CHANNEL 25
|
|
||||||
#endif
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CMD_RESULT_ERROR = 0,
|
CMD_RESULT_ERROR = 0,
|
||||||
CMD_RESULT_OK = 1,
|
CMD_RESULT_OK = 1,
|
||||||
} CmdResult;
|
} cmd_result_t;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
typedef struct {
|
PROCESS_NAME(rf_process);
|
||||||
radio_value_t dbm;
|
|
||||||
uint16_t power; ///< Value for the .txPower field
|
|
||||||
} RF_TxPower;
|
|
||||||
|
|
||||||
#define TX_POWER_UNKNOWN 0xFFFF
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
#define RSSI_UNKNOWN -128
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
PROCESS_NAME(RF_coreProcess);
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#endif /* RF_COMMON_H_ */
|
#endif /* RF_COMMON_H_ */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -121,7 +121,7 @@
|
|||||||
#ifdef IEEE_MODE_CONF_CHANNEL
|
#ifdef IEEE_MODE_CONF_CHANNEL
|
||||||
# define IEEE_MODE_CHANNEL IEEE_MODE_CONF_CHANNEL
|
# define IEEE_MODE_CHANNEL IEEE_MODE_CONF_CHANNEL
|
||||||
#else
|
#else
|
||||||
# define IEEE_MODE_CHANNEL RF_CORE_CHANNEL
|
# define IEEE_MODE_CHANNEL RF_CHANNEL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Configuration for TX power table */
|
/* Configuration for TX power table */
|
||||||
@ -301,10 +301,7 @@ static void
|
|||||||
rx_cb(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
|
rx_cb(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
|
||||||
{
|
{
|
||||||
if (e & RF_EventRxOk) {
|
if (e & RF_EventRxOk) {
|
||||||
process_poll(&RF_coreProcess);
|
process_poll(&rf_process);
|
||||||
}
|
|
||||||
if (e & RF_EventRxBufFull) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -343,7 +340,7 @@ init_data_queue(void)
|
|||||||
static void
|
static void
|
||||||
init_rf_params(void)
|
init_rf_params(void)
|
||||||
{
|
{
|
||||||
cmd_rx.channel = RF_CORE_CHANNEL;
|
cmd_rx.channel = IEEE_MODE_CHANNEL;
|
||||||
|
|
||||||
cmd_rx.pRxQ = &g_rxDataQueue;
|
cmd_rx.pRxQ = &g_rxDataQueue;
|
||||||
cmd_rx.pOutput = &g_rxStats;
|
cmd_rx.pOutput = &g_rxStats;
|
||||||
@ -555,7 +552,7 @@ init(void)
|
|||||||
ctimer_set(&g_ratOverflowTimer, RAT_OVERFLOW_PERIOD_SECONDS * CLOCK_SECOND / 2,
|
ctimer_set(&g_ratOverflowTimer, RAT_OVERFLOW_PERIOD_SECONDS * CLOCK_SECOND / 2,
|
||||||
rat_overflow_cb, NULL);
|
rat_overflow_cb, NULL);
|
||||||
|
|
||||||
process_start(&RF_coreProcess, NULL);
|
process_start(&rf_process, NULL);
|
||||||
|
|
||||||
return CMD_RESULT_OK;
|
return CMD_RESULT_OK;
|
||||||
}
|
}
|
||||||
@ -812,23 +809,25 @@ pending_packet(void)
|
|||||||
const rfc_dataEntry_t *const pStartEntry = (rfc_dataEntry_t *)g_rxDataQueue.pCurrEntry;
|
const rfc_dataEntry_t *const pStartEntry = (rfc_dataEntry_t *)g_rxDataQueue.pCurrEntry;
|
||||||
volatile const rfc_dataEntry_t *pCurrEntry = pStartEntry;
|
volatile const rfc_dataEntry_t *pCurrEntry = pStartEntry;
|
||||||
|
|
||||||
|
int rv = 0;
|
||||||
|
|
||||||
// Check all RX buffers and check their statuses, stopping when looping the circular buffer
|
// Check all RX buffers and check their statuses, stopping when looping the circular buffer
|
||||||
int bIsPending = 0;
|
|
||||||
do {
|
do {
|
||||||
const uint8_t status = pCurrEntry->status;
|
const uint8_t status = pCurrEntry->status;
|
||||||
if ((status == DATA_ENTRY_FINISHED) ||
|
if ((status == DATA_ENTRY_FINISHED) ||
|
||||||
(status == DATA_ENTRY_BUSY)) {
|
(status == DATA_ENTRY_BUSY)) {
|
||||||
bIsPending = 1;
|
rv += 1;
|
||||||
if (!g_bPollMode) {
|
|
||||||
process_poll(&RF_coreProcess);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pCurrEntry = (rfc_dataEntry_t *)pCurrEntry->pNextEntry;
|
pCurrEntry = (rfc_dataEntry_t *)pCurrEntry->pNextEntry;
|
||||||
} while (pCurrEntry != pStartEntry);
|
} while (pCurrEntry != pStartEntry);
|
||||||
|
|
||||||
|
if ((rv > 0) && !g_bPollMode) {
|
||||||
|
process_poll(&rf_process);
|
||||||
|
}
|
||||||
|
|
||||||
// If we didn't find an entry at status finished or busy, no frames are pending
|
// If we didn't find an entry at status finished or busy, no frames are pending
|
||||||
return bIsPending;
|
return rv;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
@ -909,7 +908,7 @@ get_value(radio_param_t param, radio_value_t *value)
|
|||||||
|
|
||||||
case RADIO_PARAM_TXPOWER:
|
case RADIO_PARAM_TXPOWER:
|
||||||
*value = get_tx_power();
|
*value = get_tx_power();
|
||||||
return (*value == TX_POWER_UNKNOWN)
|
return (*value == RF_TxPowerTable_INVALID_DBM)
|
||||||
? RADIO_RESULT_ERROR
|
? RADIO_RESULT_ERROR
|
||||||
: RADIO_RESULT_OK;
|
: RADIO_RESULT_OK;
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -97,7 +97,7 @@ RF_TxPowerTable_Entry rf_prop_tx_power_table[RF_PROP_TX_POWER_TABLE_SIZE+1] =
|
|||||||
};
|
};
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// Overrides for CMD_PROP_RADIO_DIV_SETUP
|
// Overrides for CMD_PROP_RADIO_DIV_SETUP
|
||||||
uint32_t p_prop_overrides[] CC_ALIGN(4) =
|
uint32_t rf_prop_overrides[] CC_ALIGN(4) =
|
||||||
{
|
{
|
||||||
// override_use_patch_prop_genfsk.xml
|
// override_use_patch_prop_genfsk.xml
|
||||||
MCE_RFE_OVERRIDE(0,4,0,1,0,0), // PHY: Use MCE ROM bank 4, RFE RAM patch
|
MCE_RFE_OVERRIDE(0,4,0,1,0,0), // PHY: Use MCE ROM bank 4, RFE RAM patch
|
||||||
@ -137,15 +137,15 @@ uint32_t p_prop_overrides[] CC_ALIGN(4) =
|
|||||||
// Proprietary Mode Radio Setup Command for All Frequency Bands
|
// Proprietary Mode Radio Setup Command for All Frequency Bands
|
||||||
rfc_CMD_PROP_RADIO_DIV_SETUP_t rf_cmd_prop_radio_div_setup =
|
rfc_CMD_PROP_RADIO_DIV_SETUP_t rf_cmd_prop_radio_div_setup =
|
||||||
{
|
{
|
||||||
.commandNo = 0x3807,
|
.commandNo = CMD_PROP_RADIO_DIV_SETUP,
|
||||||
.status = 0x0000,
|
.status = IDLE,
|
||||||
.pNextOp = 0,
|
.pNextOp = 0,
|
||||||
.startTime = 0x00000000,
|
.startTime = 0x00000000,
|
||||||
.startTrigger.triggerType = 0x0,
|
.startTrigger.triggerType = 0x0,
|
||||||
.startTrigger.bEnaCmd = 0x0,
|
.startTrigger.bEnaCmd = 0x0,
|
||||||
.startTrigger.triggerNo = 0x0,
|
.startTrigger.triggerNo = 0x0,
|
||||||
.startTrigger.pastTrig = 0x0,
|
.startTrigger.pastTrig = 0x0,
|
||||||
.condition.rule = 0x1,
|
.condition.rule = COND_NEVER,
|
||||||
.condition.nSkip = 0x0,
|
.condition.nSkip = 0x0,
|
||||||
.modulation.modType = 0x1,
|
.modulation.modType = 0x1,
|
||||||
.modulation.deviation = 0x64,
|
.modulation.deviation = 0x64,
|
||||||
@ -164,7 +164,7 @@ rfc_CMD_PROP_RADIO_DIV_SETUP_t rf_cmd_prop_radio_div_setup =
|
|||||||
.config.analogCfgMode = 0x0,
|
.config.analogCfgMode = 0x0,
|
||||||
.config.bNoFsPowerUp = 0x0,
|
.config.bNoFsPowerUp = 0x0,
|
||||||
.txPower = 0xAB3F,
|
.txPower = 0xAB3F,
|
||||||
.pRegOverride = pPropOverrides,
|
.pRegOverride = rf_prop_overrides,
|
||||||
.centerFreq = 0x0364,
|
.centerFreq = 0x0364,
|
||||||
.intFreq = 0x8000,
|
.intFreq = 0x8000,
|
||||||
.loDivider = 0x05,
|
.loDivider = 0x05,
|
||||||
@ -174,15 +174,15 @@ rfc_CMD_PROP_RADIO_DIV_SETUP_t rf_cmd_prop_radio_div_setup =
|
|||||||
// Frequency Synthesizer Programming Command
|
// Frequency Synthesizer Programming Command
|
||||||
rfc_CMD_FS_t rf_cmd_prop_fs =
|
rfc_CMD_FS_t rf_cmd_prop_fs =
|
||||||
{
|
{
|
||||||
.commandNo = 0x0803,
|
.commandNo = CMD_FS,
|
||||||
.status = 0x0000,
|
.status = IDLE,
|
||||||
.pNextOp = 0,
|
.pNextOp = 0,
|
||||||
.startTime = 0x00000000,
|
.startTime = 0x00000000,
|
||||||
.startTrigger.triggerType = 0x0,
|
.startTrigger.triggerType = 0x0,
|
||||||
.startTrigger.bEnaCmd = 0x0,
|
.startTrigger.bEnaCmd = 0x0,
|
||||||
.startTrigger.triggerNo = 0x0,
|
.startTrigger.triggerNo = 0x0,
|
||||||
.startTrigger.pastTrig = 0x0,
|
.startTrigger.pastTrig = 0x0,
|
||||||
.condition.rule = 0x1,
|
.condition.rule = COND_NEVER,
|
||||||
.condition.nSkip = 0x0,
|
.condition.nSkip = 0x0,
|
||||||
.frequency = 0x0364,
|
.frequency = 0x0364,
|
||||||
.fractFreq = 0x0000,
|
.fractFreq = 0x0000,
|
||||||
@ -199,14 +199,14 @@ rfc_CMD_FS_t rf_cmd_prop_fs =
|
|||||||
rfc_CMD_PROP_TX_ADV_t rf_cmd_prop_tx_adv =
|
rfc_CMD_PROP_TX_ADV_t rf_cmd_prop_tx_adv =
|
||||||
{
|
{
|
||||||
.commandNo = CMD_PROP_TX_ADV,
|
.commandNo = CMD_PROP_TX_ADV,
|
||||||
.status = 0x0000,
|
.status = IDLE,
|
||||||
.pNextOp = 0,
|
.pNextOp = 0,
|
||||||
.startTime = 0x00000000,
|
.startTime = 0x00000000,
|
||||||
.startTrigger.triggerType = 0x2,
|
.startTrigger.triggerType = 0x2,
|
||||||
.startTrigger.bEnaCmd = 0x0,
|
.startTrigger.bEnaCmd = 0x0,
|
||||||
.startTrigger.triggerNo = 0x0,
|
.startTrigger.triggerNo = 0x0,
|
||||||
.startTrigger.pastTrig = 0x1,
|
.startTrigger.pastTrig = 0x1,
|
||||||
.condition.rule = 0x1,
|
.condition.rule = COND_NEVER,
|
||||||
.condition.nSkip = 0x0,
|
.condition.nSkip = 0x0,
|
||||||
.pktConf.bFsOff = 0x0,
|
.pktConf.bFsOff = 0x0,
|
||||||
.pktConf.bUseCrc = 0x1,
|
.pktConf.bUseCrc = 0x1,
|
||||||
|
@ -52,7 +52,7 @@ extern rfc_CMD_PROP_TX_ADV_t rf_cmd_prop_tx_adv;
|
|||||||
extern rfc_CMD_PROP_RX_ADV_t rf_cmd_prop_rx_adv;
|
extern rfc_CMD_PROP_RX_ADV_t rf_cmd_prop_rx_adv;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
// RF Core API Overrides
|
// RF Core API Overrides
|
||||||
extern uint32_t p_prop_overrides[];
|
extern uint32_t rf_prop_overrides[];
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#endif /* PROP_SETTINGS_H_ */
|
#endif /* PROP_SETTINGS_H_ */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -109,7 +109,7 @@ uint32_t rf_ieee_overrides[] CC_ALIGN(4) =
|
|||||||
rfc_CMD_RADIO_SETUP_t rf_cmd_ieee_radio_setup =
|
rfc_CMD_RADIO_SETUP_t rf_cmd_ieee_radio_setup =
|
||||||
{
|
{
|
||||||
.commandNo = CMD_RADIO_SETUP,
|
.commandNo = CMD_RADIO_SETUP,
|
||||||
.status = 0x0000,
|
.status = IDLE,
|
||||||
.pNextOp = 0,
|
.pNextOp = 0,
|
||||||
.startTime = 0x00000000,
|
.startTime = 0x00000000,
|
||||||
.startTrigger.triggerType = TRIG_NOW,
|
.startTrigger.triggerType = TRIG_NOW,
|
||||||
@ -133,7 +133,7 @@ rfc_CMD_RADIO_SETUP_t rf_cmd_ieee_radio_setup =
|
|||||||
rfc_CMD_FS_t rf_cmd_ieee_fs =
|
rfc_CMD_FS_t rf_cmd_ieee_fs =
|
||||||
{
|
{
|
||||||
.commandNo = CMD_FS,
|
.commandNo = CMD_FS,
|
||||||
.status = 0x0000,
|
.status = IDLE,
|
||||||
.pNextOp = 0,
|
.pNextOp = 0,
|
||||||
.startTime = 0x00000000,
|
.startTime = 0x00000000,
|
||||||
.startTrigger.triggerType = TRIG_NOW,
|
.startTrigger.triggerType = TRIG_NOW,
|
||||||
@ -142,8 +142,8 @@ rfc_CMD_FS_t rf_cmd_ieee_fs =
|
|||||||
.startTrigger.pastTrig = 0x0,
|
.startTrigger.pastTrig = 0x0,
|
||||||
.condition.rule = COND_NEVER,
|
.condition.rule = COND_NEVER,
|
||||||
.condition.nSkip = 0x0,
|
.condition.nSkip = 0x0,
|
||||||
.frequency = 0x0965,
|
.frequency = 0x0965, /* set by driver */
|
||||||
.fractFreq = 0x0000,
|
.fractFreq = 0x0000, /* set by driver */
|
||||||
.synthConf.bTxMode = 0x1,
|
.synthConf.bTxMode = 0x1,
|
||||||
.synthConf.refFreq = 0x0,
|
.synthConf.refFreq = 0x0,
|
||||||
.__dummy0 = 0x00,
|
.__dummy0 = 0x00,
|
||||||
@ -156,8 +156,8 @@ rfc_CMD_FS_t rf_cmd_ieee_fs =
|
|||||||
// IEEE 802.15.4 Transmit Command
|
// IEEE 802.15.4 Transmit Command
|
||||||
rfc_CMD_IEEE_TX_t rf_cmd_ieee_tx =
|
rfc_CMD_IEEE_TX_t rf_cmd_ieee_tx =
|
||||||
{
|
{
|
||||||
.commandNo = CMD_IEEE_RX,
|
.commandNo = CMD_IEEE_TX,
|
||||||
.status = 0x0000,
|
.status = IDLE,
|
||||||
.pNextOp = 0,
|
.pNextOp = 0,
|
||||||
.startTime = 0x00000000,
|
.startTime = 0x00000000,
|
||||||
.startTrigger.triggerType = TRIG_NOW,
|
.startTrigger.triggerType = TRIG_NOW,
|
||||||
@ -178,25 +178,25 @@ rfc_CMD_IEEE_TX_t rf_cmd_ieee_tx =
|
|||||||
// IEEE 802.15.4 Receive Command
|
// IEEE 802.15.4 Receive Command
|
||||||
rfc_CMD_IEEE_RX_t rf_cmd_ieee_rx =
|
rfc_CMD_IEEE_RX_t rf_cmd_ieee_rx =
|
||||||
{
|
{
|
||||||
.commandNo = 0x2801,
|
.commandNo = CMD_IEEE_RX,
|
||||||
.status = 0x0000,
|
.status = IDLE,
|
||||||
.pNextOp = 0,
|
.pNextOp = 0,
|
||||||
.startTime = 0x00000000,
|
.startTime = 0x00000000,
|
||||||
.startTrigger.triggerType = 0x0,
|
.startTrigger.triggerType = TRIG_NOW,
|
||||||
.startTrigger.bEnaCmd = 0x0,
|
.startTrigger.bEnaCmd = 0x0,
|
||||||
.startTrigger.triggerNo = 0x0,
|
.startTrigger.triggerNo = 0x0,
|
||||||
.startTrigger.pastTrig = 0x0,
|
.startTrigger.pastTrig = 0x0,
|
||||||
.condition.rule = 0x1,
|
.condition.rule = COND_NEVER,
|
||||||
.condition.nSkip = 0x0,
|
.condition.nSkip = 0x0,
|
||||||
.channel = 0x00,
|
.channel = 0x00, /* set by driver */
|
||||||
.rxConfig.bAutoFlushCrc = 0x0,
|
.rxConfig.bAutoFlushCrc = 0x1,
|
||||||
.rxConfig.bAutoFlushIgn = 0x0,
|
.rxConfig.bAutoFlushIgn = 0x0,
|
||||||
.rxConfig.bIncludePhyHdr = 0x0,
|
.rxConfig.bIncludePhyHdr = 0x0,
|
||||||
.rxConfig.bIncludeCrc = 0x0,
|
.rxConfig.bIncludeCrc = 0x1,
|
||||||
.rxConfig.bAppendRssi = 0x1,
|
.rxConfig.bAppendRssi = 0x1,
|
||||||
.rxConfig.bAppendCorrCrc = 0x1,
|
.rxConfig.bAppendCorrCrc = 0x1,
|
||||||
.rxConfig.bAppendSrcInd = 0x0,
|
.rxConfig.bAppendSrcInd = 0x0,
|
||||||
.rxConfig.bAppendTimestamp = 0x0,
|
.rxConfig.bAppendTimestamp = 0x1,
|
||||||
.pRxQ = 0, /* set by driver */
|
.pRxQ = 0, /* set by driver */
|
||||||
.pOutput = 0, /* set by driver */
|
.pOutput = 0, /* set by driver */
|
||||||
.frameFiltOpt.frameFiltEn = 0x0, /* set by driver */
|
.frameFiltOpt.frameFiltEn = 0x0, /* set by driver */
|
||||||
|
@ -34,8 +34,8 @@
|
|||||||
#include <ti/devices/DeviceFamily.h>
|
#include <ti/devices/DeviceFamily.h>
|
||||||
#include DeviceFamily_constructPath(driverlib/rf_mailbox.h)
|
#include DeviceFamily_constructPath(driverlib/rf_mailbox.h)
|
||||||
#include DeviceFamily_constructPath(driverlib/rf_common_cmd.h)
|
#include DeviceFamily_constructPath(driverlib/rf_common_cmd.h)
|
||||||
#include DeviceFamily_constructPath(driverlib/rf_ieee_cmd.h
|
#include DeviceFamily_constructPath(driverlib/rf_ieee_cmd.h)
|
||||||
#include DeviceFamily_constructPath(driverlib/rf_ieee_mailbox.h))
|
#include DeviceFamily_constructPath(driverlib/rf_ieee_mailbox.h)
|
||||||
|
|
||||||
#include <ti/drivers/rf/RF.h>
|
#include <ti/drivers/rf/RF.h>
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -59,8 +59,8 @@
|
|||||||
* Override button symbols from dev/button-sensor.h, for the examples that
|
* Override button symbols from dev/button-sensor.h, for the examples that
|
||||||
* include it
|
* include it
|
||||||
*/
|
*/
|
||||||
#define btn1_sensor button_left_sensor
|
#define button_left_sensor btn1_sensor
|
||||||
#define btn2_sensor button_right_sensor
|
#define button_right_sensor btn2_sensor
|
||||||
/** @} */
|
/** @} */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Platform-specific define to signify sensor reading failure */
|
/* Platform-specific define to signify sensor reading failure */
|
||||||
|
@ -41,23 +41,24 @@
|
|||||||
#include <lib/sensors.h>
|
#include <lib/sensors.h>
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#include <Board.h>
|
#include <Board.h>
|
||||||
#include <ti/drivers/GPIO.h>
|
#include <ti/drivers/PIN.h>
|
||||||
#include <ti/drivers/Power.h>
|
#include <ti/drivers/Power.h>
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#include "button-sensor.h"
|
#include "button-sensor.h"
|
||||||
#include "button-sensor-arch.h"
|
#include "button-sensor-arch.h"
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* LaunchPad has 2 buttons: BTN1 and BTN2 */
|
/* LaunchPad has 2 buttons: BTN1 and BTN2 */
|
||||||
/* Map the GPIO defines from the Board file */
|
/* Map the GPIO defines from the Board file */
|
||||||
#define BTN1_GPIO Board_GPIO_BTN1
|
#define BTN1_PIN Board_PIN_BTN1
|
||||||
#define BTN2_GPIO Board_GPIO_BTN2
|
#define BTN2_PIN Board_PIN_BTN2
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#ifdef BUTTON_SENSOR_CONF_ENABLE_SHUTDOWN
|
#ifdef BUTTON_SENSOR_CONF_ENABLE_SHUTDOWN
|
||||||
# define BUTTON_SENSOR_ENABLE_SHUTDOWN BUTTON_SENSOR_CONF_ENABLE_SHUTDOWN
|
# define BUTTON_SENSOR_ENABLE_SHUTDOWN BUTTON_SENSOR_CONF_ENABLE_SHUTDOWN
|
||||||
#else
|
#else
|
||||||
# define BUTTON_SENSOR_ENABLE_SHUTDOWN 1
|
# define BUTTON_SENSOR_ENABLE_SHUTDOWN 0
|
||||||
#endif
|
#endif
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#define DEBOUNCE_DURATION (CLOCK_SECOND >> 5)
|
#define DEBOUNCE_DURATION (CLOCK_SECOND >> 5)
|
||||||
@ -68,56 +69,92 @@ typedef struct {
|
|||||||
clock_time_t duration;
|
clock_time_t duration;
|
||||||
} BtnTimer;
|
} BtnTimer;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static BtnTimer g_btn1Timer;
|
static BtnTimer btn1_timer;
|
||||||
static BtnTimer g_btn2Timer;
|
static BtnTimer btn2_timer;
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static const PIN_Config btn_pin_table[] = {
|
||||||
|
BTN1_PIN | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
|
||||||
|
BTN2_PIN | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
|
||||||
|
PIN_TERMINATE
|
||||||
|
};
|
||||||
|
|
||||||
|
static PIN_State pin_state;
|
||||||
|
static PIN_Handle pin_handle;
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
button_press_cb(uint8_t index, BtnTimer *btnTimer, const struct sensors_sensor *btnSensor)
|
button_press_cb(PIN_Handle handle, PIN_Id pin_id)
|
||||||
{
|
{
|
||||||
if (!timer_expired(&btnTimer->debounce)) {
|
#ifdef BUTTON_SENSOR_ENABLE_SHUTDOWN
|
||||||
|
if (pin_id == BTN2_PIN) {
|
||||||
|
Power_shutdown(Power_ENTERING_SHUTDOWN, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
BtnTimer *btn_timer = NULL;
|
||||||
|
const struct sensors_sensor *btn_sensor = NULL;
|
||||||
|
|
||||||
|
switch (pin_id) {
|
||||||
|
case BTN1_PIN: btn_timer = &btn1_timer;
|
||||||
|
btn_sensor = &btn1_sensor; break;
|
||||||
|
case BTN2_PIN: btn_timer = &btn2_timer;
|
||||||
|
btn_sensor = &btn2_sensor; break;
|
||||||
|
default: return; /* No matching PIN */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!timer_expired(&btn_timer->debounce)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
timer_set(&btnTimer->debounce, DEBOUNCE_DURATION);
|
timer_set(&btn_timer->debounce, DEBOUNCE_DURATION);
|
||||||
|
|
||||||
// Start press duration counter on press (falling), notify on release (rising)
|
// Start press duration counter on press (falling), notify on release (rising)
|
||||||
if (GPIO_read(index) == 0) {
|
if (PIN_getInputValue(pin_id) == 0) {
|
||||||
btnTimer->start = clock_time();
|
btn_timer->start = clock_time();
|
||||||
btnTimer->duration = 0;
|
btn_timer->duration = 0;
|
||||||
} else {
|
} else {
|
||||||
btnTimer->duration = clock_time() - btnTimer->start;
|
btn_timer->duration = clock_time() - btn_timer->start;
|
||||||
sensors_changed(btnSensor);
|
sensors_changed(btn_sensor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
button_value(int type, uint8_t index, BtnTimer *btnTimer)
|
button_value(int type, uint8_t pin, BtnTimer *btn_timer)
|
||||||
{
|
{
|
||||||
if (type == BUTTON_SENSOR_VALUE_STATE) {
|
if (type == BUTTON_SENSOR_VALUE_STATE) {
|
||||||
return (GPIO_read(index) == 0)
|
return (PIN_getInputValue(pin) == 0)
|
||||||
? BUTTON_SENSOR_VALUE_PRESSED
|
? BUTTON_SENSOR_VALUE_PRESSED
|
||||||
: BUTTON_SENSOR_VALUE_RELEASED;
|
: BUTTON_SENSOR_VALUE_RELEASED;
|
||||||
} else if (type == BUTTON_SENSOR_VALUE_DURATION) {
|
} else if (type == BUTTON_SENSOR_VALUE_DURATION) {
|
||||||
return (int)btnTimer->duration;
|
return (int)btn_timer->duration;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
button_config(int type, int value, uint8_t index, GPIO_CallbackFxn callback)
|
button_config(int type, int value, uint8_t pin)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SENSORS_HW_INIT:
|
case SENSORS_HW_INIT:
|
||||||
GPIO_clearInt(index);
|
// Open PIN handle
|
||||||
GPIO_setCallback(index, callback);
|
if (pin_handle) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
pin_handle = PIN_open(&pin_state, btn_pin_table);
|
||||||
|
if (!pin_handle) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// Register button callback function
|
||||||
|
PIN_registerIntCb(pin_handle, button_press_cb);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SENSORS_ACTIVE:
|
case SENSORS_ACTIVE:
|
||||||
if (value) {
|
if (value) {
|
||||||
GPIO_clearInt(index);
|
// Enable interrupts on both edges
|
||||||
GPIO_enableInt(index);
|
PIN_setInterrupt(pin_handle, pin | PIN_IRQ_BOTHEDGES);
|
||||||
} else {
|
} else {
|
||||||
GPIO_disableInt(index);
|
// Disable pin interrupts
|
||||||
|
PIN_setInterrupt(pin_handle, pin | PIN_IRQ_DIS);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -126,70 +163,53 @@ button_config(int type, int value, uint8_t index, GPIO_CallbackFxn callback)
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
button_status(int type, uint8_t index)
|
button_status(int type, uint8_t pin)
|
||||||
{
|
{
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case SENSORS_ACTIVE: /* fallthrough */
|
case SENSORS_ACTIVE: /* fallthrough */
|
||||||
case SENSORS_READY: {
|
case SENSORS_READY: {
|
||||||
GPIO_PinConfig pinCfg = 0;
|
PIN_Config pin_cfg = PIN_getConfig(pin);
|
||||||
GPIO_getConfig(index, &pinCfg);
|
return (pin_cfg & PIN_BM_IRQ) == PIN_IRQ_DIS;
|
||||||
return (pinCfg & GPIO_CFG_IN_INT_NONE) == 0;
|
|
||||||
}
|
}
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
|
||||||
btn1_press_cb(unsigned char unusued)
|
|
||||||
{
|
|
||||||
button_press_cb(BTN1_GPIO, &g_btn1Timer, &btn1_sensor);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static int
|
static int
|
||||||
btn1_value(int type)
|
btn1_value(int type)
|
||||||
{
|
{
|
||||||
return button_value(type, BTN1_GPIO, &g_btn1Timer);
|
return button_value(type, BTN1_PIN, &btn1_timer);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
btn1_config(int type, int value)
|
btn1_config(int type, int value)
|
||||||
{
|
{
|
||||||
return button_config(type, value, BTN1_GPIO, btn1_press_cb);
|
return button_config(type, value, BTN1_PIN);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
btn1_status(int type)
|
btn1_status(int type)
|
||||||
{
|
{
|
||||||
return button_status(type, BTN1_GPIO);
|
return button_status(type, BTN1_PIN);
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static void
|
|
||||||
btn2_press_cb(unsigned char unusued)
|
|
||||||
{
|
|
||||||
if (BUTTON_SENSOR_ENABLE_SHUTDOWN) {
|
|
||||||
Power_shutdown(Power_ENTERING_SHUTDOWN, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
button_press_cb(BTN2_GPIO, &g_btn2Timer, &btn2_sensor);
|
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
btn2_value(int type)
|
btn2_value(int type)
|
||||||
{
|
{
|
||||||
return button_value(type, BTN2_GPIO, &g_btn2Timer);
|
return button_value(type, BTN2_PIN, &btn2_timer);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
btn2_config(int type, int value)
|
btn2_config(int type, int value)
|
||||||
{
|
{
|
||||||
return button_config(type, value, BTN2_GPIO, btn2_press_cb);
|
return button_config(type, value, BTN2_PIN);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
btn2_status(int type)
|
btn2_status(int type)
|
||||||
{
|
{
|
||||||
return button_status(type, BTN1_GPIO);
|
return button_status(type, BTN2_PIN);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
SENSORS_SENSOR(btn1_sensor, BUTTON_SENSOR, btn1_value, btn1_config, btn1_status);
|
SENSORS_SENSOR(btn1_sensor, BUTTON_SENSOR, btn1_value, btn1_config, btn1_status);
|
||||||
|
@ -43,12 +43,8 @@
|
|||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Exports a global symbol to be used by the sensor API */
|
/* Exports a global symbol to be used by the sensor API */
|
||||||
SENSORS(
|
SENSORS(
|
||||||
#ifdef BUTTON_SENSOR_ARCH_BTN1
|
&btn1_sensor,
|
||||||
&button_sensor,
|
&btn2_sensor,
|
||||||
#endif
|
|
||||||
#ifdef BUTTON_SENSOR_ARCH_BTN2
|
|
||||||
&button_sensor2,
|
|
||||||
#endif
|
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -145,6 +145,10 @@
|
|||||||
#define ABS(n) (((n) < 0) ? -(n) : (n))
|
#define ABS(n) (((n) < 0) ? -(n) : (n))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CLAMP
|
||||||
|
#define CLAMP(v, vmin, vmax) (MAX(MIN(v, vmax), vmin))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define CC_CONCAT2(s1, s2) s1##s2
|
#define CC_CONCAT2(s1, s2) s1##s2
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user