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.

[参考译文] SK-AM62A-LP:AM62ax:从 v4l2 DQBUF 捕获的原始数据存在一些错误。

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1334311/sk-am62a-lp-am62ax-the-raw-data-captured-from-v4l2-dqbuf-has-some-error

器件型号:SK-AM62A-LP

我们要将 dToF 传感器移植到 TI AM62ax SoC 平台。 去年我们将 dToF 传感器移植到 Rockchip rk3568,它效果很好。   我们最近将其移植到 Am62ax。  Linux 内核版本为6.1.46。

我们已经修改了 DTS 并添加了 ads6311.c 作为摄像头传感器驱动程序、基本可以完成、但下面的一些错误除外:

1.日志中有一些错误,看起来有一些 DMA 错误发生,但我们不知道为什么?

[ 138.058123] j721e-csi2rx 30102000.ticsi2rx:DMA 传输在漏极缓冲区超时
[ 138.065813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
[138.178139] j721e-csi2rx 30102000.ticsi2rx:对于漏极缓冲器 DMA 传输超时
[ 138.185813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
[ 138.298207] j721e-csi2rx 30102000.tisi2rx:针对漏极缓冲区的 DMA 传输超时
[ 138.305888] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
[ 138.394094] j721e-csi2rx 30102000.tisi2rx:DMA 传输在漏极缓冲区超时
[ 138.401778] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧
[ 138.466288] j721e-csi2rx 30102000.ticsi2rx:针对漏极缓冲区的 DMA 传输超时
[ 138.473983] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧

2.根据 MD5SUM 的值,某些捕获的原始数据文件不正确。  BTW、I enabled 测试模式输出对于 dToF 传感器、输出原始数据是固定的、并使用固定的 MD5值、正如我之前在 Rk3568上进行的测试一样。  如下所示、突出显示的文件有错误的 MD5值、而其他文件是正确的。

root@am62axx-evm:~# md5sum /tmp/video *
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame000_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame001_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame002_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame003_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame004_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame005_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame006_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame007_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame008_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video0_frame009_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video1_frame000_2688x192_1032192.depth_raw
47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame001_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video1_frame002_2688x192_1032192.depth_raw
47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame003_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video1_frame004_2688x192_1032192.depth_raw
47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame005_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video1_frame006_2688x192_1032192.depth_raw
47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame007_2688x192_1032192.depth_raw
6471076892740e3a2aab7206a01869c4 /tmp/video1_frame008_2688x192_1032192.depth_raw
47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame009_2688x192_1032192.depth_raw

我也会发布完整的日志。 您能否帮助检查错误日志并找到根本原因? 谢谢

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

    but、位于 j721e-csi2rx.c 下 ,一些错误是通过 dev_dbg 打印的,我将"dev_dbg"更改为"ev_err",以查看这些错误日志发生时。

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

    尊敬的 David:

    Unknown 说:
    我们已经修改了 DTS

    您能否分享您对 DTS 所做的更改?

    出现"Failed to Drain DMA"错误的原因可能是您的用户应用程序没有足够快地为 CSI Rx 驱动程序对缓冲区进行排队。

    谢谢。

    建中市

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

    您好、建中。  

      我已经查看了我对 DTS 的更改、我添加了一个名为 k3-am62a7-sk-csi2-ads6311.dtso 的新文件(当然、我还修改了 uEnv.txt 以便 u-boot 以加载 k3-am62a7-sk-csi2-ads6311.dtbo)、内容如下:

    另一方面、我们还修改了 k3-am62a7-sk.dts、但大多数更改是针对引脚多路复用配置。 我会在下一个回复中发布我的副本。

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

    您好、建中。

      最后一个回复是我的 K3-am62a7-sk.dts。 谢谢

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

    尊敬的 David:

    看起来你减少了 edgeai_shared_region 和 edgeai_core_grams 的大小:

            edgeai_shared_region: edgeai_shared-memories {
                compatible = "dma-heap-carveout";
                reg = <0x00 0xa3000000 0x00 0x00100000>;
            };
            edgeai_core_heaps: edgeai-core-heap-memory@a3100000 {
                compatible = "shared-dma-pool";
                reg = <0x00 0xa3100000 0x00 0x02400000>;
                no-map;
            };

    您的应用中是否使用了这些存储器?

    "hawk_concurrent_test"有什么作用?

    此致、

    建中市

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

    您好、建中。

      看起来你减少了 edgeai_shared_region 和 edgeai_core_grams 的大小:--这个修改是由德赛软件工程师完成的,我不知道这是什么意思。 总之、这种修改会产生任何副作用吗? 如果需要、我可以恢复它、明天再试。

      另一方面、"hawk_concurrency _test"是我开发的一个简单应用、使用 v4l2 API 捕获原始数据、与 yavta 或 v4l2-ctl 类似、但更为简单。

    谢谢、此致

    大卫

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

    尊敬的 David:

    你能试一下 yavta 吗,看看这是否有用?

    此致、

    建中市

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

    您好、建中。

      我今天去办公室的时候会尝试 yavta、但这可能不是问题。 Qingfeng 曾使用 V4L-ctl utils 进行测试,也曾发生过同样的事情。

      现在我们看到了3个要点:

    1.日志中有一些错误,似乎发生了一些 DMA 错误:

    [ 138.058123] j721e-csi2rx 30102000.ticsi2rx:DMA 传输在漏极缓冲区超时
    [ 138.065813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [138.178139] j721e-csi2rx 30102000.ticsi2rx:对于漏极缓冲器 DMA 传输超时
    [ 138.185813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [ 138.298207] j721e-csi2rx 30102000.tisi2rx:针对漏极缓冲区的 DMA 传输超时
    [ 138.305888] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [ 138.394094] j721e-csi2rx 30102000.tisi2rx:DMA 传输在漏极缓冲区超时
    [ 138.401778] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧
    [ 138.466288] j721e-csi2rx 30102000.ticsi2rx:针对漏极缓冲区的 DMA 传输超时
    [ 138.473983] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧

    2.根据 MD5SUM 的值,某些捕获的原始数据文件不正确。  BTW、我为 dToF 传感器启用了测试模式输出、输出原始数据 应该是固定的 MD5值、正如我之前在 Rk3568上进行的测试一样。  如下所示、突出显示的文件有错误的 MD5值、而其他文件是正确的。

    root@am62axx-evm:~# md5sum /tmp/video *
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame000_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame001_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame002_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame003_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame004_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame005_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame006_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame007_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame008_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame009_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video1_frame000_2688x192_1032192.depth_raw
    47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame001_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video1_frame002_2688x192_1032192.depth_raw
    47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame003_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video1_frame004_2688x192_1032192.depth_raw
    47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame005_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video1_frame006_2688x192_1032192.depth_raw
    47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame007_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video1_frame008_2688x192_1032192.depth_raw
    47532ad8274f164da0c6e804f1e65223 /tmp/video1_frame009_2688x192_1032192.depth_raw

     

    3.看起来状态寄存器中出现了一些 ECC/CRC 错误,我们在 drivers\media\platform\cadences\cdns-csi2rx.c 的 csi2rx_stop()的开头添加了一些代码 ,这是否是打印这些状态的正确位置? 我测试了很多次、根据我搜索关键字"err_IRQ "的结果、有些 err_IRQ 如下所示。

    4.在 sensor 驱动程序的 set_fmt ()回调函数中,我用以下代码设置链路频率( 500MHz )和像素速率,是否足够? 我是否可以通过查看某人的寄存器来查看和检查 SoC mipi RX 侧的当前 mipi 频率设置? 我们尚未找到这些代码、直到现在、我们仍有一些担心。

    /*像素速率=链路频率* 2 *通道/ bits_per_sample */
    静态 u64 __可能_未使用 TO_像素_RATE (u32 f_index)
    {
    u64 pixel_rate = sensor_link_freq_items [f_index]* 2LL * sensor_lans;

    do_div (pixel_rate、sensor_bits_per_sample);

    返回 pixel_rate;

    __v4l2_ctrl_s_ctrl (sensor->ctrl_linkfreqency、sensor->cur_mode->link_freq_index);
    __v4l2_ctrl_s_ctrl_int64 (sensor->ctrl_pixelrate、to_pixel_rate (sensor->cur_mode->link_freq_index);

      请帮助检查上述几点、也许它会有所帮助。

    谢谢、此致、

    大卫

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

    您好、建中。

      今天早上、我尝试使用 v4l2 utils 来捕获 dToF 传感器中的一些原始文件。 步骤如下:

    包括我们的 dToF 传感器驱动程序,  

       CMD:insmod ads6311.ko;

    2.打开 ads6311.c 驱动程序的一些运行时开关,使测试模式能够输出固定的原始数据,并启用更多的调试日志;

      CMD: 回波0x142a >/sys/kernel/debug/adaps/dbg_ctrl

    3.打开  v4l2设备和子设备的一些运行时开关

      命令:

       回波0xff >/sys/class/video4linux/video0/dev_debug
       回波0xff >/sys/class/video4linux/video1/dev_debug
       回波0xff >/sys/class/video4linux/video2/dev_debug
       回波0xff >/sys/class/video4linux/video3/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev0/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev1/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev2/dev_debug

    4.为 cdns_csi2rx.30101000.csi-bridge 和30102000.ticsi2rx 设置 v4l2路由 :

      命令:

      medical-ctl -d /dev/media0 -R "'cdns_csi2rx.30101000.csi-bridge'[00->1/0 [1]、0/1 -> 1/1 [1]、0/2 -> 1/2 [1]、0/3->1/3 [1]"
      medical-ctl -d /dev/media0 -R "'30102000.ticsi2rx'[00->1/0[1]、0/1 -> 2/0[1]、0/2->3/0[1]、0/3->4/0[1]"

    5.逐步启动流0--3,为每个流捕获10帧,并保存到文件(/tmp)。

     命令:

      v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC0.raw12 --stream-count=10 --stream-poll > v4l2_ctl_v0.log 2>v4l2_ctl_v0_error.log

      v4l2-ctl --verbose -d /dev/video1 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC1.raw12 --stream-count=10 --stream-poll >> v4l2_ctl_v1.log 2>>v4l2_ctl_v1_error.log

      v4l2-ctl --verbose -d /dev/video2 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC0.raw8 --streame-count=10 --stream-poll >> v4l2_ctl_v0.log 2>>v4l2_ctl_v0_error.log

      v4l2-ctl --verbose -d /dev/video3 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC1.raw8 --streame-count=10 --stream-poll >> v4l2_ctl_v1.log 2>>v4l2_ctl_v1_error.log

    6. 查看并检查原始文件的 MD5值(对于 v4l2-ctl 而言,10帧原始数据会保存到每个流的同一文件中)

      命令:

       MD5SUM /tmp/2688x192_SBGGR12_1X12_VC * //输出如下

    4f1de82b9fc1ac88ee059f06b95153e0 /tmp/2688x192_SBGGR12_1X12_VC0.raw12
    5cd4d9a618b339640a241f79e817d3fc /tmp/2688x192_SBGGR12_1X12_VC1.raw12
      

    7.将/tmp 的原始文件复制到 tf 卡(/run/media/BOOT-mmcblk1p1/4G ),以传输到我的 PC

      命令:

       cp /tmp/2688x192_SBGGR12_1X12_VC *。

    ---------------- 以下步骤是在我的电脑上完成的。

    8.检查复制到我的 PC 的 RAW 文件的 md5sum 值

    David.chen@SZ-PC002 MINGW64 /c/work/Desay/raw/0312a
    $ md5sum 268x192_SBGGR12_1x12_vc1.raw12
    4f1de82b9fc1ac88ee059f06b95153e0 * 268x192_SBGGR12_1x12_VC1.raw12

    David.chen@SZ-PC002 MINGW64 /c/work/Desay/raw/0312a
    $ md5sum 268x192_SBGGR12_1x12_vC0.raw12
    5cd4d9a618b339640a241f79e817d3fc * 268x192_SBGGR12_1x12_VC0.raw12

    9.将 RAW 文件拆分为10个部分:

      命令:

       C:\work\tools\split_binary_file.py 268x192_SBGGR12_1x12_vC0.raw12 10

       C:\work\tools\split_binary_file.py 268x192_SBGGR12_1x12_VC1.raw12 10

    10.检查每个部件的 md5sum 值:


    $ md5sum 268x192_SBGGR12_1x12_vC0.raw12_part*
    5e946032e9053ffd742c618718fb2808 * 268x192_SBGGR12_1x12_VC0.raw12_part1
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC0.raw12_part10
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC0.raw12_part2
    5e946032e9053ffd742c618718fb2808 * 268x192_SBGGR12_1x12_VC0.raw12_part3
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC0.raw12_part4
    5e946032e9053ffd742c618718fb2808 * 268x192_SBGGR12_1x12_VC0.raw12_part5
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC0.raw12_part6
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC0.raw12_part7
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC0.raw12_part8
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC0.raw12_part9


    $ md5sum 268x192_SBGGR12_1x12_vc1.raw12_part*
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part1
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part10
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part2
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part3
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part4
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part5
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part6
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part7
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part8
    6471076892740e3a2aab7206a01869c4 * 268x192_SBGGR12_1x12_VC1.raw12_part9

    结论:

      您可以看到、即使我使用了 v4l2-ctl utils 而不是我的 hawk_concurrent_test App、一些原始文件的 md5sum 值也不正确。  

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

    e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240312_5F00_094918.txt

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

    您好、建中。

      今天我更加关注 mipi 状态,我多次测试,发现 CRC 错误似乎总是存在,但大多数时候原始数据是正确的。 请查看我的摘要结果如下:

    此致、

    大卫

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

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

      尊敬的 David:

    1.对于漏 DMA 缓冲区: 日志中有一些错误,看起来发生了一些 DMA 错误:

    [ 138.058123] j721e-csi2rx 30102000.ticsi2rx:DMA 传输在漏极缓冲区超时
    [ 138.065813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [138.178139] j721e-csi2rx 30102000.ticsi2rx:对于漏极缓冲器 DMA 传输超时
    [ 138.185813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [ 138.298207] j721e-csi2rx 30102000.tisi2rx:针对漏极缓冲区的 DMA 传输超时
    [ 138.305888] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [ 138.394094] j721e-csi2rx 30102000.tisi2rx:DMA 传输在漏极缓冲区超时
    [ 138.401778] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧
    [ 138.466288] j721e-csi2rx 30102000.ticsi2rx:针对漏极缓冲区的 DMA 传输超时
    [ 138.473983] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧

    Jai 将提供补丁以确认这是真正的错误或打印错误、如果打印错误、您可以忽略此错误。 中的 UCD 版本将被修复。

    2.对于 MD5校验和误差:

    medical-ctl -d /dev/media0 -R "'30102000.ticsi2rx'[00->2/0 [1]、0/1 -> 3/0 [1]、0/2 -> 4/0 [1]、0/3->5/0 [1]"

    3. CRC 错误,这是节奏 IP 状态寄存器。  Cadence IP 硬件接收错误。 可能会将 Steam 逐个关联起来,需要合并以下使用流命令:

    v4l2-ctl -d 0...& v4l2-ctl -d 1...& v4l2-ctl -d 3...& v4l2-ctl -d 4

    Br、

    边奥  

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

      尊敬的 David:

    1.对于漏 DMA 缓冲区: 日志中有一些错误,看起来发生了一些 DMA 错误:

    [ 138.058123] j721e-csi2rx 30102000.ticsi2rx:DMA 传输在漏极缓冲区超时
    [ 138.065813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [138.178139] j721e-csi2rx 30102000.ticsi2rx:对于漏极缓冲器 DMA 传输超时
    [ 138.185813] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [ 138.298207] j721e-csi2rx 30102000.tisi2rx:针对漏极缓冲区的 DMA 传输超时
    [ 138.305888] j721e-csi2rx 30102000.ticsi2rx:无法清除 DMA。 下一帧可能是假帧
    [ 138.394094] j721e-csi2rx 30102000.tisi2rx:DMA 传输在漏极缓冲区超时
    [ 138.401778] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧
    [ 138.466288] j721e-csi2rx 30102000.ticsi2rx:针对漏极缓冲区的 DMA 传输超时
    [ 138.473983] j721e-csi2rx 30102000.tisi2rx:TI_csi2rx_clearup_buffers:失败:-110漏 DMA。 下一帧可能是假帧

    Jai 将提供补丁以确认这是真正的错误或打印错误、如果打印错误、您可以忽略此错误。 中的 UCD 版本将被修复。

    2.对于 MD5和错误,请不要使用 video0 ,而是使用 video1到 video4 :

    medical-ctl -d /dev/media0 -R "'30102000.ticsi2rx'[00->2/0 [1]、0/1 -> 3/0 [1]、0/2 -> 4/0 [1]、0/3->5/0 [1]"

    3. CRC 错误,这是节奏 IP 状态寄存器。  Cadence IP 硬件接收错误。 可能会将 Steam 逐个关联起来,需要合并以下使用流命令:

    v4l2-ctl -d 0...& v4l2-ctl -d 1...& v4l2-ctl -d 3...& v4l2-ctl -d 4

    4.链路频率可在 TRM 中查看、需要建中和斋帮助指出具体的寄存器。  

    Br、

    边奥  

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

    David:

    请提供有关移除了16字节对齐传输限制的补丁程序影响的更新、即应用补丁程序前后的差异。

    谢谢你。

    建中市

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

    尊敬的 Biao 和 Jianzhong:

    2.对于 MD5校验和误差:

    medical-ctl -d /dev/media0 -R "'30102000.ticsi2rx'[00->2/0 [1]、0/1 -> 3/0 [1]、0/2 -> 4/0 [1]、0/3->5/0 [1]"

     我按以下步骤进行过此尝试、但捕获的结果仍然存在不匹配的 MD5值。 所以我认为它没有帮助。

    -------------------------------------------------------

    包括我们的 dToF 传感器驱动程序,  

       CMD:insmod ads6311.ko;

    2.打开 ads6311.c 驱动程序的一些运行时开关,使测试模式能够输出固定的原始数据,并启用更多的调试日志;

      CMD: 回波0x142a >/sys/kernel/debug/adaps/dbg_ctrl

    3.打开  v4l2设备和子设备的一些运行时开关

      命令:

       回波0xff >/sys/class/video4linux/video0/dev_debug
       回波0xff >/sys/class/video4linux/video1/dev_debug
       回波0xff >/sys/class/video4linux/video2/dev_debug
       回波0xff >/sys/class/video4linux/video3/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev0/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev1/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev2/dev_debug

    4.为 cdns_csi2rx.30101000.csi-bridge 和30102000.ticsi2rx 设置 v4l2路由 :

      命令:

      medical-ctl -d /dev/media0 -R "'cdns_csi2rx.30101000.csi-bridge'[00->1/0 [1]、0/1 -> 1/1 [1]、0/2 -> 1/2 [1]、0/3->1/3 [1]"

      medical-ctl -d /dev/media0 -R "'30102000.ticsi2rx'[00->2/0 [1]、0/1 -> 3/0 [1]、0/2 -> 4/0 [1]、0/3->5/0 [1]"

    5.设置 dToF 传感器子设备的格式(其驱动程序为 Ads6311.c)

      命令:

      medial-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/0 [fmt:SBGGR12_1x12/28x192]"
      medial-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/1 [fmt:SBGGR12_1x12/28x192]"
      medial-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/2 [fmt:SBGGR8_1X8/40x1]"
      medial-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/3 [fmt:SBGGR8_1X8/40x1]"

    6. 逐步启动流0--3,为每个流捕获10帧,并保存到文件(/tmp)。

      命令:

       v4l2-ctl --verbose -d /dev/video1 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC0.raw12 --stream-count=10 --stream-poll > v4l2_ctl_v0.log 2>v4l2_ctl_v0_error.log

       v4l2-ctl --verbose -d /dev/video2 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC1.raw12 --stream-count=10 --stream-poll >> v4l2_ctl_v1.log 2>>v4l2_ctl_v1_error.log

       v4l2-ctl --verbose -d /dev/video3 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC0.raw8 --streame-count=10 --stream-poll >> v4l2_ctl_v0.log 2>>v4l2_ctl_v0_error.log

       v4l2-ctl --verbose -d /dev/video4 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC1.raw8 --streame-count=10 --stream-poll >> v4l2_ctl_v1.log 2>>v4l2_ctl_v1_error.log

    7. 查看和检查原始文件的 MD5值(对于 v4l2-ctl 而言,10帧原始数据会保存到每个流的同一文件中)

      命令:

      /tmp/2688 *   //这将输出如下所示, md5sum 这次看起来是正确的。

    4f1de82b9fc1ac88ee059f06b95153e0 /tmp/2688x192_SBGGR12_1X12_VC0.raw12
    4f1de82b9fc1ac88ee059f06b95153e0 /tmp/2688x192_SBGGR12_1X12_VC1.raw12

    8.删除捕获的 RAW 文件:(重试一次)

      命令:

      RM /tmp/*.raw12

      RM /tmp/*.raw8

    9. 再次重复步骤6。

    10. 再次查看和检查原始文件的 MD5值  

      命令:

       MD5SUM /tmp/2688 *  //其输出如下:

    d41d8cd98f00b204e9800998ecf8427e /tmp/2688x192_SBGGR12_1X12_VC0.raw12  
    c69e3dd8c33b0a6c48f1b07df861562f /tmp/2688x192_SBGGR12_1X12_VC1.raw12

      这些2 .raw12文件中的 md5sum 值不正确。

      请查看详细步骤、并从以下日志中登录 file.e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240313_5F00_141046.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请提供有关修补程序影响的更新,该修补程序消除了16字节对齐传输的限制,即应用修补程序前后的差异。

    您好、建中。

      正如我看到的、此补丁确实有助于宽度为40的用户数据流输出。 没有其他帮助。

    谢谢、此致、

    大卫

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

    3. CRC 错误,这是节奏 IP 状态寄存器。  Cadence IP 硬件接收错误。 可能会将 Steam 逐个关联起来,需要合并以下使用流命令:

    v4l2-ctl -d 0...& v4l2-ctl -d 1...& v4l2-ctl -d 3...& v4l2-ctl -d 4

    [/报价]

    我尝试了以下命令、Linux 内核崩溃、请查看匹配的日志文件 MobaXterm_TI_SoC_Uart_20240313_143941.txt

    v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC0.raw12 --stream-count=10 --stream-poll &
    v4l2-ctl --verbose -d /dev/video1 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC1.raw12 --stream-count=10 --stream-poll &
    v4l2-ctl --verbose -d /dev/video2 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC0.raw8 --streame-count=10 --stream-poll &
    v4l2-ctl --verbose -d /dev/video3 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC1.raw8 --streame-count=10 --stream-poll >> v4l2_ctl_v1.log 2>>v4l2_ctl_v1_error.log

    e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240313_5F00_143941.txt

    然后我也尝试了下面的命令,它似乎不工作。  请参阅连接的日志文件 MobaXterm_TI_SoC_Uart_20240313_144314.txt

    v4l2-ctl --verbose -d /dev/video1 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC0.raw12 --stream-count=10 --stream-poll &
    v4l2-ctl --verbose -d /dev/video2 --set-fmt-video=width=2688, height=192, pixelformat='BG12'--streame-mmap=6 --streame-skip=1 --stream-to-=/tmp/2688x192_SBGGR12_1X12_VC1.raw12 --stream-count=10 --stream-poll &
    v4l2-ctl --verbose -d /dev/video3 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC0.raw8 --streame-count=10 --stream-poll &
    v4l2-ctl --verbose -d /dev/video4 --set-fmt-video=width=40,height=1,pixelformat='BA81'--streame-mmap=6 --streame-skip=1 --streame-to=/tmp/40x1_SBGGR8_1X8_VC1.raw8 --streame-count=10 --stream-poll >> v4l2_ctl_v1.log 2>>v4l2_ctl_v1_error.log

    e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240313_5F00_144314.txt

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

    尊敬的 David:

    感谢您进行快速测试。

    从`s日志来看,问题似乎在传感器驱动程序的` ensor_s_stream () 函数中。 当我们尝试同时在所有视频节点上进行流式传输时、现在正发生这种情况。

    对于多数据流传感器、v4l2 API 需要实现 enable_streams()/disable_streams() 功能。
    您将需要在传感器驱动程序中实现此功能、以同时在所有 VC/DTS 上进行流式传输。

    可以在此处查看 API 文档:
    https://docs.kernel.org/driver-api/media/mc-core.html
    https://docs.kernel.org/driver-api/media/v4l2-subdev.html

    例如、您可以参阅 TI Linux 中的 UB960驱动程序、该驱动程序为 FPDLink 解串器实现了该 API、该器件在同一 CSI 端口将多个摄像头多路复用为不同的虚拟通道:
    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/media/i2c/ds90ub960.c?h=ti-linux-6.1.y#n2549

    同时,您仍然可以像以前一样逐个测试视频节点,使用调用中建议的更改(从/dev/video1开始)来查看它是否消除了 MD5错误。

    谢谢

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

    尊敬的 Jai:

      非常感谢您的建议。 我 读取 ds90ub960.c、ds90ub953.c 和 ds90ub913.c 的源代码 。 他们实施了  enable_streams()/disable_streams()  回调 API,但未实现 s_stream()回调 API。 为  enable_streams()/disable_streams()  回调看起来适合多个摄像机(可能随时选择其中一个)、我注意到  enable_streams()/ disable_streams()函数  在这3个驱动器中、提到了"弹出焊盘"和"弹出焊盘"、其中我们的 dToF 传感器似乎只有源焊盘、没有散热焊盘。 我认为我们的 dToF 传感器不同于 ds90XXX。

      我提到了 ov2312.c、其实现了.s_stream、.init_cfg、.get_FRAME_desc 和.set_routing 回调、我们也执行了相同的实现。 对我来说很好。

     另一方面、重要的是、错误的原始数据输出看起来与多个流无关、因为即使我没有为多个流启用路由、并且我的应用程序仅尝试捕获第一个流、我也可以重现此错误。 我的测试步骤如下:

    -------------------------------------------------------

    包括我们的 dToF 传感器驱动程序,  

       CMD:insmod ads6311.ko;

    2.打开 ads6311.c 驱动程序的一些运行时开关,使测试模式能够输出固定的原始数据,并启用更多的调试日志;

      CMD: 回波0x142a >/sys/kernel/debug/adaps/dbg_ctrl

    3.打开  v4l2设备和子设备的一些运行时开关

      命令:

       回波0xff >/sys/class/video4linux/video0/dev_debug
       回波0xff >/sys/class/video4linux/video1/dev_debug
       回波0xff >/sys/class/video4linux/video2/dev_debug
       回波0xff >/sys/class/video4linux/video3/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev0/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev1/dev_debug
       回波0xff >/sys/class/video4linux/v4l-subdev2/dev_debug

    4.不要为 cdns_csi2rx.30101000.csi-bridge 和30102000.ticsi2rx 设置 v4l2路由 :

    5.将环境变量"video_stream_count"设置为1、以捕获第一个流(即 video0)

      命令:

       导出 video_stream_count=1

    6.执行我的应用程序'hawk_concurrent_test'以使用传感器工作模式捕捉100个帧2

      命令:

       ./ hawk_concurrent_test -- setworkmode 2 -- dumpframe 10 > hawk_concurrency_test1.log

    7. 查看和人眼检查原始文件的 MD5值

      命令:

      MD5SUM /tmp/video *

    8.重复步骤6-7,六、七次后,我看到发生了虫子。

    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame000_2688x192_1032192.depth_raw
    5e946032e9053ffd742c618718fb2808 /tmp/video0_frame001_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame002_2688x192_1032192.depth_raw
    5e946032e9053ffd742c618718fb2808 /tmp/video0_frame003_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame004_2688x192_1032192.depth_raw
    5e946032e9053ffd742c618718fb2808 /tmp/video0_frame005_2688x192_1032192.depth_raw
    6471076892740e3a2aab7206a01869c4 /tmp/video0_frame006_2688x192_1032192.depth_raw

     请参阅随附的日志文件以了解我的详细步骤和 log.e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240313_5F00_185959.txt

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

    状态寄存器似乎发生了一些 ECC/CRC 错误,我们在 drivers\media\platform\cdns-csi2rx.c 的 csi2rx_stop()的开头添加了一些代码 ,这是否是打印这些状态的正确位置? 我测试了很多次、根据我搜索关键字"err_IRQ "的结果、有些 err_IRQ 如下所示。

    [/报价]

    尊敬的 Jai:

      您是否需要再次确认:在 drivers\media\platform\cadences\cdns-csi2rx.c 的 csi2rx_stop()开始处,这是否是打印这些状态的正确位置? (根据我在 Qualcomm 和 Rockchip 平台上的工作经验、这些状态通常在某个 IRQ 处理函数的开始处进行检查。) 在当前平台上、我似乎总是(90%)看到 CSI2RX_DPHY_ERROR_IRQ 的第4-7位有一些错误、但大多数情况下、原始数据是正确的、原始数据有错误的几率仅小于30%。

    谢谢、此致、

    大卫

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

    David:

    关于 Biao 提到的链路频率问题、

    4. 链路频率可以在 TRM 中查看、需要建中和斋帮助指出特定的寄存器。

    相关寄存器是 DPHY_BAND_CFG 寄存器: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/phy/cadence/cdns-dphy-rx.c?h=ti-linux-6.1.y#n195。

    您可以在函数中添加一些打印输出 cdns_dphy_rx_configure() 以进行打印 hs_clk_rate, band_ctrl, 等、以查看链路频率是否配置正确。

    您还可以从以下网站打印计算出的链接频率: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/media/platform/cadence/cdns-csi2rx.c?h=ti-linux-6.1.y#n276。

    在 您之前共享的 dts 文件 k3-am62a7-sk-csi2-ads6311.dtso 中、未设置链路频率。 在这种情况下、驱动程序将使用像素速率来计算链路频率: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/media/v4l2-core/v4l2-common.c?h=ti-linux-6.1.y#n450。

    此致、

    建中市

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

    尊敬的 Jai、Jianzhong 和 Biao:

       今天早上,我试图找到一个较旧的 ads6311.c 驱动程序版本(Fub, 27 ),它没有多流支持,但可以捕获 video0原始数据。 我测试了它,我重复了6次后,我看到原始数据 md5sum 不匹配问题再次。 看来这个问题与多个流没有太大关系、让我们先尝试基于更简单的代码版本来修复。 操作步骤与前面的注释几乎相同。 有关详细步骤和日志、请参阅随附的日志文件。  我还附上了我的 ads6311.c 驱动程序代码和 hawk_concurrent_test 应用程序代码。 我今天早上也会尝试用 v4l2-ctl 命令重复这个问题。

    此致、

    Davide2e.ti.com/.../Ads6311Driver_5F00_and_5F00_Hawk_5F00_concurrency_5F00_test.rare2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240314_5F00_090026_5F00_NoMultipleStream_5F00_md5_5F00_mismatched.txt

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

    我将错误的原始文件转换为 C array .h 文件、可以看到会发生错误、因为512个字节(可能是不同的位置)、均为0x00。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我今天早上也会尝试使用 v4l2-ctl 命令重复此问题。

    我只是尝试使用 v4l2-ctl utils、也重现了问题。

    我使用了一个简单的脚本,如下所示,命令行是:./ looptest3.sh 50,脚本每次试图捕获1帧,重复50次。

    ---------------- looptest3.sh 文件-------------------------------------------------------

    insmod ads6311.ko
    echo 0x142a > /sys/kernel/debug/adaps/dbg_ctrl
    
    echo 0xff > /sys/class/video4linux/video0/dev_debug
    echo 0xff > /sys/class/video4linux/video1/dev_debug
    echo 0xff > /sys/class/video4linux/video2/dev_debug
    echo 0xff > /sys/class/video4linux/video3/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev0/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev1/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev2/dev_debug
    
    media-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/0 [fmt:SBGGR12_1X12/2688x192]'
    
    if [ -n "$1" ]; then
          times=$1
       else
          times=1
    fi
    
    for (( i=1; i <= $times; i++ ))
    do
        echo
        echo "-----TEST TIMES: $i/$times------"
        v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=2688,height=192,pixelformat='BG12' --stream-mmap=6 --stream-skip=1 --stream-to=/tmp/2688x192_SBGGR12_1X12_VC0.raw12 --stream-count=1 --stream-poll > v4l2_ctl_video0.log 2>v4l2_ctl_video0_error.log
        md5sum /tmp/2688x192_SBGGR12_1X12_VC0.raw12
        rm /tmp/2688x192_SBGGR12_1X12_VC0.raw12
    done
    
    echo "-----------$times times test done, please check the log file for result-----------"
    

    请参阅随附文件中的输出日志: e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240314_5F00_111049_5F00_NoMultipleStream_5F00_md5_5F00_mismatched_5F00_by_5F00_v4l2_2D00_ctl.txt

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

    >我提到了 ov2312.c、其实现了.s_stream、.init_cfg、.get_FRAME_desc 和.set_routing 回调、我们也执行了相同的实现。 对我来说很好。

    您好、David、您好、多流传感器不需要 ENABLE_STREAMS。 但对于 OV2312、我们不会看到内核日志在您的传感器中发生的情况。 您是否有可能共享传感器代码?

    当传感器中缺少 enable_streams()钩子时,v4l2使用回退函数,即使对多个流也只调用一次传感器的 s_stream()钩子。  请查看此函数:
    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/media/v4l2-core/v4l2-subdev.c?h=ti-linux-6.1.y#n1800

    出于某种原因,您的传感器的 s_stream()被调用了两次。 如果您对此有任何疑问、敬请告知。

    >另一方面,重要的一点是,错误的原始数据输出看起来与多个流无关,因为即使我没有为多个流启用路由,我的应用程序只尝试捕获第一个流,我也可以重现这个错误。 我的测试步骤如下:

    当您禁用路由时、是否还禁用或更改了传感器寄存器以不在另一个 VC 和 DTS 上发送数据?

    如果没有、那么在您使用/dev/video0.时仍会出现错误 您是否可以尝试相同的实验(仅一次流捕获)但使用/dev/video1?

    我可以更详细地解释硬件错误、以便让情况更清楚:

    Sensor/CSI-TX->Cadence CSI-RX -> TI CSI-RX --- 多个 DMA 通道(rx0至 rx5)--- >/dev/videoX

    如果有任何 CSI 数据传入 SoC、则必须由 TI CSI-RX 进行过滤、并将其发送到 rx0-rx5外部的某个通道。 任何未过滤的数据都可能最终出现在 rx0上、从而破坏该流。

    在您的案例中、数据出现在 VC = 0、1和 DT = raw12、raw8上、因此其他流将最终出现在 rx0 (/dev/video0)上、即使您不是通过仅启用一条路由来筛选它们也是如此。

    我们正在努力在未来的版本中更好地修复此漏洞、目前建议不要将/dev/video0用于 FPDLink 或您的传感器等任何多通道源。

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

    我的坏消息、我刚刚看到您最近对单流驱动程序测试和源代码的响应。 请给我一些时间详细介绍一下。

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

    是的、我可以。 事实上,我已经张贴了我的驱动程序代码在今天早些时候的帖子(评论)。 您可以找到该.rar 文件。

    出于某种原因,您的传感器的 s_stream ()被调用两次。 如果您对此有任何问题,请告诉我。

    第一次针对 STREAM_ON、第二次针对 STREAM_OFF。 这应该是正常的。

    当您禁用路由时,您是否还禁用或更改了传感器寄存器而不在另一个 VC 和 DTS 上发送数据?

    如果没有、那么在您使用/dev/video0.时仍会出现错误 您是否可以尝试相同的实验(仅一次流捕获)但使用/dev/video1?

    我可以更详细地解释硬件错误、以便让情况更清楚:

    Sensor/CSI-TX->Cadence CSI-RX -> TI CSI-RX --- 多个 DMA 通道(rx0至 rx5)--- >/dev/videoX

    如果有任何 CSI 数据传入 SoC、则必须由 TI CSI-RX 进行过滤、并将其发送到 rx0-rx5外部的某个通道。 任何未过滤的数据都可能最终出现在 rx0上、从而破坏该流。

    在您的案例中、数据出现在 VC = 0、1和 DT = raw12、raw8上、因此其他流将最终出现在 rx0 (/dev/video0)上、即使您不是通过仅启用一条路由来筛选它们也是如此。

    我们正在努力在将来的版本中更好地修复此漏洞、目前建议不要将/dev/video0用于任何多通道源、如 FPDLink 或您的传感器。

    感谢您的讲解。 我会尝试它。

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

    e2e.ti.com/.../62008.logs.txte2e.ti.com/.../looptest3.sh

    尊敬的 David:

    我修改了您的脚本、并使用传感器中的内部测试图形发生器使用 IMX219传感器进行了测试。
    到目前为止、我还没有看到任何 MD5SUM 不匹配情况。 我测试了 RAW8和 RAW10两种格式以及不同的分辨率。

    在您的传感器中、DMA 传输突然结束。 从 HW 侧、如果在 CSI -> PSI-L 接口上接收到 EOF (帧结束)信号、则可能会发生这种情况、如摄像头子系统下 AM62A TRM 中"6.1 PSI_L DMA 帧"一节所述。

    您能否确认您的传感器驱动程序已配置、以便传感器仅发送 VC = 0和 DT = RAW12 (不发送其他 VC / DT)。
    如上所述、使用 video0时、其他流的 EOF 信号可能会路由到 rx0/video0、从而导致 DMA 突然停止和数据不完整。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否确认您的传感器驱动程序已配置为传感器仅发送 VC = 0且 DT=RAW12 (不发送其他 VC / DT)。
    如上所述,使用 video0时,其他流的 EOF 信号可能会路由到 rx0/video0,从而导致 DMA 突然停止和数据不完整。

    尊敬的 Jai:

      是的、我还没有更改 dToF 传感器的配置。 我会问芯片设计部门是否只能启用一个数据流、 如果是、我明天会尝试一下。 感谢您的答复。

    大卫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以尝试相同的实验(只捕获一个流)但改用/dev/video1吗?

    尊敬的 Jai:

      今天早上,我用 video1测试了它,它似乎同样的错误也发生了。 下面是我的测试脚本和日志文件、 如果我有任何错误、请更正我。 谢谢。

    #!/bin/bash
    
    export TZ=Asia/Shanghai
    
    insmod ads6311.ko
    echo 0x1028 > /sys/kernel/debug/adaps/dbg_ctrl
    
    echo 0xff > /sys/class/video4linux/video0/dev_debug
    echo 0xff > /sys/class/video4linux/video1/dev_debug
    echo 0xff > /sys/class/video4linux/video2/dev_debug
    echo 0xff > /sys/class/video4linux/video3/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev0/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev1/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev2/dev_debug
    
    media-ctl -d /dev/media0 -R "'cdns_csi2rx.30101000.csi-bridge' [0/0 -> 1/0 [1]]"
    
    # map the first stream to video1(rx1)
    media-ctl -d /dev/media0 -R "'30102000.ticsi2rx' [0/0 -> 2/0 [1]]"
    
    media-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/0 [fmt:SBGGR12_1X12/2688x192]'
    
    if [ -n "$1" ]; then
          times=$1
       else
          times=1
    fi
    
    for (( i=1; i <= $times; i++ ))
    do
        echo
        echo "-----TEST TIMES: $i/$times------"
        v4l2-ctl --verbose -d /dev/video1 --set-fmt-video=width=2688,height=192,pixelformat='BG12' --stream-mmap=6 --stream-skip=1 --stream-to=/tmp/2688x192_SBGGR12_1X12_VC0.raw12 --stream-count=1 --stream-poll > v4l2_ctl_video1.log 2>v4l2_ctl_video1_error.log
        md5sum /tmp/2688x192_SBGGR12_1X12_VC0.raw12
        rm /tmp/2688x192_SBGGR12_1X12_VC0.raw12
    done
    
    echo "-----------$times times test done, please check the log file for result-----------"
    

    测试日志文件: e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240315_5F00_102412_5F00_NoMultipleStream_5F00_by_5F00_v4l2_2D00_ctl_5F00_video1.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否确认您的传感器驱动程序已配置为传感器仅发送 VC = 0和 DT=RAW12 (不 VC 发送其他 DT/DT)。
    如上所述,使用 video0时,其他流的 EOF 信号可能会路由到 rx0/video0,从而导致 DMA 突然停止和数据不完整。

    尊敬的 Jai:

      根据芯片设计 MIPI 工程师的建议、我修改了传感器配置、启用了一种数据类型(原始用户数据将添加到主流帧的最后一行)、禁用了 vc1、仅保留 vc0。  然后我用下面的脚本测试,每次捕获100帧,重复50次,所以完全捕获5000帧,有3帧原始数据不匹配。 请注意、由于用户数据(最后一行/数据包)是可更改的、因为有帧编号索引、所以整个原始文件的校验和不是固定的、所以我只计算主流数据部分的 CRC32、如果 CRC32与预期的正确值不匹配、 应用'hawk_concurrent_test'将原始文件保存至/tmp/.   

      我将这些原始文件转换为 C 数组.h 文件、它们看起来存在相同的错误、只是前512个字节正确、其余部分为0x00、与我之前提到的相同。

    ---------------- 测试脚本文件:loop_capture_with_video0_for_one_stream_only.sh -->

    #!/bin/bash
    
    export TZ=Asia/Shanghai
    
    insmod ads6311.ko
    # enable TEST pattern output,etc
    echo 0x1028 > /sys/kernel/debug/adaps/dbg_ctrl
    
    echo 0xff > /sys/class/video4linux/video0/dev_debug
    echo 0xff > /sys/class/video4linux/video1/dev_debug
    echo 0xff > /sys/class/video4linux/video2/dev_debug
    echo 0xff > /sys/class/video4linux/video3/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev0/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev1/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev2/dev_debug
    
    # enable more log output for hawk_concurrency_test app
    export debug_info_enable=true
    # only capture 1 stream for hawk_concurrency_test app
    export video_stream_count=1
    # calculate CRC32 for frame buffer to verify the data correct or not for hawk_concurrency_test app
    export calc_frame_crc32_enable=true
    
    if [ -n "$1" ]; then
          times=$1
       else
          times=1
    fi
    
    for (( i=1; i <= $times; i++ ))
    do
        echo
        echo "-----TEST TIMES: $i/$times------"
        ./hawk_concurrency_test --setworkmode 2  --dumpframe 100 > hawk_concurrency_test1.log
        # cat the log file to check CRC32 values from the saved log file.
        cat hawk_concurrency_test1.log
    done
    
    echo "-----------$times times test done, please check the log file for result-----------"
    

    ---------------- 详细测试步骤和输出日志的日志文件-------------------------------------------------------

    e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240315_5F00_135837_5F00_MIPI_5F00_TX_5F00_1Stream.txt

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

    尊敬的 Jai:

      根据我们的芯片设计工程师(mipi tx ip)的建议、我在 board-support\ti-linux-kernel-6.1.46+gitAUTOINC+247b2535b2-g247b2535b2\drivers\drivers\cadences\cdns-dphy-rx.c 中添加了一些代码、以打印 mipi 参数。  

      然后我得到了如下的电流参数:

    通道:4、
    lp_clk_rate:0Hz、
    LPx:50000ps、
    HS_clk_rate:500000000Hz、
    HS_PREPARE:48000ps、
    HS_ZERO:117000ps、
    HS_SETTLE:97000ps、
    HS_TRAIL:92000ps、
    HS_EXIT:100000 ps

       我们有 3个问题:

    Q1:为什么 LP_clk_rate 为0Hz?   

    问题2:如果我想更改 hs_settle、我该怎么做? 您能告诉我执行此操作的正确位置在哪里吗?

    问题3: 您能否帮助您再次确认:在 drivers\media\platform\cadences\cdns-csi2rx.c 的 csi2rx_stop()开始处,这是否是打印这些状态的正确位置? (根据我在 Qualcomm 和 Rockchip 平台上的工作经验、这些状态通常在某个 IRQ 处理函数的开始处进行检查。) 在当前平台上、我似乎总是(90%)看到 CSI2RX_DPHY_ERROR_IRQ 的第4-7位有一些错误、但大多数情况下、原始数据是正确的、原始数据有错误的几率仅小于30%。 目前、IRQ_STATUS 似乎与原始数据的正确/错误不匹配、所以 IRQ 状态似乎不可信、所以我有一个问题、希望有一个更好的位置来打印状态。

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

    Q4: 此问题是否与高速缓存 一致性有关?  如果我想禁用缓存只是为了尝试用于帧的 DMA 缓冲区、您能不能请我怎么做?

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

    尊敬的 David:

    感谢您通过单 Vc/dt 进行修改和执行测试。

    >所以完全捕获了5000帧,有3帧原始数据不匹配。  

    我的理解是否正确、即修改后、错误仍然存在、但错误显著减少了-因此现在您只能看到校验和不匹配的3/5000帧?

    > Q1:为什么 LP_clk_rate 为0Hz?
    > Q2:如果我想更改 hs_settle ,我该怎么做? 您能告诉我执行此操作的正确位置在哪里吗?

    在 Linux 中、当我们调用 phy 框架时、 get_default_config_for_hsclk () cdns-csi2rx.c
    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/media/platform/cadence/cdns-csi2rx.c?h=ti-linux-6.1.y#n281

    在该框架计算的所有参数中、 cdns-dphy-rx.c 驱动程序仅使用以下两个参数对硬件进行编程:
    1. HS_clk_rate
    2.通道

    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/phy/cadence/cdns-dphy-rx.c?h=ti-linux-6.1.y#n168

    因此、我的理解是您可以忽略 lp_clk_rate HS_SETTLE 因为它们不用于对 DPHY-RX 寄存器中的任何内容进行编程。

    >问题3:您能否帮助您再次确认:在 drivers\media\platform\cadences\cdns-csi2rx.c 的 csi2rx_stop()开始处,这是否是打印这些状态的正确位置? (根据我在 Qualcomm 和 Rockchip 平台上的工作经验、这些状态通常在某个 IRQ 处理函数的开始处进行检查。) 在当前平台上、我似乎总是(90%)看到 CSI2RX_DPHY_ERROR_IRQ 的第4-7位有一些错误、但大多数情况下、原始数据是正确的、原始数据有错误的几率仅小于30%。 目前、IRQ_STATUS 似乎与原始数据的正确/错误不匹配、所以 IRQ 状态似乎不可信、所以我有一个问题、希望有一个更好的位置来打印状态。

    最佳位置是在为 CSI RX INTD 模块描述的各种 IRQ 的 IRQ 处理程序中。 但目前尚不支持这些功能的驱动程序。 在 TRM 的"CSI_RX_IF 中断事件"部分中对此进行了介绍。

    在我看来、在流正在运行时直接从用户空间检查寄存器会更简单。 这可以使用 devmem2或通过/dev/mem 器件映射物理存储器的类似工具来完成。

    Q4: 此问题是否与高速缓存 一致性有关?  如果我想禁用缓存只是为了尝试用于帧的 DMA 缓冲区、您能不能请我怎么做?

    我不确定是否确实需要禁用缓存-无论如何、我都不知道直接如何禁用 A53缓存 https://stackoverflow.com/questions/41227527/disable-cpu-caches-l1-l2-on-armv8-a-linux

    此问题最有可能出现在以下情况之一:
    1.传感器硬件发送不完整的数据或某些帧上的早期 EOF
    2.传感器驱动程序错误
    3.空缓冲区未及时从用户空间排队时出现时序问题,导致短帧 DMA 错误。

    鉴于它始终以512字节发生、我不确定随机短帧(3)是否会导致这种情况。

    您是否在其他(非 AM62A)平台上测试了相同的传感器和驱动器? 该512字节问题是否会在任何其他平台上发生?


    谢谢。
    Jai

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

    今天、我更改了 dToF 传感器的寄存器配置、以便仅输出1个流(禁用 VC1、仅保留 vc0。 并启用一种数据类型将40x1用户数据组合到主流的末尾),我使用"media-ctl" utils 将第一个流(vc0)映射到 video3 (rx3), 然后尝试捕获原始数据,使用以下脚本, 每次捕获100帧,重复50次,所以总共捕获5000帧,有 8帧原始数据不匹配。  不正确的原始文件与之前相同:只有前512个字节具有正确的数据、剩余的为0x00。

    ---------------- 脚本-------------------------------------------------------

    #!/bin/bash
    
    export TZ=Asia/Shanghai
    
    EXPECTED_MD5="6471076892740e3a2aab7206a01869c4"
    FILESIZE=1032192
    
    insmod ads6311.ko
    echo 0x1028 > /sys/kernel/debug/adaps/dbg_ctrl
    
    echo 0xff > /sys/class/video4linux/video0/dev_debug
    echo 0xff > /sys/class/video4linux/video1/dev_debug
    echo 0xff > /sys/class/video4linux/video2/dev_debug
    echo 0xff > /sys/class/video4linux/video3/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev0/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev1/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev2/dev_debug
    
    media-ctl -d /dev/media0 -R "'cdns_csi2rx.30101000.csi-bridge' [0/0 -> 1/0 [1]]"
    
    # map the first stream to video3(rx3)
    media-ctl -d /dev/media0 -R "'30102000.ticsi2rx' [0/0 -> 4/0 [1]]"
    
    media-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/0 [fmt:SBGGR12_1X12/2688x193]'
    
    if [ -n "$1" ]; then
          times=$1
       else
          times=1
    fi
    
    for (( i=1; i <= $times; i++ ))
    do
        echo
        echo "-----TEST TIMES: $i/$times------"
        FILENAME="Video3_SBGGR12_1X12_VC0_$(date +%s)_Test$i.raw12"
        TMP_FILE="/tmp/$FILENAME"
    
        v4l2-ctl --verbose -d /dev/video3 --set-fmt-video=width=2688,height=193,pixelformat='BG12' --stream-mmap=6 --stream-skip=1 --stream-to=$TMP_FILE --stream-count=1 --stream-poll > v4l2_ctl_video3.log 2>v4l2_ctl_video3_error.log
        OUTPUT=$(MD5Calculator $TMP_FILE $FILESIZE)
        echo $OUTPUT
        ACTUAL_MD5=$(echo $OUTPUT | awk '{print $NF}')
        if [ "$ACTUAL_MD5" == "$EXPECTED_MD5" ]; then
            echo "MD5 matched. Deleting $TMP_FILE..."
            rm -f "$TMP_FILE"
        else
            echo "MD5 did not match. File will be kept."
        fi
    done
    
    echo "-----------$times times test done, please check the log file for result-----------"
    
    

    ---------------- 日志-------------------------------------------------------

    e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240315_5F00_205156_5F005F00_MIPI_5F00_TX_5F00_1Stream.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的理解是正确的,在修改后错误仍然存在,但它们减少了很多-所以现在您只看到3/5000帧校验和不匹配?

    我想我不能说它现在减少了很多。

    鉴于它总是以512字节发生,我不确定随机的短帧(3)是否会导致这种情况。

    您是否在其他(非 AM62A)平台上测试了相同的传感器和驱动器? 该512字节问题是否会在任何其他平台上发生? [/报价]

    512个字节不应是短帧、因为在启用测试模式时、它们与我们的测试模式数据匹配。

    我们将传感器应用在 rk3568上将近一年。  最近我在 rk3568平台上测试了我的驱动程序代码和测试应用程序('hawk_conquency_test')来再次确认它是可以的或者不是很多次,它运行良好,没有原始数据(MD5)不匹配问题。

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

    尊敬的 David:

    您能否为应用中的每一帧获取 CSI 寄存器转储、并从/dev/mem?读取它们? devmem2是一个已实现此功能的示例工具: https://github.com/radii/devmem2/blob/master/devmem2.c


    这将帮助我们比较在发生512字节帧问题时 Cadence CSI-RX 控制器是否存在任何不同的错误。

    > 3. 缓冲区空时的时序问题未及时从用户空间排队、导致短帧 DMA 错误。


    要排除第3点、请在驱动程序上应用这两个补丁、以便任何 DMA 错误也打印在控制台上。

    e2e.ti.com/.../0001_2D00_dmaengine_2D00_ti_2D00_k3_2D00_udma_2D00_Report_2D00_short_2D00_packet_2D00_errors.patche2e.ti.com/.../0001_2D00_HACK_2D00_media_2D00_ti_2D00_csi2rx_2D00_Report_2D00_error_2D00_for_2D00_short_2D00_frames.patch

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

    尊敬的 Jai:

      根据您的建议,我使用了 gst-launch-1.0 -v v4l2src num-buffers=500 device=/dev/video3 io-mode=dmabuf ! video/x-bayer,宽度=2688,高度=193,帧速率=30/1,格式=bggr12! multifilesink location="ads6311-image-%d.raw12"要在我的单流式传感器驱动程序上捕获500帧,测试结果看起来不错。 它看起来与之前有两个不同之处:

    应用程序实用程序之前我使用了 v4l2-ctl 和定制开发的 hawk_concurrent_test、 而昨天我使用了 gst-launch-1.0工具。  我没有阅读过  gst-launch-1.0的源代码、您知道 v4l2-ctl 和 gst-launch-1.0之间的真实差异吗?

    2.我注意到命令行参数"io-mode=dmabuf",而我们在 我 定制开发的 hawk_concurrent_test 中使用了"map"类型。  这可能是这个问题的一个关键因素。  但是、 如果我将 GST-LAUNCH-1.0命令行的"IO-MODE=dmabuf"更改为"IO-MODE=mmap"、则不起作用、并出现错误"Unable to setup format: invalues (22)"。  您?知道"mabuff"和"map"之间的区别是什么

    enum v4l2_memory{
    V4L2_MEMORY_MMAP = 1、
    VOL2_MEMORY_USERPTR = 2、
    V4L2_MEMORY_OVERLAY = 3、
    V4L2_MEMORY_DMABUF = 4、
    };

    此致、

    大卫

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

    尊敬的 Jai:

      一些状态更新:

      在使用 相同的传感器驱动程序(当前仅限单流)的情况下、我使用了 gst-launch-1.0和 v4l2-ctl 来捕获一些帧、看起来像是 gst-launch-1.0 (我尝试从命令行中删除"io-mode=dmabuff"关键字、 但它仍然运行良好)始终通过检查 MD5值来获取正确的原始数据、而 v4l2-ctl 有机会捕获错误的原始数据、我认为这与我的 hawk_concurrent_test 相同。

      您能帮助找出真正的差异并找到解决方案吗?  

    ---------------- 测试脚本:capture_with_gst_laugh_0319d.sh-->        //如果选择 gst-launch-1.0,则运行良好,但如果选择 v4l2-ctl,则为 ng。

    #!/bin/bash
    
    export TZ=Asia/Shanghai
    
    EXPECTED_MD5="6471076892740e3a2aab7206a01869c4"
    # when one_datatype_enable, the user data (original datatype=0x30, whose resolution is 40x1) will be
    # added at the end of main stream frame, and since the user data has some variable field such as frame
    # number, so the user data is changed by frame, so I'll check the main stream data for md5 value calculation,
    # for the current test mode(FHR), it is 1032192 bytes long.
    FILESIZE=1032192
    
    if [ -n "$1" ]; then
          times=$1
       else
          times=1
    fi
    
    if [ -n "$2" ]; then
          ctool=$2
       else
          ctool=v4l2ctl
    fi
    
    if [ -n "$3" ]; then
          drvFlag=$3
       else
          drvFlag=0x1028
    fi
    
    insmod ads6311.ko
    echo $drvFlag > /sys/kernel/debug/adaps/dbg_ctrl
    
    echo 0xff > /sys/class/video4linux/video0/dev_debug
    echo 0xff > /sys/class/video4linux/video1/dev_debug
    echo 0xff > /sys/class/video4linux/video2/dev_debug
    echo 0xff > /sys/class/video4linux/video3/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev0/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev1/dev_debug
    echo 0xff > /sys/class/video4linux/v4l-subdev2/dev_debug
    
    media-ctl -d /dev/media0 -R "'cdns_csi2rx.30101000.csi-bridge' [0/0 -> 1/0 [1]]"
    
    # map the first stream to video0(rx0)
    media-ctl -d /dev/media0 -R "'30102000.ticsi2rx' [0/0 -> 1/0 [1]]"
    
    media-ctl -d /dev/media0 --set-v4l2 '"m00_dToF_ads6311 spi1.0":0/0 [fmt:SBGGR12_1X12/2688x193]'
    
    
    for (( i=1; i <= $times; i++ ))
    do
        echo
        echo "-----TEST TIMES: $i/$times------"
        FILENAME="${ctool}_SBGGR12_1X12_one_stream_$(date +%s)_Test$i.raw12"
        TMP_FILE="/tmp/$FILENAME"
    
        if [ "v4l2ctl" == $ctool ]; then
            v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=2688,height=193,pixelformat='BG12' --stream-mmap=6 --stream-skip=1 --stream-to=$TMP_FILE --stream-count=1 --stream-poll > v4l2_ctl_video3.log 2>v4l2_ctl_video3_error.log
        else
            gst-launch-1.0 -v v4l2src num-buffers=1 device=/dev/video0  ! video/x-bayer, width=2688, height=193, format=bggr12 ! multifilesink location=$TMP_FILE
        fi
    
        OUTPUT=$(MD5Calculator $TMP_FILE $FILESIZE)
        echo $OUTPUT
        ACTUAL_MD5=$(echo $OUTPUT | awk '{print $NF}')
        if [ "$ACTUAL_MD5" == "$EXPECTED_MD5" ]; then
            echo "MD5 matched. Deleting $TMP_FILE..."
            rm -f "$TMP_FILE"
        else
            echo "MD5 did not match. File will be kept, test exiting..."
            break;
        fi
    done
    
    echo "-----------$i/$times times test done, please check the log file for result-----------"
    

    ---------------- Log file (日志文件)-------------------------------------------------------

    e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240319_5F00_105506_5F00_gst_2D00_launch_2D00_Okay_5F00_v4l2_2D00_ctl_5F00_NG.txt

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

    尊敬的 Jai:

      19年3月的第二次状态更新:

      1.我修改了 drivers\media\common\videbuf2\videbuf2-v4l2.c 的代码,以查看 VIDIOC_REQBFs 的参数。  

      然后、我使用 与 gst-launch-1.0和 v4l2-ctl utils 相同的.ko 驱动程序对其进行了测试、我看到了如下输出。 前5行适用于 GST-LAUNCH-1.0、这不存在 MD5不匹配问题、而最后2行适用于 v4l2-ctl、这存在一定的 MD5不匹配问题。

      我不知道为什么在 GST-LAUNCH-1.0开始时有3个 count = 0且 memory = 1/2/4的请求?  是尝试清除一些缓冲器吗?  对于 v4l2-ctl 来说,没有这样的请求,我不知道这是一个值得怀疑的问题吗?

      2.在  控制台上打印出任何 DMA 错误的两个补丁后,我使用相同的.ko 驱动程序进行了测试,当我使用 v4l2-ctl 进行测试时,有 一些 DMA 传输错误被报告,而 gst-launch-1.0没有这样的错误。  

    有关详细信息、请参阅随附的日志文件。   e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240319_5F00_151229.txt

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

      3月19日的第三次状态更新:

    我使用具有4流(2 VC * 2数据类型)支持和 GST-LAUNCH-1.0的最新 dToF 传感器驱动程序来使用以下命令行捕获2个主流、我仍然看到一些 DMA 传输错误以及一些 MD5不匹配。 看起来 MD5错误与 DMA 传输错误有关。

    gst-launch-1.0 -v \
    v4l2src num-buffers=100 device=/dev/video0 io-mode=dmabuf! video/x-bayer,宽度=2688,高度=192,帧速率=30/1,格式=bggr12! 队列泄漏=2! \
    多文件链接位置="ads6311-video0-%d.raw"\
    v4l2src num-buffers=100 device=/dev/video1 io-mode=dmabuf! video/x-bayer,宽度=2688,高度=192,帧速率=30/1,格式=bggr12! 队列泄漏=2! \
    多文件链接位置="ads6311-video1-%d.raw"

    请参阅随附的日志文件了解详细信息、请帮助您找到 DMA 传输错误的根本原因并进行修复。 这可能是这个问题的关键。

    DMA 传输失败、retval=3、残留=0

    e2e.ti.com/.../MobaXterm_5F00_TI_5F00_SoC_5F00_Uart_5F00_20240319_5F00_174753.txt

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

    尊敬的 David:

    感谢 GST 启动过程中作出的详细响应和进行的测试以缩小问题范围。

    >您知道"mabuff"和"map"之间的区别吗?

    两者都分配了 DMA 可以访问的内存、但对于 MMAP、内存只能在驱动程序和用户空间之间共享。 在 DMABUF 模式下、同一缓冲器可与管线中的另外一个外设(如显示或编解码器)共享

    在您的案例中、我认为这不是问题的根源、因为 GST-LAUNCH 即使在稍后进行测试的 mmap 模式下也运行良好。

    >在我应用你的 两个补丁 的任何 DMA 错误被打印在控制台上,我测试了相同的.ko 驱动程序,当我测试 v4l2-ctl 时,有 一些 DMA 传输错误被报告,而没有这样的错误与 gst-launch-1.0

    谢谢、这有助于我们准确地缩小问题范围。

    DMA 错误意味着在将帧数据从 CSI-RX 端口复制到 DDR 时 DMA 引擎报告了短帧/短数据包错误。 即、如果您请求的是 N 个字节、则只有< N 个字节可用、因此传输会突然结束。 这就是为什么缓冲区中数据丢失的原因、但我仍然不知道为什么数据始终恰好是512字节。

    当用户空间应用程序在空缓冲区排队较晚时、会发生这些短帧错误、因此摄像机不会停止流式传输、但空缓冲区不可用于获取该数据。 这个时序相匹配非常关键、而且 v4l2-ctl/hawk 应用程序可能在那里发生故障、但 GST-Launch 能够做到更好。

    我们已经在 CICD SDK 版本(以及即将发布的9.2 SDK 版本)中的 CSI 驱动程序中进行了一些优化、这修复了我们使用 gstreamer 的多摄像头流水线看到的这些 DMA 错误。 我希望相同的优化也能帮助您的应用。

    请在 ti-linux-6.1.y 中使用这两次提交、它们作为 CICD SDK 映像的一部分提供、或者您也可以手动在当前 SDK 中应用补丁:

    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/drivers/media/platform/ti/j721e-csi2rx?h=ti-linux-6.1.y-cicd&id=b93eb4cf5ccbf51c275510678e79198ad7540bd5
    https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/drivers/media/platform/ti/j721e-csi2rx?h=ti-linux-6.1.y-cicd&id=d23b3d303a07057885900044db53102bd746703a

    如果 DMA 错误不会因这些驱动程序优化而消失、那么唯一的选择就是优化应用程序代码本身以及使用的缓冲区数量。

    谢谢。
    Jai

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

    尊敬的 Jai:

      我应用了两个补丁并进行了测试、这个错误仍然存在。  从我的测试中可以看出、即使我看到"Failed DMA transfer retval=3, req=0"、数据有时也可能是正确的。  请继续寻找更好的解决方案。  我将在今天晚些时候更新更多信息。

    此致、

    大卫

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

    大家好,

    3月20日更新

    1.修改测试应用程序:

    已修改测试应用程序"hawk_concurrent_test"。
    如果缓冲区的最后16个字节全部为0被视为无效、则执行快速检查方法、而不是在接收完帧后将其保存到文件。
    这旨在减少应用程序的使用时间。
    保存1M 帧缓冲区大约需要18-30ms、而上述快速检查方法只需要1-2us。

    2.日志优化:

    将尽可能禁用应用层和驱动程序层的日志。
    仅保留错误和重要的提示信息以减少资源消耗。

    3.修补应用程序:

    应用了由 TI 研发工程师 Jai 提供的2个补丁来改进 DMA 提交流程。

    4.测试结果:

    完成上述工作后、误差率在一定程度上得到了降低。
    测试1000帧时可能没有错误、但测试10000帧时可能有一些错误。

    摘要:

    从当前的角度来看、TI 驱动程序(MIPI 驱动程序?) 过于依赖应用程序的状态调度、对应用程序使用时间过于敏感。
    在软件架构或实施方面可能有改进的余地。 请帮助改进它。 谢谢

    在实际使用中、不可能像前面提到的快速检查那样快、每个 MIPI 帧只需要1-2us。
    我们的 dToF 数据解码算法处理仍然需要相当长的时间。

    BTW、当我遇到原始数据不匹配问题时、我经常看到"dma 传输失败、retval=3、retq=0"。 但有时我看到"dma 传输失败、retval=3、return=0" 1-2次、但原始数据文件可能是正确的(捕获帧计数为10)。  它看起来错误日志并不总是匹配原始数据 积分,你会帮助检查原因吗?

    此致、

    大卫

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

    继续在 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1341669/am62a7-q1-accessing-dmabuf-takes-too-long 进行讨论。

    我将关闭该主题。