Как отобразить в / dev / fb1 с помощью DispmanX на Raspberry Pi - PullRequest
0 голосов
/ 17 октября 2018

Я использую 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;
}
...