完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我正在使用 imx8mp 开发板,在 CSI 接口上插入了一个简单的 MIPI 摄像头模块。它运行良好,并使用 gstreamer 和 v4l2src 按预期流式传输视频。
我一直在尝试 glTexDirectVIVMap,如 i.MX_Graphics_User 中所述s_Guide.pdf在我自己的程序中,它只需打开 ISI 摄像头接口(比如 /dev/video3),配置它,通过 ioctl VIDIOC_QUERYBUF 获取 4 个缓冲区,然后像这样 mmap 它们: void *data = mmap( NULL, buffer.m.planes[0].length, PROT_READ | PROT_WRITE, MAP_SHARED, _cameraFD, buffer.m.planes[0].m.mem_offset ); 然后,缓冲区与 VIDIOC_QBUF 一起排队,然后在处理帧接收的线程中排队,准备就绪时取消排队,并为使用 glTexDirectVIVMap 的渲染线程留出空间,以便将所述缓冲区映射到给定的 openGL 纹理 ID。 我在 glTexDirectVIVMap 之后立即调用“glTexDirectinvalidateVIV”,以便在 GL 端更新引用(如果我正确理解了它的作用)。 然后完成渲染,当另一个就绪帧被搁置时,我们调用 glTexDirectVIVMap、glTexDirectInvalidateVIV,并释放前一个帧,该帧将重新排队用于 v4l2。 void CameraPreview::updateTexture(){ static GLvoid **buffer = (GLvoid **)aligned_alloc(64, 8 * (sizeof(GLvoid *))); // Buffer and pointers needs to be 64 bits aligned memset(buffer,0, 8 * sizeof(GLvoid *)); buffer[0] = _camDevice.getBuffer(); if (buffer[0]) { uint32_t physicalBufferAddress = _camDevice.getPhysicalBufferAddress(); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _camTextureID); // =============UGLY BUT NOTHING BETTER AS IT CRASH IF USING THE ISI BUFFER DIRECTLY... // static void *thisIsUgly = aligned_alloc(64, 1280*1024*2); // memcpy(thisIsUgly, buffer[0], 1280*1024*2); // physicalBufferAddress = ~0U; //====================================================================== glTexDirectVIVMap(GL_TEXTURE_2D, _camResW, _camResH, GL_VIV_YUY2, (GLvoid **)buffer, physicalBufferAddress); //glTexDirectVIVMap(GL_TEXTURE_2D, _camResW, _camResH, GL_VIV_YUY2, (GLvoid **) thisIsUgly, physicalBufferAddress); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexDirectInvalidateVIV(GL_TEXTURE_2D); if (_camDevice.getHeldBuffersCount() > 1) { _camDevice.releaseBuffer(); // If we're tied to a previous buffer, liberate it } }} 可能不是最好的代码,它只是一个测试/示例。 它会导致内核崩溃并显示“AXI BUS ERROR”,尽管缓冲区据说没有在其他地方使用。我已将其从 V4L2 中出队,将其映射到 GL 纹理以供 GPU 直接访问,仅此而已。 [15256.493410] AXI BUS ERROR[15256.596880] **************************[15256.600650] *** GPU DRV CONFIG ***[15256.604415] **************************[15256.608185] Galcore version 6.4.3.398061[15256.612131] Galcore options:[15256.615019] irqLine = 83[15256.618612] registerMemBase = 0x38000000[15256.622892] registerMemSize = 0x00008000[15256.627178] irqLine2D = 84[15256.630760] registerMemBase2D = 0x38008000[15256.635040] registerMemSize2D = 0x00008000[15256.639318] contiguousSize = 0x10000000[15256.643596] contiguousBase = 0x0[15256.647257] externalSize = 0x00000000[15256.651535] externalBase = 0x0[15256.655195] bankSize = 0x00000000[15256.659475] fastClear = -1[15256.663048] compression = 15[15256.666631] powerManagement = 1[15256.670134] baseAddress = 0x40000000[15256.674417] physSize = 0xC0000000[15256.678694] recovery = 0[15256.682189] stuckDump = 0[15256.685683] userClusterMask = 0x0[15256.689399] GPU smallBatch = 1[15256.692992] allMapInOne = 1[15256.696538] mmuException = 1[15256.700046] irqs = [15256.700050] 83, [15256.703459] 85, [15256.705295] -1, [15256.707132] -1, [15256.708982] -1, [15256.710821] -1, [15256.712673] -1, [15256.714510] -1, [15256.716359] 84, [15256.718197] -1, [15256.723371] registerBases = [15256.723390] 0x38000000, [15256.726797] 0x38500000, [15256.729343] 0x00000000, [...] 如果您查看我之前粘贴的源代码,就会发现有注释行创建了一个虚拟缓冲区(在 64 位上对齐),在该缓冲区中,我复制了从 v4l2 获取的缓冲区的内容,然后使用 glTexDirectVIVMap 将其映射到纹理,它工作得非常完美。当然,我想避免每次获得新帧时都对整个帧进行不必要的 memcpy...... 所以我有点困惑。看起来我能找到的所有使用 glTexDirectVIVMap 的示例和来源,显然有些地方不对劲。是否有人有相同或类似的问题,并且可以阐明发生了什么? 谢谢! |
|
相关推荐
1个回答
|
|
|
根据你的描述,问题可能出在物理内存地址对齐或缓存一致性上。以下是逐步解决方案: 1. 检查物理内存地址对齐GPU(如Vivante)要求纹理内存按特定字节对齐(通常64字节或更高)。通过以下步骤验证: 若不对齐,需在分配缓冲区时指定对齐: 2. 确保缓存一致性DMA缓冲区需正确同步缓存: 3. 正确传递物理地址到glTexDirectVIVMap确保使用DMA缓冲区的物理地址而非虚拟地址: 4. 验证纹理参数确保纹理格式与摄像头数据匹配:
5. 使用DMA-BUF代替mmap避免直接使用 6. 参考官方示例查阅i.MX SDK中的 7. 调试工具
总结多数情况下,AXI总线错误由以下原因引起:
通过逐步检查以上各点,应能定位并解决问题。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
2135个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
37383 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
6786 浏览 1 评论
7804 浏览 1 评论
7652 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
5077 浏览 0 评论
1566浏览 2评论
关于NINA-W132 Wi-Fi模块SPI通信遇到的疑问求解
1214浏览 2评论
如何在MPC PowerPC MCU上首次刷写后禁用BDM?
753浏览 1评论
将HFREFR和LFREFR寄存器值设置为错误的值来将故障注入CMU,但CMU_ISR值始终为零,为什么?
740浏览 1评论
将SPSDK for FRDM-MCX-W71 SDK与VS一起安装时出现hidapi构建错误怎么解决?
688浏览 1评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-4 09:59 , Processed in 0.536306 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1505