dma-map.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <errno.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <inttypes.h>
  9. #include <sys/ioctl.h>
  10. #include <sys/mman.h>
  11. #include <dmabuf_exporter.h>
  12. int main(int argc, char **argv)
  13. {
  14. int fd;
  15. int buff_fd;
  16. unsigned long bufSize;
  17. void *uptr;
  18. int i;
  19. if (argc < 2) {
  20. printf("%s buffersize\n", argv[0]);
  21. return 1;
  22. }
  23. bufSize = atoi(argv[1]);
  24. fd = open("/dev/dmabuf", O_RDWR);
  25. if (fd < 0) {
  26. perror("open");
  27. return 1;
  28. }
  29. if (ioctl(fd, DMABUF_IOCTL_CREATE, bufSize)) {
  30. perror("ioctl DMABUF_IOCTL_CREATE");
  31. return 1;
  32. }
  33. buff_fd = ioctl(fd, DMABUF_IOCTL_EXPORT, 0);
  34. if (buff_fd < 0) {
  35. printf("error exporting\n");
  36. return 1;
  37. }
  38. printf("export fd : %d\n", buff_fd);
  39. uptr = mmap(NULL, bufSize, PROT_READ | PROT_WRITE, MAP_SHARED, buff_fd, 0);
  40. if (uptr == MAP_FAILED) {
  41. perror("mmap");
  42. return 1;
  43. }
  44. printf("mapped to %p\n", uptr);
  45. for (i = 0; getpagesize() * i < bufSize; i++) {
  46. int *iptr = (int *)((uintptr_t)uptr + getpagesize() * i);
  47. int val = (0xbeef << 16) | i;
  48. printf("write [%p] = %x\n", iptr, val);
  49. *iptr = val;
  50. }
  51. for (i = 0; getpagesize() * i < bufSize; i++) {
  52. int *iptr = (int *)((uintptr_t)uptr + getpagesize() * i);
  53. int val = (0xbeef << 16) | i;
  54. printf("read [%p] = %x [expected %x]\n", iptr, *iptr, val);
  55. if (*iptr != val) {
  56. printf("!!! ERROR !!!\n");
  57. return 1;
  58. }
  59. }
  60. sleep(3);
  61. close(buff_fd);
  62. close(fd);
  63. return 0;
  64. }