This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62A3-Q1:AM62A3-Q1 需要用于 ST 微型成像仪涩谷的驱动程序

Guru**** 2826755 points

Other Parts Discussed in Thread: AM62A3-Q1, AM62A3

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1618448/am62a3-q1-driver-for-st-micro-imager-shibuya-needed-for-am62a3-q1

器件型号: AM62A3-Q1
主题: AM62A3 中讨论的其他器件

团队、

我们需要使用成像仪驱动程序将 AM62A3-Q1 连接到 ST 微型成像仪涩谷。  

到目前为止、ST 仅为 rasperry Pi 提供驱动程序来连接 Libcamera。

系统在 Linux 上运行。

请告知如何继续。

谢谢您、Franz  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Franz、

    传感器驱动程序应使用 V4L2。 如果它暴露了一个 V4L2 子器件并且格式可用、则传感器可能工作。 也就是说、TI 不支持 libcamera、建议将 GStreamer 或 TIOVX 用于视觉用例。

    您还能否提供有关该特定传感器的客户和用例的详细信息?

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我可以提供一些背景信息:我们希望  将 vd1943.c 成像仪用于 OMS/DMS 应用。 该驱动程序使用“rpicam"应用“应用程序在采用最近发行版的 Rpi5 系统上工作。

    我们 在这里找到了代码 、这意味着 libcameras “Simple pipeline “应该可以与基于“j721e-csi2rx"的“的器件配合使用;由于我们仍将使用 GStreamer(带 libcamerasrc)将视频流连接到“tiovxisp"库“库、因此我们认为应该可以使用“simple-cam"应用“应用程序进行流式传输。 (我们知道,根据 Omnivision 0x05b1s 成像仪应用手册、我们必须将 vd1943 成像仪与 tiovx 生态系统进行注册。)

    此致

     Stefan Birkholz  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Stefan:

    感谢您提供了该传感器驱动程序的链接。 从快速看、这对我来说看起来很好。 一个问题是、我们电路板上的 CSI2RX 外设要求器件实现 v4l2_pad_ops get_frame_desc 函数。 这用于获取 CSI 完成滤波的虚拟通道。 默认虚拟通道取为 0。 所以,如果这是好的,我看不到一个问题。 我建议您实现这一点、尤其是在使用 SerDes 时。 有关实现示例、请参阅此处的 IMX219 传感器驱动程序: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/media/i2c/imx219.c?h=ti-linux-6.12.y#n490 

    对于流水线验证、我们可以帮助达到 v4l2 捕获工作的点 (yavta 或 gstreamer v4l2src)。 但除此之外、确保 libcamera 兼容性不是我们标准支持的一部分。

    我们知道、根据 Omnivision 0x05b1S 成像仪的应用手册、我们必须将 vd1943 成像仪注册到 tiovx 生态系统。[/报价]

    您能解释一下此处参考的应用手册是什么吗? GStreamer 不使用 tiovx 捕获。 它在默认 Linux SDK 中使用 v4l2。

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jay:

    感谢您的反馈! 我提到了“AM6xA ISP 调优指南“、在其中、如果我们的理解正确、则必须将成像仪添加到 TIOVX 模块中(以便通过“传感器名称“参数来称呼它)。

    最初、我们将从最简单的设置开始:1 个虚拟通道、无需路由。 (目前也没有串行器/解串器。) 非常感谢您对管道验证的帮助;我们当然不是任何领域的专家、而且在很大程度上只是衡量我们前进的选择。

    我将查看您提到的 get_frame_desc () 函数,但首先我必须击败我们的 Yocto 设置,将 libcamera 配方更新到更新的版本(我们目前有 libcamera-0.2.0 ,可能太旧了)。

    周末愉快!

    此致

     Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Stefan:

    感谢您的更新。 现在、我了解了通过将传感器添加到 TIOVX 是什么意思。

    这是我的建议。 首先、使捕获正常工作。 为此、您无需担心 TIOVX。 GStreamer 支持 V4L2 捕获(v4l2src 节点)、我们就是这样使用。 更有可能,libcamera 也会使用类似的 V4L2 调用。 正常运行后、我们还可以帮助您进行 ISP 调优。

    对于 Yocto、请随时在需要时提交另一个 E2E。 我对此不熟悉、我也更倾向于将这篇主题保留在主题上。

    周末快乐!

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jay:

    我们可以使用 Yocto — 无需再开一张票。

    根据您的建议,我们实现了 get_frame_desc () 函数

     

    --- vd1943.c-orig	2026-02-24 17:10:08.492811625 +0100
    +++ vd1943.c	2026-02-24 17:28:06.048985785 +0100
    @@ -1735,6 +1735,36 @@
     	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
     };
     
    +static int vd1943_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
    +                struct v4l2_mbus_frame_desc *fd)
    +{
    +        struct v4l2_subdev_state *state;
    +        const struct v4l2_mbus_framefmt *fmt;
    +        u8 bpp;
    +        int ret = 0;
    +
    +        if (pad != 0) 
    +                return -EINVAL;
    +
    +        state = v4l2_subdev_lock_and_get_active_state(sd);
    +        fmt = v4l2_subdev_state_get_format(state, 0);
    +
    +        memset(fd, 0, sizeof(*fd));
    +        fd->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2;
    +
    +        bpp = vd1943_get_bpp(fmt->code);
    +        fd->entry[0].stream      = 0;
    +        fd->entry[0].flags       = V4L2_MBUS_FRAME_DESC_FL_LEN_MAX;
    +        fd->entry[0].length      = fmt->width * fmt->height * bpp / 8;
    +        fd->entry[0].pixelcode   = fmt->code;
    +        fd->entry[0].bus.csi2.vc = 0;
    +        fd->entry[0].bus.csi2.dt = vd1943_get_datatype(fmt->code);
    +        fd->num_entries = 1;
    +
    +        v4l2_subdev_unlock_state(state);
    +        return ret;
    +}
    +
     static const struct v4l2_subdev_pad_ops vd1943_pad_ops = {
     #if KERNEL_VERSION(6, 8, 0) > LINUX_VERSION_CODE
     	.init_cfg = vd1943_init_cfg,
    @@ -1748,6 +1778,7 @@
     #endif
     	.set_fmt = vd1943_set_pad_fmt,
     	.get_selection = vd1943_get_selection,
    +        .get_frame_desc = vd1943_get_frame_desc,
     };
     
     static const struct v4l2_subdev_ops vd1943_subdev_ops = {

    在我们的评估板上、设置如下:

    Media controller API version 6.12.57
    
    Media device information
    ------------------------
    driver          j721e-csi2rx
    model           TI-CSI2RX
    serial          
    bus info        platform:30102000.ticsi2rx
    hw revision     0x1
    driver version  6.12.57
    
    Device topology
    - entity 1: 30102000.ticsi2rx (7 pads, 7 links, 0 routes)
                type V4L2 subdev subtype Unknown flags 0
                device node name /dev/v4l-subdev0
            pad0: Sink
                    [stream:0 fmt:Y8_1X8/2560x1440 field:none colorspace:raw]
                    <- "cdns_csi2rx.30101000.csi-bridge":1 [ENABLED,IMMUTABLE]
            pad1: Source
                    [stream:0 fmt:Y8_1X8/2560x1440 field:none colorspace:raw]
                    -> "30102000.ticsi2rx context 0":0 [ENABLED,IMMUTABLE]
            pad2: Source
                    -> "30102000.ticsi2rx context 1":0 [ENABLED,IMMUTABLE]
            pad3: Source
                    -> "30102000.ticsi2rx context 2":0 [ENABLED,IMMUTABLE]
            pad4: Source
                    -> "30102000.ticsi2rx context 3":0 [ENABLED,IMMUTABLE]
            pad5: Source
                    -> "30102000.ticsi2rx context 4":0 [ENABLED,IMMUTABLE]
            pad6: Source
                    -> "30102000.ticsi2rx context 5":0 [ENABLED,IMMUTABLE]
    
    - entity 9: cdns_csi2rx.30101000.csi-bridge (5 pads, 2 links, 0 routes)
                type V4L2 subdev subtype Unknown flags 0
                device node name /dev/v4l-subdev1
            pad0: Sink
                    [stream:0 fmt:Y8_1X8/2560x1440 field:none colorspace:raw]
                    <- "vd1943 4-0010":0 [ENABLED,IMMUTABLE]
            pad1: Source
                    [stream:0 fmt:Y8_1X8/2560x1440 field:none colorspace:raw]
                    -> "30102000.ticsi2rx":0 [ENABLED,IMMUTABLE]
            pad2: Source
            pad3: Source
            pad4: Source
    
    - entity 15: vd1943 4-0010 (1 pad, 1 link, 0 routes)
                 type V4L2 subdev subtype Sensor flags 0
                 device node name /dev/v4l-subdev2
            pad0: Source
                    [stream:0 fmt:Y8_1X8/2560x1440 field:none colorspace:raw xfer:none quantization:full-range
                     crop.bounds:(0,0)/2560x1984
                     crop:(0,272)/2560x1440]
                    -> "cdns_csi2rx.30101000.csi-bridge":0 [ENABLED,IMMUTABLE]
    
    - entity 21: 30102000.ticsi2rx context 0 (1 pad, 1 link)
                 type Node subtype V4L flags 0
                 device node name /dev/video2
            pad0: Sink
                    <- "30102000.ticsi2rx":1 [ENABLED,IMMUTABLE]
    
    

    但是、尝试捕获帧失败:

    v4l2-ctl --verbose --device /dev/video2  --set-fmt-video=width=2560,height=1440 --stream-mmap --stream-to=test-frame.raw 
    VIDIOC_QUERYCAP: ok
    VIDIOC_G_FMT: ok
    VIDIOC_S_FMT: ok
    Format Video Capture:
            Width/Height      : 2560/1440
            Pixel Format      : 'GREY' (8-bit Gr[   67.619609] cdns-csi2rx 30101000.csi-bridge: Failed to start streams 0x1 on subdev
    eyscale)
            Field             : None
            Bytes per Line    : 2560
            Size Image        : 3686400
            Colorspace        : sRGB
            Transf[   67.640361] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad0
    er Function : sRGB
            YCbCr/HSV Encoding: ITU-R 601
            Quantization      : Limited Range
            Flags             : 
                    VIDIOC_REQBUFS [   67.658535] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad1
    returned 0 (Success)
                    VIDIOC_QUERYBUF returned 0 (Success)
                    VIDIOC_QUERYBUF returned 0 (Success)
                    VIDIOC_QUERYBUF returned[   67.676770] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad2
     0 (Success)
                    VIDIOC_QUERYBUF returned 0 (Success)
                    VIDIOC_G_FMT returned 0 (Success)
                    VIDIOC_QBUF returned 0 (Success)
            [   67.694936] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad3
            VIDIOC_QBUF returned 0 (Success)
                    VIDIOC_QBUF returned 0 (Success)
                    VIDIOC_QBUF returned 0 (Success)
                    VIDIOC_STREAMON returned -1 (Permission denied)
    

    此致

     Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Stefan:

    我看不到 media-ctl -p 输出中定义了任何路由。 请参阅以下脚本: https://github.com/TexasInstruments/edgeai-gst-apps/blob/main/scripts/setup_camera_ox05b.sh

    具体指第 4 行和第 9 行。

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jay:

    抱歉耽误您的时间 — 自上周以来,我无法在此论坛上发布/回复! (我总是收到“发生错误。 请重试或联系您的管理员。“ 错误消息。)

    在尝试设置路由时、我总是会收到“无法设置路由:设备的 ioctl 不适当 (25)“错误。 这是否与“v4l2_subdev_pad_ops".set_routing“.set_routing 函数相关? 我在其他驱动程序中看到了这种情况、但 im219.c 驱动程序 (...) 中也没有这种情况 — 或者您认为这可能与其他缺少的函数有关吗?

    此致

     Stefan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Stefan:  

    有关专家已离职。 请预计响应会延迟。

    谢谢你

    Yashraj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Stefan:

    您实际上并不需要在传感器上设置布线。 对于可以处理多个流的器件(例如 RGB+CSI 传感器或 IR 外设)、这些参数非常重要。 在您的情况下、这可能不是必需的。

    我还在日志中看到权限问题、这似乎很不寻常。 您能否尝试查看权限错误发生的位置?

    抱歉耽误您的时间 — 自上周以来,我无法在此论坛上发布/回复! (我总是收到“发生错误。 请重试或联系您的管理员。“ 错误消息。)

    真的很抱歉、您不得不面对这个问题。 如果将来出现此类问题(希望不会)、请联系您的现场代表。

    此致、
    Jay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jay:

    可悲的是,我无法精确定位权限错误的来源:我在目标上运行每个命令作为 root 用户,文件权限是可以的,增加内核的控制台日志级别只会产生:

    [ 1812.479696] cdns-csi2rx 30101000.csi-bridge: Failed to start streams 0x1 on subdev
    [ 1812.500961] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad0
    [ 1812.519146] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad1
    [ 1812.537390] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad2
    [ 1812.555542] cdns-csi2rx 30101000.csi-bridge: Failed to stop streaming on pad3
    

    顺便说一句,如果我要破坏思想的火车,对不起提前,但在 ti-linux-kernel 中,我看到了 vgxy61 成像仪的驱动程序,这似乎与我们的 vd1943 (...) 相似,您现在是否可以将此驱动程序与 AM62A3 评估套件配合使用?

    此致

     Stefan Birkholz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Stefan:

    我的意思是、如果您可以确定驱动程序代码中出现错误的位置。 在此函数中添加调试打印: https://github.com/STMicroelectronics/vd1943-linux-driver/blob/master/vd1943.c#L1358 应该没问题。 然后、我们可以看到哪个调用失败。

    对于 vgxy61 传感器、该传感器来自上游内核。 如果您查看我们的 kernel .config、我们不会为其设置 config 变量: https://github.com/TexasInstruments/ti-linux-kernel/blob/ti-linux-6.12.y/kernel/configs/ti_arm64_prune.config

    此致、
    Jay