blob: 16c5db5c83173967feb51dc164e00bba6c05ba1d [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed 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.
*/
#include "chre/core/init.h"
#ifdef CHRE_ENABLE_CHPP
#include "chpp/platform/chpp_init.h"
#endif
#include "chre/core/event_loop_manager.h"
#include "chre/core/static_nanoapps.h"
#include "chre/platform/shared/dram_vote_client.h"
#include "chre/target_platform/init.h"
#ifdef CHRE_USE_BUFFERED_LOGGING
#include "chre/platform/shared/log_buffer_manager.h"
#include "chre/target_platform/macros.h"
#endif
#include "task.h"
namespace chre {
namespace freertos {
namespace {
#ifdef CHRE_FREERTOS_TASK_PRIORITY
constexpr UBaseType_t kChreTaskPriority =
tskIDLE_PRIORITY + CHRE_FREERTOS_TASK_PRIORITY;
#else
constexpr UBaseType_t kChreTaskPriority = tskIDLE_PRIORITY + 1;
#endif
#ifdef CHRE_FREERTOS_STACK_DEPTH_IN_WORDS
constexpr configSTACK_DEPTH_TYPE kChreTaskStackDepthWords =
CHRE_FREERTOS_STACK_DEPTH_IN_WORDS;
#else
constexpr configSTACK_DEPTH_TYPE kChreTaskStackDepthWords = 0x800;
#endif
TaskHandle_t gChreTaskHandle;
#ifdef CHRE_USE_BUFFERED_LOGGING
TaskHandle_t gChreFlushTaskHandle;
#ifdef CHRE_HIGH_POWER_TEXT_ATTRIBUTE
CHRE_HIGH_POWER_TEXT_ATTRIBUTE
#endif
uint8_t gSecondaryLogBufferData[CHRE_LOG_BUFFER_DATA_SIZE];
uint8_t gPrimaryLogBufferData[CHRE_LOG_BUFFER_DATA_SIZE];
#endif
// This function is intended to be the task action function for FreeRTOS.
// It Initializes CHRE, runs the event loop, and only exits if it receives
// a message to shutdown. Note that depending on the hardware platform this
// runs on, CHRE might create additional threads, which are cleaned up when
// CHRE exits.
void chreThreadEntry(void *context) {
UNUSED_VAR(context);
chre::init();
chre::EventLoopManagerSingleton::get()->lateInit();
chre::loadStaticNanoapps();
chre::EventLoopManagerSingleton::get()->getEventLoop().run();
// we only get here if the CHRE EventLoop exited
chre::deinit();
DramVoteClientSingleton::deinit();
vTaskDelete(nullptr);
gChreTaskHandle = nullptr;
}
#ifdef CHRE_USE_BUFFERED_LOGGING
void chreFlushLogsToHostThreadEntry(void *context) {
UNUSED_VAR(context);
// Never exits
chre::LogBufferManagerSingleton::get()->startSendLogsToHostLoop();
}
#endif
} // namespace
#ifdef CHRE_USE_BUFFERED_LOGGING
const char *getChreFlushTaskName();
#endif
BaseType_t init() {
BaseType_t rc = pdPASS;
DramVoteClientSingleton::init();
rc = initLogger();
if (rc == pdPASS) {
rc = xTaskCreate(chreThreadEntry, getChreTaskName(),
kChreTaskStackDepthWords, nullptr /* args */,
kChreTaskPriority, &gChreTaskHandle);
}
CHRE_ASSERT(rc == pdPASS);
#ifdef CHRE_ENABLE_CHPP
chpp::init();
#endif
return rc;
}
BaseType_t initLogger() {
BaseType_t rc = pdPASS;
#ifdef CHRE_USE_BUFFERED_LOGGING
if (!chre::LogBufferManagerSingleton::isInitialized()) {
chre::LogBufferManagerSingleton::init(gPrimaryLogBufferData,
gSecondaryLogBufferData,
sizeof(gPrimaryLogBufferData));
rc = xTaskCreate(chreFlushLogsToHostThreadEntry, getChreFlushTaskName(),
kChreTaskStackDepthWords, nullptr /* args */,
kChreTaskPriority, &gChreFlushTaskHandle);
}
#endif
return rc;
}
void deinit() {
// On a deinit call, we just stop the CHRE event loop. This causes the 'run'
// method in the task function exit, and move on to handle task cleanup
if (gChreTaskHandle != nullptr) {
chre::EventLoopManagerSingleton::get()->getEventLoop().stop();
}
#ifdef CHRE_ENABLE_CHPP
chpp::deinit();
#endif
}
const char *getChreTaskName() {
static constexpr char kChreTaskName[] = "CHRE";
return kChreTaskName;
}
#ifdef CHRE_USE_BUFFERED_LOGGING
const char *getChreFlushTaskName() {
static constexpr char kChreFlushTaskName[] = "CHRELogs";
return kChreFlushTaskName;
}
#endif
} // namespace freertos
BaseType_t getChreTaskPriority() {
return freertos::kChreTaskPriority;
}
} // namespace chre