API кадрового буфера

Предыдущая  Содержание  Следующая V*D*V

Давайте теперь промочим наши ноги в API кадрового буфера. Уровень ядра кадрового буфера экспортирует узлы устройств в пользовательское пространство, так что приложения могут обращаться к любому поддерживаемому видео устройству. Узлом, связанным с кадровым буфером устройства X, является /dev/fbX. Ниже перечислены основные структуры данных, которые интересны пользователям API кадрового буфера. Внутри ядра они определены в include/linux/fb.h, тогда как на стороне пользователя их определения находятся в /usr/include/linux/fb.h:

 

1.Изменяемая информация, относящаяся к видеокарте, которую вы видели в выводе fbset предыдущего раздела, находилась в структуре fb_var_screeninfo. Эта структура содержит такие поля, как разрешение по оси X, разрешение по оси Y, биты, необходимые для хранения пикселя, pixclock, продолжительность HSYNC, продолжительность VSYNC и размер отступов. Эти значения программируется пользователем:
 
struct fb_var_screeninfo {
   __u32 xres;           /* Видимое разрешение по оси X */
   __u32 yres;           /* Видимое разрешение по оси Y */
   /* ... */
   __u32 bits_per_pixel; /* Число бит, требуемое для хранения пикселя */
   /* ... */
   __u32 pixclock;       /* Частота пикселя в пикосекундах */
   __u32 left_margin;    /* Время от импульса синхронизации до картинки */
   __u32 right_margin;   /* Время от картинки до импульса синхронизации */
   /* ... */
   __u32 hsync_len;      /* Длительность горизонтальной синхронизации */
   __u32 vsync_len;      /* Длительность вертикальной синхронизации */
   /* ... */
};
 

2.В структуре fb_fix_screeninfo содержится неизменяемая информация о видео оборудовании, такая как начальный адрес и размер памяти кадрового буфера. Эти значения не могут быть изменены пользователем:
 
struct fb_fix_screeninfo {
   char id[16];              /* Строка идентификации */
   unsigned long smem_start; /* Начальный адрес памяти кадрового буфера */
   __u32 smem_len;           /* Размер памяти кадрового буфера */
   /* ... */
};
 

3.Структура fb_cmap определяет карту цветов, которые используются для передачи определённых пользователем цветов видео оборудованию. Вы можете использовать эту структуру для определения соотношений RGB (красного, зелёного, синего), которые вы желаете иметь для разных цветов:
 
struct fb_cmap {
   __u32 start;   /* Первая запись */
   __u32 len;     /* Число записей */
   __u16 *red;    /* Значения красного */
   __u16 *green;  /* Значения зелёного */
   __u16 *blue;   /* Значения синего */
   __u16 *transp; /* Прозрачность. Обсуждается позже */
};
 

 

Распечатка 12.1 является простым приложением, которое работает с API кадрового буфера. Программа очищает экран, воздействуя на /dev/fb0, узел устройства кадрового буфера, соответствующий дисплею. Сначала аппаратно-независимым образом с использованием  API кадрового буфера расшифровывается видимое разрешение экрана и число бит на пиксель, FBIOGET_VSCREENINFO. Эта  команда интерфейса собирает переменные параметры дисплея работая со структурой fb_var_screeninfo. Затем программа переходит к выполнению для памяти кадрового буфера mmap() и очищает каждый бит, составляющий пиксель.

 

Распечатка 12.1. Очистка дисплея аппаратно-независимым способом

 

Код:

#include <stdio.h>

#include <fcntl.h>

#include <linux/fb.h>

#include <sys/mman.h>

#include <stdlib.h>

 

struct fb_var_screeninfo vinfo;

 

int

main(int argc, char *argv[])

{

    int fbfd, fbsize, i;

    unsigned char *fbbuf;

 

    /* Открываем видеопамять */

    if ((fbfd = open("/dev/fb0", O_RDWR)) < 0) {

        exit(1);

    }

 

    /* Получаем изменяемые параметры изображения */

    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {

        printf("Bad vscreeninfo ioctl\n");

        exit(2);

    }

 

    /* Размер кадрового буфера =

        (разрешение по X * разрешение по Y * байты на пиксель) */

    fbsize = vinfo.xres*vinfo.yres*(vinfo.bits_per_pixel/8);

 

    /* Отображаем видеопамять */

    if ((fbbuf = mmap(0, fbsize, PROT_READ|PROT_WRITE,

        MAP_SHARED, fbfd, 0)) == (void *) -1){

        exit(3);

    }

 

    /* Очищаем экран */

    for (i=0; i<fbsize; i++) {

        *(fbbuf+i) = 0x0;

    }

 

    munmap(fbbuf, fbsize);

    close(fbfd);

}

 

Мы рассмотрим другое приложение, работающее с кадровым буфером, когда изучим доступ к областям памяти из пользовательского пространства в Главе 19, "Драйверы в пространстве пользователя".

Предыдущая  Содержание  Следующая