modeset-dumb.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include <stdbool.h>
  4. #include <stdint.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <sys/mman.h>
  9. #include <unistd.h>
  10. #include <xf86drm.h>
  11. #include <xf86drmMode.h>
  12. int main(int argc, char **argv)
  13. {
  14. int fd;
  15. char *vaddr;
  16. struct drm_mode_create_dumb create_req = {};
  17. struct drm_mode_destroy_dumb destroy_req = {};
  18. struct drm_mode_map_dumb map_req = {};
  19. fd = open("/dev/dri/card0", O_RDWR);
  20. create_req.bpp = 32;
  21. create_req.width = 240;
  22. create_req.height = 320;
  23. drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_req);
  24. printf("create dumb: handle = %u, pitch = %u, size = %llu\n",
  25. create_req.handle, create_req.pitch, create_req.size);
  26. map_req.handle = create_req.handle;
  27. drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map_req);
  28. printf("get mmap offset 0x%llx\n", map_req.offset);
  29. vaddr = mmap(0, create_req.size, PROT_WRITE, MAP_SHARED, fd, map_req.offset);
  30. strcpy(vaddr, "This is a dumb buffer!");
  31. munmap(vaddr, create_req.size);
  32. vaddr = mmap(0, create_req.size, PROT_READ, MAP_SHARED, fd, map_req.offset);
  33. printf("read from mmap: %s\n", vaddr);
  34. munmap(vaddr, create_req.size);
  35. getchar();
  36. destroy_req.handle = create_req.handle;
  37. drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_req);
  38. close(fd);
  39. return 0;
  40. }