1e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu/* 2e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * Copyright (C) 2016 The Android Open Source Project 3e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * 4e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * Licensed under the Apache License, Version 2.0 (the "License"); 5e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * you may not use this file except in compliance with the License. 6e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * You may obtain a copy of the License at 7e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * 8e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * http://www.apache.org/licenses/LICENSE-2.0 9e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * 10e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * Unless required by applicable law or agreed to in writing, software 11e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * distributed under the License is distributed on an "AS IS" BASIS, 12e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * See the License for the specific language governing permissions and 14e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu * limitations under the License. 15e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu */ 16e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 17e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu#include "SensorDevice.h" 18e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu#include "SensorDirectConnection.h" 19e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu#include <hardware/sensors.h> 20e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 21e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu#define UNUSED(x) (void)(x) 22e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 23e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xunamespace android { 24e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 25e36e34731cbe77a49aa5e7d687dde041d83d0370Peng XuSensorService::SensorDirectConnection::SensorDirectConnection(const sp<SensorService>& service, 26e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu uid_t uid, const sensors_direct_mem_t *mem, int32_t halChannelHandle, 27e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu const String16& opPackageName) 28e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu : mService(service), mUid(uid), mMem(*mem), 29e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mHalChannelHandle(halChannelHandle), 308cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu mOpPackageName(opPackageName), mDestroyed(false) { 31e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ALOGD_IF(DEBUG_CONNECTIONS, "Created SensorDirectConnection"); 32e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 33e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 34e36e34731cbe77a49aa5e7d687dde041d83d0370Peng XuSensorService::SensorDirectConnection::~SensorDirectConnection() { 35e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ALOGD_IF(DEBUG_CONNECTIONS, "~SensorDirectConnection %p", this); 368cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu destroy(); 378cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu} 388cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu 398cbefd7af4801686c27d5802cfd087b2812110b6Peng Xuvoid SensorService::SensorDirectConnection::destroy() { 408cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu Mutex::Autolock _l(mDestroyLock); 418cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu // destroy once only 428cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu if (mDestroyed) { 438cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu return; 448cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu } 45e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 46e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu stopAll(); 47e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mService->cleanupConnection(this); 48e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (mMem.handle != nullptr) { 49e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu native_handle_close(mMem.handle); 50e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu native_handle_delete(const_cast<struct native_handle*>(mMem.handle)); 51e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 528cbefd7af4801686c27d5802cfd087b2812110b6Peng Xu mDestroyed = true; 53e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 54e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 55e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuvoid SensorService::SensorDirectConnection::onFirstRef() { 56e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 57e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 58e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuvoid SensorService::SensorDirectConnection::dump(String8& result) const { 59e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu Mutex::Autolock _l(mConnectionLock); 60e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu result.appendFormat("\tPackage %s, HAL channel handle %d, total sensor activated %zu\n", 61e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu String8(mOpPackageName).string(), getHalChannelHandle(), mActivated.size()); 62e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu for (auto &i : mActivated) { 63e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu result.appendFormat("\t\tSensor %#08x, rate %d\n", i.first, i.second); 64e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 65e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 66e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 67e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xusp<BitTube> SensorService::SensorDirectConnection::getSensorChannel() const { 68e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return nullptr; 69e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 70e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 71e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xustatus_t SensorService::SensorDirectConnection::enableDisable( 72e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu int handle, bool enabled, nsecs_t samplingPeriodNs, nsecs_t maxBatchReportLatencyNs, 73e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu int reservedFlags) { 74e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu // SensorDirectConnection does not support enableDisable, parameters not used 75e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu UNUSED(handle); 76e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu UNUSED(enabled); 77e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu UNUSED(samplingPeriodNs); 78e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu UNUSED(maxBatchReportLatencyNs); 79e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu UNUSED(reservedFlags); 80e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return INVALID_OPERATION; 81e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 82e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 83e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xustatus_t SensorService::SensorDirectConnection::setEventRate( 84e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu int handle, nsecs_t samplingPeriodNs) { 85e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu // SensorDirectConnection does not support setEventRate, parameters not used 86e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu UNUSED(handle); 87e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu UNUSED(samplingPeriodNs); 88e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return INVALID_OPERATION; 89e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 90e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 91e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xustatus_t SensorService::SensorDirectConnection::flush() { 92e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu // SensorDirectConnection does not support flush 93e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return INVALID_OPERATION; 94e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 95e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 96e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuint32_t SensorService::SensorDirectConnection::configureChannel(int handle, int rateLevel) { 97e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 98e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (handle == -1 && rateLevel == SENSOR_DIRECT_RATE_STOP) { 99e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu stopAll(); 100e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return NO_ERROR; 101e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 102e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 103e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (mService->isOperationRestricted(mOpPackageName)) { 104e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return PERMISSION_DENIED; 105e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 106e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 107e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu sp<SensorInterface> si = mService->getSensorInterfaceFromHandle(handle); 108e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (si == nullptr) { 109e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return NAME_NOT_FOUND; 110e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 111e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 112e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu const Sensor& s = si->getSensor(); 113e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (!SensorService::canAccessSensor(s, "config direct channel", mOpPackageName)) { 114e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return PERMISSION_DENIED; 115e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 116e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 117e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (s.getHighestDirectReportRateLevel() == 0 118e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu || rateLevel > s.getHighestDirectReportRateLevel() 119e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu || !s.isDirectChannelTypeSupported(mMem.type)) { 120e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return INVALID_OPERATION; 121e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 122e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 123e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu struct sensors_direct_cfg_t config = { 124e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu .rate_level = rateLevel 125e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu }; 126e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 127e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu Mutex::Autolock _l(mConnectionLock); 128e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu SensorDevice& dev(SensorDevice::getInstance()); 129e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu int ret = dev.configureDirectChannel(handle, getHalChannelHandle(), &config); 130e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 131e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (rateLevel == SENSOR_DIRECT_RATE_STOP) { 132e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (ret == NO_ERROR) { 133e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mActivated.erase(handle); 134e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } else if (ret > 0) { 135e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ret = UNKNOWN_ERROR; 136e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 137e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } else { 138e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (ret > 0) { 139e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mActivated[handle] = rateLevel; 140e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 141e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 142e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 143e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return ret; 144e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 145e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 146e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuvoid SensorService::SensorDirectConnection::stopAll(bool backupRecord) { 147e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 148e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu struct sensors_direct_cfg_t config = { 149e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu .rate_level = SENSOR_DIRECT_RATE_STOP 150e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu }; 151e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 152e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu Mutex::Autolock _l(mConnectionLock); 153e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu SensorDevice& dev(SensorDevice::getInstance()); 154e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu for (auto &i : mActivated) { 155e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu dev.configureDirectChannel(i.first, getHalChannelHandle(), &config); 156e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 157e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 158e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (backupRecord && mActivatedBackup.empty()) { 159e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mActivatedBackup = mActivated; 160e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 161e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mActivated.clear(); 162e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 163e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 164e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuvoid SensorService::SensorDirectConnection::recoverAll() { 165e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu stopAll(false); 166e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 167e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu Mutex::Autolock _l(mConnectionLock); 168e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu SensorDevice& dev(SensorDevice::getInstance()); 169e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 170e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu // recover list of report from backup 171e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mActivated = mActivatedBackup; 172e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu mActivatedBackup.clear(); 173e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 174e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu // re-enable them 175e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu for (auto &i : mActivated) { 176e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu struct sensors_direct_cfg_t config = { 177e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu .rate_level = i.second 178e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu }; 179e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu dev.configureDirectChannel(i.first, getHalChannelHandle(), &config); 180e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 181e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 182e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 183e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xuint32_t SensorService::SensorDirectConnection::getHalChannelHandle() const { 184e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return mHalChannelHandle; 185e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 186e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 187e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xubool SensorService::SensorDirectConnection::isEquivalent(const sensors_direct_mem_t *mem) const { 188e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu bool ret = false; 189e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 190e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu if (mMem.type == mem->type) { 191e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu switch (mMem.type) { 192e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu case SENSOR_DIRECT_MEM_TYPE_ASHMEM: { 193364077369bda0d892dabb0626a8497bb47549404Peng Xu // there is no known method to test if two ashmem fds are equivalent besides 194364077369bda0d892dabb0626a8497bb47549404Peng Xu // trivially comparing the fd values (ino number from fstat() are always the 195364077369bda0d892dabb0626a8497bb47549404Peng Xu // same, pointing to "/dev/ashmem"). 196364077369bda0d892dabb0626a8497bb47549404Peng Xu int fd1 = mMem.handle->data[0]; 197364077369bda0d892dabb0626a8497bb47549404Peng Xu int fd2 = mem->handle->data[0]; 198364077369bda0d892dabb0626a8497bb47549404Peng Xu ret = (fd1 == fd2); 199f149b40b3385ee09b45aaf5581c31dcf66f4cb23Peng Xu break; 200e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 201e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu case SENSOR_DIRECT_MEM_TYPE_GRALLOC: 202f88e2b95b2cd6238f6758ef6a180fbd277f06ff2Peng Xu // there is no known method to test if two gralloc handle are equivalent 203f88e2b95b2cd6238f6758ef6a180fbd277f06ff2Peng Xu ret = false; 204f149b40b3385ee09b45aaf5581c31dcf66f4cb23Peng Xu break; 205e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu default: 206f88e2b95b2cd6238f6758ef6a180fbd277f06ff2Peng Xu // should never happen 207e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ALOGE("Unexpected mem type %d", mMem.type); 208e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu ret = true; 209f149b40b3385ee09b45aaf5581c31dcf66f4cb23Peng Xu break; 210e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 211e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu } 212e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu return ret; 213e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} 214e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 215e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu} // namespace android 216e36e34731cbe77a49aa5e7d687dde041d83d0370Peng Xu 217