/* * Copyright (C) 2016 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. */ #ifndef _PLATFORM_H_ #define _PLATFORM_H_ // // platform.h // seos // // Created by Simon Wilson on 10/2/14. // #ifdef __cplusplus extern "C" { #endif #include <stdbool.h> #include <stdint.h> #include <seos.h> /* plat life cycle */ void platInitialize(void); void platUninitialize(void); void platReset(void); void platPeriodic(void); // free all platform-specific resources for TID, and return non-zero status if some cleanup was done uint32_t platFreeResources(uint32_t tid); /* Logging */ void *platLogAllocUserData(); void platLogFlush(void *userData); bool platLogPutcharF(void *userData, char ch); void platEarlyLogFlush(void); /* fast timer */ uint64_t platGetTicks(void); //in nanoseconds since an arbitrary starting point in the past /* sleep/wake */ #define PLAT_MAX_SLEEP_DEVS 32 void platSleep(void); //in platSleepClockRequest() code to set next timer of some variety will live //note that maxErrTotalPpm != maxDriftPpm + maxJitterPpm is quite possible since it is possible to have: // timer A allowing 300ppm of jitter and 10pp of drift and timer B allowing 20ppm of jitter and 500ppm of drift // in that case we'd see maxJitterPpm = 200, maxDriftPpm = 500, maxErrTotalPpm = 520 (MAX of all timers' allowable error totals) //return true if timer was set. false if you failed (you will be called right back though. so false is usually reserved for cases // like "it is too soon to set a timer") //a special case is when nextTimer == 0. this indicates no next timer, so configure system for that //do not call this func if timer is already due - it will be delayed (potentially by a whole sleep-wke cycle), though this is unlikely bool platSleepClockRequest(uint64_t wakeupTime, uint32_t maxJitterPpm, uint32_t maxDriftPpm, uint32_t maxErrTotalPpm); //"nextTime == 0" => "no wakeup needed" /* 0 for any "max" value means "do not care" */ bool platRequestDevInSleepMode(uint32_t sleepDevID, uint32_t maxWakeupTime); //request that this device remain powered/clocked in sleep mode (device lists are platform specific) bool platAdjustDevInSleepMode(uint32_t sleepDevID, uint32_t maxWakeupTime); //adjust maxWakeupTime for this device bool platReleaseDevInSleepMode(uint32_t sleepDevID); //unrequest that this device remain powered/clocked in sleep mode (device lists are platform specific) #ifdef __cplusplus } #endif #endif