Я пытаюсь использовать ioctl () в C ++ под Linux для инициализации KMS / DRM, но я сталкиваюсь с некоторыми проблемами с DRM_IOCTL_MODE_GETRESOURCES. Этот макрос определяется следующим образом в /usr/include/libdrm/drm.h:
#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
Однако, когда я пытаюсь заменить DRM_IOCTL_MODE_GETRESOURCES на «0xa0» или «0xA0», я не получаютот же вывод!
Это мой код:
#include <libdrm/drm_mode.h>
#include <libdrm/drm.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
int main()
{
int dri_fd = open("/dev/dri/card0", O_RDWR);
struct drm_mode_card_res res;
ioctl(dri_fd, DRM_IOCTL_SET_MASTER, 0);
// This is the problematic one:
ioctl(dri_fd, DRM_IOCTL_MODE_GETRESOURCES, &res);
printf("VALUE: %d", res.count_connectors);
return(0);
}
Это выводит: VALUE = 4
Если я изменю «DRM_IOCTL_MODE_GETRESOURCES» на «0xa0» или «0xA0», он выдаст:VALUE = 0, что очень странно для меня.
(Вы можете спросить, почему я не использую определенный макрос, дело в том, что я пытаюсь написать этот код в сборке x86_64, поэтому мне нужноАргументы для системного вызова! :()
Я использую g ++, но я попробовал тот же системный вызов со сборкой (nasm), и я получил тот же результат (значение = 0)
Спасибомного за вашу помощь!