KT25-1015_AC695x_SDK310/apps/kaotings/drv_st7789.c

335 lines
7.3 KiB
C
Raw Normal View History

2026-02-12 13:11:00 +00:00
#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);
}
}
}
2026-02-13 13:49:31 +00:00
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
}
2026-02-12 13:11:00 +00:00
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();
2026-02-13 13:49:31 +00:00
//lcd_fill(0, 0, LCD_W, LCD_H, RED);
2026-02-12 13:11:00 +00:00
BL_H();
}