linux hdmi dev fb操作,如何在raspberry pi上使用dispmanx显示到/dev/fb1

我在树莓PI 3上使用2个显示器,运行Raspbian(内核4.14),没有X

一个是分辨率为1280x720的HDMI,另一个是分辨率为720x480的SPI。

两个显示器都在引导时显示控制台输出。

我可以在SPI显示器上正确显示随机噪声

cat /dev/urandom >/dev/fb1

我需要用C++在SPI显示器上显示图像

我正在运行测试代码,它在hdi显示器上显示一个测试模式

Source Link

问题是,不管怎样

uint32_t displayNumber = 0; \\=1; =2; etc..

我输入,它总是显示在HDMI显示器上。

info.width

info.height

始终显示1920x1080

如果我断开HDMI显示器并尝试不同的数字

uint32_t displayNumber = 0;

再一次,我明白了

信息宽度

信息高度

始终显示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;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值