diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/3a/intel3a/Intel3AParameter.cpp | 13 | ||||
| -rw-r--r-- | src/core/CameraBuffer.cpp | 14 | ||||
| -rw-r--r-- | src/core/CameraBuffer.h | 4 | ||||
| -rw-r--r-- | src/core/CameraDevice.cpp | 8 | ||||
| -rw-r--r-- | src/core/CsiMetaDevice.cpp | 9 | ||||
| -rw-r--r-- | src/core/CvfPrivacyChecker.cpp | 33 | ||||
| -rw-r--r-- | src/core/DeviceBase.cpp | 30 | ||||
| -rw-r--r-- | src/core/DeviceBase.h | 3 | ||||
| -rw-r--r-- | src/core/PSysProcessor.cpp | 2 | ||||
| -rw-r--r-- | src/core/SensorHwCtrl.cpp | 2 | ||||
| -rw-r--r-- | src/core/psysprocessor/GPUExecutor.cpp | 1 | ||||
| -rw-r--r-- | src/core/psysprocessor/PGUtils.cpp | 6 | ||||
| -rw-r--r-- | src/hal/hal_adaptor/CMakeLists.txt | 23 | ||||
| -rw-r--r-- | src/hal/hal_adaptor/HalAdaptor.cpp | 112 | ||||
| -rw-r--r-- | src/iutils/Utils.h | 12 | ||||
| -rw-r--r-- | src/platformdata/CameraParser.cpp | 68 | ||||
| -rw-r--r-- | src/platformdata/PlatformData.cpp | 7 | ||||
| -rw-r--r-- | src/v4l2/MediaControl.cpp | 74 | ||||
| -rw-r--r-- | src/v4l2/MediaControl.h | 13 |
19 files changed, 306 insertions, 128 deletions
diff --git a/src/3a/intel3a/Intel3AParameter.cpp b/src/3a/intel3a/Intel3AParameter.cpp index 7b57785..4803d15 100644 --- a/src/3a/intel3a/Intel3AParameter.cpp +++ b/src/3a/intel3a/Intel3AParameter.cpp @@ -645,11 +645,14 @@ void Intel3AParameter::updateAfParameter(const aiq_parameter_t& param) { // Current only one AF metering window is supported, so use the latest one camera_window_t window = param.afRegions.back(); if (window.right > window.left && window.bottom > window.top) { - camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, - param.resolution.height}; - window = AiqUtils::convertToIaWindow(frameCoord, window); - mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_touch; - mAfParams.focus_rect = {window.left, window.top, window.right, window.bottom}; + if ((window.right - window.left) != param.resolution.width && + (window.bottom - window.top) != param.resolution.height) { + camera_coordinate_system_t frameCoord = {0, 0, param.resolution.width, + param.resolution.height}; + window = AiqUtils::convertToIaWindow(frameCoord, window); + mAfParams.focus_metering_mode = ia_aiq_af_metering_mode_touch; + mAfParams.focus_rect = {window.left, window.top, window.right, window.bottom}; + } } } diff --git a/src/core/CameraBuffer.cpp b/src/core/CameraBuffer.cpp index 2f93487..17266e3 100644 --- a/src/core/CameraBuffer.cpp +++ b/src/core/CameraBuffer.cpp @@ -18,10 +18,10 @@ #include "CameraBuffer.h" -// DUMP_DMA_BUF_FOR_DRM_PRIME_S +#ifdef LIBDRM_SUPPORT_MMAP_OFFSET #include <xf86drm.h> -#include <drm/i915_drm.h> -// DUMP_DMA_BUF_FOR_DRM_PRIME_E +#include <libdrm/i915_drm.h> +#endif #include <errno.h> #include <stdlib.h> @@ -322,7 +322,7 @@ void CameraBuffer::freeMmap() { } } -// DUMP_DMA_BUF_FOR_DRM_PRIME_S +#ifdef LIBDRM_SUPPORT_MMAP_OFFSET CameraBuffer::DeviceRender::DeviceRender() : m_handle(-1) { m_handle = open("/dev/dri/renderD128", O_RDWR); } @@ -367,13 +367,17 @@ void* CameraBuffer::DeviceRender::mapDmaBufferAddr(int fd, unsigned int bufferSi return addr; } -// DUMP_DMA_BUF_FOR_DRM_PRIME_E +#endif void* CameraBuffer::mapDmaBufferAddr(int fd, unsigned int bufferSize) { CheckAndLogError(fd < 0 || !bufferSize, nullptr, "%s, fd:0x%x, bufferSize:%u", __func__, fd, bufferSize); +#ifdef LIBDRM_SUPPORT_MMAP_OFFSET return mDeviceRender.mapDmaBufferAddr(fd, bufferSize); +#else + return ::mmap(nullptr, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); +#endif } void CameraBuffer::unmapDmaBufferAddr(void* addr, unsigned int bufferSize) { diff --git a/src/core/CameraBuffer.h b/src/core/CameraBuffer.h index 9d7fa4b..0e65750 100644 --- a/src/core/CameraBuffer.h +++ b/src/core/CameraBuffer.h @@ -173,7 +173,7 @@ class CameraBuffer { void* mMmapAddrs[VIDEO_MAX_PLANES]; int mDmaFd[VIDEO_MAX_PLANES]; - // DUMP_DMA_BUF_FOR_DRM_PRIME_S +#ifdef LIBDRM_SUPPORT_MMAP_OFFSET class DeviceRender { public: DeviceRender(); @@ -186,7 +186,7 @@ class CameraBuffer { }; static DeviceRender mDeviceRender; - // DUMP_DMA_BUF_FOR_DRM_PRIME_E +#endif }; typedef std::vector<std::shared_ptr<CameraBuffer> > CameraBufVector; diff --git a/src/core/CameraDevice.cpp b/src/core/CameraDevice.cpp index 90e8054..aa25a52 100644 --- a/src/core/CameraDevice.cpp +++ b/src/core/CameraDevice.cpp @@ -147,9 +147,11 @@ int CameraDevice::init() { // PRIVACY_MODE_S if (PlatformData::getSupportPrivacy(mCameraId) == CVF_BASED_PRIVACY_MODE) { - ret = mCvfPrivacyChecker->init(); - CheckAndLogError((ret != OK), ret, "%s: Init privacy checker falied", __func__); - mCvfPrivacyChecker->run("CvfPrivacyChecker", PRIORITY_NORMAL); + if (OK == mCvfPrivacyChecker->init()) { + mCvfPrivacyChecker->run("CvfPrivacyChecker", PRIORITY_NORMAL); + } else { + LOGW("%s: Init privacy checker not initialized", __func__); + } } // PRIVACY_MODE_E diff --git a/src/core/CsiMetaDevice.cpp b/src/core/CsiMetaDevice.cpp index 007fbbf..25fb9f6 100644 --- a/src/core/CsiMetaDevice.cpp +++ b/src/core/CsiMetaDevice.cpp @@ -377,7 +377,16 @@ int CsiMetaDevice::setFormat() { struct v4l2_format v4l2fmt; CLEAR(v4l2fmt); +#ifdef CAL_BUILD v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; +#else + int dev_caps = mCsiMetaDevice->GetDeviceCaps(); + if (dev_caps & V4L2_CAP_META_CAPTURE) { + v4l2fmt.type = V4L2_BUF_TYPE_META_CAPTURE; + } else { + v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; + } +#endif v4l2fmt.fmt.pix_mp.width = mEmbeddedMetaData.width; v4l2fmt.fmt.pix_mp.height = mEmbeddedMetaData.height; v4l2fmt.fmt.pix_mp.num_planes = mEmbeddedMetaData.planesNum; diff --git a/src/core/CvfPrivacyChecker.cpp b/src/core/CvfPrivacyChecker.cpp index ecf7baa..a9a5d4a 100644 --- a/src/core/CvfPrivacyChecker.cpp +++ b/src/core/CvfPrivacyChecker.cpp @@ -28,6 +28,7 @@ #include "iutils/CameraLog.h" #include "iutils/Errors.h" #include "iutils/Thread.h" +#include "MediaControl.h" #include "PlatformData.h" #include "V4l2DeviceFactory.h" @@ -55,16 +56,26 @@ CvfPrivacyChecker::~CvfPrivacyChecker() { } int CvfPrivacyChecker::init() { + MediaControl* mc = MediaControl::getInstance(); std::string subDevName; - int ret = PlatformData::getDevNameByType(mCameraId, VIDEO_PIXEL_ARRAY, subDevName); - if (ret == OK) { - LOG1("%s: ArraySubdev camera id:%d dev name:%s", __func__, mCameraId, subDevName.c_str()); - mPixelArraySubdev = V4l2DeviceFactory::getSubDev(mCameraId, subDevName); - } else { - LOG1("%s: Can't get pixel array subdevice. camera id:%d, return: %d", __func__, mCameraId, - ret); + int privacy = -1; + int ret = mc->getPrivacyDeviceName(&subDevName); + + if (ret != OK) { + // Try to get sensor as privacy device + ret = PlatformData::getDevNameByType(mCameraId, VIDEO_PIXEL_ARRAY, subDevName); + CheckAndLogError(ret != OK, ret, "<id%d>%s: Can't get privacy subdev (%d)", mCameraId, + __func__, ret); } - return ret; + mPixelArraySubdev = V4l2DeviceFactory::getSubDev(mCameraId, subDevName); + + ret = mPixelArraySubdev->GetControl(V4L2_CID_PRIVACY, &privacy); + CheckAndLogError(ret != OK, ret, "<id%d>%s: get %s V4L2_CID_PRIVACY failed (%d)", mCameraId, + __func__, subDevName.c_str(), ret); + LOG1("<id%d>%s: privacy subdev: %s status %d", mCameraId, __func__, + mPixelArraySubdev->Name().c_str(), privacy); + + return OK; } void CvfPrivacyChecker::handleEvent(EventData eventData) { @@ -111,12 +122,12 @@ bool CvfPrivacyChecker::threadLoop() { if (privacy && !mPrivacyOn) { for (int i = 0; i < MAX_STREAM_NUMBER; ++i) { - LOGI("%s: mCameraStreams[%d] == %p", __func__, i, mCameraStreams[i]); + LOG2("%s: mCameraStreams[%d] == %p", __func__, i, mCameraStreams[i]); if (mCameraStreams[i]) { auto buf = mCameraStreams[i]->getPrivacyBuffer(); auto port = mCameraStreams[i]->getPort(); if (buf == nullptr) { - LOGI("%s: getPrivacyBuffer returned nullptr", __func__); + LOG2("%s: getPrivacyBuffer returned nullptr", __func__); return true; } setPrivacyImage(buf); @@ -136,7 +147,7 @@ bool CvfPrivacyChecker::checkPrivacyStatus() { } int privacy = -1; int status = mPixelArraySubdev->GetControl(V4L2_CID_PRIVACY, &privacy); - CheckAndLogError(status != OK, status, "Couldn't get V4L2_CID_PRIVACY, status:%d", status); + CheckWarningNoReturn(status != OK, "Couldn't get V4L2_CID_PRIVACY, status:%d", status); return (privacy == 1); } diff --git a/src/core/DeviceBase.cpp b/src/core/DeviceBase.cpp index 7c14b20..cf286fc 100644 --- a/src/core/DeviceBase.cpp +++ b/src/core/DeviceBase.cpp @@ -59,6 +59,9 @@ DeviceBase::DeviceBase(int cameraId, VideoNodeType nodeType, VideoNodeDirection nodeType); mDevice = new V4L2VideoNode(devName); +#ifndef CAL_BUILD + mBufType = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; +#endif } DeviceBase::~DeviceBase() { @@ -74,7 +77,22 @@ int DeviceBase::openDevice() { SyncManager::getInstance()->updateSyncCamNum(); // FRAME_SYNC_E +#ifdef CAL_BUILD return mDevice->Open(O_RDWR); +#else + int ret = mDevice->Open(O_RDWR); + if (ret) + return ret; + + int dev_caps = mDevice->GetDeviceCaps(); + if (dev_caps & V4L2_CAP_VIDEO_CAPTURE) { + mBufType = static_cast<uint32_t>(V4L2_BUF_TYPE_VIDEO_CAPTURE); + } else { + mBufType = static_cast<uint32_t>(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); + } + + return OK; +#endif } void DeviceBase::closeDevice() { @@ -139,6 +157,10 @@ int DeviceBase::queueBuffer(int64_t sequence) { mBufferQueuing = true; } +#ifndef CAL_BUILD + buffer->getV4L2Buffer().SetType(mBufType); + +#endif int ret = onQueueBuffer(sequence, buffer); if (ret == OK) { ret = mDevice->PutFrame(&buffer->getV4L2Buffer()); @@ -324,7 +346,11 @@ int MainDevice::createBufferPool(const stream_t& config) { v4l2fmt.fmt.pix.sizeimage = 0; } +#ifdef CAL_BUILD v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; +#else + v4l2fmt.type = mBufType; +#endif V4L2Format tmpbuf{v4l2fmt}; int ret = mDevice->SetFormat(tmpbuf); CheckAndLogError(ret != OK, ret, "set v4l2 format failed ret=%d", ret); @@ -428,7 +454,11 @@ int DolCaptureDevice::createBufferPool(const stream_t& config) { v4l2fmt.fmt.pix.sizeimage = 0; v4l2fmt.fmt.pix_mp.field = 0; +#ifdef CAL_BUILD v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; +#else + v4l2fmt.type = mBufType; +#endif V4L2Format tmpbuf{v4l2fmt}; int ret = mDevice->SetFormat(tmpbuf); CheckAndLogError(ret != OK, ret, "set DOL v4l2 format failed ret=%d", ret); diff --git a/src/core/DeviceBase.h b/src/core/DeviceBase.h index 9477425..b03123d 100644 --- a/src/core/DeviceBase.h +++ b/src/core/DeviceBase.h @@ -152,6 +152,9 @@ class DeviceBase : public EventSource { uint32_t mMaxBufferNumber; bool mBufferQueuing; +#ifndef CAL_BUILD + uint32_t mBufType; +#endif private: DISALLOW_COPY_AND_ASSIGN(DeviceBase); diff --git a/src/core/PSysProcessor.cpp b/src/core/PSysProcessor.cpp index 6c86f4e..db616fd 100644 --- a/src/core/PSysProcessor.cpp +++ b/src/core/PSysProcessor.cpp @@ -1200,7 +1200,7 @@ void PSysProcessor::sendPsysRequestEvent(const CameraBufferPortMap* dstBuffers, event.data.requestReady.timestamp = timestamp > 0 ? timestamp : output.second->getUserBuffer()->timestamp; event.data.requestReady.sequence = sequence; - event.data.requestReady.requestId = output.second->getUserBuffer()->requestId; + event.data.requestReady.requestId = output.second->getUserBuffer()->frameNumber; notifyListeners(event); break; diff --git a/src/core/SensorHwCtrl.cpp b/src/core/SensorHwCtrl.cpp index 2ebf9cf..b6d8ab2 100644 --- a/src/core/SensorHwCtrl.cpp +++ b/src/core/SensorHwCtrl.cpp @@ -660,7 +660,7 @@ int SensorHwCtrl::setAWB(float r_per_g, float b_per_g) { // CRL_MODULE_S int SensorHwCtrl::setFrameRate(float fps) { HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2); - CheckAndLogError(!mSensorOutputSubdev, NO_INIT, "sensor output sub device is not set"); + CheckAndLog1(!mSensorOutputSubdev, NO_INIT, "sensor output sub device is not set"); struct v4l2_queryctrl query; CLEAR(query); diff --git a/src/core/psysprocessor/GPUExecutor.cpp b/src/core/psysprocessor/GPUExecutor.cpp index 4836e7d..67ebdd9 100644 --- a/src/core/psysprocessor/GPUExecutor.cpp +++ b/src/core/psysprocessor/GPUExecutor.cpp @@ -291,6 +291,7 @@ int GPUExecutor::getTnrExtraFrameCount(int64_t seq) { CheckAndLogError(ret, 0, "Failed to get total gain"); if (!mStillTnrTriggerInfo.num_gains) return PlatformData::getTnrExtraFrameCount(mCameraId); + if (totalGain <= mStillTnrTriggerInfo.tnr7us_threshold_gain) return 0; int index = 0; for (int i = 1; i < mStillTnrTriggerInfo.num_gains; i++) { diff --git a/src/core/psysprocessor/PGUtils.cpp b/src/core/psysprocessor/PGUtils.cpp index 3683c57..4e721f9 100644 --- a/src/core/psysprocessor/PGUtils.cpp +++ b/src/core/psysprocessor/PGUtils.cpp @@ -144,7 +144,7 @@ int getCssStride(int v4l2Fmt, int width, bool compression) { stride = ALIGN(width * 2, PSYS_COMPRESSION_TNR_STRIDE_ALIGNMENT); break; default: - LOGW("%s format %d compress not supported", __func__, v4l2Fmt); + LOG1("%s format %d compress not supported", __func__, v4l2Fmt); break; } } @@ -178,7 +178,7 @@ int getCssBpp(int v4l2Fmt, bool compression) { bpp = 24; break; default: - LOGW("%s format %d compress not supported", __func__, v4l2Fmt); + LOG1("%s format %d compress not supported", __func__, v4l2Fmt); break; } } @@ -216,7 +216,7 @@ int getCssBpe(int v4l2Fmt, bool compression) { bpe = 16; break; default: - LOGW("%s format %d compress not supported", __func__, v4l2Fmt); + LOG1("%s format %d compress not supported", __func__, v4l2Fmt); break; } } diff --git a/src/hal/hal_adaptor/CMakeLists.txt b/src/hal/hal_adaptor/CMakeLists.txt index 3123135..68589e0 100644 --- a/src/hal/hal_adaptor/CMakeLists.txt +++ b/src/hal/hal_adaptor/CMakeLists.txt @@ -17,12 +17,6 @@ cmake_minimum_required(VERSION 2.8) project(hal_adaptor) -if (UPSTREAM_CODE) - add_compile_definitions(IPU6_UPSTREAM=1) -else() - add_compile_definitions(IPU6_UPSTREAM=0) -endif() - # Source directories set(ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../../../) set(METADATA_DIR ${ROOT_DIR}/src/metadata) @@ -64,7 +58,6 @@ set (CMAKE_CXX_STANDARD 11) add_compile_options(-Wall -Werror -fstack-protector -fPIE -fPIC - -D_FORTIFY_SOURCE=2 -DDCHECK_ALWAYS_ON -Wformat -Wformat-security ) @@ -74,7 +67,21 @@ add_definitions(-D__STDC_FORMAT_MACROS -DHAVE_LINUX_OS ) -set(HAL_ADAPTOR_LD_FLAGS "-fPIE -fPIC -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Wl,-z,relro -Wl,-z,now") +set(HAL_ADAPTOR_LD_FLAGS "-fPIE -fPIC -Wformat -Wformat-security -Wl,-z,relro -Wl,-z,now") + +# check if _FORTIFY_SOURCE is default defined with -O +include(${ROOT_DIR}/cmake/CheckFortifyLevel.cmake) +set(FORTIFY_SOURCE_VALUE) +check_fortify_source(FORTIFY_SOURCE_VALUE) +if(FORTIFY_SOURCE_VALUE) + message(STATUS "compiler default _FORTIFY_SOURCE=${FORTIFY_SOURCE_VALUE}") +else() + message(STATUS "_FORTIFY_SOURCE is not defined or could not be determined.") + add_compile_options(-D_FORTIFY_SOURCE=2) + set(CMAKE_SHARED_LINKER_FLAGS "${LIBCAMHAL_LD_FLAGS} -D_FORTIFY_SOURCE=2") + message(STATUS "define _FORTIFY_SOURCE=2") +endif() + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${HAL_ADAPTOR_LD_FLAGS}") set(HAL_ADAPTOR_SRCS diff --git a/src/hal/hal_adaptor/HalAdaptor.cpp b/src/hal/hal_adaptor/HalAdaptor.cpp index 896b1b7..5651063 100644 --- a/src/hal/hal_adaptor/HalAdaptor.cpp +++ b/src/hal/hal_adaptor/HalAdaptor.cpp @@ -15,10 +15,11 @@ */ #define LOG_TAG HalAdaptor -#include "HalAdaptor.h" - +#include <dirent.h> #include <dlfcn.h> +#include <fstream> +#include "HalAdaptor.h" #include "iutils/CameraLog.h" #include "iutils/Utils.h" #include "iutils/Errors.h" @@ -28,6 +29,8 @@ namespace icamera { static void* gCameraHalLib = nullptr; static HalApiHandle gCameraHalAdaptor = {}; +static char gPciId[8]; +static bool gUpstreamIpuDriver; #define CheckFuncCall(function) \ do { \ @@ -47,45 +50,84 @@ static HalApiHandle gCameraHalAdaptor = {}; LOG2("@%s: LOADING: " #fnName "= %x", __func__, gCameraHalAdaptor.member); \ } while (0) -static void load_camera_hal_library() { - FILE* pciDevice = fopen("/sys/bus/pci/drivers/intel-ipu6/0000:00:05.0/device", "rt"); - CheckAndLogError(!pciDevice, VOID_VALUE, "%s, failed to open PCI device. error: %s", __func__, - dlerror()); +static bool get_ipu_info(const std::string& path) { + bool retval = false; - fseek(pciDevice, 0, SEEK_END); - int idSize = static_cast<int>(ftell(pciDevice)); - fseek(pciDevice, 0, SEEK_SET); + DIR* dir = opendir(path.c_str()); + if (dir == nullptr) { + return retval; + } - char pciID[idSize] = {0}; - int ret = fread(pciID, idSize, 1, pciDevice); - fclose(pciDevice); - CheckAndLogError((strlen(pciID) == 0), VOID_VALUE, "%s, Failed to read PCI id. %d", __func__, - ret); + struct dirent* entry; + while ((entry = readdir(dir)) != nullptr) { + if (entry->d_type != DT_LNK || strstr(entry->d_name, "0000:") == nullptr) { + continue; + } - std::string libName = "/usr/lib/"; - if (IPU6_UPSTREAM) { - if (strstr(pciID, "0x7d19") != nullptr /* MTL */) { - libName += "ipu_mtl_upstream"; - } else { - LOGE("%s, Not support the PCI device %s for hal adaptor API", __func__, pciID); - return VOID_VALUE; + std::string devicePath = path + '/' + entry->d_name + "/device"; + std::ifstream pciDevice(devicePath); + if (!pciDevice.is_open()) { + continue; } - } else { - if (strstr(pciID, "0xa75d") != nullptr /* RPL */ || - strstr(pciID, "0x462e") != nullptr /* ADLN */ || - strstr(pciID, "0x465d") != nullptr /* ADLP */) { - libName += "ipu_adl"; - } else if (strstr(pciID, "0x7d19") != nullptr /* MTL */) { - libName += "ipu_mtl"; - } else if (strstr(pciID, "0x9a19") != nullptr /* TGL */) { - libName += "ipu_tgl"; - } else if (strstr(pciID, "0x4e19") != nullptr /* JSL */) { - libName += "ipu_jsl"; - } else { - LOGE("%s, Not support the PCI device %s for hal adaptor API", __func__, pciID); - return VOID_VALUE; + std::string pciId; + pciDevice >> pciId; + pciDevice.close(); + if (pciId.length() > 0) { + retval = true; + strncpy(gPciId, pciId.c_str(), sizeof(gPciId) - 1); + // TODO: Use another way to identify whether using upstream IPU driver. + // Upstream IPU isys driver use e.g. "intel_ipu6.isys.40" instead of + // "intel-ipu6-isys0". We use "." to identify it. + std::string pciPath = path + '/' + entry->d_name; + DIR* pciDir = opendir(pciPath.c_str()); + struct dirent* pciEntry; + while ((pciEntry = readdir(pciDir)) != nullptr) { + if (strstr(pciEntry->d_name, "intel")) { + gUpstreamIpuDriver = (strchr(pciEntry->d_name, '.') != nullptr); + break; + } + } + closedir(pciDir); + break; } } + closedir(dir); + return retval; +} + +static void load_camera_hal_library() { + const std::string ipu6Path = "/sys/bus/pci/drivers/intel-ipu6"; + const std::string ipu7Path = "/sys/bus/pci/drivers/intel-ipu7"; + bool hasIpu6Info = get_ipu_info(ipu6Path); + bool hasIpu7Info = false; + if (!hasIpu6Info) { + hasIpu7Info = get_ipu_info(ipu7Path); + } + + CheckAndLogError(!(hasIpu6Info || hasIpu7Info), VOID_VALUE, + "%s, failed to open PCI device. error: %s", __func__, dlerror()); + + std::string libName = "/usr/lib/"; + if (strstr(gPciId, "0xa75d") != nullptr /* RPL */ || + strstr(gPciId, "0x462e") != nullptr /* ADLN */ || + strstr(gPciId, "0x465d") != nullptr /* ADLP */) { + libName += "ipu_adl"; + } else if (strstr(gPciId, "0x7d19") != nullptr /* MTL */) { + libName += "ipu_mtl"; + } else if (strstr(gPciId, "0x645d") != nullptr /* LNL */) { + libName += "ipu_lnl"; + } else if (strstr(gPciId, "0x9a19") != nullptr /* TGL */) { + libName += "ipu_tgl"; + } else if (strstr(gPciId, "0x4e19") != nullptr /* JSL */) { + libName += "ipu_jsl"; + } else { + LOGE("%s, Not support the PCI device %s for hal adaptor API", __func__, gPciId); + return; + } + + if (hasIpu6Info && gUpstreamIpuDriver) { + libName += "_upstream"; + } libName += "/libcamhal.so"; LOG1("%s, the library name: %s", __func__, libName.c_str()); diff --git a/src/iutils/Utils.h b/src/iutils/Utils.h index 37396bf..388d017 100644 --- a/src/iutils/Utils.h +++ b/src/iutils/Utils.h @@ -127,6 +127,18 @@ typedef ::cros::V4L2Format V4L2Format; } \ } while (0) +/** + * Used to check input parameters, if unsuccessful, returns err_code and prints a log1 message, + * which applies to error checking without substance. + */ +#define CheckAndLog1(condition, err_code, err_msg, args...) \ + do { \ + if (condition) { \ + LOG1(err_msg, ##args); \ + return err_code; \ + } \ + } while (0) + // macro delete array and set it to null #define DELETE_ARRAY_AND_NULLIFY(var) \ do { \ diff --git a/src/platformdata/CameraParser.cpp b/src/platformdata/CameraParser.cpp index cd2c1eb..defffab 100644 --- a/src/platformdata/CameraParser.cpp +++ b/src/platformdata/CameraParser.cpp @@ -258,6 +258,8 @@ void CameraParser::checkField(CameraParser* profiles, const char* name, const ch return; } + if (profiles->mIsAvailableSensor) return; + LOGE("@%s, name:%s, atts[0]:%s, xml format wrong", __func__, name, atts[0]); return; } @@ -301,10 +303,10 @@ void CameraParser::handleCommon(CameraParser* profiles, const char* name, const cfg->supportHwJpegEncode = strcmp(atts[1], "true") == 0; } else if (strcmp(name, "maxIsysTimeoutValue") == 0) { cfg->maxIsysTimeoutValue = atoi(atts[1]); - // LEVEL0_ICBM_S + // LEVEL0_ICBM_S } else if (strcmp(name, "useGPUICBM") == 0) { cfg->isGPUICBMEnabled = strcmp(atts[1], "true") == 0; - // LEVEL0_ICBM_E + // LEVEL0_ICBM_E } } @@ -718,7 +720,7 @@ void CameraParser::handleSensor(CameraParser* profiles, const char* name, const pCurrentCam->mRemoveCacheFlushOutputBuffer = strcmp(atts[1], "true") == 0; } else if (!strcmp(name, "isPLCEnable")) { pCurrentCam->mPLCEnable = strcmp(atts[1], "true") == 0; - // PRIVACY_MODE_S + // PRIVACY_MODE_S } else if (strcmp(name, "supportPrivacy") == 0) { int val = atoi(atts[1]); if (val > 0 && val <= 2) { @@ -734,10 +736,10 @@ void CameraParser::handleSensor(CameraParser* profiles, const char* name, const if (val >= 0) { pCurrentCam->mPrivacyModeFrameDelay = val; } - // PRIVACY_MODE_E + // PRIVACY_MODE_E } else if (strcmp(name, "stillOnlyPipe") == 0) { pCurrentCam->mStillOnlyPipe = strcmp(atts[1], "true") == 0; - // VIRTUAL_CHANNEL_S + // VIRTUAL_CHANNEL_S } else if (strcmp(name, "vcAggregator") == 0) { int size = strlen(atts[1]); char src[size + 1]; @@ -748,7 +750,7 @@ void CameraParser::handleSensor(CameraParser* profiles, const char* name, const if (tablePtr) pCurrentCam->mVcAggregator.mName = tablePtr; tablePtr = strtok_r(nullptr, ",", &savePtr); if (tablePtr) pCurrentCam->mVcAggregator.mIndex = atoi(tablePtr); - // VIRTUAL_CHANNEL_E + // VIRTUAL_CHANNEL_E } else if (strcmp(name, "disableBLCByAGain") == 0) { int size = strlen(atts[1]); char src[size + 1]; @@ -2098,8 +2100,8 @@ void CameraParser::endParseElement(void* userData, const char* name) { for (size_t i = 0; i < profiles->pCurrentCam->mSupportModuleNames.size(); i++) { if ((strcmp(pCurrentCam->mSupportModuleNames[i].c_str(), profiles->pCurrentCam->mCamModuleName.c_str()) == 0) || - (strcmp(pCurrentCam->mSupportModuleNames[i].c_str(), - DEFAULT_MODULE_NAME) == 0)) { + (strcmp(pCurrentCam->mSupportModuleNames[i].c_str(), DEFAULT_MODULE_NAME) == + 0)) { isCameraAvailable = true; // If find an available sensor, it will not search other sensors profiles->mIsAvailableSensor = true; @@ -2305,12 +2307,6 @@ std::vector<std::string> CameraParser::getAvailableSensors( const std::string& ipuName, const std::vector<std::string>& sensorsList) { LOG2("@%s, ipuName:%s", __func__, ipuName.c_str()); - /* if the string doesn't contain -wf- or -uf-, it needn't be parsed */ - if ((sensorsList[0].find("-wf-") == string::npos) && - (sensorsList[0].find("-uf-") == string::npos)) { - return sensorsList; - } - // sensor's sink entity name prefix:"Intel IPU6 CSI-2 2" or "Intel IPU6 CSI2 2" std::string sensorSinkName = "Intel "; sensorSinkName.append(ipuName); @@ -2321,18 +2317,30 @@ std::vector<std::string> CameraParser::getAvailableSensors( std::vector<string> availableSensors; for (auto& sensor : sensorsList) { - std::string srcSensor = sensor; - std::string portNum = srcSensor.substr(srcSensor.find_last_of('-') + 1); - std::string sensorSinkNameTmp = sensorSinkName; - sensorSinkNameTmp.append(portNum); - std::string sensorName = srcSensor.substr(0, srcSensor.find_first_of('-')); - - if (mMC && mMC->checkAvailableSensor(sensorName, sensorSinkNameTmp)) { - AvailableSensorInfo sensorInfo = {sensorSinkNameTmp, false}; - availableSensors.push_back(srcSensor); - mAvailableSensor[srcSensor] = sensorInfo; - LOG2("@%s, The availabel sensor name:%s, sensorSinkNameTmp:%s", __func__, - srcSensor.c_str(), sensorSinkNameTmp.c_str()); + if (sensor.find("-") == string::npos) { + // sensors without suffix port number + if (mMC && mMC->checkAvailableSensor(sensor)) { + availableSensors.push_back(sensor); + LOG2("@%s, available sensor name: %s", __func__, sensor.c_str()); + } else if (sensor.find("_usb") != string::npos) { + availableSensors.push_back(sensor); + LOG2("@%s, available usb sensor name: %s", __func__, sensor.c_str()); + } + + } else { + // sensors with suffix port number + std::string portNum = sensor.substr(sensor.find_last_of('-') + 1); + std::string sensorSinkNameTmp = sensorSinkName + portNum; + std::string sensorName = sensor.substr(0, sensor.find_first_of('-')); + std::string sensorOutName = sensor.substr(0, sensor.find_last_of('-')); + + if (mMC && mMC->checkAvailableSensor(sensorName, sensorSinkNameTmp)) { + AvailableSensorInfo sensorInfo = {sensorSinkNameTmp, false}; + availableSensors.push_back(sensorOutName); + mAvailableSensor[sensor] = sensorInfo; + LOG2("@%s, available sensor name: %s, sensorSinkNameTmp:%s", __func__, + sensor.c_str(), sensorSinkNameTmp.c_str()); + } } } @@ -2368,13 +2376,7 @@ void CameraParser::getSensorDataFromXmlFile(void) { } for (auto sensor : allSensors) { - string sensorName = "sensors/"; - if ((sensor.find("-wf-") != string::npos) || (sensor.find("-uf-") != string::npos)) { - sensorName.append(sensor.substr(0, sensor.find_last_of('-'))); - } else { - sensorName.append(sensor); - } - sensorName.append(".xml"); + string sensorName = "sensors/" + sensor + ".xml"; LOG1("%s: parse sensor name %s", __func__, sensorName.c_str()); int ret = getDataFromXmlFile(sensorName); CheckAndLogError(ret != OK, VOID_VALUE, "Failed to get sensor profile data from %s", diff --git a/src/platformdata/PlatformData.cpp b/src/platformdata/PlatformData.cpp index 7380a12..357b9b7 100644 --- a/src/platformdata/PlatformData.cpp +++ b/src/platformdata/PlatformData.cpp @@ -620,11 +620,10 @@ bool PlatformData::updateMediaFormat(int cameraId, bool isNarrow) { media_format = isNarrow ? media_format_bt2100_12b_cl_narrow : media_format_bt2100_12b_cl; break; default: - LOGE("invalid media format, default value used."); + LOG1("invalid media format, default value used."); return false; - break; } - LOGI("%s, media format in tuning: %d, media format for aic %d.", __func__, tuning_media_format, + LOG1("%s, media format in tuning: %d, media format for aic %d.", __func__, tuning_media_format, media_format); getInstance()->mStaticCfg.mCameras[cameraId].mMediaFormat = media_format; return true; @@ -1390,7 +1389,7 @@ int PlatformData::getConfigModesByOperationMode(int cameraId, uint32_t operation return INVALID_OPERATION; } - CheckAndLogError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), + CheckAndLog1(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(), INVALID_OPERATION, "@%s, the tuning config in xml does not exist", __func__); if (operationMode == CAMERA_STREAM_CONFIGURATION_MODE_AUTO) { diff --git a/src/v4l2/MediaControl.cpp b/src/v4l2/MediaControl.cpp index a371e54..4284e6a 100644 --- a/src/v4l2/MediaControl.cpp +++ b/src/v4l2/MediaControl.cpp @@ -877,15 +877,19 @@ int MediaControl::mediaCtlSetup(int cameraId, MediaCtlConf* mc, int width, int h if (ivsc->links[i].sink->entity == ivsc) { MediaEntity* sensor = ivsc->links[i].source->entity; int sensor_entity_id = sensor->info.id; - LOG1("@%s, found %s -> %s", __func__, - sensor->info.name, ivscName.c_str()); + LOG1("@%s, found %s -> %s", __func__, sensor->info.name, ivscName.c_str()); for (McLink& link : mc->links) { if (link.srcEntity == sensor_entity_id) { - LOG1("@%s, skip %s, link %s -> %s", - __func__, link.srcEntityName.c_str(), + LOG1("@%s, skip %s, link %s -> %s", __func__, link.srcEntityName.c_str(), ivscName.c_str(), link.sinkEntityName.c_str()); link.srcEntity = ivsc->info.id; link.srcEntityName = ivscName; + for (uint32_t j = 0; j < ivsc->info.pads; ++j) { + if (ivsc->pads[j].flags & MEDIA_PAD_FL_SOURCE) { + link.srcPad = j; + break; + } + } break; } } @@ -951,26 +955,62 @@ int MediaControl::getLensName(string* lensName) { return UNKNOWN_ERROR; } +// PRIVACY_MODE_S +int MediaControl::getPrivacyDeviceName(std::string* name) { + CheckAndLogError(!name, UNKNOWN_ERROR, "nullptr input"); + MediaEntity* ivsc = getEntityByName(ivscName.c_str()); + + if (!ivsc) { + return BAD_VALUE; + } + name->assign(ivsc->devname); + return OK; +} +// PRIVACY_MODE_E + +bool MediaControl::checkHasSource(const MediaEntity* sink, const std::string& source) { + for (unsigned int i = 0; i < sink->numLinks; ++i) { + if (sink->links[i].sink->entity == sink) { + // links[i] is the link to sink entity + // pre is the link's source entity + MediaEntity* pre = sink->links[i].source->entity; + if (pre->info.type == MEDIA_ENT_T_V4L2_SUBDEV_SENSOR) { + // if pre is sensor, return compare name result + if (strncmp(source.c_str(), pre->info.name, source.length()) == 0) return true; + } else { + // if pre is not sensor, search recursively + if (checkHasSource(pre, source)) return true; + } + } + } + + return false; +} + +// This function must be called after enumEntities(). +bool MediaControl::checkAvailableSensor(const std::string& sensorEntityName) { + LOG1("@%s, sensorEntityName:%s", __func__, sensorEntityName.c_str()); + for (auto& entity : mEntities) { + if (strncmp(sensorEntityName.c_str(), entity.info.name, sensorEntityName.length()) == 0) { + return true; + } + } + return false; +} + // This function must be called after enumEntities(). bool MediaControl::checkAvailableSensor(const std::string& sensorEntityName, const std::string& sinkEntityName) { LOG1("@%s, sensorEntityName:%s, sinkEntityName:%s", __func__, sensorEntityName.c_str(), sinkEntityName.c_str()); - std::string sensorEntityNameTmp = sensorEntityName; - sensorEntityNameTmp.append(" "); - size_t nameLen = sensorEntityNameTmp.length(); + // Check if any sensor starts with sensorEntityName connects to + // sinkEntityName, which is IPU CSI port + std::string sensorEntityNameTmp = sensorEntityName + " "; for (auto& entity : mEntities) { - int linksCount = entity.info.links; - MediaLink* links = entity.links; - for (int i = 0; i < linksCount; i++) { - if (strcmp(links[i].sink->entity->info.name, sinkEntityName.c_str()) == 0 || - strcmp(links[i].sink->entity->info.name, ivscName.c_str()) == 0) { - char* entityName = entity.info.name; - if (strncmp(entityName, sensorEntityNameTmp.c_str(), nameLen) == 0) { - return true; - } - } + if (strcmp(sinkEntityName.c_str(), entity.info.name) == 0) { + // Got the correct IPU CSI port, check its source + return checkHasSource(&entity, sensorEntityNameTmp); } } diff --git a/src/v4l2/MediaControl.h b/src/v4l2/MediaControl.h index 80b4ce9..540937f 100644 --- a/src/v4l2/MediaControl.h +++ b/src/v4l2/MediaControl.h @@ -242,6 +242,17 @@ class MediaControl { */ int getVCMI2CAddr(const char* vcmName, std::string* vcmI2CAddr); + // PRIVACY_MODE_S + /** + * \brief Get privacy control device name + * + * \param [out]name: the device name which has privacy control + * + * \return 0 if succeed or error value if error + */ + int getPrivacyDeviceName(std::string* name); + // PRIVACY_MODE_E + /** * \brief Set up media controller pipe * @@ -275,6 +286,7 @@ class MediaControl { // VIRTUAL_CHANNEL_E int getLensName(std::string* lensName); + bool checkAvailableSensor(const std::string& sensorEntityName); bool checkAvailableSensor(const std::string& sensorEntityName, const std::string& sinkEntityName); /** @@ -306,6 +318,7 @@ class MediaControl { int getDevnameFromSysfs(MediaEntity* entity); MediaEntity* getEntityById(uint32_t id); MediaEntity* getEntityByName(const char* name); + bool checkHasSource(const MediaEntity* sink, const std::string& source); // set up entity link. |
