1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-drivers_peripheral

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 8.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 07:36 80e6969

Дисплей

Дисплей

Введение

Этот репозиторий определяет и реализует следующие аппаратные интерфейсы (HDI) модуля дисплея. HDI подразделяются на следующие типы:

  • DisplayLayer: управляет слоями отображения, включая создание слоёв, настройку атрибутов отображения и заполнение и очистку слоёв.
  • DisplayGralloc: управляет памятью модуля отображения, включая применение памяти, освобождение и отображение.
  • DisplayGfx: реализует аппаратное ускорение, включая инициализацию модуля аппаратного ускорения, битовое копирование и обычное графическое рисование и заполнение.

Рисунок 1. Архитектура HDI модуля дисплея

Структура каталогов

Структура каталогов исходного кода выглядит следующим образом:

/drivers/peripheral/display
├── hal                # HAL код
│   └── default       # Реализация по умолчанию HDI
├── interfaces         # Предоставляемые драйверы API для служб верхнего уровня
│   └── include       # Экспонированные внешние API
├── test               # Тестовый код
│   └── unittest      # Код модульного теста

Доступные API

Модуль дисплея предоставляет службе диспетчера окон (WMS) API возможностей драйвера, которые можно разделить на типы DisplayLayer, DisplayGralloc и DisplayGfx. Вызывая эти API, вы можете создавать или уничтожать слой, устанавливать атрибуты слоя, выделять, освобождать, отображать и буферизировать память, заполнять прямоугольники и копировать битовые карты.

Таблица 1 описывает основные HDI, предоставляемые модулем дисплея.

Таблица 1. Основные HDI модуля дисплея

Заголовок файла API Описание
display_layer.h int32_t (*InitDisplay)(uint32_t devId); Инициализирует слой.

Выделяет память.

*void FreeMem(GrallocBuffer buffer);

Освобождает память.

**void Mmap(GrallocBuffer buffer);

Отображает память.

**void MmapCache(GrallocBuffer buffer);

Отображает память в память с кешем.

*int32_t Unmap(GrallocBuffer buffer);

Отменяет отображение памяти.

*int32_t FlushCache(GrallocBuffer buffer);

Сбрасывает данные из кэша в память и делает данные в кэше недействительными.

*int32_t FlushMCache(GrallocBuffer buffer);

Сбрасывает данные из кеша через Mmap в память и делает данные в кеше недействительными.

В запросе есть код на языке C, который не был переведён. ### Использование

Основная функция этого репозитория — предоставить HDI для сервисов системы отображения верхнего уровня, чтобы реализовать возможности драйвера дисплея.

Следующий пример кода описывает, как использовать HDI дисплея:

#include "display_gfx.h"
#include "display_gralloc.h"
#include "display_layer.h"
#include "display_type.h"

#define DEVID 0
DisplayTest g_displayTest;
static GrallocBuffer g_buffer;

static int32_t GetDisplayInterfaces(void)
{
    int32_t ret;
    ret = LayerInitialize(&g_displayTest.layerFuncs);
    if (ret != DISPLAY_SUCCESS || g_displayTest.layerFuncs == NULL) {
        HDF_LOGE("initialize layer failed");
        return DISPLAY_FAILURE;
    }
    ret = GrallocInitialize(&g_displayTest.grallocFuncs);
    if (ret != DISPLAY_SUCCESS || g_displayTest.layerFuncs == NULL) {
        HDF_LOGE("initialize gralloc failed");
        return DISPLAY_FAILURE;
    }
    ret = GfxInitialize(&g_displayTest.gfxFuncs);
    if (ret != DISPLAY_SUCCESS || g_displayTest.gfxFuncs == NULL) {
        HDF_LOGE("initialize gralloc failed");
        return DISPLAY_FAILURE;
    }
    return DISPLAY_SUCCESS;
}

static int32_t DisplayUninit(void)
{
    LayerUninitialize(g_displayTest.layerFuncs);
    GrallocUninitialize(g_displayTest.grallocFuncs);
    GfxUninitialize(g_displayTest.gfxFuncs);
    return DISPLAY_SUCCESS;
}

