參考資訊:
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/mini/bin/arm-linux-gnueabihf-gcc main.c -o main -I/opt/mini/arm-buildroot-linux-gnueabihf/sysroot/usr/include/drm -ldrm -lEGL -lGLESv2 -lgbm root@rg351mp:/# kill -STOP `pidof emulationstation` root@rg351mp:/# ./main conn[0].connector_id=66 conn[0].encoder_id=0 conn[0].mode[0]=640x480 (640x480x107) enc[0].encoder_id=65 enc[0].crtc_id=0 crtc[0].crtc_id=60 crtc[0].buffer_id=0 crtc[0].x=0 crtc[0].y=0 crtc[0].width=0 crtc[0].height=0 crtc[0].mode.name=