Toybrick

楼主: MadDog

RK3588 HDMI 采集问题

MadDog

中级会员

积分
402
11#
 楼主| 发表于 2022-12-19 13:45:41 | 只看该作者
jefferyzhang 发表于 2022-12-19 13:06
你板子hdmiin有能用过么?是toybrick的板子么?我建议你先确认hdmiin是正常的,并且kernel和驱动是正确的 ...

能用,通过Qt V4L2 test Utility能够打开HDMI IN, 看见图像,但是帧率很低

系统启动的时候:

root@RK3588:/# dmesg | grep "hdmirx"
[    2.497774] rk_hdmirx fdee0000.hdmirx-controller: No reserved memory for HDMIRX, use default CMA
[    2.498575] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_probe: cpu_aff:0x400, Bound_cpu:4, wdt_cfg_bound_cpu:5
[    2.499950] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_audio_interrupts_setup: 0
[    2.501594] rk_hdmirx fdee0000.hdmirx-controller: rk_hdmirx_hdcp_register success
[    2.502299] rk_hdmirx fdee0000.hdmirx-controller: fdee0000.hdmirx-controller driver probe ok!
[    3.250301] rockchip-dmc dmc: hdmirx_rate = 2112000000
[    4.753210] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_audio_interrupts_setup: 1
[    5.148154] fdee0000.hdmirx-controller: hdmirx_wait_lock_and_get_timing signal lock ok, i:51!
[    5.214575] fdee0000.hdmirx-controller: Vertical Sync threshold reached interrupt 0x2
[    5.429120] fdee0000.hdmirx-controller: hdmirx_format_change: New format: 3840x2160p30.00 (4400x2250)
[    5.735924] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_delayed_work_audio: enable audio
[    5.736646] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_delayed_work_audio: restart audio fs(44100 -> 48000) ch(0 -> 1)
[    5.737612] rk_hdmirx fdee0000.hdmirx-controller: hdmirx_audio_fifo_init
[    5.939257] rk_hdmirx fdee0000.hdmirx-controller: audio on
root@RK3588:/# dmesg | grep "CMA"
[    0.806170] Reserved memory: created CMA memory pool at 0x0000000010000000, size 512 MiB
[    2.497774] rk_hdmirx fdee0000.hdmirx-controller: No reserved memory for HDMIRX, use default CMA
root@RK3588:/#
回复

使用道具 举报

jefferyzhang

版主

积分
14727
12#
发表于 2022-12-19 16:51:08 | 只看该作者
对了,还有你DMA的buffer必须是CMA的
回复

使用道具 举报

qianyun

新手上路

积分
32
13#
发表于 2023-3-15 16:31:56 | 只看该作者
请问有解决么,我这边用rk3588 hdmirx进行dma方式取数据也出现了一样的错误~但是采用mmap方式写成文件是能够取到视频数据(1080P)的
回复

使用道具 举报

MadDog

中级会员

积分
402
14#
 楼主| 发表于 2023-3-27 16:48:33 | 只看该作者
qianyun 发表于 2023-3-15 16:31
请问有解决么,我这边用rk3588 hdmirx进行dma方式取数据也出现了一样的错误~但是采用mmap方式写成文件是能 ...

解决了,关键是分配dma内存的时候,必须是CMA的
回复

使用道具 举报

qianyun

新手上路

积分
32
15#
发表于 2023-3-29 20:34:45 | 只看该作者
MadDog 发表于 2023-3-27 16:48
解决了,关键是分配dma内存的时候,必须是CMA的

请问一下分配dma内存是申请drm内存时候来指定CMA的吗,也就是应用层修改的意思?
回复

使用道具 举报

qianyun

新手上路

积分
32
16#
发表于 2023-3-29 20:35:47 | 只看该作者
MadDog 发表于 2023-3-27 16:48
解决了,关键是分配dma内存的时候,必须是CMA的

还是说需要修改驱动代码
回复

使用道具 举报

caiwei

新手上路

积分
8
17#
发表于 2025-3-27 19:01:57 | 只看该作者
MadDog 发表于 2023-3-27 16:48
解决了,关键是分配dma内存的时候,必须是CMA的

分配dma内存时,如何设置成CMA的
回复

使用道具 举报

jefferyzhang

版主

积分
14727
18#
发表于 2025-3-28 08:54:14 | 只看该作者
caiwei 发表于 2025-3-27 19:01
分配dma内存时,如何设置成CMA的

CMA是物理连续内存,硬件访问如果没有mmu支持就只能用物理连续的内存,通过物理地址传递。
基础用法问题请自行百度,应用层开发者建议你不要折腾这个,连续内存在释放重新分配时候很可能因为内存的碎片化而失败,建议用mmap方式。
回复

使用道具 举报

caiwei

新手上路

积分
8
19#
发表于 2025-3-28 09:28:22 | 只看该作者
jefferyzhang 发表于 2025-3-28 08:54
CMA是物理连续内存,硬件访问如果没有mmu支持就只能用物理连续的内存,通过物理地址传递。
基础用法问题 ...

好的,我改用mmap方式看看能不能正常预览
回复

使用道具 举报

EP_

新手上路

积分
14
20#
发表于 2025-4-15 08:58:03 | 只看该作者
3588里面如果dma拿到的内存是cma的,得修改这个
+++ b/kernel/dma/direct.c
@@ -165,11 +165,11 @@ void *dma_direct_alloc(struct device *dev, size_t size,
         * Remapping or decrypting memory may block. If either is required and
         * we can't block, allocate the memory from the atomic pools.
         */
-       if (IS_ENABLED(CONFIG_DMA_COHERENT_POOL) &&
-           !gfpflags_allow_blocking(gfp) &&
-           (force_dma_unencrypted(dev) ||
-            (IS_ENABLED(CONFIG_DMA_DIRECT_REMAP) && !dev_is_dma_coherent(dev))))
-               return dma_direct_alloc_from_pool(dev, size, dma_handle, gfp);
+       // if (IS_ENABLED(CONFIG_DMA_COHERENT_POOL) &&
+       //     !gfpflags_allow_blocking(gfp) &&
+       //     (force_dma_unencrypted(dev) ||
+       //      (IS_ENABLED(CONFIG_DMA_DIRECT_REMAP) && !dev_is_dma_coherent(dev))))
+       //      return dma_direct_alloc_from_pool(dev, size, dma_handle, gfp);

        /* we always manually zero the memory once we are done */
        page = __dma_direct_alloc_pages(dev, size, gfp & ~__GFP_ZERO);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表