pipeline: rpi: pisp: Use correct cfe devices

* Raspberry Pi 5 ISP (PiSP) support submitted to upstream libcamera is
  different from their own libcamera fork [1].
* These match the naming used in driver that was merged in upstream
  Linux 6.13 kernel [2].
* Revert back to the correct cfe devices that match the current kernel [3].

[1]: https://github.com/raspberrypi/libcamera
[2]: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/media/platform/raspberrypi/rp1-cfe/cfe.c#n126
[3]: 317477113b/drivers/media/platform/raspberrypi/rp1_cfe/cfe.c (L139-L194)
This commit is contained in:
Konsta
2025-06-15 22:04:57 +03:00
parent df8ba90d44
commit 5ae5aea2e1

View File

@@ -882,9 +882,9 @@ bool PipelineHandlerPiSP::match(DeviceEnumerator *enumerator)
*/
for (unsigned int i = 0; i < numCfeDevices; i++) {
DeviceMatch cfe("rp1-cfe");
cfe.add("rp1-cfe-fe-image0");
cfe.add("rp1-cfe-fe-stats");
cfe.add("rp1-cfe-fe-config");
cfe.add("rp1-cfe-fe_image0");
cfe.add("rp1-cfe-fe_stats");
cfe.add("rp1-cfe-fe_config");
std::shared_ptr<MediaDevice> cfeDevice = acquireMediaDevice(enumerator, cfe);
if (!cfeDevice) {
@@ -1072,10 +1072,10 @@ int PipelineHandlerPiSP::platformRegister(std::unique_ptr<RPi::CameraData> &came
PiSPCameraData *data = static_cast<PiSPCameraData *>(cameraData.get());
int ret;
MediaEntity *cfeImage = cfe->getEntityByName("rp1-cfe-fe-image0");
MediaEntity *cfeEmbedded = cfe->getEntityByName("rp1-cfe-csi2-ch1");
MediaEntity *cfeStats = cfe->getEntityByName("rp1-cfe-fe-stats");
MediaEntity *cfeConfig = cfe->getEntityByName("rp1-cfe-fe-config");
MediaEntity *cfeImage = cfe->getEntityByName("rp1-cfe-fe_image0");
MediaEntity *cfeEmbedded = cfe->getEntityByName("rp1-cfe-embedded");
MediaEntity *cfeStats = cfe->getEntityByName("rp1-cfe-fe_stats");
MediaEntity *cfeConfig = cfe->getEntityByName("rp1-cfe-fe_config");
MediaEntity *ispInput = isp->getEntityByName("pispbe-input");
MediaEntity *IpaPrepare = isp->getEntityByName("pispbe-config");
MediaEntity *ispOutput0 = isp->getEntityByName("pispbe-output0");
@@ -1630,26 +1630,12 @@ int PiSPCameraData::platformConfigure(const RPi::RPiCameraConfiguration *rpiConf
* Configure the CFE embedded data output format only if the sensor
* supports it.
*/
V4L2SubdeviceFormat embeddedFormat = sensor_->embeddedDataFormat();
V4L2SubdeviceFormat embeddedFormat;
if (sensorMetadata_) {
static const std::map<uint32_t, V4L2PixelFormat> metaFormats{
{ MEDIA_BUS_FMT_META_8, V4L2PixelFormat(V4L2_META_FMT_GENERIC_8) },
{ MEDIA_BUS_FMT_META_10, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_10) },
{ MEDIA_BUS_FMT_META_12, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_12) },
{ MEDIA_BUS_FMT_META_14, V4L2PixelFormat(V4L2_META_FMT_GENERIC_CSI2_14) },
};
const auto metaFormat = metaFormats.find(embeddedFormat.code);
if (metaFormat == metaFormats.end()) {
LOG(RPI, Error)
<< "Unsupported metadata format "
<< utils::hex(embeddedFormat.code, 4);
return -EINVAL;
}
sensor_->device()->getFormat(1, &embeddedFormat);
format = {};
format.fourcc = metaFormat->second;
format.size = embeddedFormat.size;
format.fourcc = V4L2PixelFormat(V4L2_META_FMT_SENSOR_DATA);
format.planes[0].size = embeddedFormat.size.width * embeddedFormat.size.height;
LOG(RPI, Debug) << "Setting embedded data format " << format;
ret = cfe_[Cfe::Embedded].dev()->setFormat(&format);
@@ -2174,8 +2160,9 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat,
int ret = 0;
constexpr unsigned int csiVideoSinkPad = 0;
constexpr unsigned int csiVideoSourcePad = 1;
constexpr unsigned int csiMetaSourcePad = 2;
constexpr unsigned int csiMetaSinkPad = 1;
constexpr unsigned int csiVideoSourcePad = 4;
constexpr unsigned int csiMetaSourcePad = 5;
constexpr unsigned int feVideoSinkPad = 0;
constexpr unsigned int feConfigSinkPad = 1;
@@ -2187,7 +2174,7 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat,
const MediaEntity *fe = feSubdev_->entity();
for (MediaLink *link : csi2->pads()[csiVideoSourcePad]->links()) {
if (link->sink()->entity()->name() == "rp1-cfe-csi2-ch0")
if (link->sink()->entity()->name() == "rp1-cfe-csi2_ch0")
link->setEnabled(false);
else if (link->sink()->entity()->name() == "pisp-fe")
link->setEnabled(true);
@@ -2200,34 +2187,16 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat,
fe->pads()[feVideo1SourcePad]->links()[0]->setEnabled(false);
fe->pads()[feStatsSourcePad]->links()[0]->setEnabled(true);
const V4L2Subdevice::Stream imageStream{
csiVideoSinkPad,
sensor_->imageStream().stream
};
const V4L2Subdevice::Stream embeddedDataStream{
csiVideoSinkPad,
sensor_->embeddedDataStream().value_or(V4L2Subdevice::Stream{}).stream
};
V4L2Subdevice::Routing routing;
routing.emplace_back(imageStream, V4L2Subdevice::Stream{ csiVideoSourcePad, 0 },
V4L2_SUBDEV_ROUTE_FL_ACTIVE);
if (sensorMetadata_)
routing.emplace_back(embeddedDataStream,
V4L2Subdevice::Stream{ csiMetaSourcePad, 0 },
V4L2_SUBDEV_ROUTE_FL_ACTIVE);
ret = csi2Subdev_->setRouting(&routing);
if (ret)
return ret;
ret = csi2Subdev_->setFormat(imageStream, &sensorFormat);
ret = csi2Subdev_->setFormat(csiVideoSinkPad, &sensorFormat);
if (ret)
return ret;
if (sensorMetadata_) {
ret = csi2Subdev_->setFormat(embeddedDataStream, &embeddedFormat);
ret = csi2Subdev_->setFormat(csiMetaSinkPad, &embeddedFormat);
if (ret)
return ret;
ret = csi2Subdev_->setFormat(csiMetaSourcePad, &embeddedFormat);
if (ret)
return ret;
}