92 lines
2.6 KiB
C
92 lines
2.6 KiB
C
/*! @file LCD.c
|
|
|
|
@brief sets and writes framebuffer
|
|
@author Hendrik Schutter
|
|
@version V1.0
|
|
@date 03.11.2020
|
|
|
|
This code displays graphics on the 320x240 LCD on an ESP-WROVER_KIT board.
|
|
|
|
Some info about the ILI9341/ST7789V: It has an C/D line, which is connected to a GPIO here. It expects this
|
|
line to be low for a command and high for data. We use a pre-transmit callback here to control that
|
|
line: every transaction has as the user-definable argument the needed state of the D/C line and just
|
|
before the transaction is sent, the callback will set this line to the correct state.
|
|
|
|
*/
|
|
|
|
#include "LCD.h"
|
|
#include "Driver.h"
|
|
|
|
esp_err_t iLCD_allocateFramebuffer(uint16_t ***pPixels);
|
|
|
|
uint16_t **pu16Framebuffer; //framebuffer
|
|
|
|
/**
|
|
* @fn esp_err_t iLCD_init(void)
|
|
* @brief init
|
|
* @param void
|
|
* @return int
|
|
* @author Hendrik Schutter
|
|
* @date 3.11.2020
|
|
*/
|
|
esp_err_t iLCD_init(void) {
|
|
esp_err_t ret;
|
|
|
|
//Initialize the Driver
|
|
vDriver_init();
|
|
|
|
//Initialize the framebuffer
|
|
ret= iLCD_allocateFramebuffer(&pu16Framebuffer);
|
|
ESP_ERROR_CHECK(ret);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @fn esp_err_t iLCD_allocateFramebuffer(uint16_t ***pPixels)
|
|
* @brief allocate framebuffer
|
|
* @param pointer of framebuffer two dimensional array
|
|
* @return esp error code
|
|
* @author Hendrik Schutter
|
|
* @date 3.11.2020
|
|
*/
|
|
esp_err_t iLCD_allocateFramebuffer(uint16_t ***pPixels)
|
|
{
|
|
*pPixels = NULL;
|
|
esp_err_t ret = ESP_OK;
|
|
//Alocate pixel memory. Each line is an array of IMAGE_W 16-bit pixels; the `*pixels` array itself contains pointers to these lines.
|
|
*pPixels = calloc(240, sizeof(uint16_t *));
|
|
if (*pPixels == NULL) {
|
|
printf("Error allocating memory for lines");
|
|
ret = ESP_ERR_NO_MEM;
|
|
}
|
|
for (int i = 0; i < 240; i++) {
|
|
(*pPixels)[i] = malloc(320 * sizeof(uint16_t));
|
|
if ((*pPixels)[i] == NULL) {
|
|
printf("Error allocating memory for line %d", i);
|
|
ret = ESP_ERR_NO_MEM;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @fn esp_err_t iLCD_clearFramebuffer(uint16_t u16Color)
|
|
* @brief clear complete framebuffer with a color
|
|
* @param RGB586 color code
|
|
* @return esp error code
|
|
* @author Hendrik Schutter
|
|
* @date 3.11.2020
|
|
*/
|
|
esp_err_t iLCD_clearFramebuffer(uint16_t u16Color) {
|
|
// uint8_t *in = (uint8_t *)bitmap;
|
|
for (int y = 0; y < 240; y++) {
|
|
for (int x = 0; x < 320; x++) {
|
|
//The LCD wants the 16-bit value in big-endian, so swap bytes
|
|
u16Color = (u16Color >> 8) | (u16Color << 8);
|
|
pu16Framebuffer[y][x] = u16Color;
|
|
}
|
|
}
|
|
return iDriver_writeFramebuffer(&pu16Framebuffer);
|
|
}
|