9.5.2 Внутреннее строение кадрового буфера |
Предыдущая Содержание Следующая |
Ядро обеспечивает основу драйвера кадрового буфера (реализованную в 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
Таблица 9.4 Регистр режима
| ||||||||||||||||||||||||||||||||||
Предыдущая Содержание Следующая |