Mynewt: Stop the host on system shutdown

This is Mynewt-only feature.  When the system is shutting down, the host
stops.
This commit is contained in:
Christopher Collins
2018-11-21 14:47:27 -08:00
committed by ccollins476ad
parent 6709c868f2
commit 4eec25a1c2
4 changed files with 90 additions and 0 deletions
+11
View File
@@ -364,6 +364,17 @@ void ble_hs_evq_set(struct ble_npl_eventq *evq);
*/
void ble_hs_init(void);
/**
* @brief Called when the system is shutting down. Stops the BLE host.
*
* @param reason The reason for the shutdown. One of the
* HAL_RESET_[...] codes or an
* implementation-defined value.
*
* @return SYSDOWN_IN_PROGRESS.
*/
int ble_hs_shutdown(int reason);
#ifdef __cplusplus
}
#endif
+3
View File
@@ -50,3 +50,6 @@ pkg.req_apis:
pkg.init:
ble_hs_init: 200
pkg.down.BLE_HS_STOP_ON_SHUTDOWN:
ble_hs_shutdown: 200
+69
View File
@@ -0,0 +1,69 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#if MYNEWT
#include "os/mynewt.h"
#include "ble_hs_priv.h"
static struct ble_hs_stop_listener ble_hs_shutdown_stop_listener;
/**
* Called when the host stop procedure has completed.
*/
static void
ble_hs_shutdown_stop_cb(int status, void *arg)
{
SYSDOWN_ASSERT_ACTIVE();
/* Indicate to sysdown that the host is fully shut down. */
sysdown_release();
}
int
ble_hs_shutdown(int reason)
{
int rc;
/* Ensure this function only gets called by sysdown. */
SYSDOWN_ASSERT_ACTIVE();
/* Initiate a host stop procedure. */
rc = ble_hs_stop(&ble_hs_shutdown_stop_listener, ble_hs_shutdown_stop_cb,
NULL);
switch (rc) {
case 0:
/* Stop initiated. Wait for result to be reported asynchronously. */
return SYSDOWN_IN_PROGRESS;
case BLE_HS_EBUSY:
/* Already stopping. Wait for result to be reported asynchronously. */
return SYSDOWN_IN_PROGRESS;
case BLE_HS_EALREADY:
/* Already stopped. Shutdown complete. */
return SYSDOWN_COMPLETE;
default:
BLE_HS_LOG(ERROR, "ble_hs_shutdown: failed to stop host; rc=%d\n", rc);
return SYSDOWN_COMPLETE;
}
}
#endif
+7
View File
@@ -422,5 +422,12 @@ syscfg.defs:
a necessary workaround when interfacing with some controllers.
value: 0
BLE_HS_STOP_ON_SHUTDOWN:
description: >
Stops the Bluetooth host when the system shuts down. Stopping
entails aborting all GAP procedures and terminating open
connections.
value: 1
syscfg.vals.BLE_MESH:
BLE_SM_SC: 1