summaryrefslogtreecommitdiff
path: root/src
diff options
Diffstat (limited to 'src')
-rw-r--r--src/3a/intel3a/Intel3AParameter.cpp13
-rw-r--r--src/core/CameraBuffer.cpp14
-rw-r--r--src/core/CameraBuffer.h4
-rw-r--r--src/core/CameraDevice.cpp8
-rw-r--r--src/core/CsiMetaDevice.cpp9
-rw-r--r--src/core/CvfPrivacyChecker.cpp33
-rw-r--r--src/core/DeviceBase.cpp30
-rw-r--r--src/core/DeviceBase.h3
-rw-r--r--src/core/PSysProcessor.cpp2
-rw-r--r--src/core/SensorHwCtrl.cpp2
-rw-r--r--src/core/psysprocessor/GPUExecutor.cpp1
-rw-r--r--src/core/psysprocessor/PGUtils.cpp6
-rw-r--r--src/hal/hal_adaptor/CMakeLists.txt23
-rw-r--r--src/hal/hal_adaptor/HalAdaptor.cpp112
-rw-r--r--src/iutils/Utils.h12
-rw-r--r--src/platformdata/CameraParser.cpp68
-rw-r--r--src/platformdata/PlatformData.cpp7
-rw-r--r--src/v4l2/MediaControl.cpp74
-rw-r--r--src/v4l2/MediaControl.h13
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.