static void GetLayerInfo(LayerInfo *layInfo)
{
    layInfo->width = g_displayTest.displayInfo.width;
    layInfo->height = g_displayTest.displayInfo.height;
    layInfo->bpp = LAYER_BPP;
    layInfo->pixFormat = PIXEL_FMT_RGBA_5551;
    layInfo->type = LAYER_TYPE_GRAPHIC;
}

static void WriteDataToBuf(int32_t width, int32_t height, uint16_t *pBuf)
{
    int32_t x;
    int32_t y;

    for (y = ((height / LINE_WIDTH) - LINE_WIDTH); y < ((height / LINE_WIDTH) + LINE_WIDTH); y++) {
        for (x = 0; x < width; x++) {
            *((uint16_t*)pBuf + y * width + x) = HIFB_RED_1555;
        }
    }
    for (y = 0; y < height; y++) {
        for (x = ((width / LINE_WIDTH) - LINE_WIDTH); x < ((width / LINE_WIDTH) + LINE_WIDTH); x++) {
            *((uint16_t*)pBuf + y * width + x) = HIFB_RED_1555;
        }
    }
}

int DisplayServiceSample(void)
{    
    int32_t ret;
    g_displayTest.devId = DEVID;

    /* Obtain display driver APIs. */
    ret = GetDisplayInterfaces();
    if (ret != DISPLAY_SUCCESS) {
        HDF_LOGE("get display interfaces ops failed");
        return ret;
    }
    /* Initialize a display device. */
    if (g_displayTest.layerFuncs->InitDisplay != NULL) {
        ret = g_displayTest.layerFuncs->InitDisplay(g_displayTest.devId);
        if (ret != DISPLAY_SUCCESS) {
            HDF_LOGE("initialize display failed");
            return ret;
        }
        /* Do something with the display. */
        ...
        /* Uninitialize the display device. */
        g_displayTest.layerFuncs->UninitDisplay(g_displayTest.devId);
    } else {
        HDF_LOGW("the display driver is not initialized");
    }
    DisplayUninit();
    return DISPLAY_SUCCESS;
}
``` ```
display failed");
    return DISPLAY_FAILURE;
}

Отображение не удалось

/* Obtain the display device information. */
if (g_displayTest.layerFuncs->GetDisplayInfo != NULL) {
    ret = g_displayTest.layerFuncs->GetDisplayInfo(g_displayTest.devId, &g_displayTest.displayInfo);
    if (ret != DISPLAY_SUCCESS) {
        HDF_LOGE("get disp info failed");
        return DISPLAY_FAILURE;
    }
}

Получаем информацию об устройстве отображения.

Если g_displayTest.layerFuncs–>GetDisplayInfo не равно нулю, то переменной ret присваивается значение g_displayTest.layerFuncs–>GetDisplayInfo(g_displayTest.devId, &g_displayTest.displayInfo).

В противном случае выводится сообщение «get disp info failed» и возвращается значение DISPLAY_FAILURE.

    /* Open a specific layer of the display device. */
    if (g_displayTest.layerFuncs->OpenLayer != NULL) {
        LayerInfo layInfo;
        GetLayerInfo(&layInfo);
        ret = g_displayTest.layerFuncs->OpenLayer(g_displayTest.devId, &layInfo, &g_displayTest.layerId);
        if (ret != DISPLAY_SUCCESS) {
            HDF_LOGE("open layer failed");
            return DISPLAY_FAILURE;
        }
    }

Открываем определённый слой устройства отображения.

Если g_displayTest.layerFuncs–>OpenLayer не равен нулю, то переменной ret присваивается значение g_displayTest.layerFuncs–>OpenLayer(g_displayTest.devId, &layInfo, &g_displayTest.layerId).

В противном случае выводится сообщение «open layer failed» и возвращается значение DISPLAY_FAILURE.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/openharmony-drivers_peripheral.git
git@api.gitlife.ru:oschina-mirror/openharmony-drivers_peripheral.git
oschina-mirror
openharmony-drivers_peripheral
openharmony-drivers_peripheral
master