The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

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 бит, индексный режим

 

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