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.

[参考译文] Linux/AM5728:双摄像头演示和 CMEM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/659808/linux-am5728-dual-camera-demo-and-cmem

器件型号:AM5728

工具/软件:Linux

您好!  

我使用:make dual-camera-demo 在 sdk4.2.0.9的 topdir 中重新编译双摄像机演示

我将 loopback.c 中的"default_parameters"更改为我们自己的器件:

/*主摄像头*/
cap0_device.memory_mode = V4L2_memory_DMABUF;
cap0_device.num_pbuffers = NBUF;
strcpy (cap0_device.dev_name,"/dev/video2");
strcpy (cap0_device.name,"Capture 0");
cap0_device.buffers =空;
cap0_device.fmt.fmt.pix.pixelformat = V4L2_PI_FMT_YUV;
cap0_device.width = 1920;
cap0_device.height = 1080;

然后 取消注释"#define USE_CMEM_BUF"以将帧捕获到.jpeg。

它显示正常。但当我尝试单击"捕获"时、应用程序将崩溃:

root@am57xx-evm:/opt#./dual_camera-platform linuxfb
CRTC 大小:1920x1080

捕捉0:打开的通道

捕捉0:能够流式传输

捕捉0:初始化成功完成


分配大小为0x3f4800的 cmem 缓冲区
分配大小为0x3f4800的 cmem 缓冲区

捕捉1:打开的通道

捕捉1:能够流式传输

VIDIoc_G_parm:器件的 ioctl 不合适
分配大小为0x3f4800的 cmem 缓冲区仅检测到一个摄像头
在 am57xx 处理器上运行演示
W=1920、H=1080
//单击此处的“捕获”
分段故障(转储内核)

 /usr/share/camera-images 中有一个 image0.jpg,但不能存储任何内容。

我尝试从 cmem 指针"buf->cmem"中读取 buf。cmem 中仍然没有任何内容。

我们渴望 使用 cmem 快速从 V4L2读取图片、然后显示所需图片。  

