표적: 저는 프레임 버퍼를 위한 매우 간단한 이미지 뷰어를 작성하고 있습니다 /dev/fb0
(예:FBI).
현재 상태:
/sys/class/graphics/fb0/virtual_size
내 소프트웨어는 (예를 들어) 에서 픽셀 해상도를 가져옵니다1920,1080
.- 그런 다음 (각 행마다) 1920행 픽셀(총 4x1920 = 7680바이트)당 4바이트(BGRA)를
/dev/fb0
. - 보다 정확하게는
y
-row -col =>에서 값이 각각 (, 및 )인x
픽셀을 설정합니다 .arr[y * 1920 * 4 + x * 4 + channel]
channel
0,1,2,3
B
G
R
A
질문:
/sys/.../virtual_size
( -> 해상도) 를 사용하여 이전 노트북에서 1366,768
동일한 소프트웨어를 시도했을 때 이미지가 올바르게 표시되지 않았습니다(약간 기울어짐). 그래서 픽셀 너비 값을 조사한 결과 값이 다음과 같은 것으로 나타났습니다.1376 화(1366이 아님).
질문:
- 이 10개의 추가 바이트는 어디서 오는 걸까요?
- 그리고 다른 컴퓨터에서 이 10바이트의 값을 어떻게 얻을 수 있습니까(수동으로 조정하지 않고 자동으로)?
- 왜 일부 시스템에는 이러한 추가 10바이트가 필요하고 일부 시스템에는 필요하지 않습니까?
답변1
프로그래밍 방식으로 프레임 버퍼에 대한 정보를 검색하려면 다음을 사용해야 합니다.FBIOGET_FSCREENINFO
그리고FBIOGET_VSCREENINFO
ioctl
:
#include <fcntl.h>
#include <linux/fb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
int main(int argc, char **argv) {
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo var;
int fb = open("/dev/fb0", O_RDWR);
if (fb < 0) {
perror("Opening fb0");
exit(1);
}
if (ioctl(fb, FBIOGET_FSCREENINFO, &fix) != 0) {
perror("FSCREENINFO");
exit(1);
}
if (ioctl(fb, FBIOGET_VSCREENINFO, &var) != 0) {
perror("VSCREENINFO");
exit(1);
}
printf("Line length: %ld\n", fix.line_length);
printf("Visible resolution: %ldx%ld\n", var.xres, var.yres);
printf("Virtual resolution: %ldx%ld\n", var.xres_virtual, var.yres_virtual);
}
line_length
당신에게 행 보폭을 제공합니다.
답변2
좋아요보폭와 관련될 필요는 없다너비;1920 와이드스크린에서 소프트웨어는 "우연히" 작동합니다(우연이 아닙니다. 스트라이드는 일반적으로 하드웨어 정렬 요구 사항에 따라 선택되며 1920은 이미 일반적인 정렬 요구 사항인 16으로 나눌 수 있습니다).
좋은 기존 Linux 프레임 버퍼 인프라에 익숙하지 않기 때문에 이를 수행하는 방법을 직접적으로 말할 수는 없지만 진행 상황을 파악해야 합니다.
Linux는 줄 정렬을 16의 배수로 기록하므로 항상 너비를 다음 배수로 반올림하거나 /sys/class/graphics/fb0/에 보폭 또는 줄 정렬을 정의하는 다른 더미 파일을 포함하도록 해야 합니다.