Встроенный linux кадровый буфер вращается

Мне нужно интегрировать ЖК-экран в мою встроенную систему Linux (ARM9). ЖК-экран портретный 320x480, и мне нужно запустить экран в альбомной ориентации 480x320. Используя регистр конфигурации ЖК-дисплея, я могу аппаратно повернуть его так, чтобы (x, y) (0,0) повернулся на 90 градусов. Здесь начинается моя проблема, широкая сторона экрана сужается с 480 пикселей до 320, а длинная сторона изображения выходит за пределы экрана. Это должно быть исправлено путем изменения размеров буфера кадра, насколько мне известно, но я попробовал несколько способов сделать это, но пока безуспешно. используя fbset, ниже приведены настройки для портрета:

mode "480x320-55"
    # D: 9.091 MHz, H: 18.182 kHz, V: 55.096 Hz
    geometry 480 320 480 320 16
    timings 110000 4 4 4 4 12 2
    rgba 5/0,6/5,5/11,0/0
endmode

Отправка команды:

fbset --geometry 480 320 480 320 16

Результат:

mode "480x320-55"
    # D: 9.091 MHz, H: 18.182 kHz, V: 55.096 Hz
    geometry 480 320 480 320 16
    timings 110000 4 4 4 4 12 2
    rgba 5/0,6/5,5/11,0/0
endmode

Из-за чего изображение появляется несколько раз и перекрывается, но ширина экрана все еще слишком мала.

Я попытался обеспечить двойной размер экрана для виртуальных xres и yres, но без изменений.

fbset --geometry 480 320 960 640 16

Я также попытался использовать функцию поворота fb, которую я нашел в Интернете «saFbdevRotation.c», которая использует IOCTL FB, но размер активного экрана по-прежнему неверен.

повернуть на 90 градусов, посмотреть вывод

$> ./fb_rotate -r 90
## Before rotation
### Fix Screen Info:
Line Length - 640
Physical Address = 81a00000
Buffer Length = 1048576

### Var Screen Info:
Xres - 320
Yres - 480
Xres Virtual - 320
Yres Virtual - 480
Bits Per Pixel - 16
Pixel Clk - 110000
Rotation - 0
## after rotation
###  Fix Screen Info:
Line Length - 960
Physical Address = 81a00000
Buffer Length = 1048576

### Var Screen Info:
Xres - 480
Yres - 320
Xres Virtual - 480
Yres Virtual - 320
Bits Per Pixel - 16
Pixel Clk - 110000
Rotation - 90

Я также могу добавить, что система очень ограничена свободной памятью, может ли это привести к тому, что фб НЕ выделяет новый буфер? Однако ошибок в dmesg не было.

Буду признателен за ваш совет.


person user1937525    schedule 11.01.2013    source источник


Ответы (2)


Я также могу добавить, что система очень ограничена свободной памятью, может ли это привести к тому, что фб НЕ выделяет новый буфер? Однако ошибок в dmesg не было.

Обычно стандартный способ выделения видеобуфера заключается в предварительном выделении большого видеобуфера (в зависимости от поддерживаемого вами максимального разрешения видео) во время загрузки, который передает ядру аргумент men=, чтобы ядро ​​не занимало его. изначально.

затем позже видеодрайвер может сделать

void *ioremap(unsigned long phys_addr, unsigned long size)

который создаст область mmap для драйвера, непосредственно управляющего буфером кадра.

Вы можете проверить это, выполнив cat /proc/iomen

Таким образом, память видеодрайвера предварительно выделена и отличается от системной памяти ядра Linux (например, kmalloc() или get_free_pages() или vmalloc()), то, что вас интересует, исключено.

person kikigood    schedule 04.05.2015

Я думаю, что ваша проблема связана с ЖК-дисплеем, который вы используете. Я видел несколько встроенных ЖК-дисплеев, которые утверждают, что поддерживают поворот на 90 градусов, но результат был именно таким, как вы описали. Мои проблемы всегда возникали при использовании интерфейса RGB-дисплея. Я подозреваю, что вращение могло работать с использованием интерфейса ЦП. Я видел только один встроенный дисплей, который правильно поворачивал для интерфейса RGB.

Дело в том, что вы должны попытаться сделать вращение либо с помощью LCD HW, вашего процессора HW, либо с помощью чистого ПО. Я не знаю, может ли фреймбуфер Linux использовать чистое ПО или аппаратное обеспечение вашего процессора, вероятно, это зависит от вашего драйвера.

person Juha Lipponen    schedule 08.08.2016