Я использую 2 дисплея на Raspberry Pi 3, использую Raspbian (ядро 4.14) без X
Один - это HDMI с разрешением 1280x720, другой - с разрешением SPI 720x480.
Обана дисплеях отображается консольный вывод при загрузке.
Я могу отображать случайный шум только на дисплее SPI правильно, используя cat /dev/urandom >/dev/fb1
Мне нужно отобразить изображение на дисплее SPI с помощью C ++
Я использую тестовый код, который отображает тестовый шаблон на дисплее HDI. Source Link
Проблема в том, что независимо от того, какой ввод uint32_t displayNumber = 0; \\=1; =2; etc..
I, он всегда отображается наHDMI дисплей.info.width
и info.height
всегда показывают 1920x1080
Если я отсоединяю дисплей HDMI и снова пробую разные числа для uint32_t displayNumber = 0;
, я получаю info.width
и info.height
всегда показывают 720x480
Но на дисплее SPI по-прежнему ничего не отображается.
Похоже, что vc_dispmanx_display_open(displayNumber);
не заботится о том, что требуется в качестве входного параметра.
У меня вопрос, как правильно переключатьсяdispmanx
с /dev/fb0
до /dev/fb1
?
Спасибо,
int main(int argc, char *argv[])
{
uint32_t displayNumber = 0;
VC_IMAGE_TYPE_T type = VC_IMAGE_RGBA32;
bcm_host_init();
DISPMANX_DISPLAY_HANDLE_T display
= vc_dispmanx_display_open(displayNumber);
assert(display != 0);
DISPMANX_MODEINFO_T info;
int result = vc_dispmanx_display_get_info(display, &info);
assert(result == 0);
uint32_t vc_image_ptr;
DISPMANX_RESOURCE_HANDLE_T bgResource =
vc_dispmanx_resource_create(type, 1, 1, &vc_image_ptr);
assert(bgResource != 0);
DISPMANX_RESOURCE_HANDLE_T resource =
vc_dispmanx_resource_create(type, 2, 2, &vc_image_ptr);
assert(resource != 0);
VC_RECT_T src_rect;
VC_RECT_T dst_rect;
vc_dispmanx_rect_set(&dst_rect, 0, 0, 1, 1);
uint32_t background = 0;
result = vc_dispmanx_resource_write_data(bgResource,
type,
sizeof(background),
&background,
&dst_rect);
assert(result == 0);
uint32_t image[32];
memset(image, 0, sizeof(image));
image[0] = 0xFF0000FF;
image[1] = 0xFF00FFFF;
image[16] = 0xFFFF0000;
image[17] = 0xFFFFFF00;
vc_dispmanx_rect_set(&dst_rect, 0, 0, 2, 2);
result = vc_dispmanx_resource_write_data(resource,
type,
16 * sizeof(uint32_t),
image,
&dst_rect);
assert(result == 0);
DISPMANX_UPDATE_HANDLE_T update = vc_dispmanx_update_start(0);
assert(update != 0);
VC_DISPMANX_ALPHA_T alpha =
{
DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS,
255,
/*alpha 0->255*/
0
};
vc_dispmanx_rect_set(&src_rect, 0, 0, 1, 1);
vc_dispmanx_rect_set(&dst_rect, 0, 0, 0, 0);
DISPMANX_ELEMENT_HANDLE_T bgElement =
vc_dispmanx_element_add(update,
display,
1,
// layer
&dst_rect,
bgResource,
&src_rect,
DISPMANX_PROTECTION_NONE,
&alpha,
NULL,
// clamp
DISPMANX_NO_ROTATE);
assert(bgElement != 0);
vc_dispmanx_rect_set(&src_rect, 0, 0, 2 << 16, 2 << 16);
vc_dispmanx_rect_set(&dst_rect,
(info.width - info.height) / 2,
0,
info.height,
info.height);
DISPMANX_ELEMENT_HANDLE_T element =
vc_dispmanx_element_add(update,
display,
2,
// layer
&dst_rect,
resource,
&src_rect,
DISPMANX_PROTECTION_NONE,
&alpha,
NULL,
// clamp
DISPMANX_NO_ROTATE);
assert(element != 0);
result = vc_dispmanx_update_submit_sync(update);
assert(result == 0);
//---------------------------------------------------------------------
usleep(1000000);
//---------------------------------------------------------------------
update = vc_dispmanx_update_start(0);
assert(update != 0);
result = vc_dispmanx_element_remove(update, element);
assert(result == 0);
result = vc_dispmanx_element_remove(update, bgElement);
assert(result == 0);
result = vc_dispmanx_update_submit_sync(update);
assert(result == 0);
result = vc_dispmanx_resource_delete(resource);
assert(result == 0);
result = vc_dispmanx_resource_delete(bgResource);
assert(result == 0);
result = vc_dispmanx_display_close(display);
assert(result == 0);
return 0;
}