This commit is contained in:
huxi
2025-12-03 11:12:34 +08:00
parent c23ae4f24c
commit bc195654bf
8163 changed files with 3799544 additions and 92 deletions
+376
View File
@@ -0,0 +1,376 @@
#ifndef __LCD_DRIVER_H__
#define __LCD_DRIVER_H__
#include "os/os_type.h"
#include "dbi.h"
#ifdef Reset
#undef Reset
#endif
#ifndef SPI_LCD_DEBUG_ENABLE
#define SPI_LCD_DEBUG_ENABLE 0
#endif
#if (SPI_LCD_DEBUG_ENABLE == 0)
#define lcd_d(...)
#define lcd_w(...)
#define lcd_e(fmt, ...) printf("[LCD ERROR]: "fmt, ##__VA_ARGS__)
#elif (SPI_LCD_DEBUG_ENABLE == 1)
#define lcd_d(...)
#define lcd_w(fmt, ...) printf("[LCD WARNING]: "fmt, ##__VA_ARGS__)
#define lcd_e(fmt, ...) printf("[LCD ERROR]: "fmt, ##__VA_ARGS__)
#else
#define lcd_d(fmt, ...) printf("[LCD DEBUG]: "fmt, ##__VA_ARGS__)
#define lcd_w(fmt, ...) printf("[LCD WARNING]: "fmt, ##__VA_ARGS__)
#define lcd_e(fmt, ...) printf("[LCD ERROR]: "fmt, ##__VA_ARGS__)
#endif
// 注意:以下配置组合为固定搭配,不可随意更改
// 切换配置使用上面的宏选择
#if defined(CONFIG_CPU_BR28) || defined(CONFIG_CPU_BR35)
#include "app_config.h"
#define SPI_SUBMODE(config) (((config)>>16)&0xf0)
#define SPI_WIRE(config) (((config)>>16)&0x0f)
#define PIXEL_nPnT(config) (((config))&0xe0)
#define PIXEL_nTnB(config) (((config))&0x1f)
#define SPI_IF_MODE(config) (((config)>>16)&0xff)
#define OUT_FORMAT(config) (((config)>>8)&0xff)
#define PIXEL_TYPE(config) (((config))&0xff)
#define LCD_CONFIG(mode, format, type) (((mode)<<16) | ((format)<<8) | (type))
/////////////////////////////////////////////spi 3wire///////////////////////////////////////////////
#define SPI_3WIRE_RGB888_1T8B LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T8B)
#define SPI_3WIRE_RGB888_1T24B LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB888, PIXEL_1P1T|PIXEL_1T24B)
#define SPI_3WIRE_RGB666_1T18B LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB666, PIXEL_1P1T|PIXEL_1T18B)
#define SPI_3WIRE_RGB565_1T8B LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T8B)
#define SPI_3WIRE_RGB565_1T16B LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB565, PIXEL_1P1T|PIXEL_1T16B)
/////////////////////////////////////////////spi 4wire///////////////////////////////////////////////
#define SPI_4WIRE_RGB888_1T8B LCD_CONFIG(SPI_MODE|SPI_WIRE4, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T8B)
#define SPI_4WIRE_RGB888_1T24B LCD_CONFIG(SPI_MODE|SPI_WIRE4, FORMAT_RGB888, PIXEL_1P1T|PIXEL_1T24B)
#define SPI_4WIRE_RGB666_1T18B LCD_CONFIG(SPI_MODE|SPI_WIRE4, FORMAT_RGB666, PIXEL_1P1T|PIXEL_1T18B)
#define SPI_4WIRE_RGB565_1T8B LCD_CONFIG(SPI_MODE|SPI_WIRE4, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T8B)
#define SPI_4WIRE_RGB565_1T16B LCD_CONFIG(SPI_MODE|SPI_WIRE4, FORMAT_RGB565, PIXEL_1P1T|PIXEL_1T16B)
////////////////////////////////////////////dspi 3wire///////////////////////////////////////////////
#define DSPI_3WIRE_RGB565_1T8B LCD_CONFIG(DSPI_MODE|SPI_WIRE3, FORMAT_RGB565, PIXEL_1P1T|PIXEL_1T8B)
#define DSPI_3WIRE_RGB666_1T9B LCD_CONFIG(DSPI_MODE|SPI_WIRE3, FORMAT_RGB666, PIXEL_1P1T|PIXEL_1T9B)
#define DSPI_3WIRE_RGB666_1T6B LCD_CONFIG(DSPI_MODE|SPI_WIRE3, FORMAT_RGB666, PIXEL_2P3T|PIXEL_1T6B)
#define DSPI_3WIRE_RGB888_1T12B LCD_CONFIG(DSPI_MODE|SPI_WIRE3, FORMAT_RGB888, PIXEL_1P1T|PIXEL_1T12B)
#define DSPI_3WIRE_RGB888_1T8B LCD_CONFIG(DSPI_MODE|SPI_WIRE3, FORMAT_RGB888, PIXEL_2P3T|PIXEL_1T8B)
////////////////////////////////////////////dspi 4wire///////////////////////////////////////////////
#define DSPI_4WIRE_RGB565_1T8B LCD_CONFIG(DSPI_MODE|SPI_WIRE4, FORMAT_RGB565, PIXEL_1P1T|PIXEL_1T8B)
#define DSPI_4WIRE_RGB666_1T9B LCD_CONFIG(DSPI_MODE|SPI_WIRE4, FORMAT_RGB666, PIXEL_1P1T|PIXEL_1T9B)
#define DSPI_4WIRE_RGB666_1T6B LCD_CONFIG(DSPI_MODE|SPI_WIRE4, FORMAT_RGB666, PIXEL_2P3T|PIXEL_1T6B)
#define DSPI_4WIRE_RGB888_1T12B LCD_CONFIG(DSPI_MODE|SPI_WIRE4, FORMAT_RGB888, PIXEL_1P1T|PIXEL_1T12B)
#define DSPI_4WIRE_RGB888_1T8B LCD_CONFIG(DSPI_MODE|SPI_WIRE4, FORMAT_RGB888, PIXEL_2P3T|PIXEL_1T8B)
///////////////////////////////////////////////qspi//////////////////////////////////////////////////
#define QSPI_RGB565_SUBMODE0_1T8B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE0, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T8B)
#define QSPI_RGB666_SUBMODE0_1T8B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE0, FORMAT_RGB666, PIXEL_1P3T|PIXEL_1T8B)
#define QSPI_RGB888_SUBMODE0_1T8B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE0, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T8B)
#define QSPI_RGB565_SUBMODE1_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE1, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T2B)
#define QSPI_RGB666_SUBMODE1_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE1, FORMAT_RGB666, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB888_SUBMODE1_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE1, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB565_SUBMODE2_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE2, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T2B)
#define QSPI_RGB666_SUBMODE2_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE2, FORMAT_RGB666, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB888_SUBMODE2_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SUBMODE2, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB565_RAMLESS_1T2B LCD_CONFIG(QSPI_MODE|QSPI_RAMLESS, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T2B)
#define QSPI_RGB666_RAMLESS_1T2B LCD_CONFIG(QSPI_MODE|QSPI_RAMLESS, FORMAT_RGB666, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB888_RAMLESS_1T2B LCD_CONFIG(QSPI_MODE|QSPI_RAMLESS, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB565_FT2388_1T2B LCD_CONFIG(QSPI_MODE|QSPI_FT2388, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T2B)
#define QSPI_RGB666_FT2388_1T2B LCD_CONFIG(QSPI_MODE|QSPI_FT2388, FORMAT_RGB666, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB888_FT2388_1T2B LCD_CONFIG(QSPI_MODE|QSPI_FT2388, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB565_SD3302_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SD3302, FORMAT_RGB565, PIXEL_1P2T|PIXEL_1T2B)
#define QSPI_RGB666_SD3302_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SD3302, FORMAT_RGB666, PIXEL_1P3T|PIXEL_1T2B)
#define QSPI_RGB888_SD3302_1T2B LCD_CONFIG(QSPI_MODE|QSPI_SD3302, FORMAT_RGB888, PIXEL_1P3T|PIXEL_1T2B)
#define RGB_SPI_3WIRE_RGB565 LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB565, 0)
#define RGB_SPI_3WIRE_RGB666 LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB666, 0)
#define RGB_SPI_3WIRE_RGB888 LCD_CONFIG(SPI_MODE|SPI_WIRE3, FORMAT_RGB888, 0)
#define MCU_8BITS_RGB565 LCD_CONFIG(0, FORMAT_RGB565, 0)
#define MCU_8BITS_RGB666 LCD_CONFIG(0, FORMAT_RGB666, 0)
#define MCU_8BITS_RGB888 LCD_CONFIG(0, FORMAT_RGB888, 0)
#endif // #if defined(CONFIG_CPU_BR28)
//////////////////////////////lcd mode end///////////////////////////
//~~~~~~~~~~~~~~~~~~~~~~~屏驱相关的参数和结构体~~~~~~~~~~~~~~~~~~~~~~~~~~//
// 屏幕初始化代码延时标志
#ifndef REGFLAG_DELAY
#define REGFLAG_DELAY_FLAG 0xff5aa5ff
#define REGFLAG_DELAY ((REGFLAG_DELAY_FLAG>>24)&0xff),((REGFLAG_DELAY_FLAG>>16)&0xff),((REGFLAG_DELAY_FLAG>>8)&0xff),(REGFLAG_DELAY_FLAG&0xff)
#endif
#ifndef REGFLAG_CONFIRM
#define REGFLAG_CONFIRM_FLAG 0xff5bb5ff
#define REGFLAG_CONFIRM ((REGFLAG_CONFIRM_FLAG>>24)&0xff),((REGFLAG_CONFIRM_FLAG>>16)&0xff),((REGFLAG_CONFIRM_FLAG>>8)&0xff),(REGFLAG_CONFIRM_FLAG&0xff)
#endif
// 区分屏幕初始化代码开始和结束的标志
#define BEGIN_FLAG 0x12345678
#define END_FLAG 0x87654321
#define _BEGIN_ ((BEGIN_FLAG>>24)&0xff),((BEGIN_FLAG>>16)&0xff),((BEGIN_FLAG>>8)&0xff),(BEGIN_FLAG&0xff)
#define _END_ ((END_FLAG>>24)&0xff),((END_FLAG>>16)&0xff),((END_FLAG>>8)&0xff),(END_FLAG&0xff)
struct lcd_drive {
char *logo; //屏驱logo
u8 column_addr_align; //列对齐(默认为1)
u8 row_addr_align; //行对齐(默认为1)
u8 *lcd_cmd; // 初始化命令列表
int cmd_cnt;
// 显示形状描述
u16 radius; // 圆角半径
u32 fill_argb; // 不显示区域填充色
// 配置参数
void *param;
// 应用层函数
void (*reset)(void); /* 复位函数 */
int (*backlight_ctrl)(u8);
int (*power_ctrl)(u8);
void (*entersleep)(void);
void (*exitsleep)(void);
u32(*read_id)(void);
u32 lcd_id; //屏幕id
};
#define REGISTER_LCD_DEVICE(lcd) \
const struct lcd_drive lcd sec(.lcd_device_info) __attribute__((used))
extern struct lcd_drive lcd_device_begin[];
extern struct lcd_drive lcd_device_end[];
struct lcd_platform_data {
int pin_reset;
int pin_en;
int pin_en_ex;
int pin_bl;
int pin_te;
};
// enum LCD_COLOR {
// LCD_COLOR_RGB888,
// LCD_COLOR_RGB565,
// LCD_COLOR_MONO,
// };
// 使用 dbi 模块定义的颜色格式
#define LCD_COLOR_RGB888 OUTPUT_FORMAT_RGB888
#define LCD_COLOR_RGB565 OUTPUT_FORMAT_RGB565
enum LCD_IF {
LCD_SPI,
LCD_MCU,
LCD_RGB,
LCD_EMI,
};
struct lcd_info {
u16 width;
u16 height;
u16 stride;
u16 radius;
u32 fill_argb;
u8 fps;
u8 color_format;
u8 interface;
u8 col_align;
u8 row_align;
u8 buf_num;
u8 bl_status;
u8 *buffer;
int buffer_size;
};
struct lcd_interface {
void (*init)(void *);
void (*get_screen_info)(struct lcd_info *info);
void (*buffer_malloc)(u8 **buf, u32 *size);
void (*buffer_free)(u8 *buf);
void (*draw)(u8 *buf, int xstart, int xend, int ystart, int yend);
void (*draw_continue)(u8 *buf, int xstart, int xend, int ystart, int yend);
void (*set_draw_area)(u16 xs, u16 xe, u16 ys, u16 ye);
void (*clear_screen)(u32 color, int xstart, int xend, int ystart, int yend);
int (*backlight_ctrl)(u8 on);
int (*power_ctrl)(u8 on);
void (*draw_page)(u8 *buf, u8 page_star, u8 page_len);//刷新页(点阵屏)
};
extern struct lcd_interface lcd_interface_begin[];
extern struct lcd_interface lcd_interface_end[];
#define REGISTER_LCD_INTERFACE(lcd) \
static const struct lcd_interface lcd sec(.lcd_if_info) __attribute__((used))
struct lcd_interface *lcd_get_hdl();
#define LCD_SPI_PLATFORM_DATA_BEGIN(data) \
const struct lcd_platform_data data
#define LCD_SPI_PLATFORM_DATA_END() \
extern struct mcpwm_config lcd_pwm_p_data;
/**
* @brief lcd bl引脚输出控制
*
* @param val 电平输出值
*
*/
void lcd_bl_ctrl(u8 val);
/**
* @brief lcd en引脚输出控制
*
* @param val 电平输出值
*
*/
void lcd_en_ctrl(u8 val);
/*
* Description: 获取 LCD 背光状态
* Returns : 0 背光熄灭
* 1 背光点亮
*/
int lcd_backlight_status();
/*
* Description: 获取 LCD sleep状态
* Returns : 0 sleep out
* 1 sleep in
*/
int lcd_sleep_status();
// int lcd_drv_backlight_ctrl(u8 percent);
// int lcd_drv_power_ctrl(u8 on);
int lcd_backlight_ctrl(u8 on);
/*
* Description: 发送屏幕初始化指令
* @param cmd_list 初始化命令地址
* @param cmd_cnt 初始化命令长度
*/
void lcd_drv_cmd_list(u8 *cmd_list, int cmd_cnt);
/*
* Description: LCD 设备初始化
*
* Arguments : 匹配模式, 屏驱LOGO
*
* Returns : 屏设备句柄
*
* Notes : 1、当只有一个屏驱时,不进行匹配,直接返回该屏驱句柄
*
* 2、两种匹配方式 LOGO 或者 ID
*
* 3、若存在屏设备句柄时直接返回
*/
struct lcd_drive *lcd_drv_get_hdl(u8 mode, const char *logo);
/*
* Description: LCD 设备初始化
*
* Arguments : 匹配模式, 屏驱ID
*
* Returns : 屏设备句柄
*/
struct lcd_drive *lcd_drv_get_hdl_by_id();
/*
* Description: LCD 设备初始化
*
* Arguments : 匹配模式, 屏驱LOGO
*
* Returns : 屏设备句柄
*/
struct lcd_drive *lcd_drv_get_hdl_by_logo(const char *logo);
/*
* Description: 获取 LCD 设备信息
*
* Arguments : *info LCD 设备信息缓存结构体,根据结构体内容赋值即可
*
* Returns : 0 获取成功
*/
int lcd_drv_get_info(void *info);
/*
* Description: 获取向 LCD 设备发送一帧数据所需时间(us)
*
* Returns : 发送一帧数据的时间
*/
extern u32 lcd_get_spi_frame_period_us(void);
/*
* Description: 获取 LCD 设备刷新一行所需时间(us)
*
* Returns : 刷新一行的时间
*/
extern u8 lcd_get_te_line_period_us(void);
/*
* Description: 获取 LCD 设备刷新一帧所需时间(us)
*
* Returns : 刷新一帧的时间
*/
extern u32 lcd_get_te_frame_period_us(void);
/*
* Description: 获取 LCD 设备的宽度
*
* Returns : LCD 宽度
*/
extern int lcd_get_screen_width();
/*
* Description: 获取 LCD 设备的高度
*
* Returns : LCD 高度
*/
extern int lcd_get_screen_height();
// 两毫秒延时
extern void delay_2ms(int cnt);
/*************************************************************************/
struct lcd_sleep_headler {
char *name;
void (*enter)(void);
void (*exit)(void);
};
#define REGISTER_LCD_SLEEP_HEADLER(target) \
const struct lcd_sleep_headler target sec(.lcd_sleep_headler)
extern const struct lcd_sleep_headler lcd_sleep_ctrl_headler_begin[];
extern const struct lcd_sleep_headler lcd_sleep_ctrl_headler_end[];
#define list_for_each_lcd_sleep_headler(p) \
for (p = (struct lcd_sleep_headler *)lcd_sleep_ctrl_headler_begin; p < lcd_sleep_ctrl_headler_end; p++)
/*************************************************************************/
#endif