Files
game-and-watch-zelda3/Core/Src/lcd.c
2023-05-01 19:07:18 -07:00

179 lines
5.1 KiB
C

#include "lcd.h"
#include "stm32h7xx_hal.h"
#include "main.h"
uint16_t framebuffer[GW_LCD_WIDTH * GW_LCD_HEIGHT];
extern DAC_HandleTypeDef hdac1;
extern DAC_HandleTypeDef hdac2;
void lcd_backlight_off() {
/*HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);*/
HAL_DAC_Stop(&hdac1, DAC_CHANNEL_1);
HAL_DAC_Stop(&hdac1, DAC_CHANNEL_2);
HAL_DAC_Stop(&hdac2, DAC_CHANNEL_1);
}
void lcd_backlight_on() {
/*HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);*/
lcd_backlight_set(255);
}
void lcd_backlight_set(uint8_t brightness)
{
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_8B_R, brightness);
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_8B_R, brightness);
HAL_DAC_SetValue(&hdac2, DAC_CHANNEL_1, DAC_ALIGN_8B_R, brightness);
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);
HAL_DAC_Start(&hdac2, DAC_CHANNEL_1);
}
void lcd_fill_framebuffer(uint8_t r, uint8_t g, uint8_t b) {
uint16_t color = ((r & 0x1f) << 11) | ((g & 0x3f) << 5) | (b & 0x1f);
for (int y = 0; y < GW_LCD_HEIGHT; y++) {
for (int x = 0; x < GW_LCD_WIDTH; x++) {
framebuffer[y*GW_LCD_WIDTH + x] = color; // RGB565
}
}
}
void lcd_init(SPI_HandleTypeDef *spi, LTDC_HandleTypeDef *ltdc) {
// Turn display *off* completely.
lcd_backlight_off();
// 3.3v power to display *SET* to disable supply.
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET);
// TURN OFF CHIP SELECT
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
// TURN OFF PD8
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET);
// Turn off CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(100);
// Wake
// Enable 3.3v
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(1);
// Enable 1.8V
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET);
// also assert CS, not sure where to put this yet
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_Delay(7);
// HAL_SPI_Transmit(spi, "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55", 10, 100);
// Lets go, bootup sequence.
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_SET);
HAL_Delay(2);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x08\x80", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x6E\x80", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x80\x80", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x68\x00", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\xd0\x00", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x1b\x00", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\xe0\x00", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x6a\x80", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x80\x00", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
// HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_SPI_Transmit(spi, "\x14\x80", 2, 100);
HAL_Delay(2);
// CS
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_LTDC_SetAddress(ltdc,(uint32_t) &framebuffer,0);
lcd_backlight_on();
}
void lcd_deinit(SPI_HandleTypeDef *spi)
{
// Chip select low.
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
// 3.3v power to display *SET* to disable supply.
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
// Disable 1.8v.
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET);
// Pull reset line(?) low. (Flakey without this)
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET);
}