參考資訊:
https://www.kernel.org/doc/html/v4.15/gpu/drm-kms.html
https://github.com/grate-driver/libdrm/blob/master/xf86drmMode.h
main.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
int main(int argc, char *argv[])
{
int i = 0;
int j = 0;
int fd = -1;
drmModeRes *res = NULL;
fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
res = drmModeGetResources(fd);
for (i = 0; i < res->count_connectors; i++) {
drmModeConnector *conn = drmModeGetConnector(fd, res->connectors[i]);
if (conn) {
if ((conn->connection == DRM_MODE_CONNECTED) && conn->count_modes) {
printf("conn[%d].connector_id=%d\n", i, conn->connector_id);
printf("conn[%d].encoder_id=%d\n", i, conn->encoder_id);
for (j = 0; j < conn->count_modes; j++) {
drmModeModeInfo *mode = &conn->modes[j];
printf("conn[%d].mode[%d]=%s (%dx%dx%d)\n", i, j, mode->name, mode->hdisplay, mode->vdisplay, mode->vrefresh);
}
}
drmModeFreeConnector(conn);
}
}
for (i = 0; i < res->count_encoders; i++) {
drmModeEncoder *enc = drmModeGetEncoder(fd, res->encoders[i]);
if (enc) {
printf("enc[%d].encoder_id=%d\n", i, enc->encoder_id);
printf("enc[%d].crtc_id=%d\n", i, enc->crtc_id);
drmModeFreeEncoder(enc);
}
}
for (i = 0; i < res->count_crtcs; i++) {
drmModeCrtc *crtc = drmModeGetCrtc(fd, res->crtcs[i]);
if (crtc) {
printf("crtc[%d].crtc_id=%d\n", i, crtc->crtc_id);
printf("crtc[%d].buffer_id=%d\n", i, crtc->buffer_id);
printf("crtc[%d].x=%d\n", i, crtc->x);
printf("crtc[%d].y=%d\n", i, crtc->x);
printf("crtc[%d].width=%d\n", i, crtc->width);
printf("crtc[%d].height=%d\n", i, crtc->height);
printf("crtc[%d].mode.name=%s\n", i, crtc->mode.name);
drmModeFreeCrtc(crtc);
}
}
drmModeFreeResources(res);
close(fd);
return 0;
}
編譯、執行
$ /opt/flip/bin/aarch64-linux-gcc main.c -o main -I/opt/flip/aarch64-flip-linux-gnu/sysroot/usr/include/libdrm -ldrm
RuiSuo:~/roms # kill -STOP `pidof emulationstation`
RuiSuo:~/roms # ./main
conn[0].connector_id=95
conn[0].encoder_id=94
conn[0].mode[0]=640x480 (640x480x59)
enc[0].encoder_id=94
enc[0].crtc_id=69
crtc[0].crtc_id=69
crtc[0].buffer_id=0
crtc[0].x=0
crtc[0].y=0
crtc[0].width=640
crtc[0].height=480
crtc[0].mode.name=640x480