參考資訊:
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 root@rk3566-buildroot:/mnt/SDCARD# ./main conn[1].connector_id=179 conn[1].encoder_id=178 conn[1].mode[0]=640x480 (640x480x60) enc[0].encoder_id=161 enc[0].crtc_id=0 enc[1].encoder_id=163 enc[1].crtc_id=0 enc[2].encoder_id=178 enc[2].crtc_id=107 crtc[0].crtc_id=85 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= crtc[1].crtc_id=107 crtc[1].buffer_id=184 crtc[1].x=0 crtc[1].y=0 crtc[1].width=640 crtc[1].height=480 crtc[1].mode.name=640x480