1951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/* 2951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Copyright (C) 2011 The Android Open Source Project 3951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * 4951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * you may not use this file except in compliance with the License. 6951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * You may obtain a copy of the License at 7951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * 8951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * http://www.apache.org/licenses/LICENSE-2.0 9951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * 10951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Unless required by applicable law or agreed to in writing, software 11951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * distributed under the License is distributed on an "AS IS" BASIS, 12951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * See the License for the specific language governing permissions and 14951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * limitations under the License. 15951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen */ 16951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 17951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#define LOG_TAG "common_time" 18951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <utils/Log.h> 19951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 20951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <assert.h> 21951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <stdint.h> 22951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 23951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <common_time/local_clock.h> 24951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <hardware/hardware.h> 25951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <hardware/local_time_hal.h> 26951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <utils/Errors.h> 27951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <utils/threads.h> 28951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 29951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chennamespace android { 30951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 31951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. ChenMutex LocalClock::dev_lock_; 32951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenlocal_time_hw_device_t* LocalClock::dev_ = NULL; 33951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 34951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. ChenLocalClock::LocalClock() { 35951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int res; 36951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen const hw_module_t* mod; 37951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 38951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen AutoMutex lock(&dev_lock_); 39951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 40951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (dev_ != NULL) 41951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return; 42951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 43951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen res = hw_get_module_by_class(LOCAL_TIME_HARDWARE_MODULE_ID, NULL, &mod); 44951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (res) { 45951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ALOGE("Failed to open local time HAL module (res = %d)", res); 46951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } else { 47951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen res = local_time_hw_device_open(mod, &dev_); 48951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (res) { 49951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ALOGE("Failed to open local time HAL device (res = %d)", res); 50951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen dev_ = NULL; 51951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 52951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen } 53951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 54951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 55951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenbool LocalClock::initCheck() { 56951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return (NULL != dev_); 57951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 58951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 59951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenint64_t LocalClock::getLocalTime() { 60951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen assert(NULL != dev_); 61951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen assert(NULL != dev_->get_local_time); 62951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 63951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return dev_->get_local_time(dev_); 64951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 65951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 66951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenuint64_t LocalClock::getLocalFreq() { 67951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen assert(NULL != dev_); 68951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen assert(NULL != dev_->get_local_freq); 69951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 70951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return dev_->get_local_freq(dev_); 71951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 72951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 73951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatus_t LocalClock::setLocalSlew(int16_t rate) { 74951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen assert(NULL != dev_); 75951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 76951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (!dev_->set_local_slew) 77951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return INVALID_OPERATION; 78951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 79951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return static_cast<status_t>(dev_->set_local_slew(dev_, rate)); 80951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 81951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 82951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenint32_t LocalClock::getDebugLog(struct local_time_debug_event* records, 83951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen int max_records) { 84951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen assert(NULL != dev_); 85951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 86951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen if (!dev_->get_debug_log) 87951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return INVALID_OPERATION; 88951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 89951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen return dev_->get_debug_log(dev_, records, max_records); 90951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} 91951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen 92951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen} // namespace android 93