/* * Copyright 2021, The Android Open Source Project * * Copyright 2023 NXP * * 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. */ #include "hal_nxpuwb.h" #include "phNxpUciHal_Adaptation.h" #include "uwb.h" namespace { constexpr static int32_t kAndroidUciVersion = 1; } namespace android { namespace hardware { namespace uwb { namespace impl { using namespace ::aidl::android::hardware::uwb; UwbChip::UwbChip(const std::string& name) : name_(name){}; std::shared_ptr UwbChip::mClientCallback = nullptr; AIBinder_DeathRecipient *mClientDeathRecipient = nullptr; UwbChip::~UwbChip() {} void onServiceDied(void *cookie) { if (UwbChip::mClientCallback != nullptr && !AIBinder_isAlive(UwbChip::mClientCallback->asBinder().get())) { LOG(INFO) << "UWB framework service died. Hence closing the UwbChip connection."; UwbChip *uwbChip = static_cast(cookie); uwbChip->close(); } } ::ndk::ScopedAStatus UwbChip::getName(std::string* name) { *name = name_; return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus UwbChip::open(const std::shared_ptr& clientCallback) { mClientCallback = clientCallback; LOG(INFO) << "AIDL-open Enter"; if (mClientCallback == nullptr) { LOG(ERROR) << "AIDL-HAL open clientCallback is null......"; return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); } mClientDeathRecipient = AIBinder_DeathRecipient_new(onServiceDied); auto linkRet = AIBinder_linkToDeath(clientCallback->asBinder().get(), mClientDeathRecipient, this /* cookie */); if (linkRet == STATUS_OK) { LOG(INFO) << "AIDL-linkToDeath succeed: " << linkRet; } else { LOG(ERROR) << "AIDL-linkToDeath failed: " << linkRet; } int status = phNxpUciHal_open(eventCallback, dataCallback); LOG(INFO) << "AIDL-open Exit" << status; return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus UwbChip::close() { LOG(INFO) << "AIDL-Close Enter"; if (mClientCallback == nullptr) { LOG(ERROR) << "AIDL-HAL close mCallback is null......"; return ndk::ScopedAStatus( AStatus_fromExceptionCode(EX_UNSUPPORTED_OPERATION)); } phNxpUciHal_close(); if (mClientCallback != nullptr) { mClientCallback = nullptr; } AIBinder_DeathRecipient_delete(mClientDeathRecipient); mClientDeathRecipient = nullptr; return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus UwbChip::coreInit() { LOG(INFO) << "AIDL-coreInit Enter"; phNxpUciHal_coreInitialization(); return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus UwbChip::getSupportedAndroidUciVersion(int32_t* version) { *version = kAndroidUciVersion; return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus UwbChip::sendUciMessage(const std::vector& data, int32_t* _aidl_return /* bytes_written */) { // TODO(b/195992658): Need emulator support for UCI stack. std::vector copy = data; LOG(INFO) << "AIDL-Write Enter"; int32_t ret = phNxpUciHal_write(data.size(), ©[0]); *_aidl_return = ret; return ndk::ScopedAStatus::ok(); } ::ndk::ScopedAStatus UwbChip::sessionInit(int32_t sessionId) { LOG(INFO) << "AIDL-SessionInitialization Enter"; phNxpUciHal_sessionInitialization(sessionId); return ndk::ScopedAStatus::ok(); } } // namespace impl } // namespace uwb } // namespace hardware } // namespace android