blob: 1a7704356135d91fd2f19feaf535b42d69ec9b39 [file] [log] [blame]
/*
* Copyright (c) 2019 Marc Reilly
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <logging/log.h>
LOG_MODULE_REGISTER(app, LOG_LEVEL_INF);
#include <zephyr.h>
#include <device.h>
#include <display.h>
static void backlight_init(void)
{
/* If you have a backlight, set it up and turn it on here */
}
void main(void)
{
LOG_INF("ST7789V display sample");
struct device *display_dev;
struct display_capabilities capabilities;
struct display_buffer_descriptor buf_desc;
backlight_init();
#ifdef CONFIG_ST7789V_RGB565
const size_t rgb_size = 2;
#else
const size_t rgb_size = 3;
#endif
display_dev = device_get_binding(DT_INST_0_SITRONIX_ST7789V_LABEL);
if (display_dev == NULL) {
LOG_ERR("Device not found. Aborting test.");
return;
}
display_get_capabilities(display_dev, &capabilities);
/* size of the rectangle */
const size_t w = 40;
const size_t h = 20;
const size_t buf_size = rgb_size * w * h;
/* points are clockwise, from top left */
size_t x0, y0, x1, y1, x2, y2, x3, y3;
/* top left */
x0 = 0;
y0 = 0;
/* top right */
x1 = capabilities.x_resolution - w;
y1 = 0;
/* bottom right */
x2 = capabilities.x_resolution - w;
y2 = capabilities.y_resolution - h;
/* bottom left */
x3 = 0;
y3 = capabilities.y_resolution - h;
/* Allocate rectangular buffer for corner data */
u8_t *buf = k_malloc(buf_size);
if (buf == NULL) {
LOG_ERR("Could not allocate memory. Aborting test.");
return;
}
/* Clear frame buffer before enabling LCD, reuse corner buffer
*/
int h_step;
(void)memset(buf, 0, buf_size);
h_step = (w * h) / capabilities.x_resolution;
buf_desc.buf_size = buf_size;
buf_desc.pitch = capabilities.x_resolution;
buf_desc.width = capabilities.x_resolution;
buf_desc.height = h_step;
for (int idx = 0; idx < capabilities.y_resolution; idx += h_step) {
display_write(display_dev, 0, idx, &buf_desc, buf);
}
display_blanking_off(display_dev);
buf_desc.pitch = w;
buf_desc.width = w;
buf_desc.height = h;
int grey_count = 0;
size_t cnt = 0;
while (1) {
/* Update the color of the rectangle buffer and write the buffer
* to one of the corners
*/
#ifdef CONFIG_ST7789V_RGB565
int color = cnt % 4;
/* RGB565 format */
u16_t color_r;
u16_t color_g;
u16_t color_b;
u16_t color_rgb;
color_r = (color == 0) ? 0xF800U : 0U;
color_g = (color == 1) ? 0x07E0U : 0U;
color_b = (color == 2) ? 0x001FU : 0U;
color_rgb = color_r + color_g + color_b;
if (color == 3) {
u16_t t = grey_count & 0x1f;
/* shift the green an extra bit, it has 6 bits */
color_rgb = t << 11 | t << (5+1) | t;
grey_count++;
}
for (size_t idx = 0; idx < buf_size; idx += rgb_size) {
*(buf + idx + 0) = (color_rgb >> 8) & 0xFFU;
*(buf + idx + 1) = (color_rgb >> 0) & 0xFFU;
}
#else
u32_t color_rgb;
u32_t c = grey_count & 0xff;
switch (cnt % 4) {
case 0:
color_rgb = 0x00FF0000u;
break;
case 1:
color_rgb = 0x0000FF00u;
break;
case 2:
color_rgb = 0x000000FFu;
break;
case 3:
color_rgb = c << 16 | c << 8 | c;
grey_count++;
break;
}
/* RGB888 format */
for (size_t idx = color; idx < buf_size; idx += rgb_size) {
*(buf + idx + 0) = color_rgb >> 16;
*(buf + idx + 1) = color_rgb >> 8;
*(buf + idx + 2) = color_rgb >> 0;
}
#endif
switch (cnt % 4) {
case 0:
/* top left, red */
display_write(display_dev, x0, y0, &buf_desc, buf);
break;
case 1:
/* top right, green */
display_write(display_dev, x1, y1, &buf_desc, buf);
break;
case 2:
/* bottom right, blue */
display_write(display_dev, x2, y2, &buf_desc, buf);
break;
case 3:
/* bottom left, alternating grey */
display_write(display_dev, x3, y3, &buf_desc, buf);
break;
}
++cnt;
k_sleep(K_MSEC(100));
}
}