1aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol/* 2aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * Copyright (C) 2016 The Android Open Source Project 3aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * 4aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License"); 5aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * you may not use this file except in compliance with the License. 6aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * You may obtain a copy of the License at 7aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * 8aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * http://www.apache.org/licenses/LICENSE-2.0 9aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * 10aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * Unless required by applicable law or agreed to in writing, software 11aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS, 12aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * See the License for the specific language governing permissions and 14aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol * limitations under the License. 15aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol */ 16aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 17aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol#include "chre/platform/system_timer.h" 18aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 19aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol#include "chre/platform/log.h" 20aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 21aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignolnamespace chre { 22aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 23aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew RossignolSystemTimer::SystemTimer() {} 24aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 25aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew RossignolSystemTimer::~SystemTimer() { 26eb3dde5a004878cc5e608ff992efc5f23db10f88Arthur Ishiguro if (mInitialized) { 27eb3dde5a004878cc5e608ff992efc5f23db10f88Arthur Ishiguro slpiTimerUndef(&mTimerHandle); 28eb3dde5a004878cc5e608ff992efc5f23db10f88Arthur Ishiguro } 29aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol} 30aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 31aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignolbool SystemTimer::init() { 32aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol if (mInitialized) { 33aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol LOGW("Tried re-initializing timer"); 34aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } else { 3509f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol#ifdef CHRE_SLPI_UIMG_ENABLED 3609f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol SlpiTimerErrorType status = utimer_def_osal( 3709f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol &mTimerHandle, UTIMER_FUNC1_CB_TYPE, 3809f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol reinterpret_cast<utimer_osal_notify_obj_ptr>(systemTimerNotifyCallback), 3909f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol reinterpret_cast<utimer_osal_notify_data>(this)); 4009f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol#else 4109f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol SlpiTimerErrorType status = timer_def_osal( 42aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol &mTimerHandle, &timer_non_defer_group, TIMER_FUNC1_CB_TYPE, 43aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol reinterpret_cast<time_osal_notify_obj_ptr>(systemTimerNotifyCallback), 44aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol reinterpret_cast<time_osal_notify_data>(this)); 4509f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol#endif // CHRE_SLPI_UIMG_ENABLED 4609f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol 4709f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol if (status != SLPI_TIMER_SUCCESS) { 48aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol LOGE("Error initializing timer %d", status); 49aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } else { 50aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol mInitialized = true; 51aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } 52aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } 53aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 54aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol return mInitialized; 55aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol} 56aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 57aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignolbool SystemTimer::set(SystemTimerCallback *callback, void *data, 58aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol Nanoseconds delay) { 59aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol bool wasSet = false; 60aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol if (mInitialized) { 61aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol mCallback = callback; 62aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol mData = data; 6309f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol SlpiTimerErrorType status = slpiTimerSet64(&mTimerHandle, 64717e3e51edd5b711e3fd47673a1c89b5071054eaArthur Ishiguro Microseconds(delay).getMicroseconds(), 0, SlpiTimerMicroUnit); 6509f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol if (status != SLPI_TIMER_SUCCESS) { 66aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol LOGE("Error setting timer %d", status); 67aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } else { 68aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol wasSet = true; 69aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } 70aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } 71aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 72aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol return wasSet; 73aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol} 74aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 75aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignolbool SystemTimer::cancel() { 76aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol bool wasCancelled = false; 77aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol if (mInitialized) { 7809f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol SlpiTimerTickType ticksRemaining = slpiTimerClr64(&mTimerHandle, 7909f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol SlpiTimerTickUnit); 80aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol wasCancelled = (ticksRemaining > 0); 81aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol } 82aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 83aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol return wasCancelled; 84aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol} 85aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 86aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignolbool SystemTimer::isActive() { 8709f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol SlpiTimerTickType ticksRemaining = slpiTimerGet64(&mTimerHandle, 8809f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol SlpiTimerTickUnit); 8909f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignol return (mInitialized && ticksRemaining > 0); 90aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol} 91aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 9209f26e11e9488a9c710b23486da55d440b4f6665Andrew Rossignolvoid SystemTimerBase::systemTimerNotifyCallback(SlpiTimerCallbackDataType data) { 93aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol SystemTimer *systemTimer = reinterpret_cast<SystemTimer *>(data); 94aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol systemTimer->mCallback(systemTimer->mData); 95aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol} 96aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol 97aab84350d333c03bc6d6e52841e291f66f8e0aaeAndrew Rossignol} // namespace chre 98