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