53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
|
|
#include <fcntl.h>
|
|||
|
|
#include <linux/dma-heap.h>
|
|||
|
|
#include <sys/ioctl.h>
|
|||
|
|
#include <sys/mman.h>
|
|||
|
|
#include <unistd.h>
|
|||
|
|
|
|||
|
|
#include <iostream>
|
|||
|
|
#include <string>
|
|||
|
|
|
|||
|
|
class DmaBuffer {
|
|||
|
|
public:
|
|||
|
|
int fd;
|
|||
|
|
void* vaddr; // 虚拟地址(仅供调试或CPU必须介入时使用,如画字)
|
|||
|
|
size_t size;
|
|||
|
|
|
|||
|
|
DmaBuffer(size_t size, const std::string& heap_name = "/dev/dma_heap/system") {
|
|||
|
|
this->size = size;
|
|||
|
|
this->vaddr = MAP_FAILED;
|
|||
|
|
this->fd = -1;
|
|||
|
|
|
|||
|
|
int heap_fd = open(heap_name.c_str(), O_RDONLY | O_CLOEXEC);
|
|||
|
|
if (heap_fd < 0) {
|
|||
|
|
perror("Failed to open dma heap");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct dma_heap_allocation_data data = {0};
|
|||
|
|
data.len = size;
|
|||
|
|
data.fd_flags = O_RDWR | O_CLOEXEC;
|
|||
|
|
|
|||
|
|
if (ioctl(heap_fd, DMA_HEAP_IOCTL_ALLOC, &data) < 0) {
|
|||
|
|
perror("dma heap alloc failed");
|
|||
|
|
close(heap_fd);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this->fd = data.fd;
|
|||
|
|
close(heap_fd);
|
|||
|
|
|
|||
|
|
// 如果需要CPU访问(例如写OSD文字),则映射,否则可以不映射
|
|||
|
|
this->vaddr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, this->fd, 0);
|
|||
|
|
if (this->vaddr == MAP_FAILED) {
|
|||
|
|
perror("mmap failed");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
~DmaBuffer() {
|
|||
|
|
if (vaddr != MAP_FAILED)
|
|||
|
|
munmap(vaddr, size);
|
|||
|
|
if (fd >= 0)
|
|||
|
|
close(fd);
|
|||
|
|
}
|
|||
|
|
};
|