Доступ к фреймбуферу чаще всего получают через устройства /dev/fb* (в большинстве случаев — /dev/fb0). Переключение режимов может осуществляться через интерфейс ioctl, либо из командной строки при помощи утилиты fbset. Для нее, в свою очередь, требуется конфигурационный файл /etc/fb.modes, где указываются частоты и глубина цвета для различных видеорежимов.
Можно указать видеорежим, используемый при запуске PowerPC®-системы, добавив соответствующий параметр ядра в файл настроек yaboot. Если вы привыкли работать на системах x86, то вам будет приятно узнать, что загрузчик yaboot практически идентичен загрузчику LILO в плане настройки и использования; по умолчанию файл настроек расположен в /etc/yaboot.conf, и когда вы внесете в него изменения, вы можете применить их, запустив утилиту ybin. Чтобы явно задать конкретный видеорежим на этапе загрузки, просто добавьте параметр append=video=ВИДЕОРЕЖИМ в конец команды yaboot, запускающей ядро, и запустите ybin, чтобы применить сделанные изменения (дальше будет подробнее рассказано о редактировании этих параметров). Например, файл yaboot.conf для Mac mini может выглядеть следующим образом:
Листинг 1. Пример файла yaboot.conf
boot=/dev/hda6
init-message=Нажмите TAB для получения списка вариантов или подождите…
partition=8
timeout=30
install=/usr/lib/yaboot/yaboot
magicboot=/usr/lib/yaboot/ofboot
delay=10
enablecdboot
image=/boot/vmlinux-2.6.10-1.ydl.1
label=linux
read-only
initrd=/boot/initrd-2.6.10-1.ydl.1.img
root=/dev/hda8
append=video=radeonfb:1024×768-16
(Если вы настраиваете iMac, то нужно указать видеодрайвер atyfb, так как в этом компьютере используется старый видеочип Mach64. Для задания корректных частот на iMac следует указывать видеорежим следующим образом: atyfb:vmode:17,cmode:16 — см. ниже).
Параметры в строке video= можно указывать в двух форматах: либо video=driver:hresxyres-depth (где hres — физическое разрешение по горизонтали, yres — разрешение по вертикали и depth — код глубины цвета), либо video=driver:vmode:V,cmode:C (где V — номер видеорежима, а C – код глубины цвета). Обратите внимание, что коды vmode не несут какой-либо смысловой нагрузки, а просто обозначают номер режима из устаревшей спецификации Apple на содержимое PRAM. Эти коды перечислены в ядре Linux в файле drivers/video/macmodes.h.
Кстати, если Linux не сможет найти подходящий видеорежим на вашем компьютере, вы можете использовать параметр video=ofonly (ofonly означает только режим Open Firmware). Это похоже на режимы VESA BIOS в компьютерах на базе процессоров Intel®.
Если вы хотите оставить загрузочные видеопараметры такими, как они были определены автоматически, то изменять видеорежим можно по своему усмотрению командой fbset. Сначала добавьте следующие строки в файл /etc/fb.modes:
Листинг 2. Определение режимов фреймбуфера
mode 1024×768-universal
geometry 1024 768 1024 768 16
timings 12735 160 32 28 1 96 3
hsync high
vsync high
endmode
Сохранив этот файл, вы сможете переключаться в режим 1024×768 с 16-битной глубиной цвета с помощью команды fbset 1024×768-universal.
Чтобы компьютер автоматически переходил в нужный видеорежим при загрузке, добавьте следующие строки в файл /etc/rc.d/rc.local сразу перед строкой touch…:
fbset 1024×768-universal setterm -blank 0
Вывод на экран
Теперь, когда видеорежим почти настроен, нужно сделать, чтобы выводить на экран данные. Все, что нужно — выяснить, где находится видеопамять и каков ее формат. Вкратце, шаги следующие:
1) Открыть устройство фреймбуфера — /dev/fb0.
2) Получить информацию о фиксированном и изменяющемся экранах (fb_fix_screeninfo и fb_var_screeninfo), включая физические и виртуальные размеры, глубину цвета, физический адрес видеопамяти.
3) Вызвать mmap(2), чтобы добавить память фреймбуфера в адресное пространство данного процесса.
4) Выделить достаточное количество основной памяти для закадрового буфера (черновика).
5) Отключить курсор текстового режима. Заглянете в конец функции GR_InitGraphics, там должно быть:
Листинг 3. Инициализация фреймбуфера
// Отключаем курсор
handle = open(FB_TTY, O_RDWR);
if (0 < handle) {
write(handle, \\033[?1c, 5);
close(handle);
}
Поиск файлов
Основной цикл программы следующий:
– Запустить функцию FL_Scan() для поиска изображений. Если изображений не найдено, то подождать 10 секунд и повторить поиск.
– Проиграть слайдшоу из всех найденных изображений; между изображениями делать паузу в 10 секунд.
– Повторять бесконечно.
Для простоты можно применить библиотеку JPEG, которая входит в состав Yellow Dog Linux. Сведения о вызове декомпрессора JPEG содержатся в файле codecs.c. Не обойдется без некоторого количества возни — в основном, нужно создать точки возврата setjmp для всех ошибок, возникающих глубоко внутри библиотеки JPEG.
Запускаем
Теперь запишите пару JPEG-файлов в каталог /web и запустите программу ibmslides. Если все настроено корректно, то изображения будут отображаться одно за другим (без масштабирования и центрирования).
На iMac цвета отображаются абсолютно неправильно. Создается ощущение, что ЦАП в чипе Mach64 все еще работает в палитровом видеорежиме (с использованием CLUT), а не в режиме direct color (с непосредственным представлением цвета).
Если с первого раза у вас не получилось…
Можно пойти более хитрым путем и инициализировать видеоподсистему как-то иначе. Мы будем делать это при помощи XFree86 — сервера оконной системы X11.
Сначала откройте файл /etc/X11/XF86Config и внесите следующие изменения в раздел Screen:
Листинг 4. Файл XF86Config
Section Screen
Identifier Screen0
Device Card0
Monitor Monitor0
DefaultDepth 16
SubSection Display
Depth 16
Modes 1024×768
EndSubSection
EndSection
Теперь скопируйте файл blank.xbm в каталог /etc (или любое другое удобное место) и выполните следующие команды (предполагается, что программа ibmslides находится в текущем каталоге):
/etc/blank.xbm /etc/blank.xbm ; xset -dpms s off ; ./ibmslides
Вот и всё — идеальные изображения!
Свежие комментарии