Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | /*
* Copyright (c) 2019 Intel Corp.
*
* This is most of the display driver for a "standard" 32-bpp framebuffer.
* Device-specific drivers must still create the device instance and initialize
* it accordingly, but this driver implements most/all of the API functions.
* This code attempts to be endian-agnostic. It manipulates the framebuffer
* address space only in 32-bit words (and assumes those words are 0xAARRGGBB).
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <drivers/display.h>
#include <display/framebuf.h>
#include <string.h>
static int framebuf_blanking_on(const struct device *dev)
{
return -ENOTSUP;
}
static int framebuf_blanking_off(const struct device *dev)
{
return -ENOTSUP;
}
static void *framebuf_get_framebuffer(const struct device *dev)
{
return NULL;
}
static int framebuf_set_brightness(const struct device *dev,
const uint8_t brightness)
{
return -ENOTSUP;
}
static int framebuf_set_contrast(const struct device *dev,
const uint8_t contrast)
{
return -ENOTSUP;
}
static int framebuf_set_pixel_format(const struct device *dev,
const enum display_pixel_format format)
{
switch (format) {
case PIXEL_FORMAT_ARGB_8888:
return 0;
default:
return -ENOTSUP;
}
}
static int framebuf_set_orientation(const struct device *dev,
const enum display_orientation orientation)
{
switch (orientation) {
case DISPLAY_ORIENTATION_NORMAL:
return 0;
default:
return -ENOTSUP;
}
}
static void framebuf_get_capabilities(const struct device *dev,
struct display_capabilities *caps)
{
struct framebuf_dev_data *data = FRAMEBUF_DATA(dev);
caps->x_resolution = data->width;
caps->y_resolution = data->height;
caps->supported_pixel_formats = PIXEL_FORMAT_ARGB_8888;
caps->screen_info = 0;
caps->current_pixel_format = PIXEL_FORMAT_ARGB_8888;
caps->current_orientation = DISPLAY_ORIENTATION_NORMAL;
}
static int framebuf_write(const struct device *dev, const uint16_t x,
const uint16_t y,
const struct display_buffer_descriptor *desc,
const void *buf)
{
struct framebuf_dev_data *data = FRAMEBUF_DATA(dev);
uint32_t *dst = data->buffer;
const uint32_t *src = buf;
uint32_t row;
dst += x;
dst += (y * data->pitch);
for (row = 0; row < desc->height; ++row) {
(void) memcpy(dst, src, desc->width * sizeof(uint32_t));
dst += data->pitch;
src += desc->pitch;
}
return 0;
}
static int framebuf_read(const struct device *dev, const uint16_t x,
const uint16_t y,
const struct display_buffer_descriptor *desc,
void *buf)
{
struct framebuf_dev_data *data = FRAMEBUF_DATA(dev);
uint32_t *src = data->buffer;
uint32_t *dst = buf;
uint32_t row;
src += x;
src += (y * data->pitch);
for (row = 0; row < desc->height; ++row) {
(void) memcpy(dst, src, desc->width * sizeof(uint32_t));
src += data->pitch;
dst += desc->pitch;
}
return 0;
}
const struct display_driver_api framebuf_display_api = {
.blanking_on = framebuf_blanking_on,
.blanking_off = framebuf_blanking_off,
.write = framebuf_write,
.read = framebuf_read,
.get_framebuffer = framebuf_get_framebuffer,
.set_brightness = framebuf_set_brightness,
.set_contrast = framebuf_set_contrast,
.get_capabilities = framebuf_get_capabilities,
.set_pixel_format = framebuf_set_pixel_format,
.set_orientation = framebuf_set_orientation
};
|