Hi Philipp,
I'm looking at how I would enable a parallel greyscale camera using this
set of drivers and am a little bit confused. Do you have an example
somewhere of a devicetree with an input node. I also have a further note
below:
<snip>
+
+static int ipu_capture_start_streaming(struct vb2_queue *vq, unsigned int count)
+{
+ struct ipu_capture *priv = vb2_get_drv_priv(vq);
+ struct v4l2_subdev *csi_sd = priv->csi_sd;
+ u32 width = priv->format.fmt.pix.width;
+ u32 height = priv->format.fmt.pix.height;
+ struct device *dev = priv->dev;
+ int burstsize;
+ struct ipu_capture_buffer *buf;
+ int nfack_irq;
+ int ret;
+ const char *irq_name[2] = { "CSI0", "CSI1" };
+ bool raw;
+
+ ret = ipu_capture_get_resources(priv);
+ if (ret < 0) {
+ dev_err(dev, "Failed to get resources: %d\n", ret);
+ goto err_dequeue;
+ }
+
+ ipu_cpmem_zero(priv->ipuch);
+
+ nfack_irq = ipu_idmac_channel_irq(priv->ipu, priv->ipuch,
+ IPU_IRQ_NFACK);
+ ret = request_threaded_irq(nfack_irq, NULL,
+ ipu_capture_new_frame_handler, IRQF_ONESHOT,
+ irq_name[priv->id], priv);
+ if (ret) {
+ dev_err(dev, "Failed to request NFACK interrupt: %d\n", nfack_irq);
+ goto put_resources;
+ }
+
+ dev_dbg(dev, "width: %d height: %d, %.4s\n",
+ width, height, (char *)&priv->format.fmt.pix.pixelformat);
+
+ ipu_cpmem_set_resolution(priv->ipuch, width, height);
+
+ raw = false;
+
+ if (raw && priv->smfc) {
How does this ever get used? If I were to set 1X8 greyscale it wouldn't
ever take this path, correct?
+ /*
+ * raw formats. We can only pass them through to memory
+ */
+ u32 fourcc = priv->format.fmt.pix.pixelformat;
+ int bytes;
+
+ switch (fourcc) {
+ case V4L2_PIX_FMT_GREY:
+ bytes = 1;
+ break;
+ case V4L2_PIX_FMT_Y10:
+ case V4L2_PIX_FMT_Y16:
+ case V4L2_PIX_FMT_UYVY:
+ case V4L2_PIX_FMT_YUYV:
+ bytes = 2;
+ break;
+ }
+
+ ipu_cpmem_set_stride(priv->ipuch, width * bytes);
+ ipu_cpmem_set_format_passthrough(priv->ipuch, bytes * 8);
+ /*
+ * According to table 37-727 (SMFC Burst Size), burstsize should
+ * be set to NBP[6:4] for PFS == 6. Unfortunately, with a 16-bit
+ * bus any value below 4 doesn't produce proper images.
+ */
+ burstsize = (64 / bytes) >> 3;
+ } else {
+ /*
+ * formats we understand, we can write it in any format not requiring
+ * colorspace conversion.
+ */
+ u32 fourcc = priv->format.fmt.pix.pixelformat;
+
+ switch (fourcc) {
+ case V4L2_PIX_FMT_RGB32:
+ ipu_cpmem_set_stride(priv->ipuch, width * 4);
+ ipu_cpmem_set_fmt(priv->ipuch, fourcc);
+ break;
+ case V4L2_PIX_FMT_UYVY:
+ case V4L2_PIX_FMT_YUYV:
+ ipu_cpmem_set_stride(priv->ipuch, width * 2);
+ ipu_cpmem_set_yuv_interleaved(priv->ipuch, fourcc);
+ break;
+ case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_YVU420:
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_YUV422P:
+ ipu_cpmem_set_stride(priv->ipuch, width);
+ ipu_cpmem_set_fmt(priv->ipuch, fourcc);
+ ipu_cpmem_set_yuv_planar(priv->ipuch, fourcc,
+ width, height);
+ burstsize = 16;
+ break;
+ default:
+ dev_err(dev, "invalid color format: %4.4s\n",
+ (char *)&fourcc);
+ ret = -EINVAL;
+ goto free_irq;
+ }
+ }
+
<snip>
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html