我试图在Linux下的C ++中使用ioctl()初始化KMS / DRM,但是DRM_IOCTL_MODE_GETRESOURCES却遇到了一些问题。在/usr/include/libdrm/drm.h中,此宏的定义如下:
#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
但是,当我尝试用“ 0xa0”或“ 0xA0”替换DRM_IOCTL_MODE_GETRESOURCES时,却没有得到相同的输出!
这是我的代码:
#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程序集中编写此代码,所以我需要syscall的参数!:()
我正在使用g ++,但是我已经尝试过使用汇编程序(nasm)进行相同的syscall,并且得到的结果相同(值= 0)
非常感谢您的帮助!