[radio] add proprietary radio support (#6558)

This commit adds single-band proprietary radio support for
OpenThread. This feature will enable users to configure OpenThread
stack with proprietary radio parameters and use a PHY as defined by
the Platform.

More specifically:
1. Introduced the following platform configuration options:
   - OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
   - OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MIN
   - OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MAX
   - OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK
   - OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE
2. Updated the radio and meshcop tlv implementation to incorporate the
   proprietary radio configurations
3. Updated the network diagnostics code to support channel page mask
   value up to 32.
This commit is contained in:
Sagar Chinchani
2021-05-07 19:25:15 -07:00
committed by GitHub
parent 5b425a1b58
commit 122d8b8d71
5 changed files with 88 additions and 7 deletions
@@ -413,6 +413,17 @@
#endif
/**
* @def OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
*
* Define to 1 to support proprietary radio configurations defined by platform.
*
* @note If this setting is set to 1, the channel range is defined by the platform. Choosing this option requires
* the following configuration options to be defined by Platform:
* OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE,
* OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MIN,
* OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MAX and,
* OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK.
*
* @def OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT
*
* Define to 1 to support OQPSK modulation in 915MHz frequency band. The physical layer parameters are defined in
@@ -427,15 +438,18 @@
*
* @note If this settings is set to 1, the IEEE 802.15.4 channel range is 11 to 26.
*
* @note At least one of these two settings must be set to 1. The platform must support the modulation and frequency
* @note At least one of these settings must be set to 1. The platform must support the modulation and frequency
* band configured by the setting.
*/
#ifndef OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
#ifndef OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT
#ifndef OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT
#define OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT 0
#define OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT 0
#define OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT 1
#endif
#endif
#endif
/**
* @def OPENTHREAD_CONFIG_DEFAULT_CHANNEL
+24
View File
@@ -118,4 +118,28 @@
#define OPENTHREAD_CONFIG_PLATFORM_RADIO_SPINEL_RX_FRAME_BUFFER_SIZE 8192
#endif
/**
* @def OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
*
* Define to 1 if you want to enable proprietary radio support as defined by platform.
*
*/
#ifndef OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
#define OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT 0
#endif
#if OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
#if (!defined(OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE) || \
!defined(OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MIN) || \
!defined(OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MAX) || \
!defined(OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK))
#error "Proprietary radio support requires\
OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE,\
OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MIN,\
OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MAX and\
OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK\
to be defined by Platform."
#endif
#endif
#endif // CONFIG_PLATFORM_H_
+35 -1
View File
@@ -200,6 +200,14 @@ void ChannelTlv::SetChannel(uint16_t aChannel)
}
#endif
#if OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
if ((OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MIN <= aChannel) &&
(aChannel <= OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MAX))
{
channelPage = OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE;
}
#endif
SetChannelPage(channelPage);
mChannel = HostSwap16(aChannel);
}
@@ -285,6 +293,18 @@ void ChannelMaskTlv::SetChannelMask(uint32_t aChannelMask)
}
#endif
#if OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
if (aChannelMask & OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK)
{
OT_ASSERT(entry != nullptr);
entry->Init();
entry->SetChannelPage(OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE);
entry->SetMask(aChannelMask & OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK);
length += sizeof(MeshCoP::ChannelMaskEntry);
}
#endif
SetLength(length);
}
@@ -318,6 +338,14 @@ uint32_t ChannelMaskTlv::GetChannelMask(void) const
}
#endif
#if OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
if (channelPage == OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE)
{
mask |= static_cast<const ChannelMaskEntry *>(cur)->GetMask() &
OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK;
}
#endif
cur = cur->GetNext();
}
@@ -356,8 +384,14 @@ uint32_t ChannelMaskTlv::GetChannelMask(const Message &aMessage)
mask |= entry.GetMask() & OT_RADIO_915MHZ_OQPSK_CHANNEL_MASK;
break;
#endif
}
#if OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
case OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE:
IgnoreError(aMessage.Read(offset, entry));
mask |= entry.GetMask() & OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK;
break;
#endif
}
offset += entry.GetEntrySize();
}
+13 -4
View File
@@ -74,8 +74,8 @@ class Radio : public InstanceLocator, private NonCopyable
public:
/**
* This enumeration defines the IEEE 802.15.4 channel related parameters.
*
* This enumeration defines the IEEE 802.15.4 channel related parameters. It also
* supports proprietary channel parameters defined by platform.
*/
enum
{
@@ -97,11 +97,20 @@ public:
kChannelMin = OT_RADIO_2P4GHZ_OQPSK_CHANNEL_MIN,
kChannelMax = OT_RADIO_2P4GHZ_OQPSK_CHANNEL_MAX,
kSupportedChannelPages = OT_RADIO_CHANNEL_PAGE_0_MASK,
#elif OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT
kNumChannelPages = 1,
kSupportedChannels = OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MASK,
kChannelMin = OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MIN,
kChannelMax = OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_MAX,
kSupportedChannelPages = (1U << OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_CHANNEL_PAGE),
#endif
};
static_assert((OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT || OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT),
"OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT or OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT "
static_assert((OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT || OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT ||
OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT),
"OPENTHREAD_CONFIG_RADIO_2P4GHZ_OQPSK_SUPPORT "
"or OPENTHREAD_CONFIG_RADIO_915MHZ_OQPSK_SUPPORT "
"or OPENTHREAD_CONFIG_PLATFORM_RADIO_PROPRIETARY_SUPPORT "
"must be set to 1 to specify the radio mode");
/**
+1 -1
View File
@@ -410,7 +410,7 @@ Error NetworkDiagnostic::FillRequestedTlvs(const Message & aRequest,
case NetworkDiagnosticTlv::kChannelPages:
{
uint8_t length = 0;
uint8_t pageMask = Radio::kSupportedChannelPages;
uint32_t pageMask = Radio::kSupportedChannelPages;
ChannelPagesTlv tlv;
tlv.Init();