[posix] extract co-processor init out of otSysInit (#10344)

This commit adds a new posix sys API `otSysInitCoprocessor` which only
initializes the platform spinel component. (Reset the co-processor and
get the type)

The intention is to let the app to get the co-processor type without
creating the otInstance. Currently only `otSysInit` can be called
which creates the otInstance. However in some cases, we don't want to
create the instance at the early stage.
This commit is contained in:
Li Cao
2024-06-06 08:42:49 -07:00
committed by GitHub
parent 89b42178ad
commit cdeb02b035
3 changed files with 58 additions and 23 deletions
+5 -3
View File
@@ -275,12 +275,14 @@ static void ParseArg(int aArgCount, char *aArgVector[], PosixConfig *aConfig)
for (; optind < aArgCount; optind++)
{
VerifyOrDie(aConfig->mPlatformConfig.mRadioUrlNum < OT_ARRAY_LENGTH(aConfig->mPlatformConfig.mRadioUrls),
VerifyOrDie(aConfig->mPlatformConfig.mCoprocessorUrls.mNum <
OT_ARRAY_LENGTH(aConfig->mPlatformConfig.mCoprocessorUrls.mUrls),
OT_EXIT_INVALID_ARGUMENTS);
aConfig->mPlatformConfig.mRadioUrls[aConfig->mPlatformConfig.mRadioUrlNum++] = aArgVector[optind];
aConfig->mPlatformConfig.mCoprocessorUrls.mUrls[aConfig->mPlatformConfig.mCoprocessorUrls.mNum++] =
aArgVector[optind];
}
if (aConfig->mPlatformConfig.mRadioUrlNum == 0)
if (aConfig->mPlatformConfig.mCoprocessorUrls.mNum == 0)
{
PrintUsage(aArgVector[0], stderr, OT_EXIT_INVALID_ARGUMENTS);
}
@@ -69,25 +69,49 @@ enum
OT_PLATFORM_CONFIG_MAX_RADIO_URLS = 2, ///< Max number of Radio URLs.
};
/**
* Represents the Co-processor URLs.
*
*/
typedef struct otPlatformCoprocessorUrls
{
const char *mUrls[OT_PLATFORM_CONFIG_MAX_RADIO_URLS]; ///< Co-processor URLs.
uint8_t mNum; ///< Number of Co-processor URLs.
} otPlatformCoprocessorUrls;
/**
* Represents platform specific configurations.
*
*/
typedef struct otPlatformConfig
{
const char *mBackboneInterfaceName; ///< Backbone network interface name.
const char *mInterfaceName; ///< Thread network interface name.
const char *mRadioUrls[OT_PLATFORM_CONFIG_MAX_RADIO_URLS]; ///< Radio URLs.
uint8_t mRadioUrlNum; ///< Number of Radio URLs.
int mRealTimeSignal; ///< The real-time signal for microsecond timer.
uint32_t mSpeedUpFactor; ///< Speed up factor.
bool mPersistentInterface; ///< Whether persistent the interface
bool mDryRun; ///< If 'DryRun' is set, the posix daemon will exit
///< directly after initialization.
CoprocessorType mCoprocessorType; ///< The co-processor type. This field is used to pass
///< the type to the app layer.
const char *mBackboneInterfaceName; ///< Backbone network interface name.
const char *mInterfaceName; ///< Thread network interface name.
otPlatformCoprocessorUrls mCoprocessorUrls; ///< Coprocessor URLs.
int mRealTimeSignal; ///< The real-time signal for microsecond timer.
uint32_t mSpeedUpFactor; ///< Speed up factor.
bool mPersistentInterface; ///< Whether persistent the interface
bool mDryRun; ///< If 'DryRun' is set, the posix daemon will exit
///< directly after initialization.
CoprocessorType mCoprocessorType; ///< The co-processor type. This field is used to pass
///< the type to the app layer.
} otPlatformConfig;
/**
* Initializes the co-processor and the spinel driver.
*
* @note This API will initialize the co-processor by resetting it and return the co-processor type.
* If this API is called, the upcoming call of `otSysInit` won't initialize the co-processor
* and the spinel driver again, unless `otSysDeinit` is called. This API is used to get the
* co-processor type without calling `otSysInit`.
*
* @param[in] aUrls The URLs to initialize the co-processor.
*
* @returns The co-processor type.
*
*/
CoprocessorType otSysInitCoprocessor(otPlatformCoprocessorUrls *aUrls);
/**
* Performs all platform-specific initialization of OpenThread's drivers and initializes the OpenThread
* instance.
+18 -9
View File
@@ -82,20 +82,20 @@ static void processStateChange(otChangedFlags aFlags, void *aContext)
}
#endif
static const char *get802154RadioUrl(otPlatformConfig *aPlatformConfig)
static const char *get802154RadioUrl(const otPlatformCoprocessorUrls &aUrls)
{
const char *radioUrl = nullptr;
for (uint8_t i = 0; i < aPlatformConfig->mRadioUrlNum; i++)
for (uint8_t i = 0; i < aUrls.mNum; i++)
{
ot::Posix::RadioUrl url(aPlatformConfig->mRadioUrls[i]);
ot::Posix::RadioUrl url(aUrls.mUrls[i]);
if (strcmp(url.GetProtocol(), "trel") == 0)
{
continue;
}
radioUrl = aPlatformConfig->mRadioUrls[i];
radioUrl = aUrls.mUrls[i];
break;
}
@@ -108,13 +108,13 @@ static const char *getTrelRadioUrl(otPlatformConfig *aPlatformConfig)
{
const char *radioUrl = nullptr;
for (uint8_t i = 0; i < aPlatformConfig->mRadioUrlNum; i++)
for (uint8_t i = 0; i < aPlatformConfig->mCoprocessorUrls.mNum; i++)
{
ot::Posix::RadioUrl url(aPlatformConfig->mRadioUrls[i]);
ot::Posix::RadioUrl url(aPlatformConfig->mCoprocessorUrls.mUrls[i]);
if (strcmp(url.GetProtocol(), "trel") == 0)
{
radioUrl = aPlatformConfig->mRadioUrls[i];
radioUrl = aPlatformConfig->mCoprocessorUrls.mUrls[i];
break;
}
}
@@ -132,7 +132,7 @@ void otSysSetInfraNetif(const char *aInfraNetifName, int aIcmp6Socket)
void platformInitRcpMode(otPlatformConfig *aPlatformConfig)
{
platformRadioInit(get802154RadioUrl(aPlatformConfig));
platformRadioInit(get802154RadioUrl(aPlatformConfig->mCoprocessorUrls));
// For Dry-Run option, only init the co-processor.
VerifyOrExit(!aPlatformConfig->mDryRun);
@@ -181,7 +181,10 @@ void platformInit(otPlatformConfig *aPlatformConfig)
platformAlarmInit(aPlatformConfig->mSpeedUpFactor, aPlatformConfig->mRealTimeSignal);
sCoprocessorType = platformSpinelManagerInit(get802154RadioUrl(aPlatformConfig));
if (sCoprocessorType == OT_COPROCESSOR_UNKNOWN)
{
sCoprocessorType = platformSpinelManagerInit(get802154RadioUrl(aPlatformConfig->mCoprocessorUrls));
}
switch (sCoprocessorType)
{
@@ -249,6 +252,12 @@ exit:
return;
}
CoprocessorType otSysInitCoprocessor(otPlatformCoprocessorUrls *aUrls)
{
sCoprocessorType = platformSpinelManagerInit(get802154RadioUrl(*aUrls));
return sCoprocessorType;
}
otInstance *otSysInit(otPlatformConfig *aPlatformConfig)
{
OT_ASSERT(gInstance == nullptr);