掌機 - Miyoo Flip - C/C++ - DRM/KMS - Enum Encoder



參考資訊:
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);
        }
    }

    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