diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/drmgamma.c | 108 | ||||
-rw-r--r-- | src/drmgamma.h | 75 | ||||
-rw-r--r-- | src/framebuffer.c | 8 | ||||
-rw-r--r-- | src/framebuffer.h | 8 |
4 files changed, 191 insertions, 8 deletions
diff --git a/src/drmgamma.c b/src/drmgamma.c new file mode 100644 index 0000000..0a8f72f --- /dev/null +++ b/src/drmgamma.c @@ -0,0 +1,108 @@ +/** + * crt-calibrator – Calibration utility for CRT monitors + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "drmgamma.h" + +#include <unistd.h> +#include <errno.h> +#include <stdio.h> +#include <fcntl.h> + + + +/** + * Close on exec flag for `open` + */ +#ifndef O_CLOEXEC +# define O_CLOEXEC 02000000 +#endif + + +/** + * The number of elements to allocates to a buffer for a DRM device pathname + */ +#define DRM_DEV_NAME_MAX_LEN \ + ((sizeof(DRM_DEV_NAME) + sizeof(DRM_DIR_NAME)) / sizeof(char) + 3 * sizeof(int)) + + + +/** + * Figure out how many graphics cards there are on the system + * + * @return The number of graphics cards on the system + */ +size_t drm_card_count(void) +{ + char buf[DRM_DEV_NAME_MAX_LEN]; + size_t count = 0; + + for (;; count++) + { + sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, (int)count); + if (access(buf, F_OK) < 0) + return count; + } + +} + +/** + * Acquire access to a graphics card + * + * @param index The index of the graphics card + * @param card Graphics card information to fill in + * @return Zero on success, -1 on error + */ +int drm_card_open(size_t index, drm_card_t* restrict card) +{ + char buf[DRM_DEV_NAME_MAX_LEN]; + int old_errno; + + card->fd = -1; + card->res = NULL; + + sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, (int)index); + card->fd = open(buf, O_RDWR | O_CLOEXEC); + if (card->fd == -1) + goto fail; + + card->res = drmModeGetResources(card->fd); + if (card->res == NULL) + goto fail; + + card->crtc_count = (size_t)(card->res->count_crtcs); + + return 0; + fail: + old_errno = errno; + drm_card_close(card); + errno = old_errno; + return -1; +} + + +/** + * Release access to a graphics card + * + * @param card The graphics card information + */ +void drm_card_close(drm_card_t* restrict card) +{ + if (card->res != NULL) + drmModeFreeResources(card->res), card->res = NULL; + if (card->fd != -1) + close(card->fd), card->fd = -1; +} diff --git a/src/drmgamma.h b/src/drmgamma.h new file mode 100644 index 0000000..7044fd7 --- /dev/null +++ b/src/drmgamma.h @@ -0,0 +1,75 @@ +/** + * crt-calibrator – Calibration utility for CRT monitors + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef CRT_CALIBRATOR_DRMGAMMA_H +#define CRT_CALIBRATOR_DRMGAMMA_H + + +#include <xf86drm.h> +#include <xf86drmMode.h> + + +/** + * Graphics card information + */ +typedef struct drm_card +{ + /** + * File descriptor for the connection to the graphics card, + * -1 if not opened + */ + int fd; + + /** + * The graphics card's mode resources, `NULL` if not acquired + */ + drmModeRes* restrict res; + + /** + * The number of CRTC:s available on the graphics card + */ + size_t crtc_count; + +} drm_card_t; + + +/** + * Figure out how many graphics cards there are on the system + * + * @return The number of graphics cards on the system + */ +size_t drm_card_count(void); + +/** + * Acquire access to a graphics card + * + * @param index The index of the graphics card + * @param card Graphics card information to fill in + * @return Zero on success, -1 on error + */ +int drm_card_open(size_t index, drm_card_t* restrict card); + +/** + * Release access to a graphics card + * + * @param card The graphics card information + */ +void drm_card_close(drm_card_t* restrict card); + + +#endif + diff --git a/src/framebuffer.c b/src/framebuffer.c index b830d6e..f783671 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -76,12 +76,12 @@ int fb_open(size_t index, framebuffer_t* restrict fb) struct fb_var_screeninfo var_info; int old_errno; - fb->fd = 0; + fb->fd = -1; fb->mem = MAP_FAILED; sprintf(buf, FB_DEVICE_PATTERN, index); fb->fd = open(buf, O_RDWR); - if (fb->fd == 0) + if (fb->fd == -1) goto fail; if (ioctl(fb->fd, FBIOGET_FSCREENINFO, &fix_info) || @@ -116,8 +116,8 @@ int fb_open(size_t index, framebuffer_t* restrict fb) */ void fb_close(framebuffer_t* restrict fb) { - if (fb->fd) - close(fb->fd); + if (fb->fd != -1) + close(fb->fd), fb->fd = -1; } diff --git a/src/framebuffer.h b/src/framebuffer.h index 7ef1fed..f6b99ea 100644 --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -15,8 +15,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef CRT_CALIBRATOR_H -#define CRT_CALIBRATOR_H +#ifndef CRT_CALIBRATOR_FRAMEBUFFER_H +#define CRT_CALIBRATOR_FRAMEBUFFER_H #include <stddef.h> @@ -29,7 +29,7 @@ typedef struct framebuffer { /** - * The file descriptor used to access the framebuffer, 0 if not opened + * The file descriptor used to access the framebuffer, -1 if not opened */ int fd; @@ -72,7 +72,7 @@ size_t fb_count(void); * Open a framebuffer * * @param index The index of the framebuffer to open - * @param fb Framevuffer information to fill in + * @param fb Framebuffer information to fill in * @return Zero on success, -1 on error */ int fb_open(size_t index, framebuffer_t* restrict fb); |