diff options
61 files changed, 620 insertions, 110 deletions
diff --git a/audio/common/all-versions/default/service/Android.bp b/audio/common/all-versions/default/service/Android.bp index 0d4775c6a8..71952c8545 100644 --- a/audio/common/all-versions/default/service/Android.bp +++ b/audio/common/all-versions/default/service/Android.bp @@ -13,11 +13,7 @@ cc_binary { init_rc: ["android.hardware.audio.service.rc"], relative_install_path: "hw", vendor: true, - // Prefer 32 bit as the binary must always be installed at the same - // location for init to start it and the build system does not support - // having two binaries installable to the same location even if they are - // not installed in the same build. - compile_multilib: "prefer32", + compile_multilib: "32", srcs: ["service.cpp"], cflags: [ @@ -29,6 +25,40 @@ cc_binary { shared_libs: [ "libcutils", "libbinder", + "libhwbinder", + "libhidlbase", + "liblog", + "libutils", + "libhardware", + ], + arch : { + arm : { + cflags: [ + "-DARCH_ARM_32", + ] + } + }, +} + +cc_binary { + name: "android.hardware.audio.service_64", + + init_rc: ["android.hardware.audio.service_64.rc"], + relative_install_path: "hw", + vendor: true, + compile_multilib: "64", + srcs: ["service.cpp"], + + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], + + shared_libs: [ + "libcutils", + "libbinder", + "libhwbinder", "libhidlbase", "liblog", "libutils", @@ -41,3 +71,7 @@ phony { name: "android.hardware.audio@2.0-service", required: ["android.hardware.audio.service"], } +phony { + name: "android.hardware.audio@2.0-service_64", + required: ["android.hardware.audio.service_64"], +} diff --git a/audio/common/all-versions/default/service/android.hardware.audio.service_64.rc b/audio/common/all-versions/default/service/android.hardware.audio.service_64.rc new file mode 100644 index 0000000000..5db2fafe31 --- /dev/null +++ b/audio/common/all-versions/default/service/android.hardware.audio.service_64.rc @@ -0,0 +1,9 @@ +service vendor.audio-hal /vendor/bin/hw/android.hardware.audio.service_64 + class hal + user audioserver + # media gid needed for /dev/fm (radio) and for /data/misc/media (tee) + group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct wakelock context_hub + capabilities BLOCK_SUSPEND + ioprio rt 4 + task_profiles ProcessCapacityHigh HighPerformance + onrestart restart audioserver diff --git a/audio/common/all-versions/default/service/service.cpp b/audio/common/all-versions/default/service/service.cpp index bbc14adc6c..eab9c3ef94 100644 --- a/audio/common/all-versions/default/service/service.cpp +++ b/audio/common/all-versions/default/service/service.cpp @@ -30,6 +30,18 @@ using android::OK; using InterfacesList = std::vector<std::string>; +#ifdef ARCH_ARM_32 +//default h/w binder memsize is 1 MB +#define DEFAULT_HW_BINDER_MEM_SIZE_KB 1024 + +size_t getHWBinderMmapSize(){ + int32_t value = DEFAULT_HW_BINDER_MEM_SIZE_KB; + value = property_get_int32("persist.vendor.audio.hw.binder.size_kbyte", value); + ALOGD("Init hw binder with mem size = %d ", value); + return 1024 * value; +} +#endif + /** Try to register the provided factories in the provided order. * If any registers successfully, do not register any other and return true. * If all fail, return false. @@ -45,6 +57,10 @@ static bool registerPassthroughServiceImplementations(Iter first, Iter last) { } int main(int /* argc */, char* /* argv */ []) { + signal(SIGPIPE, SIG_IGN); +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize(getHWBinderMmapSize()); +#endif ::android::ProcessState::initWithDriver("/dev/vndbinder"); // start a threadpool for vndbinder interactions ::android::ProcessState::self()->startThreadPool(); diff --git a/boot/1.0/default/Android.bp b/boot/1.0/default/Android.bp index b7d2ec8971..10634e8535 100644 --- a/boot/1.0/default/Android.bp +++ b/boot/1.0/default/Android.bp @@ -39,6 +39,13 @@ cc_binary { "libhidlbase", "libutils", "android.hardware.boot@1.0", + "libhwbinder", ], - + arch: { + arm: { + cflags: [ + "-DARCH_ARM_32" + ], + }, + }, } diff --git a/boot/1.0/default/service.cpp b/boot/1.0/default/service.cpp index f3996efe9c..2b50740f2a 100644 --- a/boot/1.0/default/service.cpp +++ b/boot/1.0/default/service.cpp @@ -17,10 +17,14 @@ #include <android/hardware/boot/1.0/IBootControl.h> #include <hidl/LegacySupport.h> +#include <hwbinder/ProcessState.h> using ::android::hardware::boot::V1_0::IBootControl; using android::hardware::defaultPassthroughServiceImplementation; int main (int /* argc */, char * /* argv */ []) { +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)8192); +#endif return defaultPassthroughServiceImplementation<IBootControl>(); } diff --git a/camera/common/1.0/default/Android.bp b/camera/common/1.0/default/Android.bp index 4a5ca83803..0927807b21 100644 --- a/camera/common/1.0/default/Android.bp +++ b/camera/common/1.0/default/Android.bp @@ -36,4 +36,5 @@ cc_library_static { ], include_dirs: ["system/media/private/camera/include"], export_include_dirs: ["include"], + sdclang: false, } diff --git a/camera/common/1.0/default/CameraModule.cpp b/camera/common/1.0/default/CameraModule.cpp index 16fb85cc64..188b4bed27 100644 --- a/camera/common/1.0/default/CameraModule.cpp +++ b/camera/common/1.0/default/CameraModule.cpp @@ -267,6 +267,22 @@ int CameraModule::init() { return res; } +int CameraModule::getCameraDeviceVersion(int cameraId, uint32_t* version) { + ATRACE_CALL(); + int ret; + if (getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_5 && + mModule->get_camera_device_version != NULL) { + ret = mModule->get_camera_device_version(cameraId, version); + } else { + struct camera_info info; + ret = getCameraInfo(cameraId, &info); + if (ret == OK) { + *version = info.device_version; + } + } + return ret; +} + int CameraModule::getCameraInfo(int cameraId, struct camera_info *info) { ATRACE_CALL(); Mutex::Autolock lock(mCameraInfoLock); @@ -367,11 +383,9 @@ int CameraModule::getPhysicalCameraInfo(int physicalCameraId, camera_metadata_t int CameraModule::getDeviceVersion(int cameraId) { ssize_t index = mDeviceVersionMap.indexOfKey(cameraId); if (index == NAME_NOT_FOUND) { - int deviceVersion; + uint32_t deviceVersion; if (getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_0) { - struct camera_info info; - getCameraInfo(cameraId, &info); - deviceVersion = info.device_version; + getCameraDeviceVersion(cameraId, &deviceVersion); } else { deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; } diff --git a/camera/common/1.0/default/include/CameraModule.h b/camera/common/1.0/default/include/CameraModule.h index c89e934655..8195835406 100644 --- a/camera/common/1.0/default/include/CameraModule.h +++ b/camera/common/1.0/default/include/CameraModule.h @@ -49,6 +49,7 @@ public: // Returns OK on success, NO_INIT on failure int init(); + int getCameraDeviceVersion(int cameraId, uint32_t* version); int getCameraInfo(int cameraId, struct camera_info *info); int getDeviceVersion(int cameraId); int getNumberOfCameras(void); diff --git a/camera/device/1.0/default/Android.bp b/camera/device/1.0/default/Android.bp index 9ff6480d4b..f875d77f68 100644 --- a/camera/device/1.0/default/Android.bp +++ b/camera/device/1.0/default/Android.bp @@ -19,6 +19,7 @@ cc_library_shared { "libhidlmemory", "libutils", "android.hardware.camera.device@1.0", + "vendor.qti.hardware.camera.device@1.0", "android.hardware.camera.common@1.0", "android.hardware.graphics.allocator@2.0", "android.hardware.graphics.mapper@2.0", @@ -40,4 +41,9 @@ cc_library_shared { "media_plugin_headers", ], export_include_dirs: ["."], + sdclang: false, // See b/163842697 + // Since this platform module has been forked to depend on a vendor + // proprietary library, we exclude it from the vendor snapshot so that it + // will be built from source as part of the vendor build. + exclude_from_vendor_snapshot: true, } diff --git a/camera/device/1.0/default/CameraDevice.cpp b/camera/device/1.0/default/CameraDevice.cpp index 80733d1908..622660685f 100644 --- a/camera/device/1.0/default/CameraDevice.cpp +++ b/camera/device/1.0/default/CameraDevice.cpp @@ -433,30 +433,68 @@ void CameraDevice::sDataCb(int32_t msg_type, const camera_memory_t *data, unsign index, mem->mNumBufs); return; } - if (object->mDeviceCallback != nullptr) { - CameraFrameMetadata hidlMetadata; - if (metadata) { - hidlMetadata.faces.resize(metadata->number_of_faces); - for (size_t i = 0; i < hidlMetadata.faces.size(); i++) { - hidlMetadata.faces[i].score = metadata->faces[i].score; - hidlMetadata.faces[i].id = metadata->faces[i].id; - for (int k = 0; k < 4; k++) { - hidlMetadata.faces[i].rect[k] = metadata->faces[i].rect[k]; - } - for (int k = 0; k < 2; k++) { - hidlMetadata.faces[i].leftEye[k] = metadata->faces[i].left_eye[k]; - } - for (int k = 0; k < 2; k++) { - hidlMetadata.faces[i].rightEye[k] = metadata->faces[i].right_eye[k]; - } - for (int k = 0; k < 2; k++) { - hidlMetadata.faces[i].mouth[k] = metadata->faces[i].mouth[k]; - } - } - } - CameraHeapMemory* mem = static_cast<CameraHeapMemory *>(data->handle); - object->mDeviceCallback->dataCallback( - (DataCallbackMsg) msg_type, mem->handle.mId, index, hidlMetadata); + if(object->mQDeviceCallback != nullptr) { + vendor::qti::hardware::camera::device::V1_0::QCameraFrameMetadata hidlMetadata; + if (metadata) { + hidlMetadata.faces.resize(metadata->number_of_faces); + for (size_t i = 0; i < hidlMetadata.faces.size(); i++) { + hidlMetadata.faces[i].score = metadata->faces[i].score; + hidlMetadata.faces[i].id = metadata->faces[i].id; + for (int k = 0; k < 4; k++) { + hidlMetadata.faces[i].rect[k] = metadata->faces[i].rect[k]; + } + for (int k = 0; k < 2; k++) { + hidlMetadata.faces[i].leftEye[k] = metadata->faces[i].left_eye[k]; + } + for (int k = 0; k < 2; k++) { + hidlMetadata.faces[i].rightEye[k] = metadata->faces[i].right_eye[k]; + } + for (int k = 0; k < 2; k++) { + hidlMetadata.faces[i].mouth[k] = metadata->faces[i].mouth[k]; + } + hidlMetadata.faces[i].smile_degree = metadata->faces[i].smile_degree; + hidlMetadata.faces[i].smile_score = metadata->faces[i].smile_score; + hidlMetadata.faces[i].blink_detected = metadata->faces[i].blink_detected; + hidlMetadata.faces[i].face_recognised = metadata->faces[i].face_recognised; + hidlMetadata.faces[i].gaze_angle = metadata->faces[i].gaze_angle; + hidlMetadata.faces[i].updown_dir = metadata->faces[i].updown_dir; + hidlMetadata.faces[i].leftright_dir = metadata->faces[i].leftright_dir; + hidlMetadata.faces[i].roll_dir = metadata->faces[i].roll_dir; + hidlMetadata.faces[i].left_right_gaze = metadata->faces[i].left_right_gaze; + hidlMetadata.faces[i].top_bottom_gaze = metadata->faces[i].top_bottom_gaze; + hidlMetadata.faces[i].leye_blink = metadata->faces[i].leye_blink; + hidlMetadata.faces[i].reye_blink = metadata->faces[i].reye_blink; + } + } + CameraHeapMemory* mem = static_cast<CameraHeapMemory *>(data->handle); + object->mQDeviceCallback->QDataCallback( + (DataCallbackMsg) msg_type, mem->handle.mId, index, hidlMetadata); + } else { + if (object->mDeviceCallback != nullptr) { + CameraFrameMetadata hidlMetadata; + if (metadata) { + hidlMetadata.faces.resize(metadata->number_of_faces); + for (size_t i = 0; i < hidlMetadata.faces.size(); i++) { + hidlMetadata.faces[i].score = metadata->faces[i].score; + hidlMetadata.faces[i].id = metadata->faces[i].id; + for (int k = 0; k < 4; k++) { + hidlMetadata.faces[i].rect[k] = metadata->faces[i].rect[k]; + } + for (int k = 0; k < 2; k++) { + hidlMetadata.faces[i].leftEye[k] = metadata->faces[i].left_eye[k]; + } + for (int k = 0; k < 2; k++) { + hidlMetadata.faces[i].rightEye[k] = metadata->faces[i].right_eye[k]; + } + for (int k = 0; k < 2; k++) { + hidlMetadata.faces[i].mouth[k] = metadata->faces[i].mouth[k]; + } + } + } + CameraHeapMemory* mem = static_cast<CameraHeapMemory *>(data->handle); + object->mDeviceCallback->dataCallback( + (DataCallbackMsg) msg_type, mem->handle.mId, index, hidlMetadata); + } } } @@ -672,6 +710,11 @@ Return<Status> CameraDevice::open(const sp<ICameraDeviceCallback>& callback) { initHalPreviewWindow(); mDeviceCallback = callback; + mQDeviceCallback = + vendor::qti::hardware::camera::device::V1_0::IQCameraDeviceCallback::castFrom(callback); + if(mQDeviceCallback == nullptr) { + ALOGI("could not cast ICameraDeviceCallback to IQCameraDeviceCallback"); + } if (mDevice->ops->set_callbacks) { mDevice->ops->set_callbacks(mDevice, diff --git a/camera/device/1.0/default/CameraDevice_1_0.h b/camera/device/1.0/default/CameraDevice_1_0.h index 2c980f0a8f..e5a194edc5 100644 --- a/camera/device/1.0/default/CameraDevice_1_0.h +++ b/camera/device/1.0/default/CameraDevice_1_0.h @@ -24,6 +24,7 @@ #include "HandleImporter.h" #include <android/hardware/camera/device/1.0/ICameraDevice.h> +#include <vendor/qti/hardware/camera/device/1.0/IQCameraDeviceCallback.h> #include <android/hidl/allocator/1.0/IAllocator.h> #include <android/hidl/memory/1.0/IMemory.h> #include <hidl/MQDescriptor.h> @@ -44,6 +45,7 @@ using ::android::hardware::camera::common::V1_0::helper::HandleImporter; using ::android::hardware::camera::device::V1_0::CameraInfo; using ::android::hardware::camera::device::V1_0::CommandType; using ::android::hardware::camera::device::V1_0::ICameraDevice; +using ::vendor::qti::hardware::camera::device::V1_0::IQCameraDeviceCallback; using ::android::hardware::camera::device::V1_0::ICameraDeviceCallback; using ::android::hardware::camera::device::V1_0::ICameraDevicePreviewCallback; using ::android::hardware::camera::device::V1_0::MemoryId; @@ -164,6 +166,7 @@ private: const SortedVector<std::pair<std::string, std::string>>& mCameraDeviceNames; sp<ICameraDeviceCallback> mDeviceCallback = nullptr; + sp<IQCameraDeviceCallback> mQDeviceCallback = nullptr; mutable Mutex mMemoryMapLock; // gating access to mMemoryMap // must not hold mLock after this lock is acquired diff --git a/camera/device/3.2/default/Android.bp b/camera/device/3.2/default/Android.bp index a1962915ff..d7ad6ad740 100644 --- a/camera/device/3.2/default/Android.bp +++ b/camera/device/3.2/default/Android.bp @@ -38,4 +38,5 @@ cc_library_shared { export_shared_lib_headers: [ "libfmq", ], + sdclang: false, // See b/163842697 } diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp index 769991c5fa..896c35843a 100644 --- a/camera/device/3.2/default/CameraDeviceSession.cpp +++ b/camera/device/3.2/default/CameraDeviceSession.cpp @@ -926,12 +926,12 @@ bool CameraDeviceSession::preProcessConfigurationLocked( mStreamMap[id].data_space); mCirculatingBuffers.emplace(stream.mId, CirculatingBuffers{}); } else { - // width/height/format must not change, but usage/rotation might need to change + // width/height must not change, but usage/rotation might need to change + // format might change and get updated with overrideFormat if (mStreamMap[id].stream_type != (int) requestedConfiguration.streams[i].streamType || mStreamMap[id].width != requestedConfiguration.streams[i].width || mStreamMap[id].height != requestedConfiguration.streams[i].height || - mStreamMap[id].format != (int) requestedConfiguration.streams[i].format || mStreamMap[id].data_space != mapToLegacyDataspace( static_cast<android_dataspace_t> ( requestedConfiguration.streams[i].dataSpace))) { diff --git a/camera/device/3.2/default/convert.cpp b/camera/device/3.2/default/convert.cpp index 06ad7e963c..628b7af912 100644 --- a/camera/device/3.2/default/convert.cpp +++ b/camera/device/3.2/default/convert.cpp @@ -66,6 +66,8 @@ void convertFromHidl(const Stream &src, Camera3Stream* dst) { dst->data_space = (android_dataspace_t) src.dataSpace; dst->rotation = (int) src.rotation; dst->usage = (uint32_t) src.usage; + dst->reserved[0] = NULL; + dst->reserved[1] = NULL; // Fields to be filled by HAL (max_buffers, priv) are initialized to 0 dst->max_buffers = 0; dst->priv = 0; @@ -88,6 +90,23 @@ void convertToHidl(const Camera3Stream* src, HalStream* dst) { ALOGW("%s: Stream type %d is not currently supported!", __FUNCTION__, src->stream_type); } + + HalStream* halStream = NULL; + if (src->reserved[0] != NULL) { + halStream = (HalStream*)(src->reserved[0]); + } else if (src->reserved[1] != NULL) { + halStream = (HalStream*)(src->reserved[1]); + } + + // Check if overrideFormat is set and honor it + if (halStream != NULL) { + dst->overrideFormat = (PixelFormat) halStream->overrideFormat; + if (src->stream_type == CAMERA3_STREAM_OUTPUT) { + dst->producerUsage = (BufferUsageFlags)halStream->producerUsage; + } else if (src->stream_type == CAMERA3_STREAM_INPUT) { + dst->consumerUsage = (BufferUsageFlags)halStream->consumerUsage; + } + } } void convertToHidl(const camera3_stream_configuration_t& src, HalStreamConfiguration* dst) { diff --git a/camera/device/3.3/default/convert.cpp b/camera/device/3.3/default/convert.cpp index dae190b03c..ac17d837d7 100644 --- a/camera/device/3.3/default/convert.cpp +++ b/camera/device/3.3/default/convert.cpp @@ -47,6 +47,22 @@ void convertToHidl(const Camera3Stream* src, HalStream* dst) { ALOGW("%s: Stream type %d is not currently supported!", __FUNCTION__, src->stream_type); } + + HalStream* halStream = NULL; + if (src->reserved[0] != NULL) { + halStream = (HalStream*)(src->reserved[0]); + } else if (src->reserved[1] != NULL) { + halStream = (HalStream*)(src->reserved[1]); + } + + if (halStream != NULL) { + dst->v3_2.overrideFormat = (PixelFormat) halStream->v3_2.overrideFormat; + if (src->stream_type == CAMERA3_STREAM_OUTPUT) { + dst->v3_2.producerUsage = (BufferUsageFlags)halStream->v3_2.producerUsage; + } else if (src->stream_type == CAMERA3_STREAM_INPUT) { + dst->v3_2.consumerUsage = (BufferUsageFlags)halStream->v3_2.consumerUsage; + } + } } void convertToHidl(const camera3_stream_configuration_t& src, HalStreamConfiguration* dst) { diff --git a/camera/device/3.4/default/Android.bp b/camera/device/3.4/default/Android.bp index 9f0c77739a..17bcdbb6d4 100644 --- a/camera/device/3.4/default/Android.bp +++ b/camera/device/3.4/default/Android.bp @@ -71,6 +71,7 @@ cc_library_shared { export_shared_lib_headers: [ "libfmq", ], + sdclang: false, // See b/163842697 } cc_library_shared { @@ -114,4 +115,5 @@ cc_library_shared { export_shared_lib_headers: [ "libfmq", ], + sdclang: false, // See b/163842697 } diff --git a/camera/device/3.5/default/Android.bp b/camera/device/3.5/default/Android.bp index 9d27b321e0..4ed65ba72d 100644 --- a/camera/device/3.5/default/Android.bp +++ b/camera/device/3.5/default/Android.bp @@ -68,6 +68,7 @@ cc_library_shared { "android.hardware.camera.common@1.0-helper", ], local_include_dirs: ["include/device_v3_5_impl"], + sdclang: false, // See b/163842697 } cc_library_shared { @@ -112,4 +113,5 @@ cc_library_shared { export_shared_lib_headers: [ "libfmq", ], + sdclang: false, // See b/163842697 } diff --git a/camera/device/3.6/default/Android.bp b/camera/device/3.6/default/Android.bp index 89ee145820..0e5440a865 100644 --- a/camera/device/3.6/default/Android.bp +++ b/camera/device/3.6/default/Android.bp @@ -74,4 +74,5 @@ cc_library_shared { export_shared_lib_headers: [ "libfmq", ], + sdclang: false, // See b/163842697 } diff --git a/camera/provider/2.4/default/Android.bp b/camera/provider/2.4/default/Android.bp index bccd6cb536..76220e2917 100644 --- a/camera/provider/2.4/default/Android.bp +++ b/camera/provider/2.4/default/Android.bp @@ -15,6 +15,7 @@ cc_library_shared { shared_libs: [ "android.hardware.camera.common@1.0", "android.hardware.camera.device@1.0", + "vendor.qti.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.device@3.3", "android.hardware.camera.device@3.4", @@ -45,6 +46,11 @@ cc_library_shared { "camera.device@3.5-impl_headers", ], export_include_dirs: ["."], + sdclang: false, // See b/163842697 + // Since this framework module has been forked to depend on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } cc_library_shared { @@ -88,6 +94,10 @@ cc_library_shared { "camera.device@3.6-external-impl_headers", ], export_include_dirs: ["."], + // Since this framework module has a transitive dependency on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } cc_library_shared { @@ -136,6 +146,10 @@ cc_library_shared { "android.hardware.camera.common@1.0-helper", ], export_include_dirs: ["."], + // Since this framework module has a transitive dependency on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } cc_defaults { @@ -147,6 +161,7 @@ cc_defaults { shared_libs: [ "android.hardware.camera.common@1.0", "android.hardware.camera.device@1.0", + "vendor.qti.hardware.camera.device@1.0", "android.hardware.camera.device@3.2", "android.hardware.camera.device@3.3", "android.hardware.camera.device@3.4", @@ -174,6 +189,10 @@ cc_defaults { "camera.device@3.5-external-impl_headers", "camera.device@3.5-impl_headers", ], + // Since this framework module has been forked to depend on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } cc_binary { @@ -236,4 +255,8 @@ cc_binary { "camera.device@3.5-external-impl_headers", "camera.device@3.5-impl_headers", ], + // Since this framework module has a transitive dependency on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } diff --git a/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.cpp b/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.cpp index 4cff1b79a1..18149e5ccc 100644 --- a/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.cpp +++ b/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.cpp @@ -87,23 +87,32 @@ void LegacyCameraProviderImpl_2_4::addDeviceNames(int camera_id, CameraDeviceSta if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 && mModule->isOpenLegacyDefined()) { // try open_legacy to see if it actually works - struct hw_device_t* halDev = nullptr; - int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev); - if (ret == 0) { - mOpenLegacySupported[cameraIdStr] = true; - halDev->close(halDev); - deviceNamePair = std::make_pair(cameraIdStr, + if ((property_get_bool("ro.config.low_ram", /*default*/ false))) { + deviceNamePair = std::make_pair(cameraIdStr, getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0)); - mCameraDeviceNames.add(deviceNamePair); - if (cam_new) { - mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status); - } - } else if (ret == -EBUSY || ret == -EUSERS) { + mCameraDeviceNames.add(deviceNamePair); + if (cam_new) { + mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status); + } + } else { + struct hw_device_t* halDev = nullptr; + int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev); + if (ret == 0) { + mOpenLegacySupported[cameraIdStr] = true; + halDev->close(halDev); + deviceNamePair = std::make_pair(cameraIdStr, + getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0)); + mCameraDeviceNames.add(deviceNamePair); + if (cam_new) { + mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status); + } + } else if (ret == -EBUSY || ret == -EUSERS) { // Looks like this provider instance is not initialized during // system startup and there are other camera users already. // Not a good sign but not fatal. - ALOGW("%s: open_legacy try failed!", __FUNCTION__); - } + ALOGW("%s: open_legacy try failed!", __FUNCTION__); + } + } } } @@ -314,15 +323,15 @@ bool LegacyCameraProviderImpl_2_4::initialize() { mNumberOfLegacyCameras = mModule->getNumberOfCameras(); for (int i = 0; i < mNumberOfLegacyCameras; i++) { - struct camera_info info; - auto rc = mModule->getCameraInfo(i, &info); + uint32_t device_version; + auto rc = mModule->getCameraDeviceVersion(i, &device_version); if (rc != NO_ERROR) { - ALOGE("%s: Camera info query failed!", __func__); + ALOGE("%s: Camera device version query failed!", __func__); mModule.clear(); return true; } - if (checkCameraVersion(i, info) != OK) { + if (checkCameraVersion(i, device_version) != OK) { ALOGE("%s: Camera version check failed!", __func__); mModule.clear(); return true; @@ -342,7 +351,7 @@ bool LegacyCameraProviderImpl_2_4::initialize() { /** * Check that the device HAL version is still in supported. */ -int LegacyCameraProviderImpl_2_4::checkCameraVersion(int id, camera_info info) { +int LegacyCameraProviderImpl_2_4::checkCameraVersion(int id, uint32_t device_version) { if (mModule == nullptr) { return NO_INIT; } @@ -352,7 +361,7 @@ int LegacyCameraProviderImpl_2_4::checkCameraVersion(int id, camera_info info) { uint16_t moduleVersion = mModule->getModuleApiVersion(); if (moduleVersion >= CAMERA_MODULE_API_VERSION_2_0) { // Verify the device version is in the supported range - switch (info.device_version) { + switch (device_version) { case CAMERA_DEVICE_API_VERSION_1_0: case CAMERA_DEVICE_API_VERSION_3_2: case CAMERA_DEVICE_API_VERSION_3_3: @@ -370,7 +379,7 @@ int LegacyCameraProviderImpl_2_4::checkCameraVersion(int id, camera_info info) { if (moduleVersion < CAMERA_MODULE_API_VERSION_2_5) { ALOGE("%s: Device %d has unsupported version combination:" "HAL version %x and module version %x", - __FUNCTION__, id, info.device_version, moduleVersion); + __FUNCTION__, id, device_version, moduleVersion); return NO_INIT; } break; @@ -380,8 +389,8 @@ int LegacyCameraProviderImpl_2_4::checkCameraVersion(int id, camera_info info) { case CAMERA_DEVICE_API_VERSION_3_1: // no longer supported default: - ALOGE("%s: Device %d has HAL version %x, which is not supported", - __FUNCTION__, id, info.device_version); + ALOGE("%s: Device %d has HAL version %x, which is not supported", __FUNCTION__, id, + device_version); return NO_INIT; } } diff --git a/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.h b/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.h index b4914b3cfe..9ec5c5e8db 100644 --- a/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.h +++ b/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.h @@ -97,7 +97,7 @@ protected: hidl_vec<VendorTagSection> mVendorTagSections; bool setUpVendorTags(); - int checkCameraVersion(int id, camera_info info); + int checkCameraVersion(int id, uint32_t device_version); // create HIDL device name from camera ID and legacy device version std::string getHidlDeviceName(std::string cameraId, int deviceVersion); diff --git a/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc b/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc index f7ac9f83e4..ff924ed360 100644 --- a/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc +++ b/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc @@ -5,4 +5,4 @@ service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provid group audio camera input drmrpc ioprio rt 4 capabilities SYS_NICE - task_profiles CameraServiceCapacity MaxPerformance + task_profiles CameraServiceCapacity HighPerformance diff --git a/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service_64.rc b/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service_64.rc index a32dd468d3..642e84e5b0 100644 --- a/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service_64.rc +++ b/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service_64.rc @@ -5,4 +5,4 @@ service vendor.camera-provider-2-4 /vendor/bin/hw/android.hardware.camera.provid group audio camera input drmrpc ioprio rt 4 capabilities SYS_NICE - task_profiles CameraServiceCapacity MaxPerformance + task_profiles CameraServiceCapacity HighPerformance diff --git a/camera/provider/2.5/default/Android.bp b/camera/provider/2.5/default/Android.bp index 2fcb35ab00..188b70157a 100644 --- a/camera/provider/2.5/default/Android.bp +++ b/camera/provider/2.5/default/Android.bp @@ -44,6 +44,10 @@ cc_library_shared { "camera.device@3.5-impl_headers", ], export_include_dirs: ["."], + // Since this framework module has a transitive dependency on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } cc_library_shared { @@ -87,6 +91,10 @@ cc_library_shared { "camera.device@3.6-external-impl_headers" ], export_include_dirs: ["."], + // Since this framework module has a transitive dependency on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } cc_defaults { @@ -123,6 +131,10 @@ cc_defaults { "camera.device@3.4-impl_headers", "camera.device@3.5-impl_headers" ], + // Since this framework module has a transitive dependency on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } cc_binary { @@ -196,4 +208,8 @@ cc_binary { "camera.device@3.5-impl_headers", "camera.device@3.6-external-impl_headers", ], + // Since this framework module has a transitive dependency on a vendor + // proprietary library, we exclude this module from the vendor snapshot so + // that it will be built from source as part of the vendor image build. + exclude_from_vendor_snapshot: true, } diff --git a/cas/1.0/default/Android.bp b/cas/1.0/default/Android.bp index fc5b3b4361..a85c5fc230 100644 --- a/cas/1.0/default/Android.bp +++ b/cas/1.0/default/Android.bp @@ -33,10 +33,16 @@ cc_defaults { "liblog", "libstagefright_foundation", "libutils", + "libhwbinder" ], header_libs: [ "media_plugin_headers", ], + arch: { + arm: { + cflags: ["-DARCH_ARM_32"], + }, + }, } cc_binary { diff --git a/cas/1.0/default/service.cpp b/cas/1.0/default/service.cpp index 754c0c5af7..dfb385d2a0 100644 --- a/cas/1.0/default/service.cpp +++ b/cas/1.0/default/service.cpp @@ -27,6 +27,10 @@ #include "MediaCasService.h" +#ifdef ARCH_ARM_32 +#include <hwbinder/ProcessState.h> +#endif + using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; using android::hardware::LazyServiceRegistrar; @@ -40,6 +44,9 @@ const bool kLazyService = false; #endif int main() { + #ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)32768); + #endif configureRpcThreadpool(8, true /* callerWillJoin */); // Setup hwbinder service diff --git a/compatibility_matrices/compatibility_matrix.4.xml b/compatibility_matrices/compatibility_matrix.4.xml index 3b8ee2198e..3fb0260199 100644 --- a/compatibility_matrices/compatibility_matrix.4.xml +++ b/compatibility_matrices/compatibility_matrix.4.xml @@ -499,6 +499,7 @@ <interface> <name>IHostapd</name> <instance>default</instance> + <instance>wigighostapd</instance> </interface> </hal> <hal format="hidl" optional="true"> diff --git a/compatibility_matrices/compatibility_matrix.5.xml b/compatibility_matrices/compatibility_matrix.5.xml index 0fb21a7443..1233ed6590 100644 --- a/compatibility_matrices/compatibility_matrix.5.xml +++ b/compatibility_matrices/compatibility_matrix.5.xml @@ -548,6 +548,7 @@ <interface> <name>IHostapd</name> <instance>default</instance> + <instance>wigighostapd</instance> </interface> </hal> <hal format="hidl" optional="true"> diff --git a/compatibility_matrices/compatibility_matrix.6.xml b/compatibility_matrices/compatibility_matrix.6.xml index aee2c5164b..1c51dea9ef 100644 --- a/compatibility_matrices/compatibility_matrix.6.xml +++ b/compatibility_matrices/compatibility_matrix.6.xml @@ -638,6 +638,7 @@ <interface> <name>IHostapd</name> <instance>default</instance> + <instance>wigighostapd</instance> </interface> </hal> <hal format="hidl" optional="true"> diff --git a/compatibility_matrices/compatibility_matrix.current.xml b/compatibility_matrices/compatibility_matrix.current.xml index 8b6e8414d0..55d4f973da 100644 --- a/compatibility_matrices/compatibility_matrix.current.xml +++ b/compatibility_matrices/compatibility_matrix.current.xml @@ -638,6 +638,7 @@ <interface> <name>IHostapd</name> <instance>default</instance> + <instance>wigighostapd</instance> </interface> </hal> <hal format="hidl" optional="true"> diff --git a/graphics/allocator/2.0/default/Android.bp b/graphics/allocator/2.0/default/Android.bp index 4d17dc3a1b..47c34849c1 100644 --- a/graphics/allocator/2.0/default/Android.bp +++ b/graphics/allocator/2.0/default/Android.bp @@ -42,4 +42,11 @@ cc_binary { "liblog", "libutils", ], + arch: { + arm: { + cflags: [ + "-DARCH_ARM_32" + ], + }, + }, } diff --git a/graphics/allocator/2.0/default/service.cpp b/graphics/allocator/2.0/default/service.cpp index bc0539a617..ca1fee4f2d 100644 --- a/graphics/allocator/2.0/default/service.cpp +++ b/graphics/allocator/2.0/default/service.cpp @@ -19,10 +19,15 @@ #include <android/hardware/graphics/allocator/2.0/IAllocator.h> #include <hidl/LegacySupport.h> +#include <hwbinder/ProcessState.h> using android::hardware::defaultPassthroughServiceImplementation; using android::hardware::graphics::allocator::V2_0::IAllocator; int main() { + +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)(32768)); +#endif return defaultPassthroughServiceImplementation<IAllocator>(4); } diff --git a/graphics/composer/2.1/default/Android.bp b/graphics/composer/2.1/default/Android.bp index 96fea4e6cd..3744469e21 100644 --- a/graphics/composer/2.1/default/Android.bp +++ b/graphics/composer/2.1/default/Android.bp @@ -22,6 +22,7 @@ cc_binary { "android.hardware.graphics.composer@2.1-resources", "libbase", "libbinder", + "libhwbinder", "libcutils", "libfmq", "libhardware", @@ -32,4 +33,11 @@ cc_binary { "libsync", "libutils", ], + arch: { + arm: { + cflags: [ + "-DARCH_ARM_32" + ], + }, + }, } diff --git a/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc b/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc index cbd589afca..5b8a46f9e9 100644 --- a/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc +++ b/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc @@ -1,8 +1,8 @@ service vendor.hwcomposer-2-1 /vendor/bin/hw/android.hardware.graphics.composer@2.1-service - interface android.hardware.graphics.composer@2.1::IComposer default class hal animation user system group graphics drmrpc capabilities SYS_NICE onrestart restart surfaceflinger writepid /dev/cpuset/system-background/tasks + socket pps stream 0660 system system diff --git a/graphics/composer/2.1/default/service.cpp b/graphics/composer/2.1/default/service.cpp index 1276d2df7e..b8ddd212a4 100644 --- a/graphics/composer/2.1/default/service.cpp +++ b/graphics/composer/2.1/default/service.cpp @@ -23,6 +23,7 @@ #include <binder/ProcessState.h> #include <composer-passthrough/2.1/HwcLoader.h> #include <hidl/LegacySupport.h> +#include <hwbinder/ProcessState.h> using android::hardware::graphics::composer::V2_1::IComposer; using android::hardware::graphics::composer::V2_1::passthrough::HwcLoader; @@ -41,6 +42,10 @@ int main() { ALOGE("Couldn't set SCHED_FIFO: %d", errno); } +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)(32768)); +#endif + android::hardware::configureRpcThreadpool(4, true /* will join */); android::sp<IComposer> composer = HwcLoader::load(); diff --git a/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc b/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc index efe6dadbc2..289a91ca3d 100644 --- a/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc +++ b/graphics/composer/2.2/default/android.hardware.graphics.composer@2.2-service.rc @@ -4,4 +4,5 @@ service vendor.hwcomposer-2-2 /vendor/bin/hw/android.hardware.graphics.composer@ group graphics drmrpc capabilities SYS_NICE onrestart restart surfaceflinger + socket pps stream 0660 system system writepid /dev/cpuset/system-background/tasks diff --git a/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc b/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc index 81ce89059c..5cc19bb82c 100644 --- a/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc +++ b/graphics/composer/2.3/default/android.hardware.graphics.composer@2.3-service.rc @@ -4,4 +4,5 @@ service vendor.hwcomposer-2-3 /vendor/bin/hw/android.hardware.graphics.composer@ group graphics drmrpc capabilities SYS_NICE onrestart restart surfaceflinger + socket pps stream 0660 system system writepid /dev/cpuset/system-background/tasks diff --git a/graphics/composer/2.3/utils/passthrough/include/composer-passthrough/2.3/HwcHal.h b/graphics/composer/2.3/utils/passthrough/include/composer-passthrough/2.3/HwcHal.h index e0e1394027..19c4653e0f 100644 --- a/graphics/composer/2.3/utils/passthrough/include/composer-passthrough/2.3/HwcHal.h +++ b/graphics/composer/2.3/utils/passthrough/include/composer-passthrough/2.3/HwcHal.h @@ -222,6 +222,10 @@ class HwcHalImpl : public V2_2::passthrough::detail::HwcHalImpl<Hal> { Error getDisplayCapabilities( Display display, std::vector<IComposerClient::DisplayCapability>* outCapabilities) override { + if (!mDispatch.getDisplayCapabilities) { + return Error::UNSUPPORTED; + } + uint32_t count = 0; int32_t error = mDispatch.getDisplayCapabilities(mDevice, display, &count, nullptr); if (error != HWC2_ERROR_NONE) { diff --git a/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc b/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc index a296b0aace..802b99e7de 100644 --- a/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc +++ b/graphics/composer/2.4/default/android.hardware.graphics.composer@2.4-service.rc @@ -5,3 +5,4 @@ service vendor.hwcomposer-2-4 /vendor/bin/hw/android.hardware.graphics.composer@ capabilities SYS_NICE onrestart restart surfaceflinger writepid /dev/cpuset/system-background/tasks + socket pps stream 0660 system system diff --git a/keymaster/4.0/support/include/keymasterV4_0/keymaster_tags.h b/keymaster/4.0/support/include/keymasterV4_0/keymaster_tags.h index ea40971898..d7358f36f3 100644 --- a/keymaster/4.0/support/include/keymasterV4_0/keymaster_tags.h +++ b/keymaster/4.0/support/include/keymasterV4_0/keymaster_tags.h @@ -73,6 +73,9 @@ namespace V4_0 { static const int32_t KM_TAG_DIGEST_OLD = static_cast<int32_t>(TagType::ENUM) | 5; static const int32_t KM_TAG_PADDING_OLD = static_cast<int32_t>(TagType::ENUM) | 7; +static const int32_t KM_TAG_FBE_ICE = static_cast<int32_t>(TagType::BOOL) | 16201; +static const int32_t KM_TAG_KEY_TYPE = static_cast<int32_t>(TagType::UINT) | 16202; + constexpr TagType typeFromTag(Tag tag) { return static_cast<TagType>(static_cast<uint32_t>(tag) & static_cast<uint32_t>(0xf0000000)); } diff --git a/light/2.0/default/Android.bp b/light/2.0/default/Android.bp index 2745f3d8be..e3e7e5b0ca 100644 --- a/light/2.0/default/Android.bp +++ b/light/2.0/default/Android.bp @@ -50,10 +50,18 @@ cc_defaults { "libbase", "libdl", "libutils", + "libhwbinder", "libhardware", "libhidlbase", "android.hardware.light@2.0", ], + arch: { + arm: { + cflags: [ + "-DARCH_ARM_32" + ], + }, + }, } cc_binary { diff --git a/light/2.0/default/service.cpp b/light/2.0/default/service.cpp index 20f0578f02..b50a2034f4 100644 --- a/light/2.0/default/service.cpp +++ b/light/2.0/default/service.cpp @@ -16,10 +16,14 @@ #include <android/hardware/light/2.0/ILight.h> #include <hidl/LegacySupport.h> +#include <hwbinder/ProcessState.h> using android::hardware::light::V2_0::ILight; using android::hardware::defaultPassthroughServiceImplementation; int main() { +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)(32768)); +#endif return defaultPassthroughServiceImplementation<ILight>(); } diff --git a/power/1.0/default/Android.bp b/power/1.0/default/Android.bp index a64b15ca97..d99ef9d833 100644 --- a/power/1.0/default/Android.bp +++ b/power/1.0/default/Android.bp @@ -63,6 +63,12 @@ cc_binary { "libhardware", "libhidlbase", "android.hardware.power@1.0", + "libhwbinder" ], + arch: { + arm: { + cflags: ["-DARCH_ARM_32"], + }, + }, } diff --git a/power/1.0/default/service.cpp b/power/1.0/default/service.cpp index e8618b84e8..d5619192bb 100644 --- a/power/1.0/default/service.cpp +++ b/power/1.0/default/service.cpp @@ -18,10 +18,16 @@ #include <android/hardware/power/1.0/IPower.h> #include <hidl/LegacySupport.h> +#ifdef ARCH_ARM_32 +#include <hwbinder/ProcessState.h> +#endif using android::hardware::power::V1_0::IPower; using android::hardware::defaultPassthroughServiceImplementation; int main() { + #ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)16384); + #endif return defaultPassthroughServiceImplementation<IPower>(); } diff --git a/sensors/1.0/default/Android.bp b/sensors/1.0/default/Android.bp index 2e4e1b015c..b2d3c49cf2 100644 --- a/sensors/1.0/default/Android.bp +++ b/sensors/1.0/default/Android.bp @@ -55,6 +55,7 @@ cc_binary { relative_install_path: "hw", vendor: true, init_rc: ["android.hardware.sensors@1.0-service.rc"], + defaults: ["hidl_defaults"], srcs: ["service.cpp"], shared_libs: [ @@ -65,5 +66,11 @@ cc_binary { "libutils", "libhidlbase", "android.hardware.sensors@1.0", + "libhwbinder", ], + arch: { + arm: { + cflags: ["-DARCH_ARM_32"], + }, + }, } diff --git a/sensors/1.0/default/android.hardware.sensors@1.0-service.rc b/sensors/1.0/default/android.hardware.sensors@1.0-service.rc index 1af6d0b08c..e029bb8f72 100644 --- a/sensors/1.0/default/android.hardware.sensors@1.0-service.rc +++ b/sensors/1.0/default/android.hardware.sensors@1.0-service.rc @@ -2,6 +2,6 @@ service vendor.sensors-hal-1-0 /vendor/bin/hw/android.hardware.sensors@1.0-servi interface android.hardware.sensors@1.0::ISensors default class hal user system - group system wakelock uhid context_hub + group system wakelock uhid input context_hub capabilities BLOCK_SUSPEND rlimit rtprio 10 10 diff --git a/sensors/1.0/default/service.cpp b/sensors/1.0/default/service.cpp index 65f6d816a1..c413d1a0e0 100644 --- a/sensors/1.0/default/service.cpp +++ b/sensors/1.0/default/service.cpp @@ -19,10 +19,30 @@ #include <android/hardware/sensors/1.0/ISensors.h> #include <hidl/LegacySupport.h> +#ifdef ARCH_ARM_32 +#include <hwbinder/ProcessState.h> +#include <cutils/properties.h> +#endif + using android::hardware::sensors::V1_0::ISensors; using android::hardware::defaultPassthroughServiceImplementation; +#ifdef ARCH_ARM_32 +//default h/w binder memsize for sensors is 8 KB +#define DEFAULT_SENSORS_HW_BINDER_MEM_SIZE_KB 8 +size_t getHWBinderMmapSize() { + int32_t value = DEFAULT_SENSORS_HW_BINDER_MEM_SIZE_KB; + + value = property_get_int32("persist.vendor.sensor.hw.binder.size", value); + ALOGD("Init hw binder with mem size = %d", value); + return 1024 * value; +} +#endif + int main() { +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)getHWBinderMmapSize()); +#endif /* Sensors framework service needs at least two threads. * One thread blocks on a "poll" * The second thread is needed for all other HAL methods. diff --git a/usb/1.0/default/Usb.cpp b/usb/1.0/default/Usb.cpp index 6eb88428c9..f72ab9cb39 100644 --- a/usb/1.0/default/Usb.cpp +++ b/usb/1.0/default/Usb.cpp @@ -206,6 +206,19 @@ rescan: bool canSwitchRoleHelper(const std::string portName, PortRoleType type) { std::string filename = appendRoleNodeHelper(portName, type); + + if (type == PortRoleType::DATA_ROLE || type == PortRoleType::POWER_ROLE) { + std::string pd_filename = "/sys/class/power_supply/usb/pd_active"; + std::string pd_active; + + if (!readFile(pd_filename, pd_active)) { + if (pd_active == "0") + return false; + } else { + ALOGE("canSwitchRoleHelper: couldn't read %s", pd_filename.c_str()); + } + } + std::ofstream file(filename); if (file.is_open()) { @@ -396,7 +409,7 @@ void* work(void* param) { for (int n = 0; n < nevents; ++n) { if (events[n].data.ptr) - (*(void (*)(int, struct data *payload))events[n].data.ptr) + (*(void (*)(uint32_t, struct data *payload))events[n].data.ptr) (events[n].events, &payload); } } diff --git a/usb/gadget/1.1/default/lib/UsbGadgetUtils.cpp b/usb/gadget/1.1/default/lib/UsbGadgetUtils.cpp index 8402853b99..4c40bf88af 100644 --- a/usb/gadget/1.1/default/lib/UsbGadgetUtils.cpp +++ b/usb/gadget/1.1/default/lib/UsbGadgetUtils.cpp @@ -178,6 +178,9 @@ Status addGenericAndroidFunctions(MonitorFfs* monitorFfs, uint64_t functions, bo Status addAdb(MonitorFfs* monitorFfs, int* functionCount) { ALOGI("setCurrentUsbFunctions Adb"); + if (!WriteStringToFile("1", DESC_USE_PATH)) + return Status::ERROR; + if (!monitorFfs->addInotifyFd("/dev/usb-ffs/adb/")) return Status::ERROR; if (linkFunction("ffs.adb", (*functionCount)++)) return Status::ERROR; diff --git a/usb/gadget/1.2/default/lib/UsbGadgetUtils.cpp b/usb/gadget/1.2/default/lib/UsbGadgetUtils.cpp index 898655651c..fa50821b5b 100644 --- a/usb/gadget/1.2/default/lib/UsbGadgetUtils.cpp +++ b/usb/gadget/1.2/default/lib/UsbGadgetUtils.cpp @@ -190,6 +190,9 @@ Status addGenericAndroidFunctions(MonitorFfs* monitorFfs, uint64_t functions, bo Status addAdb(MonitorFfs* monitorFfs, int* functionCount) { ALOGI("setCurrentUsbFunctions Adb"); + if (!WriteStringToFile("1", DESC_USE_PATH)) + return Status::ERROR; + if (!monitorFfs->addInotifyFd("/dev/usb-ffs/adb/")) return Status::ERROR; if (linkFunction("ffs.adb", (*functionCount)++)) return Status::ERROR; diff --git a/vibrator/1.0/default/Android.bp b/vibrator/1.0/default/Android.bp index ed750b453b..d495f711d3 100644 --- a/vibrator/1.0/default/Android.bp +++ b/vibrator/1.0/default/Android.bp @@ -51,5 +51,13 @@ cc_binary { "libutils", "libhardware", "android.hardware.vibrator@1.0", + "libhwbinder", ], + arch: { + arm: { + cflags: [ + "-DARCH_ARM_32" + ], + }, + }, } diff --git a/vibrator/1.0/default/service.cpp b/vibrator/1.0/default/service.cpp index 7cc074461d..b626056990 100644 --- a/vibrator/1.0/default/service.cpp +++ b/vibrator/1.0/default/service.cpp @@ -17,10 +17,14 @@ #include <android/hardware/vibrator/1.0/IVibrator.h> #include <hidl/LegacySupport.h> +#include <hwbinder/ProcessState.h> using android::hardware::vibrator::V1_0::IVibrator; using android::hardware::defaultPassthroughServiceImplementation; int main() { +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize((size_t)8192); +#endif return defaultPassthroughServiceImplementation<IVibrator>(); } diff --git a/wifi/1.5/default/Android.mk b/wifi/1.5/default/Android.mk index 1997b2209f..edb59bb085 100644 --- a/wifi/1.5/default/Android.mk +++ b/wifi/1.5/default/Android.mk @@ -42,6 +42,12 @@ endif ifdef WIFI_AVOID_IFACE_RESET_MAC_CHANGE LOCAL_CPPFLAGS += -DWIFI_AVOID_IFACE_RESET_MAC_CHANGE endif +ifdef QC_WIFI_HIDL_FEATURE_DUAL_AP +LOCAL_CPPFLAGS += -DQC_WIFI_HIDL_FEATURE_DUAL_AP +endif +ifdef QC_WIFI_HIDL_FEATURE_DUAL_STA +LOCAL_CPPFLAGS += -DQC_WIFI_HIDL_FEATURE_DUAL_STA +endif # Allow implicit fallthroughs in wifi_legacy_hal.cpp until they are fixed. LOCAL_CFLAGS += -Wno-error=implicit-fallthrough LOCAL_SRC_FILES := \ @@ -94,6 +100,10 @@ LOCAL_VINTF_FRAGMENTS := android.hardware.wifi@1.0-service.xml LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_PROPRIETARY_MODULE := true LOCAL_CPPFLAGS := -Wall -Werror -Wextra +ifeq ($(TARGET_ARCH),arm) + LOCAL_CPPFLAGS += -DARCH_ARM_32 +endif + LOCAL_SRC_FILES := \ service.cpp LOCAL_SHARED_LIBRARIES := \ @@ -103,6 +113,7 @@ LOCAL_SHARED_LIBRARIES := \ liblog \ libnl \ libutils \ + libhwbinder \ libwifi-hal \ libwifi-system-iface \ libxml2 \ diff --git a/wifi/1.5/default/hidl_struct_util.cpp b/wifi/1.5/default/hidl_struct_util.cpp index 338a8f13c1..ec8e0759a4 100644 --- a/wifi/1.5/default/hidl_struct_util.cpp +++ b/wifi/1.5/default/hidl_struct_util.cpp @@ -52,7 +52,7 @@ IWifiChip::ChipCapabilityMask convertLegacyLoggerFeatureToHidlChipCapability( case legacy_hal::WIFI_LOGGER_POWER_EVENT_SUPPORTED: return HidlChipCaps::DEBUG_RING_BUFFER_POWER_EVENT; case legacy_hal::WIFI_LOGGER_WAKE_LOCK_SUPPORTED: - return HidlChipCaps::DEBUG_RING_BUFFER_WAKELOCK_EVENT; + return HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS; }; CHECK(false) << "Unknown legacy feature: " << feature; return {}; @@ -158,10 +158,8 @@ bool convertLegacyFeaturesToHidlChipCapabilities( } } - // There are no flags for these 3 in the legacy feature set. Adding them to + // There are no flags for these in the legacy feature set. Adding this to // the set because all the current devices support it. - *hidl_caps |= HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA; - *hidl_caps |= HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS; *hidl_caps |= HidlChipCaps::DEBUG_ERROR_ALERTS; return true; } @@ -2102,7 +2100,7 @@ bool convertHidlNanDataPathInitiatorRequestToLegacy( "ifaceName too long"; return false; } - strncpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str(), + strlcpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str(), IFNAMSIZ + 1); legacy_request->ndp_cfg.security_cfg = (hidl_request.securityConfig.securityType != @@ -2189,7 +2187,7 @@ bool convertHidlNanDataPathIndicationResponseToLegacy( "ifaceName too long"; return false; } - strncpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str(), + strlcpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str(), IFNAMSIZ + 1); legacy_request->ndp_cfg.security_cfg = (hidl_request.securityConfig.securityType != diff --git a/wifi/1.5/default/service.cpp b/wifi/1.5/default/service.cpp index 3de49b29bb..4c089d86ea 100644 --- a/wifi/1.5/default/service.cpp +++ b/wifi/1.5/default/service.cpp @@ -20,6 +20,8 @@ #include <signal.h> #include <utils/Looper.h> #include <utils/StrongPointer.h> +#include <hwbinder/ProcessState.h> +#include <cutils/properties.h> #include "wifi.h" #include "wifi_feature_flags.h" @@ -38,6 +40,17 @@ using android::hardware::wifi::V1_5::implementation::legacy_hal:: using android::hardware::wifi::V1_5::implementation::mode_controller:: WifiModeController; +#ifdef ARCH_ARM_32 +#define DEFAULT_WIFIHAL_HW_BINDER_SIZE_KB 16 +size_t getHWBinderMmapSize() { + size_t value = 0; + value = property_get_int32("persist.vendor.wifi.wifihal.hw.binder.size", DEFAULT_WIFIHAL_HW_BINDER_SIZE_KB); + if (!value) value = DEFAULT_WIFIHAL_HW_BINDER_SIZE_KB; // deafult to 1 page of 4 Kb + + return 1024 * value; +} +#endif /* ARCH_ARM_32 */ + #ifdef LAZY_SERVICE const bool kLazyService = true; #else @@ -46,6 +59,9 @@ const bool kLazyService = false; int main(int /*argc*/, char** argv) { signal(SIGPIPE, SIG_IGN); +#ifdef ARCH_ARM_32 + android::hardware::ProcessState::initWithMmapSize(getHWBinderMmapSize()); +#endif /* ARCH_ARM_32 */ android::base::InitLogging( argv, android::base::LogdLogger(android::base::SYSTEM)); LOG(INFO) << "Wifi Hal is booting up..."; diff --git a/wifi/1.5/default/wifi_chip.cpp b/wifi/1.5/default/wifi_chip.cpp index 6bdff42149..d8e0a60133 100644 --- a/wifi/1.5/default/wifi_chip.cpp +++ b/wifi/1.5/default/wifi_chip.cpp @@ -22,6 +22,7 @@ #include <net/if.h> #include <sys/stat.h> #include <sys/sysmacros.h> +#include <net/if.h> #include "hidl_return_util.h" #include "hidl_struct_util.h" @@ -137,8 +138,10 @@ std::string getPredefinedP2pIfaceName() { strlen(P2P_MGMT_DEVICE_PREFIX)) == 0) { /* Get the p2p parent interface name from p2p device interface name set * in property */ - strncpy(p2pParentIfname, buffer.data() + strlen(P2P_MGMT_DEVICE_PREFIX), - strlen(buffer.data()) - strlen(P2P_MGMT_DEVICE_PREFIX)); + + strlcpy(p2pParentIfname, buffer.data() + strlen(P2P_MGMT_DEVICE_PREFIX), + sizeof(p2pParentIfname)); + if (property_get(kActiveWlanIfaceNameProperty, primaryIfaceName.data(), nullptr) == 0) { return buffer.data(); @@ -232,7 +235,7 @@ bool cpioWriteHeader(int out_fd, struct stat& st, const char* file_name, size_t file_name_len) { std::array<char, 32 * 1024> read_buf; ssize_t llen = - sprintf(read_buf.data(), + snprintf(read_buf.data(), read_buf.size(), "%s%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X", kCpioMagic, static_cast<int>(st.st_ino), st.st_mode, st.st_uid, st.st_gid, static_cast<int>(st.st_nlink), @@ -300,8 +303,8 @@ bool cpioWriteFileTrailer(int out_fd) { std::array<char, 4096> read_buf; read_buf.fill(0); if (write(out_fd, read_buf.data(), - sprintf(read_buf.data(), "070701%040X%056X%08XTRAILER!!!", 1, - 0x0b, 0) + + snprintf(read_buf.data(), read_buf.size(), + "070701%040X%056X%08XTRAILER!!!", 1, 0x0b, 0) + 4) == -1) { PLOG(ERROR) << "Error writing trailing bytes"; return false; @@ -785,7 +788,36 @@ Return<void> WifiChip::triggerSubsystemRestart( hidl_status_cb); } +void WifiChip::QcRemoveAndClearDynamicIfaces() { + for (const auto& iface : created_ap_ifaces_) { + std::string ifname = iface->getName(); + legacy_hal::wifi_error legacy_status = + legacy_hal_.lock()->deleteVirtualInterface(ifname); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + LOG(ERROR) << "Failed to remove interface: " << ifname << " " + << legacyErrorToString(legacy_status); + } + } + + for (const auto& iface : created_sta_ifaces_) { + std::string ifname = iface->getName(); + legacy_hal::wifi_error legacy_status = + legacy_hal_.lock()->deleteVirtualInterface(ifname); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + LOG(ERROR) << "Failed to remove interface: " << ifname << " " + << legacyErrorToString(legacy_status); + } + } + + // created_ap/sta_ifaces are also part of sta/ap_ifaces. + // Do no invalidate here. + + created_ap_ifaces_.clear(); + created_sta_ifaces_.clear(); +} + void WifiChip::invalidateAndRemoveAllIfaces() { + QcRemoveAndClearDynamicIfaces(); invalidateAndClearBridgedApAll(); invalidateAndClearAll(ap_ifaces_); invalidateAndClearAll(nan_ifaces_); @@ -975,6 +1007,7 @@ sp<WifiApIface> WifiChip::newWifiApIface(std::string& ifname) { ap_instances = it.second; } } + iface_util_->setRandomMacAddressIndex(ap_ifaces_.size()); sp<WifiApIface> iface = new WifiApIface(ifname, ap_instances, legacy_hal_, iface_util_); ap_ifaces_.push_back(iface); @@ -992,12 +1025,17 @@ WifiChip::createApIfaceInternal() { if (!canCurrentModeSupportIfaceOfTypeWithCurrentIfaces(IfaceType::AP)) { return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}}; } + bool iface_created = false; std::string ifname = allocateApIfaceName(); - WifiStatus status = createVirtualApInterface(ifname); - if (status.code != WifiStatusCode::SUCCESS) { - return {status, {}}; + if (!if_nametoindex(ifname.c_str())) { + WifiStatus status = createVirtualApInterface(ifname); + if (status.code != WifiStatusCode::SUCCESS) { + return {status, {}}; + } + iface_created = true; } sp<WifiApIface> iface = newWifiApIface(ifname); + if (iface_created) created_ap_ifaces_.push_back(iface); return {createWifiStatus(WifiStatusCode::SUCCESS), iface}; } @@ -1069,6 +1107,15 @@ WifiStatus WifiChip::removeApIfaceInternal(const std::string& ifname) { // nan/rtt objects over AP iface. But, there is no harm to do it // here and not make that assumption all over the place. invalidateAndRemoveDependencies(ifname); + if (findUsingName(created_ap_ifaces_, ifname) != nullptr) { + legacy_hal::wifi_error legacy_status = + legacy_hal_.lock()->deleteVirtualInterface(ifname); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + LOG(ERROR) << "Failed to remove interface: " << ifname << " " + << legacyErrorToString(legacy_status); + } + invalidateAndClear(created_ap_ifaces_, iface); + } // Clear the bridge interface and the iface instance. invalidateAndClearBridgedAp(ifname); invalidateAndClear(ap_ifaces_, iface); @@ -1230,18 +1277,23 @@ WifiChip::createStaIfaceInternal() { if (!canCurrentModeSupportIfaceOfTypeWithCurrentIfaces(IfaceType::STA)) { return {createWifiStatus(WifiStatusCode::ERROR_NOT_AVAILABLE), {}}; } + bool iface_created = false; std::string ifname = allocateStaIfaceName(); - legacy_hal::wifi_error legacy_status = - legacy_hal_.lock()->createVirtualInterface( - ifname, - hidl_struct_util::convertHidlIfaceTypeToLegacy(IfaceType::STA)); - if (legacy_status != legacy_hal::WIFI_SUCCESS) { - LOG(ERROR) << "Failed to add interface: " << ifname << " " - << legacyErrorToString(legacy_status); - return {createWifiStatusFromLegacyError(legacy_status), {}}; + if (!if_nametoindex(ifname.c_str())) { + legacy_hal::wifi_error legacy_status = + legacy_hal_.lock()->createVirtualInterface( + ifname, + hidl_struct_util::convertHidlIfaceTypeToLegacy(IfaceType::STA)); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + LOG(ERROR) << "Failed to add interface: " << ifname << " " + << legacyErrorToString(legacy_status); + return {createWifiStatusFromLegacyError(legacy_status), {}}; + } + iface_created = true; } sp<WifiStaIface> iface = new WifiStaIface(ifname, legacy_hal_, iface_util_); sta_ifaces_.push_back(iface); + if (iface_created) created_sta_ifaces_.push_back(iface); for (const auto& callback : event_cb_handler_.getCallbacks()) { if (!callback->onIfaceAdded(IfaceType::STA, ifname).isOk()) { LOG(ERROR) << "Failed to invoke onIfaceAdded callback"; @@ -1275,11 +1327,14 @@ WifiStatus WifiChip::removeStaIfaceInternal(const std::string& ifname) { } // Invalidate & remove any dependent objects first. invalidateAndRemoveDependencies(ifname); - legacy_hal::wifi_error legacy_status = - legacy_hal_.lock()->deleteVirtualInterface(ifname); - if (legacy_status != legacy_hal::WIFI_SUCCESS) { - LOG(ERROR) << "Failed to remove interface: " << ifname << " " - << legacyErrorToString(legacy_status); + if (findUsingName(created_sta_ifaces_, ifname) != nullptr) { + legacy_hal::wifi_error legacy_status = + legacy_hal_.lock()->deleteVirtualInterface(ifname); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + LOG(ERROR) << "Failed to remove interface: " << ifname << " " + << legacyErrorToString(legacy_status); + } + invalidateAndClear(created_sta_ifaces_, iface); } invalidateAndClear(sta_ifaces_, iface); for (const auto& callback : event_cb_handler_.getCallbacks()) { @@ -1937,7 +1992,7 @@ uint32_t WifiChip::startIdxOfApIface() { } // AP iface names start with idx 1 for modes supporting -// concurrent STA and not dual AP, else start with idx 0. +// concurrent STA, else start with idx 0. std::string WifiChip::allocateApIfaceName() { // Check if we have a dedicated iface for AP. std::vector<std::string> ifnames = getPredefinedApIfaceNames(false); diff --git a/wifi/1.5/default/wifi_chip.h b/wifi/1.5/default/wifi_chip.h index bd40ead35a..51ade5d810 100644 --- a/wifi/1.5/default/wifi_chip.h +++ b/wifi/1.5/default/wifi_chip.h @@ -306,6 +306,7 @@ class WifiChip : public V1_5::IWifiChip { void invalidateAndClearBridgedAp(const std::string& br_name); bool findUsingNameFromBridgedApInstances(const std::string& name); WifiStatus triggerSubsystemRestartInternal(); + void QcRemoveAndClearDynamicIfaces(); ChipId chip_id_; std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_; @@ -331,6 +332,10 @@ class WifiChip : public V1_5::IWifiChip { const std::function<void(const std::string&)> subsystemCallbackHandler_; std::map<std::string, std::vector<std::string>> br_ifaces_ap_instances_; + + std::vector<sp<WifiApIface>> created_ap_ifaces_; + std::vector<sp<WifiStaIface>> created_sta_ifaces_; + DISALLOW_COPY_AND_ASSIGN(WifiChip); }; diff --git a/wifi/1.5/default/wifi_feature_flags.cpp b/wifi/1.5/default/wifi_feature_flags.cpp index 124ba32e9f..84697f80e8 100644 --- a/wifi/1.5/default/wifi_feature_flags.cpp +++ b/wifi/1.5/default/wifi_feature_flags.cpp @@ -84,14 +84,54 @@ constexpr ChipModeId kMainModeId = chip_mode_ids::kV3; # define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P}, 1}} # endif # else -# ifdef WIFI_HIDL_FEATURE_AWARE -// (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN)) -# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ - {{{STA}, 1}, {{P2P, NAN}, 1}} +# if defined(QC_WIFI_HIDL_FEATURE_DUAL_AP) && defined(QC_WIFI_HIDL_FEATURE_DUAL_STA) +# ifdef WIFI_HIDL_FEATURE_AWARE +// (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN)) or (2 AP) or (2 STA) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P, NAN}, 1}},\ + {{{AP}, 2}},\ + {{{STA}, 2}} +# else +// (1 STA + 1 AP) or (1 STA + 1 P2P) or (2 AP) or (2 STA) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P}, 1}},\ + {{{AP}, 2}},\ + {{{STA}, 2}} +# endif +# elif defined(QC_WIFI_HIDL_FEATURE_DUAL_AP) +# ifdef WIFI_HIDL_FEATURE_AWARE +// (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN)) or (2 AP) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P, NAN}, 1}},\ + {{{AP}, 2}} +# else +// (1 STA + 1 AP) or (1 STA + 1 P2P) or (2 AP) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P}, 1}},\ + {{{AP}, 2}} +# endif +# elif defined(QC_WIFI_HIDL_FEATURE_DUAL_STA) +# ifdef WIFI_HIDL_FEATURE_AWARE +// (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN)) or (2 STA) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P, NAN}, 1}},\ + {{{STA}, 2}} +# else +// (1 STA + 1 AP) or (1 STA + 1 P2P) or (2 STA) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P}, 1}},\ + {{{STA}, 2}} +# endif # else -// (1 STA + 1 AP) or (1 STA + 1 P2P) -# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ - {{{STA}, 1}, {{P2P}, 1}} +# ifdef WIFI_HIDL_FEATURE_AWARE +// (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN)) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P, NAN}, 1}} +# else +// (1 STA + 1 AP) or (1 STA + 1 P2P) +# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\ + {{{STA}, 1}, {{P2P}, 1}} +# endif # endif # endif #else diff --git a/wifi/1.5/default/wifi_iface_util.cpp b/wifi/1.5/default/wifi_iface_util.cpp index 7bf830b875..f1c182fc7d 100644 --- a/wifi/1.5/default/wifi_iface_util.cpp +++ b/wifi/1.5/default/wifi_iface_util.cpp @@ -45,8 +45,11 @@ WifiIfaceUtil::WifiIfaceUtil( const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal) : iface_tool_(iface_tool), legacy_hal_(legacy_hal), - random_mac_address_(nullptr), - event_handlers_map_() {} + random_mac_address_index_(0), + event_handlers_map_() { + for (int i=0; i < MAX_RANDOM_MAC_ADDR_INDEX; i++) + random_mac_address_[i] = nullptr; +} std::array<uint8_t, 6> WifiIfaceUtil::getFactoryMacAddress( const std::string& iface_name) { @@ -56,14 +59,21 @@ std::array<uint8_t, 6> WifiIfaceUtil::getFactoryMacAddress( bool WifiIfaceUtil::setMacAddress(const std::string& iface_name, const std::array<uint8_t, 6>& mac) { #ifndef WIFI_AVOID_IFACE_RESET_MAC_CHANGE - if (!iface_tool_.lock()->SetUpState(iface_name.c_str(), false)) { + legacy_hal::wifi_error legacy_status; + uint64_t legacy_feature_set; + std::tie(legacy_status, legacy_feature_set) = + legacy_hal_.lock()->getSupportedFeatureSet(iface_name); + + if (!(legacy_feature_set & WIFI_FEATURE_DYNAMIC_SET_MAC) && + !iface_tool_.lock()->SetUpState(iface_name.c_str(), false)) { LOG(ERROR) << "SetUpState(false) failed."; return false; } #endif bool success = iface_tool_.lock()->SetMacAddress(iface_name.c_str(), mac); #ifndef WIFI_AVOID_IFACE_RESET_MAC_CHANGE - if (!iface_tool_.lock()->SetUpState(iface_name.c_str(), true)) { + if (!(legacy_feature_set & WIFI_FEATURE_DYNAMIC_SET_MAC) && + !iface_tool_.lock()->SetUpState(iface_name.c_str(), true)) { LOG(ERROR) << "SetUpState(true) failed. Wait for driver ready."; // Wait for driver ready and try to set iface UP again if (legacy_hal_.lock()->waitForDriverReady() != @@ -93,13 +103,22 @@ bool WifiIfaceUtil::setMacAddress(const std::string& iface_name, return success; } +void WifiIfaceUtil::setRandomMacAddressIndex(int idx) { + if (idx >= MAX_RANDOM_MAC_ADDR_INDEX) { + LOG(ERROR) << "Requested random mac address index crossed max limit!!"; + return; + } + + random_mac_address_index_ = idx; +} + std::array<uint8_t, 6> WifiIfaceUtil::getOrCreateRandomMacAddress() { - if (random_mac_address_) { - return *random_mac_address_.get(); + if (random_mac_address_[random_mac_address_index_]) { + return *random_mac_address_[random_mac_address_index_].get(); } - random_mac_address_ = + random_mac_address_[random_mac_address_index_] = std::make_unique<std::array<uint8_t, 6>>(createRandomMacAddress()); - return *random_mac_address_.get(); + return *random_mac_address_[random_mac_address_index_].get(); } void WifiIfaceUtil::registerIfaceEventHandlers(const std::string& iface_name, diff --git a/wifi/1.5/default/wifi_iface_util.h b/wifi/1.5/default/wifi_iface_util.h index 544f575d41..cb30ca8f9e 100644 --- a/wifi/1.5/default/wifi_iface_util.h +++ b/wifi/1.5/default/wifi_iface_util.h @@ -17,6 +17,8 @@ #ifndef WIFI_IFACE_UTIL_H_ #define WIFI_IFACE_UTIL_H_ +#define MAX_RANDOM_MAC_ADDR_INDEX 5 + #include <wifi_system/interface_tool.h> #include <android/hardware/wifi/1.0/IWifi.h> @@ -55,6 +57,7 @@ class WifiIfaceUtil { // daemon. (So, changes on every reboot) virtual std::array<uint8_t, 6> getOrCreateRandomMacAddress(); + virtual void setRandomMacAddressIndex(int idx); // Register for any iface event callbacks for the provided interface. virtual void registerIfaceEventHandlers(const std::string& iface_name, IfaceEventHandlers handlers); @@ -77,7 +80,9 @@ class WifiIfaceUtil { private: std::weak_ptr<wifi_system::InterfaceTool> iface_tool_; std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal_; - std::unique_ptr<std::array<uint8_t, 6>> random_mac_address_; + std::unique_ptr<std::array<uint8_t, 6>> random_mac_address_[MAX_RANDOM_MAC_ADDR_INDEX]; + + int random_mac_address_index_; std::map<std::string, IfaceEventHandlers> event_handlers_map_; }; diff --git a/wifi/1.5/default/wifi_legacy_hal.cpp b/wifi/1.5/default/wifi_legacy_hal.cpp index 5074252d3d..109c482cb2 100644 --- a/wifi/1.5/default/wifi_legacy_hal.cpp +++ b/wifi/1.5/default/wifi_legacy_hal.cpp @@ -37,8 +37,8 @@ static constexpr uint32_t kLinkLayerStatsDataMpduSizeThreshold = 128; static constexpr uint32_t kMaxWakeReasonStatsArraySize = 32; static constexpr uint32_t kMaxRingBuffers = 10; static constexpr uint32_t kMaxWifiUsableChannels = 256; -// need a long timeout (1000ms) for chips that unload their driver. -static constexpr uint32_t kMaxStopCompleteWaitMs = 1000; +// need a long timeout (2000ms) for chips that unload their driver. +static constexpr uint32_t kMaxStopCompleteWaitMs = 2000; static constexpr char kDriverPropName[] = "wlan.driver.status"; // Helper function to create a non-const char* for legacy Hal API's. |