arch/x86: drivers/display: add framebuffer driver w/ multiboot support
A basic display driver is added for a generic 32-bpp framebuffer. Glue logic is added to the x86 arch to request the intitialization of a linear framebuffer by the Multiboot loader (GRUB) and connect it to this generic driver. Signed-off-by: Charles E. Youse <charles.youse@intel.com>
This commit is contained in:
parent
a1a3a4fced
commit
4c63e29aec
9 changed files with 275 additions and 31 deletions
|
@ -1,23 +1,22 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_DISPLAY_MCUX_ELCDIF display_mcux_elcdif.c)
|
||||
zephyr_sources_ifdef(CONFIG_GROVE_LCD_RGB grove_lcd_rgb.c)
|
||||
zephyr_sources_ifdef(CONFIG_GROVE_LCD_RGB grove_lcd_rgb.c)
|
||||
zephyr_sources_ifdef(CONFIG_SSD1306 ssd1306.c)
|
||||
zephyr_sources_ifdef(CONFIG_SSD1673 ssd1673.c)
|
||||
zephyr_sources_ifdef(CONFIG_SDL_DISPLAY display_sdl.c)
|
||||
zephyr_sources_ifdef(CONFIG_DUMMY_DISPLAY display_dummy.c)
|
||||
zephyr_sources_ifdef(CONFIG_FRAMEBUF_DISPLAY display_framebuf.c)
|
||||
zephyr_sources_ifdef(CONFIG_ILI9340 display_ili9340.c)
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_MICROBIT_DISPLAY
|
||||
mb_display.c
|
||||
mb_font.c
|
||||
)
|
||||
zephyr_sources_ifdef(CONFIG_ILI9340 display_ili9340.c)
|
||||
zephyr_sources_ifdef(CONFIG_ILI9340_LCD_ADAFRUIT_1480
|
||||
display_ili9340_adafruit_1480.c
|
||||
)
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_ILI9340_LCD_SEEED_TFTV2
|
||||
display_ili9340_seeed_tftv2.c
|
||||
)
|
||||
zephyr_sources_ifdef(CONFIG_SSD1306 ssd1306.c)
|
||||
zephyr_sources_ifdef(CONFIG_SSD1673 ssd1673.c)
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_SDL_DISPLAY display_sdl.c)
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_DUMMY_DISPLAY display_dummy.c)
|
||||
|
||||
|
|
|
@ -22,11 +22,15 @@ source "drivers/display/Kconfig.mcux_elcdif"
|
|||
source "drivers/display/Kconfig.microbit"
|
||||
source "drivers/display/Kconfig.ili9340"
|
||||
source "drivers/display/Kconfig.sdl"
|
||||
|
||||
source "drivers/display/Kconfig.ssd1306"
|
||||
|
||||
source "drivers/display/Kconfig.ssd1673"
|
||||
|
||||
source "drivers/display/Kconfig.dummy"
|
||||
|
||||
config FRAMEBUF_DISPLAY
|
||||
# Hidden, selected by client drivers.
|
||||
bool
|
||||
default n
|
||||
help
|
||||
Enable framebuffer-based display 'helper' driver.
|
||||
|
||||
endif # DISPLAY
|
||||
|
|
134
drivers/display/display_framebuf.c
Normal file
134
drivers/display/display_framebuf.c
Normal file
|
@ -0,0 +1,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 <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 u8_t brightness)
|
||||
{
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
static int framebuf_set_contrast(const struct device *dev,
|
||||
const u8_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 u16_t x,
|
||||
const u16_t y,
|
||||
const struct display_buffer_descriptor *desc,
|
||||
const void *buf)
|
||||
{
|
||||
struct framebuf_dev_data *data = FRAMEBUF_DATA(dev);
|
||||
u32_t *dst = data->buffer;
|
||||
const u32_t *src = buf;
|
||||
u32_t row;
|
||||
|
||||
dst += x;
|
||||
dst += (y * data->pitch);
|
||||
|
||||
for (row = 0; row < desc->height; ++row) {
|
||||
(void) memcpy(dst, src, desc->width * sizeof(u32_t));
|
||||
dst += data->pitch;
|
||||
src += desc->pitch;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int framebuf_read(const struct device *dev, const u16_t x,
|
||||
const u16_t y,
|
||||
const struct display_buffer_descriptor *desc,
|
||||
void *buf)
|
||||
{
|
||||
struct framebuf_dev_data *data = FRAMEBUF_DATA(dev);
|
||||
u32_t *src = data->buffer;
|
||||
u32_t *dst = buf;
|
||||
u32_t row;
|
||||
|
||||
src += x;
|
||||
src += (y * data->pitch);
|
||||
|
||||
for (row = 0; row < desc->height; ++row) {
|
||||
(void) memcpy(dst, src, desc->width * sizeof(u32_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
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue