summaryrefslogtreecommitdiff
path: root/include/linux
AgeCommit message (Expand)Author
2024-06-03include: linux: Update kernel headers to version v6.10-rc1Hans de Goede
2024-05-16include: linux: Add PiSP specific image and config buffer formatsNaushir Patuck
2024-05-16include: linux: Add RGB48 formatsNaushir Patuck
2024-02-23include: linux: Add RKISP1_V_IMX8MP versionPaul Elder
2024-01-17include: linux: Update kernel headers to version v6.7Laurent Pinchart
2022-08-03include: linux: Add V4L2 subdev internal routing APILaurent Pinchart
2022-08-03include: linux: Add V4L2 YUVA32 and YUVX32 pixel formatsLaurent Pinchart
2022-08-03include: drm_fourcc: Add AVUY and XVUY 4:4:4 packet formatsLaurent Pinchart
2022-08-03include: linux: Update kernel headers to version v5.19Laurent Pinchart
2022-07-28include: linux: Update rkisp1 kernel header for DPCC configurationFlorian Sylvestre
2022-07-27raspberrypi: Update Copyright statement in all Raspberry Pi source filesNaushir Patuck
2022-03-15include: linux: Add MEDIA_LNK_FL_ANCILLARY_LINKDaniel Scally
2022-01-08include: linux: Update kernel headers to version v5.16-rc7David Plowman
2021-11-02include: drm_fourcc: Add R10 and R12 FourCCLaurent Pinchart
2021-10-06ipa: ipu3: Replace ipa::ipu3::algorithms::Ipu3AwbCellJean-Michel Hautbois
2021-03-03include: linux: Update Linux headers to v5.12-rc1Laurent Pinchart
2021-02-09uapi: raspberrypi: Update the bcm2835-isp header definitionNaushir Patuck
2021-02-05include: linux: Add ipu3 kernel header and format definitionsNiklas Söderlund
2020-10-19include: linux: Update V4L2_CID_USER_BCM2835_ISP_BASE to match upstream treeNaushir Patuck
2020-09-29include: linux: Update rkisp1 headerNiklas Söderlund
2020-07-27include: drm_fourcc: Add 16-bit Bayer FourCCNiklas Söderlund
2020-07-17libcamera: pipeline: ipa: raspberrypi: Use dma heap allocs for LS tablesNaushir Patuck
2020-07-17include: linux: Add dma-buf.h and dma-heap.h UAPI headersNaushir Patuck
2020-06-18include: linux: Remove drm.h and drm_mode.hLaurent Pinchart
2020-06-09libcamera: Add missing SPDX headers to miscellaneous small filesLaurent Pinchart
2020-05-21include: linux: Update v4l2 ctrls for propertiesJacopo Mondi
2020-05-11include: uapi: Add header definitions for BCM2835 Unicam and ISP blocksNaushir Patuck
2020-05-10include: linux: Extend VIDIOC_ENUM_FMT to support MC-centric devicesLaurent Pinchart
2020-03-27include: drm_fourcc: Add Bayer FourCC and modifiersNiklas Söderlund
2020-02-14include: linux: Update v4l2-controls.hJacopo Mondi
2019-12-08include: linux: Update Linux headers readme to v5.2Paul Elder
2019-10-28include: drm_fourcc: Add Motion-JPEG FourCCJacopo Mondi
2019-10-28include: linux: Import DRM/KMS headers from Linux v5.2Jacopo Mondi
2019-10-28include: linux: Update headers to Linux v5.2Jacopo Mondi
2019-10-11include: linux: Add rkisp1 kernel header and format definitionsNiklas Söderlund
2019-06-02include: linux: Update Linux headers to v5.1Jacopo Mondi
2019-01-17include: linux: Import V4L2 uAPI headers from Linux v4.19Kieran Bingham
2018-12-19libcamera: include: Import media.h from Linux v4.19Jacopo Mondi
s="hl com"> * camera_module_t operations, to retrieve the number of cameras in the system, * their static information and to open camera devices. */ CameraHalManager::CameraHalManager() : cameraManager_(nullptr), callbacks_(nullptr), numInternalCameras_(0), nextExternalCameraId_(firstExternalCameraId_) { } /* CameraManager calls stop() in the destructor. */ CameraHalManager::~CameraHalManager() = default; /* static */ CameraHalManager *CameraHalManager::instance() { static CameraHalManager *cameraHalManager = new CameraHalManager; return cameraHalManager; } int CameraHalManager::init() { cameraManager_ = std::make_unique<CameraManager>(); /* * If the configuration file is not available the HAL only supports * external cameras. If it exists but it's not valid then error out. */ if (halConfig_.exists() && !halConfig_.isValid()) { LOG(HAL, Error) << "HAL configuration file is not valid"; return -EINVAL; } /* Support camera hotplug. */ cameraManager_->cameraAdded.connect(this, &CameraHalManager::cameraAdded); cameraManager_->cameraRemoved.connect(this, &CameraHalManager::cameraRemoved); int ret = cameraManager_->start(); if (ret) { LOG(HAL, Error) << "Failed to start camera manager: " << strerror(-ret); cameraManager_.reset(); return ret; } return 0; } std::tuple<CameraDevice *, int> CameraHalManager::open(unsigned int id, const hw_module_t *hardwareModule) { MutexLocker locker(mutex_); if (!callbacks_) { LOG(HAL, Error) << "Can't open camera before callbacks are set"; return { nullptr, -ENODEV }; } CameraDevice *camera = cameraDeviceFromHalId(id); if (!camera) { LOG(HAL, Error) << "Invalid camera id '" << id << "'"; return { nullptr, -ENODEV }; } int ret = camera->open(hardwareModule); if (ret) return { nullptr, ret }; LOG(HAL, Info) << "Open camera '" << id << "'"; return { camera, 0 }; } void CameraHalManager::cameraAdded(std::shared_ptr<Camera> cam) { unsigned int id; bool isCameraExternal = false; bool isCameraNew = false; MutexLocker locker(mutex_); /* * Each camera is assigned a unique integer ID when it is seen for the * first time. If the camera has been seen before, the previous ID is * re-used. * * IDs starts from '0' for internal cameras and '1000' for external * cameras. */ auto iter = cameraIdsMap_.find(cam->id()); if (iter != cameraIdsMap_.end()) { id = iter->second; if (id >= firstExternalCameraId_) isCameraExternal = true; } else { isCameraNew = true; /* * Now check if this is an external camera and assign * its id accordingly. */ if (cameraLocation(cam.get()) == properties::CameraLocationExternal) { isCameraExternal = true; id = nextExternalCameraId_; } else { id = numInternalCameras_; } } /* * The configuration file must be valid, and contain a corresponding * entry for internal cameras. External cameras can be initialized * without configuration file. */ if (!isCameraExternal && !halConfig_.exists()) { LOG(HAL, Error) << "HAL configuration file is mandatory for internal cameras"; return; } const CameraConfigData *cameraConfigData = halConfig_.cameraConfigData(cam->id()); /* * Some cameras whose location is reported by libcamera as external may * actually be internal to the device. This is common with UVC cameras * that are integrated in a laptop. In that case the real location * should be specified in the configuration file. * * If the camera location is external and a configuration entry exists * for it, override its location. */ if (isCameraNew && isCameraExternal) { if (cameraConfigData && cameraConfigData->facing != -1) { isCameraExternal = false; id = numInternalCameras_; } } if (!isCameraExternal && !cameraConfigData) { LOG(HAL, Error) << "HAL configuration entry for internal camera " << cam->id() << " is missing"; return; } /* Create a CameraDevice instance to wrap the libcamera Camera. */ std::unique_ptr<CameraDevice> camera = CameraDevice::create(id, cam); int ret = camera->initialize(cameraConfigData); if (ret) { LOG(HAL, Error) << "Failed to initialize camera: " << cam->id(); return; } if (isCameraNew) { cameraIdsMap_.emplace(cam->id(), id); if (isCameraExternal) nextExternalCameraId_++; else numInternalCameras_++; } cameras_.emplace_back(std::move(camera)); if (callbacks_) callbacks_->camera_device_status_change(callbacks_, id, CAMERA_DEVICE_STATUS_PRESENT); LOG(HAL, Debug) << "Camera ID: " << id << " added successfully."; } void CameraHalManager::cameraRemoved(std::shared_ptr<Camera> cam) { MutexLocker locker(mutex_); auto iter = std::find_if(cameras_.begin(), cameras_.end(), [&cam](const std::unique_ptr<CameraDevice> &camera) { return cam == camera->camera(); }); if (iter == cameras_.end()) return; /* * CAMERA_DEVICE_STATUS_NOT_PRESENT should be set for external cameras * only. */ unsigned int id = (*iter)->id(); if (id >= firstExternalCameraId_) callbacks_->camera_device_status_change(callbacks_, id, CAMERA_DEVICE_STATUS_NOT_PRESENT); /* * \todo Check if the camera is already open and running. * Inform the framework about its absence before deleting its * reference here. */ cameras_.erase(iter); LOG(HAL, Debug) << "Camera ID: " << id << " removed successfully."; } int32_t CameraHalManager::cameraLocation(const Camera *cam) { const ControlList &properties = cam->properties(); if (!properties.contains(properties::Location)) return -1; return properties.get(properties::Location); } CameraDevice *CameraHalManager::cameraDeviceFromHalId(unsigned int id) { auto iter = std::find_if(cameras_.begin(), cameras_.end(), [id](const std::unique_ptr<CameraDevice> &camera) { return camera->id() == id; }); if (iter == cameras_.end()) return nullptr; return iter->get(); } unsigned int CameraHalManager::numCameras() const { return numInternalCameras_; } int CameraHalManager::getCameraInfo(unsigned int id, struct camera_info *info) { if (!info) return -EINVAL; MutexLocker locker(mutex_); CameraDevice *camera = cameraDeviceFromHalId(id); if (!camera) { LOG(HAL, Error) << "Invalid camera id '" << id << "'"; return -EINVAL; } info->facing = camera->facing(); info->orientation = camera->orientation(); info->device_version = CAMERA_DEVICE_API_VERSION_3_3; info->resource_cost = 0; info->static_camera_characteristics = camera->getStaticMetadata(); info->conflicting_devices = nullptr; info->conflicting_devices_length = 0; return 0; } void CameraHalManager::setCallbacks(const camera_module_callbacks_t *callbacks) { callbacks_ = callbacks; MutexLocker locker(mutex_); /* * Some external cameras may have been identified before the callbacks_ * were set. Iterate all existing external cameras and mark them as * CAMERA_DEVICE_STATUS_PRESENT explicitly. * * Internal cameras are already assumed to be present at module load * time by the Android framework. */ for (const std::unique_ptr<CameraDevice> &camera : cameras_) { unsigned int id = camera->id(); if (id >= firstExternalCameraId_) callbacks_->camera_device_status_change(callbacks_, id, CAMERA_DEVICE_STATUS_PRESENT); } }