blob: 5cf4de4009a3454f0cbf9f4d8f2dfd0aa8295496 [file] [log] [blame]
/*
* Copyright (c) 2017 Jan Van Winkel <jan.van_winkel@dxplore.eu>
* Copyright (c) 2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <device.h>
#include <drivers/display.h>
#include <stdio.h>
#include <string.h>
#include <zephyr.h>
#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <logging/log.h>
LOG_MODULE_REGISTER(main);
/* This example will update each 500ms one of the LCD corners
* wit a rectangular bitmap.
* The color of the bit map is changed for every
* iteration and is picked out of a set of red, green and blue.
*/
void main(void)
{
struct device *dev;
struct display_capabilities capabilities;
struct display_buffer_descriptor buf_desc;
#ifdef CONFIG_ILI9340_RGB565
const size_t rgb_size = 2;
#else
const size_t rgb_size = 3;
#endif
/* size of the rectangle */
const size_t w = 40;
const size_t h = 20;
const size_t buf_size = rgb_size * w * h;
u8_t *buf;
/* xy coordinates where to place rectangles*/
size_t x0, y0, x1, y1, x2, y2, x3, y3;
size_t color = 0;
size_t cnt = 0;
int h_step;
dev = device_get_binding(DT_INST_0_ILITEK_ILI9340_LABEL);
if (dev == NULL) {
LOG_ERR("Device not found. Aborting test.");
return;
}
display_get_capabilities(dev, &capabilities);
x0 = 0;
y0 = 0;
x1 = capabilities.x_resolution - w;
y1 = 0;
x2 = capabilities.x_resolution - w;
y2 = capabilities.y_resolution - h;
x3 = 0;
y3 = capabilities.y_resolution - h;
/* Allocate rectangular buffer for corner data */
buf = k_malloc(buf_size);
if (buf == NULL) {
LOG_ERR("Could not allocate memory. Aborting test.");
return;
}
/* Clear ili9340 frame buffer before enabling LCD, reuse corner buffer
*/
(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(dev, 0, idx, &buf_desc, buf);
}
display_blanking_off(dev);
buf_desc.pitch = w;
buf_desc.width = w;
buf_desc.height = h;
while (1) {
/* Update the color of the rectangle buffer and write the buffer
* to one of the corners
*/
#ifdef CONFIG_ILI9340_RGB565
/* RGB565 format */
uint16_t color_r;
uint16_t color_g;
uint16_t color_b;
uint16_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;
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
/* RGB888 format */
(void)memset(buf, 0, buf_size);
for (size_t idx = color; idx < buf_size; idx += rgb_size) {
*(buf + idx) = 255U;
}
#endif
switch (cnt % 4) {
case 0:
display_write(dev, x0, y0, &buf_desc, buf);
break;
case 1:
display_write(dev, x1, y1, &buf_desc, buf);
break;
case 2:
display_write(dev, x2, y2, &buf_desc, buf);
break;
case 3:
display_write(dev, x3, y3, &buf_desc, buf);
break;
}
++cnt;
++color;
if (color > 2) {
color = 0;
}
k_sleep(K_MSEC(500));
}
}