Files
gk-sdk/source/bootloader/product/driver/ssp/lcd_st7789.c
T

151 lines
4.5 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* (C) Copyright 2002
* Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com
*/
/*
* SPI Read/Write Utilities
*/
#include <common.h>
#include <command.h>
#include <errno.h>
#include <spi.h>
#include <asm/io.h>
/*-----------------------------------------------------------------------
* Definitions
*/
void spi_write_a9byte(struct spi_slave *slave, unsigned char cmd_dat,unsigned char dat)
{
unsigned short spi_data = 0;
if (cmd_dat)
spi_data = 1 << 8;
else
spi_data = 0 << 8;
spi_data = spi_data | dat;
spi_xfer(slave, 9, &spi_data, NULL, 0);
return;
}
void ssp_write_dat(struct spi_slave *slave, unsigned char dat)
{
spi_write_a9byte(slave, 1, dat);
}
void ssp_write_cmd(struct spi_slave *slave,unsigned char dat)
{
spi_write_a9byte(slave, 0, dat);
}
int do_lcd_st7789_init (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
struct spi_slave *slave;
int ret = 0;
/*
* We use the last specified parameters, unless new ones are
* entered.
*/
if ((flag & CMD_FLAG_REPEAT) == 0) {
slave = spi_setup_slave(0, 0, 1000000, SPI_MODE_3);
if (!slave) {
printf("Invalid device \n");
return -EINVAL;
}
spi_set_wordlen(slave, 9);
ret = spi_claim_bus(slave);
if (ret)
return -EINVAL;
/* st7789v turn on sleep mode */
ssp_write_cmd(slave,0x10);
/* st7789v software reset */
ssp_write_cmd(slave,0x01);
udelay(120000);
/* st7789v turn off sleep mode */
ssp_write_cmd(slave,0x11);
udelay(120000);
/* Display Setting */
ssp_write_cmd(slave,0x53);
ssp_write_dat(slave,0x04);
ssp_write_cmd(slave,0x36);
ssp_write_dat(slave,0x00);
ssp_write_cmd(slave,0x3a);
ssp_write_dat(slave,0x60);
ssp_write_cmd(slave,0x21);
/* st7789v frame rate setting */
ssp_write_cmd(slave,0xb0);
ssp_write_dat(slave,0x11);
ssp_write_dat(slave,0x04);
ssp_write_cmd(slave,0xb2);
ssp_write_dat(slave,0x05);
ssp_write_dat(slave,0x05);
ssp_write_dat(slave,0x00);
ssp_write_dat(slave,0x33);
ssp_write_dat(slave,0x33);
ssp_write_cmd(slave,0xb7);
ssp_write_dat(slave,0x35);
/* st7789v power setting */
ssp_write_cmd(slave,0xb8);
ssp_write_dat(slave,0x2f);
ssp_write_dat(slave,0x2b);
ssp_write_dat(slave,0x2f);
ssp_write_cmd(slave,0xbb);
ssp_write_dat(slave,0x20);
ssp_write_cmd(slave,0xc0);
ssp_write_dat(slave,0x2c);
ssp_write_cmd(slave,0xc2);
ssp_write_dat(slave,0x01);
ssp_write_cmd(slave,0xc3);
ssp_write_dat(slave,0x0b);
ssp_write_cmd(slave,0xc4);
ssp_write_dat(slave,0x20);
ssp_write_cmd(slave,0xc6);
ssp_write_dat(slave,0x11);
ssp_write_cmd(slave,0xd0);
ssp_write_dat(slave,0xa4);
ssp_write_dat(slave,0xa1);
ssp_write_cmd(slave,0xe8);
ssp_write_dat(slave,0x03);
ssp_write_cmd(slave,0xe9);
ssp_write_dat(slave,0x0d);
ssp_write_dat(slave,0x12);
ssp_write_dat(slave,0x00);
/* st7789v gamma setting */
ssp_write_cmd(slave,0xe0);
ssp_write_dat(slave,0xd0);
ssp_write_dat(slave,0x06);
ssp_write_dat(slave,0x0b);
ssp_write_dat(slave,0x0a);
ssp_write_dat(slave,0x09);
ssp_write_dat(slave,0x05);
ssp_write_dat(slave,0x2e);
ssp_write_dat(slave,0x43);
ssp_write_dat(slave,0x44);
ssp_write_dat(slave,0x09);
ssp_write_dat(slave,0x16);
ssp_write_dat(slave,0x15);
ssp_write_dat(slave,0x23);
ssp_write_dat(slave,0x27);
ssp_write_cmd(slave,0xe1);
ssp_write_dat(slave,0xd0);
ssp_write_dat(slave,0x06);
ssp_write_dat(slave,0x0b);
ssp_write_dat(slave,0x09);
ssp_write_dat(slave,0x08);
ssp_write_dat(slave,0x06);
ssp_write_dat(slave,0x2e);
ssp_write_dat(slave,0x44);
ssp_write_dat(slave,0x44);
ssp_write_dat(slave,0x3a);
ssp_write_dat(slave,0x15);
ssp_write_dat(slave,0x15);
ssp_write_dat(slave,0x23);
ssp_write_dat(slave,0x26);
ssp_write_cmd(slave,0x29);
spi_release_bus(slave);
}
return 0;
}
/***************************************************/
U_BOOT_CMD(
lcd_st7789_init, 1, 0, do_lcd_st7789_init,
"do lcd st7789 init",
""
);