-
Notifications
You must be signed in to change notification settings - Fork 2
DMA_README
SweerItTer edited this page Feb 1, 2026
·
3 revisions
DMA 模块提供 DMA-BUF(Direct Memory Access Buffer)的管理功能,支持跨硬件模块的零拷贝数据传输。
| 类 | 文档 | 说明 |
|---|---|---|
DmaBuffer |
DmaBuffer | DMA-BUF 缓冲区 |
- 创建 DMA-BUF
- 导入现有 DMA-BUF
- 映射到用户空间
- 导出 fd 跨设备共享
- 跨硬件模块零拷贝
- fd 共享机制
- 引用计数管理
- 自动生命周期管理
- 引用计数
- RAII
// 创建 DMA-BUF
auto buffer = DmaBuffer::create(1920, 1080, DRM_FORMAT_NV12);
if (!buffer) {
fprintf(stderr, "Failed to create DMA-BUF\n");
}
// 获取 fd
int fd = buffer->fd();
// 获取 handle
uint32_t handle = buffer->handle();
// 获取尺寸
uint32_t width = buffer->width();
uint32_t height = buffer->height();// 导入现有 DMA-BUF
auto buffer = DmaBuffer::importFromFD(fd, width, height, format);
if (!buffer) {
fprintf(stderr, "Failed to import DMA-BUF\n");
}
// 注意: 导入的 fd 设计上不受 DmaBuffer 控制, 需要手动close// 映射 DMA-BUF
auto buffer = DmaBuffer::importFromFD(fd, width, height, format);
if (buffer) {
// 访问数据
uint8_t* data = buffer->map();
size_t size = buffer->size();
// 修改数据
memset(data, 0, size);
// 解除映射(RAII 析构时自动 unmap)
buffer->unmap();
}// 创建 DMA-BUF
auto buffer = DmaBuffer::create(1920, 1080, DRM_FORMAT_NV12);
auto width = buffer->width();
auto height = buffer->height();
// 传递给 V4L2
camera.setBuffer(buffer);
// 传递给 RGA
rga_process(buffer->fd(), width, height);
// 传递给 DRM
drm_display(buffer->fd(), width, height);// 创建 DMA-BUF
auto buffer = DmaBuffer::create(1920, 1080, DRM_FORMAT_NV12);
// 创建 SharedBufferState
auto shared_state = std::make_shared<SharedBufferState>(buffer->fd(), 2);
// 设置有效
shared_state->setValid(true);
// 传递给多个 Frame
Frame frame1(shared_state);
Frame frame2(shared_state); // 共享同一个 fd
// Frame 析构时,引用计数自动减少V4L2 → DMA-BUF → RGA → DMA-BUF → DRM
DmaBuffer → fd → 跨设备共享 → 引用计数管理
- DmaBuffer 内部使用互斥锁保护 drm-fd 操作
- DmaBuffer 本身为只读对象, 仅在创建时修改
- 内存访问时非线程安全(需要通过fence同步)
- 使用 DMA-BUF 实现零拷贝
- 使用引用计数管理生命周期
- 避免频繁创建和销毁 DMA-BUF
- 使用对象池管理 DMA-BUF
- 检查创建函数的返回值(失败时返回nullptr)
- 检查 fd 是否有效
- 处理内存分配失败
- fd 管理: fd 由 DmaBuffer 管理,不要手动关闭
- 映射/解映射: 使用完毕后要解除映射
- 生命周期: 使用 SharedBufferState 管理生命周期
- 线程安全: fd 可以跨线程共享
- 格式支持: 确保硬件支持对应的格式
- 对齐要求: 注意 DMA-BUF 的对齐要求
- 引用计数: 使用引用计数管理 fd 生命周期
- 内存限制: 注意 DMA-BUF 的内存使用
- v1.0 - 初始版本,支持基本 DMA-BUF 管理
主页
API 文档
DMA 模块
DRM 模块
- DRM 模块总览
- DeviceController - DRM 设备控制器
- DrmLayer - DRM 图层管理
- PlanesCompositor - DRM 平面合成器
- DrmBpp - DRM 格式定义
NET 模块
- NET 模块总览
- TcpServer - TCP 服务器
- SocketConnection - Socket 连接管理
- CommandHandler - 命令处理器
- DataPacket - 数据包
V4L2 模块
- V4L2 模块总览
- CameraController - V4L2 摄像头控制器
- Frame - V4L2 帧数据结构
- FormatTool - V4L2 格式工具
- Exception - V4L2 异常类
V4L2Param 模块
- V4L2Param 模块总览
- ParamControl - 参数控制
- ParamLogger - 参数日志
- ParamProcessor - 参数处理器
RGA 模块
- RGA 模块总览
- RgaConverter - RGA 转换器
- RgaProcessor - RGA 处理器
- FormatTool - RGA 格式工具
MPP 模块
- MPP 模块总览
- EncoderContext - 编码器上下文
- EncoderCore - 编码器核心
- JpegEncoder - JPEG 编码器
- StreamWriter - 流写入器
- MppResourceGuard - MPP 资源守护
- FileTools - 文件工具
- FormatTool - 格式工具
Sys 模块
- Sys 模块总览
- CpuMonitor - CPU 监控器
- MemoryMonitor - 内存监控器
- Base - 基础类
Mouse 模块
- Mouse 模块总览
- Watcher - 鼠标监视器
Utils 模块
- Utils 模块总览
- AsyncThreadPool - 异步线程池
- ConcurrentQueue - 并发队列
- FdWrapper - 文件描述符包装器
- FenceWatcher - 围栏监视器
- FixedSizePool - 固定大小对象池
- Logger - 日志记录器
- ObjectsPool - 对象池
- OrderedQueue - 有序队列
- ProgressBar - 进度条
- SafeQueue - 安全队列
- SharedBufferState - 共享缓冲区状态
- SimpleVariant - 简单变体类型
- ThreadPauser - 线程暂停器
- ThreadUtils - 线程工具
- Types - 类型定义
- UdevMonitor - Udev 监视器