Дисплей
Этот репозиторий определяет и реализует следующие аппаратные интерфейсы (HDI) модуля дисплея. HDI подразделяются на следующие типы:
Рисунок 1. Архитектура HDI модуля дисплея
Структура каталогов исходного кода выглядит следующим образом:
/drivers/peripheral/display
├── hal # HAL код
│ └── default # Реализация по умолчанию HDI
├── interfaces # Предоставляемые драйверы API для служб верхнего уровня
│ └── include # Экспонированные внешние API
├── test # Тестовый код
│ └── unittest # Код модульного теста
Модуль дисплея предоставляет службе диспетчера окон (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 )