9.5.2 Внутреннее строение кадрового буфера

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

Ядро обеспечивает основу драйвера кадрового буфера (реализованную в drivers/video/fbmem.c и drivers/video/fbgen.c). Эта  основа обеспечивает лёгкую интеграцию в ядро настоящего аппаратного драйвера с кадровым буфером. Все зависимые от оборудования драйверы с кадровым буфером регистрируют этот интерфейс в ядре. Основа обеспечивает API и определяет структуры данных для подключения аппаратно-зависимого кода. Скелет любого драйвера, который использует эту основу, выглядит следующим образом.

 

Заполнение структуры операций драйвера, struct fb_ops.

Заполнение фиксированной информации кадрового буфера, struct fb_fix_screeninfo.

Заполнение структуры информации драйвера, struct fb_info.

Инициализация аппаратных регистров и области видеопамяти.

Выделение памяти и инициализация карты цветов, struct fb_cmap, если необходимо. (* Не каждое оборудование обеспечивает хранение таблиц карт цветов.)

Регистрация структуры fb_info с использованием драйверного ядра с помощью register_framebuffer.

 

Мы уже обсуждали структуры fb_fix_screeninfo, fb_var_screeninfo и fb_cmap. Теперь рассмотрим две другие структуры драйвера, fb_ops и fb_info. Важными полями структуры fb_ops являются указатели на функции таких операций, как open, close, read, write и ioctl. Большинство из них имеют универсальную обработку в ядре. Так что если нет необходимости сделать нечто особенное для вашего оборудования, нет необходимости определять большинство из этих полей. Например, отключение экрана, fb_blank, и установка регистра цвета, fb_setcolreg, - это аппаратно-зависимые процедуры. Они должны быть определены, если ваше оборудование поддерживает их и соответственно обрабатывает. Описания различных полей структуры struct fb_info можно найти в incude/linux/fb.h.

Структура fb_info является наиболее важной структурой, так как это единая точка объединения для всех других структур данных.  Драйвер регистрируется в ядре с указателем на зависимую от драйвера структуру fb_info. Важными полями в этой структуры являются:

 

struct fb_info {

    …

    …

    struct fb_var_screeninfo var; /*Текущая переменная информация экрана*/

    struct fb_fix_screeninfo fix; /*Постоянная информация экрана*/

    …

    …

    struct fb_cmap cmap;  /*Текущая таблица Цветов*/

    struct fb_ops *fbops; /*Указатель на структуру fb_ops*/

    char *screen_base;    /*Базовый адрес видеопамяти (виртуальный)*/

    …

    …

};

 

Поле screen_base - это базовый адрес видеопамяти, указатель на фактический кадровый буфер в аппаратной памяти. Но следует отметить, что аппаратный адрес должен быть переотображён из пространства ввода-вывода, прежде чем предоставлять этот адрес ядру. После того, как структуры данных подготовлены, драйвер должен зарегистрироваться в ядре, вызвав register_framebuffer.

 

int register_framebuffer(struct fb_info *fb_info);

 

В итоге, драйверу необходимо заполнить

 

fb_info.fix: Постоянная информация об области экрана и типе.

fb_info.var: Переменная информация о разрешении экрана и глубине пикселя для текущего режима.

fb_info.fb_ops: Указатели на функции для операций кадрового буфера; используется только когда требуется зависимая от оборудования обработка.

fb_info.screen_base: Базовый (виртуальный) адрес видеопамяти, передаваемый пользовательским приложениям через mmap.

fb_info.fb_cmap: Настройка записей карты цветов, если это необходимо.

fb_ops.fb_blank, fb_ops.fb_setcolreg: Настройка аппаратно-зависимых записей fb_ops, если это необходимо.

И, наконец, вызов register_framebuffer(&fb_info).

 

Идею написания простого драйвера кадрового буфера можно увидеть в drivers/video/vfb.c, примере виртуального кадрового буфера в ядре. Чтобы получить представление о деталях написания кода драйвера, можно также посмотреть на исходные коды других драйверов. Сейчас мы обсуждаем пример драйвера с кадровым буфером для Linux 2.6. (* В драйверах кадрового буфера для ядер версий 2.4 и 2.6 есть небольшое отличие. Структура info кадрового буфера 2.4 хранит прямые указатели на данные консольного драйвера; 2.6 удалило эту зависимость, полностью отделив консоль от графического интерфейса.) Таблицы 9.3 и 9.4 перечисляют  детали спецификаций и данных нашего гипотетического графического оборудования: устройства Простого Кадрового Буфера (Simple Frame Buffer, SFB).

 

Давайте сначала для этого драйвера заполним зависимые от оборудования макросы. Остальная часть кода носит общий характер и не зависит от оборудования. Вся подробная информация, связанная с аппаратным обеспечением, содержится в Распечатке 9.2. Распечатка 9.3представляет собой простой скелет драйвера с кадровым буфером, который будет работать с любым оборудованием, при условии обновления соответствующим образом Распечатки 9.2.

 

Таблица 9.3 Детали оборудования SFB

 

Параметр

Значение

Начальный адрес видеопамяти

0xA00000

Размер видеопамяти

0x12C000

Конечный адрес видеопамяти

0xB2C000

Максимальное разрешение по X

640

Максимальное разрешение по Y

480

Минимальное разрешение по X

320

Минимальное разрешение по Y

240

Форматы цветов

32 бита, true color, RGBX888, Старшие 8 бит не используются

16 бит, high color, RGB565

8 бит, индексный цвет, требуется программирование палитры

Наличие палитры

Да, 256 аппаратных индексных регистров цвета

Первый регистр палитры

0xB2C100

Регистр режима

0xB2C004

Регистр разрешения

0xB2C008. Старшие 2 байта это разрешение по Y, а младшие 2 байта - это разрешение по X

 

Таблица 9.4 Регистр режима

 

Значение в регистре

Режим карты

0x100

RGB X888

0x010

RGB 565

0x001

8 бит, индексный режим

 

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