但我们无法在本演示中阅读图片。请帮助我们。

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我发现这个问题发生在 cmem_buf.c 中的"alloc_cmem_buffer"
    当外显时:
    CMEM_EXPORT_dmabuf (cmem_buf);
    "cmem_buf"将返回到0。为什么会发生这种情况?
    功能:
    cmem_buf = CMEM_LOCAT2 (CMEM_BLOCKID、大小、&cmem_alloc_params);
    已经为我已检查的 cmem_buf 分配了一个 cmem_buf。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    int alloc_cmem_buffer (unsigned int size、unsigned int align、void * cmem_buf)

    cmem_alloc_params.alignment =对齐;

    printf ("\n 分配大小为0x%x"的 cmem 缓冲区、大小);

    cmem_buf = CMEM_LOCAT2 (CMEM_BLOCKID、大小、
    cmem_alloc_params (&C);

    if (cmem_buf = NULL){
    printf ("CMEM 分配失败");
    返回-1;


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

    大家好、dual_camera_demo cmem 缓冲区分配中存在已知的错误、下一个 Processor SDK 版本将对此进行处理。   alloc_cmem_buffer()函数调用需要将指针传递到缓冲区地址,在该函数内,该值需要存储为  *cmem_buf

    buf->fd[0] = alloc_cmem_buffer (w*h*bytes_pp,1,&buf->cmem_buf);

    *cmem_buf = CMEM_LOCAT2 (CMEM_BLOCKID、大小、&cmem_alloc_params);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    谢谢,还有另一条关于 alloc_cmem_buffer()的建议,"void *cmem_buf"需要为"unsigned int *cmem_buf"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CMEM_LOCAT2 () API 返回 void *、因此可以返回 void *、该应用程序可以将该应用程序分配给他们希望作为其使用缓冲区的类型。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复。

    发生了另一个问题。

    我尝试在 am57xx-evm-cmem.dtsi 中创建新的 cmem 块

    /{
    保留存储器{
    #address-cells =<2>;
    大小单元格=<2>;
    范围;

    cmem_block_mem_0:cmem_block_mem@a0000000{
    reg =<0x0 0xa0000000 0x0 0xc000000>;
    无地图;
    状态="正常";
    };

    cmem_block_mem_1_ocmc3:cmem_block_mem@40500000{
    REG =<0x0 0x40500000 0x0 0x100000>;
    无地图;
    状态="正常";
    };

    cmem_block_mem_2:cmem_block_mem@ac000000{
    reg =<0x0 0xac000000 0x0 0xc000000>;
    无地图;
    状态="正常";
    };

    };

    cmem{
    兼容="ti、cmem";
    #address-cells =<1>;
    #size-cells =<0>;

    #pool-size-cells =<2>;

    状态="正常";

    cmem_block_0:cmem_block@0{
    reg =<0>;
    memory-region =<&cmem_block_mem_0>;
    cmem-buf-pools=<1 0x0 0xc000000>;
    };

    cmem_block_1:cmem_block@1{
    reg =<1>;
    MEMORY 区域=<&cmem_block_mem_1_ocmc3>;
    };

    cmem_block_2:cmem_block@2{
    reg =<2>;
    memory-region =<&cmem_block_mem_2>;
    cmem-buf-pools=<1 0x0 0xc000000>;
    };


    };
    };

    0xac000000 ~ 0xb7ffff 是用于存储缓冲区的 cmem

    但是当我尝试更新 am57xx-beagle-x15.dtb 时 :

    root@am57xx-EVM:/opt# cat /proc/cmem

    块0:池0:1 bufs 大小0xc000000 (请求0xc000000)

    池0忙缓冲区:

    池0免费 bufs:
    ID 0:PHY 地址0xa0000000

    root@am57xx-EVM:~# cat /proc/iomem | grep CMEM
    40500000-405ffff:CMEM
    a0000000-abffff:CMEM
    ac000000-b7ffff:CMEM

    还是一个默认块?

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

    您好!

    您是否解决了这个 cmem 问题?我遇到了相同的问题、该问题是否能够在 am57xx-evm-cmem.dtsi 中创建一个新块?

    对这一点的任何见解都是很好的。

    谢谢、BR

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

    您好!

    我已经解决了。

    如果您使用:

    CMEM_AllocParams cmem_alloc_params ={

    CMEM_HEAP、/*类型*/

    CMEM_Cached、/*标志*/

    1 /*对齐*/

    };

    cmem_buf = CMEM_LOCAT2 (CMEM_BLOCKID、大小、

    cmem_alloc_params (&C);

    您将在 DDR 中自动获得一个 cmem。

    如果您设置  CMEM_POOL。

    您可以在 CMEM_LOCAT2()中选择一个 blockid

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您的回复。我已经在 am57xx-evm-cmem.dtsi 中创建了一个新块、但当我运行 dual_cam 演示时、分配仍然失败。您能告诉我如何设置 CMEM_pool?我应该在 DTS 文件或演示中进行其他更改吗?

    CMEM 错误:分配堆:ioctl CMEM_IOCALLOCHEPCACHED 失败:-1
    分配大小为0x3f4800CMEM 的 cmem 缓冲区失败
    CMEM 错误:Free:无法释放0
    无法导出 CMEM 缓冲区
    错误:get_vid_buffers_new:400:分配失败
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    下面是我关于 cmem 的旧主题:
    e2e.ti.com/.../660967
    这可能会对您有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    很抱歉再次中断 u。我已经检查了您的旧线程并添加了一个新块、现在我的问题是如何在 dual_cam 演示中选择此块、我发现它使用的是旧块而不是我的新块。
    root@am57xx-EVM:~# cat /proc/cmem

    块0:池0:1 bufs 大小0xf000000 (请求0xf000000)

    池0忙缓冲区:

    池0免费 bufs:
    ID 0:PHY 地址0xa0000000

    块1:池0:1 bufs 大小0xf000000 (请求0xf000000)

    池0忙缓冲区:

    池0免费 bufs:
    ID 0:PHY 地址0xaf000000
    真诚地感谢 BR
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我也试过 ti-mctd、同样的问题出现了、您是如何解决的?
    root@am57xx-EVM:~# ti-mctd
    [2040.531084] CMEMK 错误:ioctl:块1中没有可用的堆
    CMEM 错误:分配堆:ioctl CMEM_IOCALLOCHEPCACHED 失败:-1
    TIOCL 致命:无法从0xaf000000分配片上 CMEM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、bulabula_yan、
    问题迎刃而解、感谢您的帮助!