KT25-1015_AC695x_SDK310/apps/kaotings/drv_st7789.c
2026-02-13 21:49:31 +08:00

335 lines
7.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "drv_st7789.h"
#include "asm/spi.h"
extern void delay(unsigned int cnt);
#define RST_L() gpio_set_output_value(LCD_RST_PIN, 0);
#define RST_H() gpio_set_output_value(LCD_RST_PIN, 1);
#define DC_L() gpio_set_output_value(LCD_DC_PIN, 0);
#define DC_H() gpio_set_output_value(LCD_DC_PIN, 1);
#define CS_L() gpio_set_output_value(LCD_CS_PIN, 0);
#define CS_H() gpio_set_output_value(LCD_CS_PIN, 1);
#define BL_L() gpio_set_output_value(LCD_BL_PIN, 0);
#define BL_H() gpio_set_output_value(LCD_BL_PIN, 1);
static void hw_init(void)
{
// reset pin
gpio_set_pull_up(LCD_RST_PIN, 0);
gpio_set_pull_down(LCD_RST_PIN, 0);
gpio_set_direction(LCD_RST_PIN, 0);
RST_L();
// bl pin
gpio_set_pull_up(LCD_BL_PIN, 0);
gpio_set_pull_down(LCD_BL_PIN, 0);
gpio_set_direction(LCD_BL_PIN, 0);
BL_L();
// dc pin
gpio_set_pull_up(LCD_DC_PIN, 0);
gpio_set_pull_down(LCD_DC_PIN, 0);
gpio_set_direction(LCD_DC_PIN, 0);
DC_H();
// cs pin
gpio_set_pull_up(LCD_CS_PIN, 0);
gpio_set_pull_down(LCD_CS_PIN, 0);
gpio_set_direction(LCD_CS_PIN, 0);
CS_H();
}
static void lcd_write(u8 *buf, int leng)
{
for (int i = 0; i < leng; i++)
{
spi_send_byte(LCD_SPI_CFG, buf[i]);
}
}
void lcd_write_data(u8 data)
{
DC_H();
delay(2);
CS_L();
delay(2);
DC_H();
delay(2);
lcd_write(&data, 1);
CS_H();
}
void lcd_write_data_ex(u16 dat)
{
DC_H();
delay(2);
CS_L();
delay(2);
DC_H();
delay(2);
// lcd_write(&data, 1);
spi_send_byte(LCD_SPI_CFG, dat >> 8);
spi_send_byte(LCD_SPI_CFG, dat);
CS_H();
// TFTLCD_Writ_Bus(dat>>8);
// TFTLCD_Writ_Bus(dat);
}
void lcd_write_cmd(u8 cmd)
{
DC_L();
delay(2);
CS_L();
delay(2);
DC_L();
delay(2);
spi_send_byte(LCD_SPI_CFG, cmd);
CS_H();
}
void lcd_open_window(u16 x1, u16 y1, u16 x2, u16 y2)
{
if (USE_HORIZONTAL == 0)
{
lcd_write_cmd(0x2a);
lcd_write_data_ex(x1 + LCD_COLUMN_OFFSET);
lcd_write_data_ex(x2 + LCD_COLUMN_OFFSET);
lcd_write_cmd(0x2b);
lcd_write_data_ex(y1 + LCD_LINE_OFFSET);
lcd_write_data_ex(y2 + LCD_LINE_OFFSET);
lcd_write_cmd(0x2c);
}
else if (USE_HORIZONTAL == 1)
{
lcd_write_cmd(0x2a);
lcd_write_data_ex(x1 + LCD_COLUMN_OFFSET);
lcd_write_data_ex(x2 + LCD_COLUMN_OFFSET);
lcd_write_cmd(0x2b);
lcd_write_data_ex(y1 + LCD_LINE_OFFSET);
lcd_write_data_ex(y2 + LCD_LINE_OFFSET);
lcd_write_cmd(0x2c);
}
else if (USE_HORIZONTAL == 2)
{
lcd_write_cmd(0x2a);
lcd_write_data_ex(x1 + LCD_COLUMN_OFFSET);
lcd_write_data_ex(x2 + LCD_COLUMN_OFFSET);
lcd_write_cmd(0x2b);
lcd_write_data_ex(y1 + LCD_LINE_OFFSET);
lcd_write_data_ex(y2 + LCD_LINE_OFFSET);
lcd_write_cmd(0x2c);
}
else
{
lcd_write_cmd(0x2a);
lcd_write_data_ex(x1);
lcd_write_data_ex(x2);
lcd_write_cmd(0x2b);
lcd_write_data_ex(y1);
lcd_write_data_ex(y2);
lcd_write_cmd(0x2c);
}
}
static void st7789_init_cmd(void)
{
lcd_write_cmd(0x36);
if (USE_HORIZONTAL == 0)
lcd_write_data(0x00);
else if (USE_HORIZONTAL == 1)
lcd_write_data(0x60);
else if (USE_HORIZONTAL == 2)
lcd_write_data(0xa0);
else
lcd_write_data(0xc0);
lcd_write_cmd(0x3A);
lcd_write_data(0x05);
lcd_write_cmd(0xB2);
lcd_write_data(0x0C);
lcd_write_data(0x0C);
lcd_write_data(0x00);
lcd_write_data(0x33);
lcd_write_data(0x33);
lcd_write_cmd(0xB7);
lcd_write_data(0x35);
lcd_write_cmd(0xBB);
lcd_write_data(0x19);
lcd_write_cmd(0xC0);
lcd_write_data(0x2C);
lcd_write_cmd(0xC2);
lcd_write_data(0x01);
lcd_write_cmd(0xC3);
lcd_write_data(0x12);
lcd_write_cmd(0xC4);
lcd_write_data(0x20);
lcd_write_cmd(0xC6);
lcd_write_data(0x0F);
lcd_write_cmd(0xD0);
lcd_write_data(0xA4);
lcd_write_data(0xA1);
lcd_write_cmd(0xE0);
lcd_write_data(0xD0);
lcd_write_data(0x04);
lcd_write_data(0x0D);
lcd_write_data(0x11);
lcd_write_data(0x13);
lcd_write_data(0x2B);
lcd_write_data(0x3F);
lcd_write_data(0x54);
lcd_write_data(0x4C);
lcd_write_data(0x18);
lcd_write_data(0x0D);
lcd_write_data(0x0B);
lcd_write_data(0x1F);
lcd_write_data(0x23);
lcd_write_cmd(0xE1);
lcd_write_data(0xD0);
lcd_write_data(0x04);
lcd_write_data(0x0C);
lcd_write_data(0x11);
lcd_write_data(0x13);
lcd_write_data(0x2C);
lcd_write_data(0x3F);
lcd_write_data(0x44);
lcd_write_data(0x51);
lcd_write_data(0x2F);
lcd_write_data(0x1F);
lcd_write_data(0x1F);
lcd_write_data(0x20);
lcd_write_data(0x23);
lcd_write_cmd(0x21);
lcd_write_cmd(0x11);
// Delay (120);
lcd_write_cmd(0x29);
// 设置列地址
lcd_write_cmd(0x2A); // 列地址设置
lcd_write_data(0x00); // 起始列地址高位
lcd_write_data(0x00); // 起始列地址低位
lcd_write_data(0x00); // 结束列地址高位
lcd_write_data(0xEF); // 结束列地址低位240 列)
// 设置行地址
lcd_write_cmd(0x2B); // 行地址设置
lcd_write_data(0x00); // 起始行地址高位
lcd_write_data(0x00); // 起始行地址低位
lcd_write_data(0x00); // 结束行地址高位
lcd_write_data(0xC5); // 结束行地址低位198 行)
lcd_write_cmd(0x2C); // 内存写入
}
void lcd_fill(u16 xsta, u16 ysta, u16 xend, u16 yend, u16 color)
{
u16 i, j;
lcd_open_window(xsta, ysta, xend - 1, yend - 1);
for (i = ysta; i < yend; i++)
{
for (j = xsta; j < xend; j++)
{
lcd_write_data_ex(color);
}
}
}
void lcd_write_data_dma(u32 len, u8 *color)
{
// printf("lcd_write_data_dma %d \n", len);
// int spi_dma_send(spi_dev spi, const void *buf, u32 len);
// spi_send_byte(spi1_hdl, buf[i]);
DC_H();
// rt_pin_write((rt_base_t)st7789_device.config.user_data, PIN_HIGH);
// return rt_lcd_write_data(st7789_device.mcu, &data, 1);
CS_L();
DC_H();
// spi_send_byte(spi1_hdl,data);
// lcd_write(&data, 1);
spi_dma_send(LCD_SPI_CFG, color, len * 2);
CS_H();
}
void lcd_fill_frame_lv(int x1, int y1, int x2, int y2, u16 *color)
{
u16 c;
int i = 0;
lcd_open_window(x1, y1, x2, y2);
//lcd_write_cmd(CMD_WRITE);
int cnt = (x2 + 1 - x1) * (y2 + 1 - y1);
#if 1
u8 color_buf[cnt * 2];
int idx = 0;
for (int i = 0; i < cnt; i++)
{
color_buf[idx] = (u8)(color[i] >> 8);
color_buf[idx + 1] = (u8)(color[i]);
idx += 2;
}
lcd_write_data_dma(cnt, color_buf);
#else
for (int i = 0; i < cnt; i++)
{
clr_wdt();
c = color[i];
lcd_write_data((u8)(c >> 8));
lcd_write_data((u8)(c));
}
#endif
}
void lcd_st7789_init(void)
{
printf("lcd_st7789_init\n");
hw_init();
EXP_PWR_ON();
clr_wdt();
os_time_dly(1);
spi_open(LCD_SPI_CFG);
int delay_cnt = 0;
RST_L();
while (1)
{
clr_wdt();
os_time_dly(1);
delay_cnt++;
if (delay_cnt > 10)
{
break;
}
}
RST_H();
clr_wdt();
os_time_dly(1);
st7789_init_cmd();
//lcd_fill(0, 0, LCD_W, LCD_H, RED);
BL_H();
}