inital commit
This commit is contained in:
commit
216b9c0d64
17
CMakeLists.txt
Normal file
17
CMakeLists.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
|
||||||
|
project(drmcrtcinfo)
|
||||||
|
|
||||||
|
set(SRC_FILES main.c)
|
||||||
|
set(LIBS -ldrm)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} ${SRC_FILES})
|
||||||
|
|
||||||
|
target_link_libraries( ${PROJECT_NAME} ${LIBS} -lstdc++fs)
|
||||||
|
target_include_directories(${PROJECT_NAME} PRIVATE "/usr/include/libdrm/")
|
||||||
|
add_definitions("-Wall -O2 -flto -fno-strict-aliasing")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
|
||||||
|
|
||||||
|
|
||||||
|
set(CMAKE_INSTALL_PREFIX "/usr")
|
||||||
|
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
|
160
main.c
Normal file
160
main.c
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
#include<stdio.h>
|
||||||
|
#include<stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include<xf86drmMode.h>
|
||||||
|
#include<xf86drm.h>
|
||||||
|
#include <linux/vt.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define DPMS_ID 2
|
||||||
|
|
||||||
|
int drm_get_device_connectors(int device, drmModeConnectorPtr** connectors)
|
||||||
|
{
|
||||||
|
drmModeRes* resources;
|
||||||
|
resources = drmModeGetResources(device);
|
||||||
|
if(!resources) {
|
||||||
|
perror("Can not get resources from drm device");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(resources->count_connectors > 0) {
|
||||||
|
*connectors = malloc(sizeof(drmModeConnectorPtr)*resources->count_connectors);
|
||||||
|
if(!*connectors) {
|
||||||
|
fprintf(stderr, "Out of memory!\n");
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
for(int i = 0; i < resources->count_connectors; ++i) {
|
||||||
|
(*connectors)[i] = drmModeGetConnectorCurrent(device, resources->connectors[i]);
|
||||||
|
}
|
||||||
|
return resources->count_connectors;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drm_free_device_connectors(drmModeConnectorPtr* connectors, int count_connectors)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < count_connectors; ++i) {
|
||||||
|
drmModeFreeConnector(connectors[i]);
|
||||||
|
}
|
||||||
|
free(connectors);
|
||||||
|
}
|
||||||
|
|
||||||
|
int drm_get_connector_propertys(int device, drmModeConnectorPtr connector, drmModePropertyPtr** properties)
|
||||||
|
{
|
||||||
|
*properties = malloc(sizeof(drmModePropertyRes*)*connector->count_props);
|
||||||
|
if(!properties){
|
||||||
|
fprintf(stderr, "Out of memory!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < connector->count_props; ++i) {
|
||||||
|
(*properties)[i] = drmModeGetProperty(device, connector->props[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return connector->count_props;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drm_free_device_properties(drmModePropertyPtr* properties, int count_props)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < count_props; ++i) {
|
||||||
|
drmModeFreeProperty(properties[i]);
|
||||||
|
}
|
||||||
|
free(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
int drm_open_device(char* fileName)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
fd = open(fileName, O_RDWR);
|
||||||
|
if(fd < 0) {
|
||||||
|
fprintf(stderr, "Can not open drm device %s: ", fileName);
|
||||||
|
perror(NULL);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
if(argc < 2) {
|
||||||
|
printf("Usage: %s [DEVICE]\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int device = drm_open_device("/dev/dri/card2");
|
||||||
|
if(device < 0)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
drmModeConnectorPtr* connectors = NULL;
|
||||||
|
int count_connectors = drm_get_device_connectors(device, &connectors);
|
||||||
|
|
||||||
|
printf("Device has %i connectors\n", count_connectors);
|
||||||
|
for(int i = 0; i < count_connectors; ++i){
|
||||||
|
drmModePropertyPtr* properties = NULL;
|
||||||
|
int count_props = drm_get_connector_propertys(device, connectors[i], &properties);
|
||||||
|
printf("Connector: %u with %i properties\n", connectors[i]->connector_id, count_props);
|
||||||
|
for(int j = 0; j < count_props; ++j){
|
||||||
|
printf(" id: %u name: %s\n", properties[j]->prop_id, properties[j]->name);
|
||||||
|
}
|
||||||
|
drm_free_device_properties(properties, count_props);
|
||||||
|
}
|
||||||
|
drm_free_device_connectors(connectors, count_connectors);
|
||||||
|
|
||||||
|
drmSetClientCap(device, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
|
||||||
|
drmModeResPtr resources = drmModeGetResources(device);
|
||||||
|
if(!resources) {
|
||||||
|
printf("Failed to get the resources!\n");
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
drmModePlaneResPtr planeres = drmModeGetPlaneResources(device);
|
||||||
|
printf("\nDevice has %i planes\n", planeres->count_planes);
|
||||||
|
for(int i = 0; i < planeres->count_planes; ++i){
|
||||||
|
printf("Plane: %u\n", planeres->planes[i]);
|
||||||
|
drmModePlanePtr plane = drmModeGetPlane(device, planeres->planes[i]);
|
||||||
|
if(!plane) {
|
||||||
|
printf("\tUnable to get plane\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!plane->crtc_id) {
|
||||||
|
printf("\tNot Connected to crtc\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("\tcrtc id\t\t%u\n", plane->crtc_id);
|
||||||
|
drmModeCrtcPtr crtc = drmModeGetCrtc(device, plane->crtc_id);
|
||||||
|
if(!crtc) {
|
||||||
|
printf("\tUnable to get crtc\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(crtc->mode_valid) {
|
||||||
|
printf("\tClock\t\t%u\n", crtc->mode.clock);
|
||||||
|
printf("\thdisplay\t%u\n", crtc->mode.hdisplay);
|
||||||
|
printf("\thsync_start\t%u\n", crtc->mode.hsync_start);
|
||||||
|
printf("\thsync_end\t%u\n", crtc->mode.hsync_end);
|
||||||
|
printf("\thtotal\t\t%u\n", crtc->mode.htotal);
|
||||||
|
printf("\thskew\t\t%u\n", crtc->mode.hskew);
|
||||||
|
printf("\tvdisplay\t%u\n", crtc->mode.vdisplay);
|
||||||
|
printf("\tvsync_start\t%u\n", crtc->mode.vsync_start);
|
||||||
|
printf("\tvsync_end\t%u\n", crtc->mode.vsync_end);
|
||||||
|
printf("\tvtotal\t\t%u\n", crtc->mode.vtotal);
|
||||||
|
printf("\tvscan\t\t%u\n", crtc->mode.vscan);
|
||||||
|
printf("\tvrefresh\t%u\n", crtc->mode.vrefresh);
|
||||||
|
printf("\tflags\t\t%u\n", crtc->mode.flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drmModeFreePlane(plane);
|
||||||
|
|
||||||
|
}
|
||||||
|
drmModeFreePlaneResources(planeres);
|
||||||
|
drmModeFreeResources(resources);
|
||||||
|
|
||||||
|
close(device);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user