mcu_hi3321_watch/tjd/driver/lcd/lcd.c
2025-05-31 10:45:15 +08:00

172 lines
4.7 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 "debug_print.h"
#include "lcd.h"
#include "common_def.h"
#include "pinctrl.h"
#include "gpio.h"
#include "rtc.h"
#include "timer.h"
#include "systick.h"
#include "chip_core_irq.h"
// #include "thread_init.h"
#include "cmsis_os2.h" // ::CMSIS:RTOS2
#include "cmsis_compiler.h" // Compiler agnostic definitions
#include "os_tick.h"
#include "common_def.h"
#include "lcd_config.h"
extern const lcd_cmds_sequ g_display_off_cmds;
extern const lcd_cmds_sequ g_idle_in_cmds;
extern const lcd_cmds_sequ g_idle_out_cmds;
extern const lcd_cmds_sequ g_te_on_cmds;
extern const lcd_cmds_sequ g_te_off_cmds;
extern const lcd_cmds_sequ g_brightness_cmds;
extern const lcd_cmds_sequ g_sleep_in_cmds;
extern const lcd_cmds_sequ g_sleep_out_cmds;
#define TJD_LCD_460x460_SCREEN_ID 0x1133
const combo_dev_cfg_t tjd_g_panel_460x460_60_config = {
.devno = 0,
.lane_id = {0, -1},
.out_mode = OUT_MODE_DSI_CMD,
.out_format = OUT_FORMAT_RGB_24BIT,
.sync_info = {
.hsa_pixels = 2, // hsa 10 pixels
.hbp_pixels = 10, // hbp 10 pixels
.hact_pixels = 466, // hact 454 pixels
.hfp_pixels = 10, // hfp 10 pixels
.vsa_lines = 2, // vsa 4 lines
.vbp_lines = 10, // vbp 12 lines
.vact_lines = 466, // vact 454 lines
.vfp_lines = 8, // vfp 10 lines
},
//.phy_data_rate = 480, // 480Mbps mipi使用的
//.pixel_clk = 20000, // 20000KHz dpu使用
.phy_data_rate = 400, // 480Mbps mipi使用的
.pixel_clk = 16000, // 20000KHz dpu使用
};
const lcd_cmd_sequ g_tjd_460x460_screen_init_on[] = {
//bist code
#if 0
{1, 2, {0xfe, 0x20}, 0},
{1, 2, {0xf4, 0x5a}, 0},
{1, 2, {0xf5, 0x59}, 0},
{1, 2, {0xfe, 0xd0}, 0},
{1, 2, {0x4d, 0x7f}, 0},
{1, 2, {0x4e, 0x80}, 0},
{1, 2, {0xfe, 0x40}, 0},
{1, 2, {0x54, 0xaf}, 0},
#endif
/*{1, 2, {0xfe, 0x20}, 0},
{1, 2, {0xf4, 0x5a}, 0},
{1, 2, {0xf5, 0x59}, 0},
{1, 2, {0xfe, 0x40}, 0},
{1, 2, {0x08, 0x0a}, 0},*/
{1, 2, {0xfe, 0x00}, 0},
//{1, 2, {0xc4, 0x80}, 0},
//rgb24位数据
{1, 2, {0x3a, 0x77}, 0},
//te信号低电平表示忙高电平通知MCU可以送显
{1, 2, {0x35, 0x00}, 0},
//
{1, 2, {0x53, 0x20}, 0},
//亮度调节
{1, 2, {0x51, 0xff}, 0},
//高亮模式,默认如此,不用管
{1, 2, {0x63, 0xff}, 0},
//设置列地址
{1, 5, {0x2a, 0x00,0x06,0x01,0xd7}, 0},
//设置行地址
{1, 5, {0x2b, 0x00,0x00,0x01,0xd1}, 0},
{1, 3, {0x44, 0x01, 0xc5}, 0},
//退出睡眠
#if defined (TJD_LCD_1_43)
{1, 1, {0x11}, 120},
#else
{1, 1, {0x11}, 60},
#endif
//开启显示
{1, 1, {0x29}, 0},
};
const lcd_cmds_sequ tjd_g_460x460_screen_init_on_cmds = {
.cmd = g_tjd_460x460_screen_init_on,
.cmd_cnt = array_size(g_tjd_460x460_screen_init_on),
};
const lcd_cmd_sequ g_tjd_460x460_screen_init_off[] = {
{1, 2, {0xfe, 0x00}, 0}, /* select default cmd page */
{1, 1, {0x28}, 10}, /* display off */
{1, 1, {0x10}, 100}, /* sleep in */
{1, 2, {0x4F, 0x01}, 100}, /* idle */
};
const lcd_cmds_sequ tjd_g_460x460_screen_init_off_cmds = {
.cmd = g_tjd_460x460_screen_init_off,
.cmd_cnt = array_size(g_tjd_460x460_screen_init_off),
};
const lcd_drv_cfg g_tjd_lcd_driver_ops[] = {
{
.bus_type = BUS_DISPLAY_MIPI,
.bus_cfg = &tjd_g_panel_460x460_60_config,
.x_start = 6,
.y_start = 0,
.fps = 60,
.lcd_id = TJD_LCD_460x460_SCREEN_ID,
.display_on_cmds = &tjd_g_460x460_screen_init_on_cmds,
.display_off_cmds = &tjd_g_460x460_screen_init_off_cmds,
.enter_idle_cmds = &g_idle_in_cmds,
.exit_idle_cmds = &g_idle_out_cmds,
.te_on_cmds = &g_te_on_cmds,
.te_off_cmds = &g_te_off_cmds,
.set_brightnes_cmds = &g_brightness_cmds,
.sleep_in_cmds = &g_sleep_in_cmds,
.sleep_out_cmds = &g_sleep_out_cmds,
.lcd_id_info.reg_addr = 0x04,
.lcd_id_info.read_len = 3,
}
};
lcd_drv_cfg *tjd_lcd_get_driver_ops(void)
{
return g_tjd_lcd_driver_ops;
}
uint32_t tjd_lcd_get_ops_num(void)
{
return array_size(g_tjd_lcd_driver_ops);
}
combo_dev_cfg_t *tjd_lcd_get_bus_escape_config(void)
{
return g_tjd_lcd_driver_ops[0].bus_cfg;
}
lcd_drv_cfg *tjd_lcd_get_driver_config(uint32_t id)
{
uint32_t i;
if (id == 0) {
return NULL;
}
for (i = 0; i < array_size(g_tjd_lcd_driver_ops); i++) {
if (g_tjd_lcd_driver_ops[i].lcd_id == id) {
return &(g_tjd_lcd_driver_ops[i]);
}
}
return NULL;
}