1 引言
LCD分辨率240x320适合:GC9300,GC9306,ST7789
LCD分辨率480x320适合:HX8357C
2 下载地址
- 有需要参考的朋友可以在博主的博文链接地址中进行下载:
https://download.csdn.net/download/zhoubingda/12711011
3 LCD驱动代码
1)GC9300驱动
/*
*********************************************************************************************************
* sys_config.fex 配置示例
lcd_bl_en_used = 0
lcd_bl_en = 0
lcd_power_used = 0
lcd_power = 0
lcd_pwm_used = 1
lcd_pwm = port:PA08<2><0><default><default>
*********************************************************************************************************
*/
#include "lcd_panel_cfg.h"
#define GC9300_CMD(V) LCD_CPU_WR_INDEX(0, V)
#define GC9300_DATA(D) LCD_CPU_WR_DATA(0, D)
#define __inf eLIBs_printf
void Lcd_cpuisr_proc(void);
static void LCD_cfg_panel_info(__panel_para_t * info)
{
memset(info,0,sizeof(__panel_para_t));
//屏的基本信息 lcd gc9300
#if 1 //横屏分辨率
info->lcd_x = 320;
info->lcd_y = 240;
#else //竖屏分辨率
info->lcd_x = 240;
info->lcd_y = 320;
#endif
info->lcd_dclk_freq = 12; //MHz
info->lcd_pwm_freq = 1; //KHz
info->lcd_srgb = 0; //0x00202020;
info->lcd_swap = 0;
//屏的接口配置信息
info->lcd_if = 1; //0:HV , 1:8080 I/F, 2:TTL I/F, 3:LVDS
//屏的HV模块相关信息
info->lcd_hv_if = 0;
info->lcd_hv_hspw = 0;
info->lcd_hv_lde_iovalue = 0;
info->lcd_hv_lde_used = 0;
info->lcd_hv_smode = 0;
info->lcd_hv_syuv_if = 0;
info->lcd_hv_vspw = 0;
//屏的HV配置信息
info->lcd_hbp = 3;
info->lcd_ht = 480;
info->lcd_vbp = 3;
info->lcd_vt = (2 * 450);
//屏的IO配置信息
info->lcd_io_cfg0 = 0x00000000;
info->lcd_io_cfg1 = 0x00000000;
info->lcd_io_strength = 0;
//TTL屏幕的配置信息
info->lcd_ttl_ckvd = 0;
info->lcd_ttl_ckvh = 0;
info->lcd_ttl_ckvt = 0;
info->lcd_ttl_datainv_en = 0;
info->lcd_ttl_datainv_sel= 0;
info->lcd_ttl_datarate = 0;
info->lcd_ttl_oehd = 0;
info->lcd_ttl_oehh = 0;
info->lcd_ttl_oevd = 0;
info->lcd_ttl_oevh = 0;
info->lcd_ttl_oevt = 0;
info->lcd_ttl_revd = 0;
info->lcd_ttl_revsel = 0;
info->lcd_ttl_sthd = 0;
info->lcd_ttl_sthh = 0;
info->lcd_ttl_stvdl = 0;
info->lcd_ttl_stvdp = 0;
info->lcd_ttl_stvh = 0;
//gc9300 的配置信息
info->lcd_frm = 0; //0: disable; 1: enable rgb666 dither; 2:enable rgb656 dither
info->lcd_cpu_if = 4; //16: color will become red;
}
static void LCD_init_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, Lcd_cpuisr_proc);
}
static void LCD_exit_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, 0);
}
static __s32 LCD_open_flow(__u32 sel)
{
LCD_OPEN_FUNC(sel, LCD_power_on , 10); //打开LCD供电,并延时10ms
LCD_OPEN_FUNC(sel, TCON_open , 200); //打开LCD控制器,并延时200ms
LCD_OPEN_FUNC(sel, LCD_open_cmd , 100); //通过IO配置LCD模组为工作模式,并延时100ms
LCD_OPEN_FUNC(sel, LCD_bl_close , 0); //打开背光,并延时0ms
LCD_OPEN_FUNC(sel, LCD_init_isr , 0); //初始化CPU PANEL 中断服务程序,并延时 0ms
return 0;
}
static __s32 LCD_close_flow(__u32 sel)
{
LCD_CLOSE_FUNC(sel, LCD_exit_isr , 0); //关闭CPU PANEL中断服务程序,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_bl_close , 0); //关闭背光,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_close_cmd , 0); //通过IO配置LCD模组为掉电/休眠模式,并延时0ms
LCD_CLOSE_FUNC(sel, TCON_close , 0); //关闭LCD 控制器,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_power_off , 1700); //关闭LCD供电,并延时1700ms
return 0;
}
/*
*********************************************************************************************************
* POWER ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_power_on(__u32 sel)
{
LCD_POWER_EN(sel, 1);
}
static void LCD_power_off(__u32 sel)
{
LCD_POWER_EN(sel, 0);
}
/*
*********************************************************************************************************
* BACK LIGHT ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_bl_open(__u32 sel)
{
LCD_BL_EN(sel, 1);
}
static void LCD_bl_close(__u32 sel)
{
LCD_BL_EN(sel, 0);
}
static void lcd_cpu_cmdset(void)
{
//------------end Reset Sequence-----------//
GC9300_CMD(0xfe);
GC9300_CMD(0xef);
GC9300_CMD(0x36);
GC9300_DATA(0x28); //0x48竖屏 //0x38或者0x28横屏
GC9300_CMD(0x3a);
GC9300_DATA(0x05);
//------end display control setting----//
//------Power Control Registers Initial----//
GC9300_CMD(0xa4);
GC9300_DATA(0x44);
GC9300_DATA(0x44);
GC9300_CMD(0xa5);
GC9300_DATA(0x42);
GC9300_DATA(0x42);
GC9300_CMD(0xaa);
GC9300_DATA(0x88);
GC9300_DATA(0x88);
GC9300_CMD(0xe8);
GC9300_DATA(0x11);
GC9300_DATA(0x0b);
GC9300_CMD(0xe3);
GC9300_DATA(0x01);
GC9300_DATA(0x10);
GC9300_CMD(0xff);
GC9300_DATA(0x61);
GC9300_CMD(0xAC);
GC9300_DATA(0x00);
GC9300_CMD(0xad);
GC9300_DATA(0x33);
GC9300_CMD(0xae);
GC9300_DATA(0x2b);
GC9300_CMD(0xAf);
GC9300_DATA(0x55);
GC9300_CMD(0xa6);
GC9300_DATA(0x2a);
GC9300_DATA(0x2a);
GC9300_CMD(0xa7);
GC9300_DATA(0x2b);
GC9300_DATA(0x2b);
GC9300_CMD(0xa8);
GC9300_DATA(0x18);
GC9300_DATA(0x18);
GC9300_CMD(0xa9);
GC9300_DATA(0x2a);
GC9300_DATA(0x2a);
GC9300_CMD(0x35);
GC9300_DATA(0x00);
GC9300_CMD(0x44);
GC9300_DATA(0x00);
GC9300_DATA(0x0a);
//------------window setting------------------//
#if 1//横屏窗口设置
GC9300_CMD(0x2b);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0xef);
GC9300_CMD(0x2a);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x01);
GC9300_DATA(0x3f);
#else //竖屏窗口设置
GC9300_CMD(0x2a);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0xef);
GC9300_CMD(0x2b);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x01);
GC9300_DATA(0x3f);
#endif
GC9300_CMD(0x2c);
//------------gamma setting------------------//
GC9300_CMD(0xF0);
GC9300_DATA(0x02);
GC9300_DATA(0x01);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x07);
GC9300_CMD(0xF1);
GC9300_DATA(0x01);
GC9300_DATA(0x01);
GC9300_DATA(0x00);
GC9300_DATA(0x0F);
GC9300_DATA(0x22);
GC9300_DATA(0x12);
GC9300_CMD(0xF2);
GC9300_DATA(0x09);
GC9300_DATA(0x07);
GC9300_DATA(0x22);
GC9300_DATA(0x04);
GC9300_DATA(0x04);
GC9300_DATA(0x33);
GC9300_CMD(0xF3);
GC9300_DATA(0x13);
GC9300_DATA(0x0B);
GC9300_DATA(0x56);
GC9300_DATA(0x03);
GC9300_DATA(0x02);
GC9300_DATA(0x65);
GC9300_CMD(0xF4);
GC9300_DATA(0x0B);
GC9300_DATA(0x19);
GC9300_DATA(0x17);
GC9300_DATA(0x04);
GC9300_DATA(0x07);
GC9300_DATA(0x0F);
GC9300_CMD(0xF5);
GC9300_DATA(0x05);
GC9300_DATA(0x10);
GC9300_DATA(0x11);
GC9300_DATA(0x34);
GC9300_DATA(0x34);
GC9300_DATA(0x0F);
//--------end gamma setting--------------//
GC9300_CMD(0x11);
LCD_delay(120*60000);
GC9300_CMD(0x29);
LCD_delay(120*60000);
GC9300_CMD(0x2c);
}
static void LCD_open_cmd(__u32 sel)
{
__u32 id = 0;
LCD_CPU_AUTO_FLUSH(0,0);
__inf("LCD_BOOT: disable auto mode for setting!!!!!!!!!!!!!!!!\n");
LCD_delay(600);
LCD_CPU_RD(0, 0x0004, &id);
__inf("==LCD_BOOT: id to read back is %x\n",id);
//setting panel
lcd_cpu_cmdset();
__inf("LCD_BOOT: lcd_cpu_cmdset!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
LCD_CPU_AUTO_FLUSH(0,1);
__inf("LCD_BOOT: LCD_CPU_AUTO_FLUSH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
}
static void LCD_close_cmd(__u32 sel)
{
}
void Lcd_cpuisr_proc(void)
{
#if 1 //横屏窗口设置
GC9300_CMD(0x2b);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0xef);
GC9300_CMD(0x2a);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x01);
GC9300_DATA(0x3f);
#else //竖屏窗口设置
GC9300_CMD(0x2a);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0xef);
GC9300_CMD(0x2b);
GC9300_DATA(0x00);
GC9300_DATA(0x00);
GC9300_DATA(0x01);
GC9300_DATA(0x3f);
#endif
GC9300_CMD(0x2c);
}
void LCD_get_panel_funs_0(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}
void LCD_get_panel_funs_1(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info1;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}
2)GC9306驱动
/*
*********************************************************************************************************
* sys_config.fex 配置示例
lcd_bl_en_used = 0
lcd_bl_en = 0
lcd_power_used = 0
lcd_power = 0
lcd_pwm_used = 1
lcd_pwm = port:PA08<2><0><default><default>
*********************************************************************************************************
*/
#include "lcd_panel_cfg.h"
#define GC9306_CMD(V) LCD_CPU_WR_INDEX(0, V)
#define GC9306_DATA(D) LCD_CPU_WR_DATA(0, D)
#define __inf eLIBs_printf
void Lcd_cpuisr_proc(void);
static void LCD_cfg_panel_info(__panel_para_t * info)
{
memset(info,0,sizeof(__panel_para_t));
//屏的基本信息 lcd gc9306
#if 1 //横屏分辨率
info->lcd_x = 320;
info->lcd_y = 240;
#else //竖屏分辨率
info->lcd_x = 240;
info->lcd_y = 320;
#endif
info->lcd_dclk_freq = 12; //MHz
info->lcd_pwm_freq = 1; //KHz
info->lcd_srgb = 0; //0x00202020;
info->lcd_swap = 0;
//屏的接口配置信息
info->lcd_if = 1; //0:HV , 1:8080 I/F, 2:TTL I/F, 3:LVDS
//屏的HV模块相关信息
info->lcd_hv_if = 0;
info->lcd_hv_hspw = 0;
info->lcd_hv_lde_iovalue = 0;
info->lcd_hv_lde_used = 0;
info->lcd_hv_smode = 0;
info->lcd_hv_syuv_if = 0;
info->lcd_hv_vspw = 0;
//屏的HV配置信息
info->lcd_hbp = 3;
info->lcd_ht = 480;
info->lcd_vbp = 3;
info->lcd_vt = (2 * 450);
//屏的IO配置信息
info->lcd_io_cfg0 = 0x00000000;
info->lcd_io_cfg1 = 0x00000000;
info->lcd_io_strength = 0;
//TTL屏幕的配置信息
info->lcd_ttl_ckvd = 0;
info->lcd_ttl_ckvh = 0;
info->lcd_ttl_ckvt = 0;
info->lcd_ttl_datainv_en = 0;
info->lcd_ttl_datainv_sel= 0;
info->lcd_ttl_datarate = 0;
info->lcd_ttl_oehd = 0;
info->lcd_ttl_oehh = 0;
info->lcd_ttl_oevd = 0;
info->lcd_ttl_oevh = 0;
info->lcd_ttl_oevt = 0;
info->lcd_ttl_revd = 0;
info->lcd_ttl_revsel = 0;
info->lcd_ttl_sthd = 0;
info->lcd_ttl_sthh = 0;
info->lcd_ttl_stvdl = 0;
info->lcd_ttl_stvdp = 0;
info->lcd_ttl_stvh = 0;
//gc9306 的配置信息
info->lcd_frm = 0; //0: disable; 1: enable rgb666 dither; 2:enable rgb656 dither
info->lcd_cpu_if = 4; //16: color will become red;
}
static void LCD_init_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, Lcd_cpuisr_proc);
}
static void LCD_exit_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, 0);
}
static __s32 LCD_open_flow(__u32 sel)
{
LCD_OPEN_FUNC(sel, LCD_power_on , 10); //打开LCD供电,并延时10ms
LCD_OPEN_FUNC(sel, TCON_open , 200); //打开LCD控制器,并延时200ms
LCD_OPEN_FUNC(sel, LCD_open_cmd , 100); //通过IO配置LCD模组为工作模式,并延时100ms
LCD_OPEN_FUNC(sel, LCD_bl_close , 0); //打开背光,并延时0ms
LCD_OPEN_FUNC(sel, LCD_init_isr , 0); //初始化CPU PANEL 中断服务程序,并延时 0ms
return 0;
}
static __s32 LCD_close_flow(__u32 sel)
{
LCD_CLOSE_FUNC(sel, LCD_exit_isr , 0); //关闭CPU PANEL中断服务程序,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_bl_close , 0); //关闭背光,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_close_cmd , 0); //通过IO配置LCD模组为掉电/休眠模式,并延时0ms
LCD_CLOSE_FUNC(sel, TCON_close , 0); //关闭LCD 控制器,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_power_off , 1700); //关闭LCD供电,并延时1700ms
return 0;
}
/*
*********************************************************************************************************
* POWER ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_power_on(__u32 sel)
{
LCD_POWER_EN(sel, 1);
}
static void LCD_power_off(__u32 sel)
{
LCD_POWER_EN(sel, 0);
}
/*
*********************************************************************************************************
* BACK LIGHT ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_bl_open(__u32 sel)
{
LCD_BL_EN(sel, 1);
}
static void LCD_bl_close(__u32 sel)
{
LCD_BL_EN(sel, 0);
}
static void lcd_cpu_cmdset(void)
{
GC9306_CMD(0xfe);
GC9306_CMD(0xef);
GC9306_CMD(0x36);
GC9306_DATA(0x28); //0x48竖屏 //0x38或者0x28横屏
//GC9306_DATA(0xe8); //横屏 翻转180
GC9306_CMD(0x3a);
GC9306_DATA(0x05);
//------end display control setting----//
//------Power Control Registers Initial----//
GC9306_CMD(0xa4);
GC9306_DATA(0x44);
GC9306_DATA(0x44);
GC9306_CMD(0xa5);
GC9306_DATA(0x42);
GC9306_DATA(0x42);
GC9306_CMD(0xaa);
GC9306_DATA(0x88);
GC9306_DATA(0x88);
GC9306_CMD(0xe8);
GC9306_DATA(0x11);
GC9306_DATA(0x0b);
GC9306_CMD(0xe3);
GC9306_DATA(0x01);
GC9306_DATA(0x10);
GC9306_CMD(0xff);
GC9306_DATA(0x61);
GC9306_CMD(0xac);
GC9306_DATA(0x00);
GC9306_CMD(0xad);
GC9306_DATA(0x33);
GC9306_CMD(0xae);
GC9306_DATA(0x2b);
GC9306_CMD(0xaf);
GC9306_DATA(0x55);
GC9306_CMD(0xa6);
GC9306_DATA(0x2a);
GC9306_DATA(0x2a);
GC9306_CMD(0xa7);
GC9306_DATA(0x2b);
GC9306_DATA(0x2b);
GC9306_CMD(0xa8);
GC9306_DATA(0x18);
GC9306_DATA(0x18);
GC9306_CMD(0xa9);
GC9306_DATA(0x2a);
GC9306_DATA(0x2a);
#if 1 //横屏窗口设置
GC9306_CMD(0x2b);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0xef);
GC9306_CMD(0x2a);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x01);
GC9306_DATA(0x3f);
GC9306_CMD(0x2c);
#else //竖屏窗口设置
GC9306_CMD(0x2a);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0xef);
GC9306_CMD(0x2b);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x01);
GC9306_DATA(0x3f);
GC9306_CMD(0x2c);
#endif
GC9306_CMD(0xF0);
GC9306_DATA(0x02);
GC9306_DATA(0x01);
GC9306_DATA(0x00);
GC9306_DATA(0x06);
GC9306_DATA(0x09);
GC9306_DATA(0x0c);
GC9306_CMD(0xF1);
GC9306_DATA(0x01);
GC9306_DATA(0x03);
GC9306_DATA(0x00);
GC9306_DATA(0x3a);
GC9306_DATA(0x3e);
GC9306_DATA(0x09);
GC9306_CMD(0xF2);
GC9306_DATA(0x0c);
GC9306_DATA(0x09);
GC9306_DATA(0x26);
GC9306_DATA(0x07);
GC9306_DATA(0x07);
GC9306_DATA(0x30);
GC9306_CMD(0xF3);
GC9306_DATA(0x09);
GC9306_DATA(0x06);
GC9306_DATA(0x57);
GC9306_DATA(0x03);
GC9306_DATA(0x03);
GC9306_DATA(0x6b);
GC9306_CMD(0xF4);
GC9306_DATA(0x0d);
GC9306_DATA(0x1d);
GC9306_DATA(0x1c);
GC9306_DATA(0x06);
GC9306_DATA(0x08);
GC9306_DATA(0x0F);
GC9306_CMD(0xF5);
GC9306_DATA(0x0c);
GC9306_DATA(0x05);
GC9306_DATA(0x06);
GC9306_DATA(0x33);
GC9306_DATA(0x31);
GC9306_DATA(0x0F);
//------------------------------------end gamma setting-----------------------------------------//
GC9306_CMD(0x11);
LCD_delay(120*60000);
GC9306_CMD(0x29);
LCD_delay(120*60000);
GC9306_CMD(0x2c);
}
static void LCD_open_cmd(__u32 sel)
{
__u32 id = 0;
LCD_CPU_AUTO_FLUSH(0,0);
__inf("LCD_BOOT: disable auto mode for setting!!!!!!!!!!!!!!!!\n");
LCD_delay(600);
//LCD_CPU_RD(0, 0x0000,&id);
//__inf("==LCD_BOOT: id to read back is %x\n",id);
LCD_CPU_RD(0, 0x0004, &id);
__inf("==LCD_BOOT: id to read back is %x\n",id);
//setting panel
lcd_cpu_cmdset();
__inf("LCD_BOOT: lcd_cpu_cmdset!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
LCD_CPU_AUTO_FLUSH(0,1);
__inf("LCD_BOOT: LCD_CPU_AUTO_FLUSH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
}
static void LCD_close_cmd(__u32 sel)
{
}
void Lcd_cpuisr_proc(void)
{
#if 1 //横屏窗口设置
GC9306_CMD(0x2b);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0xef);
GC9306_CMD(0x2a);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x01);
GC9306_DATA(0x3f);
GC9306_CMD(0x2c);
#else //竖屏窗口设置
GC9306_CMD(0x2a);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0xef);
GC9306_CMD(0x2b);
GC9306_DATA(0x00);
GC9306_DATA(0x00);
GC9306_DATA(0x01);
GC9306_DATA(0x3f);
GC9306_CMD(0x2c);
#endif
}
void LCD_get_panel_funs_0(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}
void LCD_get_panel_funs_1(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info1;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}
3)ST7789驱动
/*
*********************************************************************************************************
* sys_config.fex 配置示例
lcd_bl_en_used = 0
lcd_bl_en = 0
lcd_power_used = 0
lcd_power = 0
lcd_pwm_used = 1
lcd_pwm = port:PA08<2><0><default><default>
*********************************************************************************************************
*/
#include "lcd_panel_cfg.h"
#define ST7789_CMD(V) LCD_CPU_WR_INDEX(0, V)
#define ST7789_DATA(D) LCD_CPU_WR_DATA(0, D)
#define __inf eLIBs_printf
void Lcd_cpuisr_proc(void);
static void LCD_cfg_panel_info(__panel_para_t * info)
{
memset(info,0,sizeof(__panel_para_t));
//屏的基本信息 ST7789
#if 1 //横屏分辨率
info->lcd_x = 320;
info->lcd_y = 240;
#else //竖屏分辨率
info->lcd_x = 240;
info->lcd_y = 320;
#endif
info->lcd_dclk_freq = 12; //MHz
info->lcd_pwm_freq = 1; //KHz
info->lcd_srgb = 0; //0x00202020;
info->lcd_swap = 0;
//屏的接口配置信息
info->lcd_if = 1; //0:HV , 1:8080 I/F, 2:TTL I/F, 3:LVDS
//屏的HV模块相关信息
info->lcd_hv_if = 0;
info->lcd_hv_hspw = 0;
info->lcd_hv_lde_iovalue = 0;
info->lcd_hv_lde_used = 0;
info->lcd_hv_smode = 0;
info->lcd_hv_syuv_if = 0;
info->lcd_hv_vspw = 0;
//屏的HV配置信息
info->lcd_hbp = 3;
info->lcd_ht = 480;
info->lcd_vbp = 3;
info->lcd_vt = (2 * 450);
//屏的IO配置信息
info->lcd_io_cfg0 = 0x00000000;
info->lcd_io_cfg1 = 0x00000000;
info->lcd_io_strength = 0;
//TTL屏幕的配置信息
info->lcd_ttl_ckvd = 0;
info->lcd_ttl_ckvh = 0;
info->lcd_ttl_ckvt = 0;
info->lcd_ttl_datainv_en = 0;
info->lcd_ttl_datainv_sel= 0;
info->lcd_ttl_datarate = 0;
info->lcd_ttl_oehd = 0;
info->lcd_ttl_oehh = 0;
info->lcd_ttl_oevd = 0;
info->lcd_ttl_oevh = 0;
info->lcd_ttl_oevt = 0;
info->lcd_ttl_revd = 0;
info->lcd_ttl_revsel = 0;
info->lcd_ttl_sthd = 0;
info->lcd_ttl_sthh = 0;
info->lcd_ttl_stvdl = 0;
info->lcd_ttl_stvdp = 0;
info->lcd_ttl_stvh = 0;
//st7789屏幕的配置信息
info->lcd_frm = 0; //2; //0: disable; 1: enable rgb666 dither; 2:enable rgb656 dither
info->lcd_cpu_if = 4; //16: color will become red;
}
static void LCD_init_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, Lcd_cpuisr_proc);
}
static void LCD_exit_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, 0);
}
static __s32 LCD_open_flow(__u32 sel)
{
LCD_OPEN_FUNC(sel, LCD_power_on , 10); //打开LCD供电,并延时10ms
LCD_OPEN_FUNC(sel, TCON_open , 200); //打开LCD控制器,并延时200ms
LCD_OPEN_FUNC(sel, LCD_open_cmd , 100); //通过IO配置LCD模组为工作模式,并延时100ms
LCD_OPEN_FUNC(sel, LCD_bl_close , 0); //打开背光,并延时0ms
LCD_OPEN_FUNC(sel, LCD_init_isr , 0); //初始化CPU PANEL 中断服务程序,并延时 0ms
return 0;
}
static __s32 LCD_close_flow(__u32 sel)
{
LCD_CLOSE_FUNC(sel, LCD_exit_isr , 0); //关闭CPU PANEL中断服务程序,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_bl_close , 0); //关闭背光,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_close_cmd , 0); //通过IO配置LCD模组为掉电/休眠模式,并延时0ms
LCD_CLOSE_FUNC(sel, TCON_close , 0); //关闭LCD 控制器,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_power_off , 1700); //关闭LCD供电,并延时1700ms
return 0;
}
/*
*********************************************************************************************************
* POWER ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_power_on(__u32 sel)
{
LCD_POWER_EN(sel, 1);
}
static void LCD_power_off(__u32 sel)
{
LCD_POWER_EN(sel, 0);
}
/*
*********************************************************************************************************
* BACK LIGHT ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_bl_open(__u32 sel)
{
LCD_BL_EN(sel, 1);
}
static void LCD_bl_close(__u32 sel)
{
LCD_BL_EN(sel, 0);
}
static void lcd_cpu_cmdset(void)
{
//-----------------------------------ST7789 reset sequence------------------------------------//
/*
LCD_RESET=1;
Delayms(1); //Delay 1ms
LCD_RESET=0;
Delayms(10); //Delay 10ms
LCD_RESET=1;
Delayms(120); //Delay 120ms
*/
//--------------------------------------------------------------------------------------------//
ST7789_CMD(0x11);
LCD_delay(120*60000); //Delay 120ms
//--------------------------------ST7789S Frame rate setting----------------------------------//
ST7789_CMD(0xb2);
ST7789_DATA(0x0c); //0x05
ST7789_DATA(0x0c); //0x05
ST7789_DATA(0x00);
ST7789_DATA(0x33);
ST7789_DATA(0x33);
ST7789_CMD(0xb7);
ST7789_DATA(0x35);
//---------------------------------ST7789S Power setting--------------------------------------//
ST7789_CMD(0xbb);
ST7789_DATA(0x1c); //(0x35);//10
ST7789_CMD(0xc0);
ST7789_DATA(0x2c);
ST7789_CMD(0xc2);
ST7789_DATA(0x01);
ST7789_CMD(0xc3);
ST7789_DATA(0x12); //(0x17);
ST7789_CMD(0xc4);
ST7789_DATA(0x20);
ST7789_CMD(0xc6);
ST7789_DATA(0x0f); //(0x15);//0F
ST7789_CMD(0xca);
ST7789_DATA(0x0f);
ST7789_CMD(0xc8);
ST7789_DATA(0x08);
ST7789_CMD(0x55);
ST7789_DATA(0x90);
ST7789_CMD(0xd0);
ST7789_DATA(0xa4);
ST7789_DATA(0xa2); //(0xa1);
ST7789_CMD(0x3a);
ST7789_DATA(0x55);
ST7789_CMD(0x36);
ST7789_DATA(0x60); //0x60 horizontal show // 0x00 vertical show
//ST7789_DATA(0xa0); //横屏翻转180
//--------------------------------ST7789S gamma setting---------------------------------------//
ST7789_CMD(0xe0);
ST7789_DATA(0xf0);
ST7789_DATA(0x00);
ST7789_DATA(0x0a);
ST7789_DATA(0x10);
ST7789_DATA(0x12);
ST7789_DATA(0x1b);
ST7789_DATA(0x39);
ST7789_DATA(0x44);
ST7789_DATA(0x47);
ST7789_DATA(0x28);
ST7789_DATA(0x12);
ST7789_DATA(0x10);
ST7789_DATA(0x16);
ST7789_DATA(0x1b);
ST7789_CMD(0xe1);
ST7789_DATA(0xf0);
ST7789_DATA(0x00);
ST7789_DATA(0x0a);
ST7789_DATA(0x10);
ST7789_DATA(0x11);
ST7789_DATA(0x1a);
ST7789_DATA(0x3b);
ST7789_DATA(0x34);
ST7789_DATA(0x4e);
ST7789_DATA(0x3a);
ST7789_DATA(0x17);
ST7789_DATA(0x16);
ST7789_DATA(0x21);
ST7789_DATA(0x22);
#if 1 //横屏窗口设置
ST7789_CMD(0x2b);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0xef);
ST7789_CMD(0x2a);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x01);
ST7789_DATA(0x3f);
ST7789_CMD(0x2c);
#else //竖屏窗口设置
ST7789_CMD(0x2a);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0xef);
ST7789_CMD(0x2b);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x01);
ST7789_DATA(0x3f);
ST7789_CMD(0x2c);
#endif
}
static void LCD_open_cmd(__u32 sel)
{
__u32 id = 0;
LCD_CPU_AUTO_FLUSH(0,0);
__inf("LCD_BOOT: disable auto mode for setting!!!!!!!!!!!!!!!!\n");
LCD_delay(600);
//LCD_CPU_RD(0, 0x0000,&id);
//__inf("==LCD_BOOT: id to read back is %x\n",id);
LCD_CPU_RD(0, 0x0004, &id);
__inf("==LCD_BOOT: id to read back is %x\n",id);
//setting panel
lcd_cpu_cmdset();
__inf("LCD_BOOT: lcd_cpu_cmdset!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
LCD_CPU_AUTO_FLUSH(0,1);
__inf("LCD_BOOT: LCD_CPU_AUTO_FLUSH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
}
static void LCD_close_cmd(__u32 sel)
{
}
void Lcd_cpuisr_proc(void)
{
#if 1 //横屏窗口设置
ST7789_CMD(0x2b);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0xef);
ST7789_CMD(0x2a);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x01);
ST7789_DATA(0x3f);
ST7789_CMD(0x2c);
#else //竖屏窗口设置
ST7789_CMD(0x2a);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0xef);
ST7789_CMD(0x2b);
ST7789_DATA(0x00);
ST7789_DATA(0x00);
ST7789_DATA(0x01);
ST7789_DATA(0x3f);
ST7789_CMD(0x2c);
#endif
}
void LCD_get_panel_funs_0(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}
void LCD_get_panel_funs_1(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info1;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}
4)HX8357C驱动
/*
*********************************************************************************************************
* sys_config.fex 配置示例
lcd_bl_en_used = 0
lcd_bl_en = 0
lcd_power_used = 0
lcd_power = 0
lcd_pwm_used = 1
lcd_pwm = port:PA08<2><0><default><default>
*********************************************************************************************************
*/
#include "lcd_panel_cfg.h"
#define HX8357C_CMD(V) LCD_CPU_WR_INDEX(0, V)
#define HX8357C_DATA(D) LCD_CPU_WR_DATA(0, D)
#define __inf eLIBs_printf
void Lcd_cpuisr_proc(void);
static void LCD_cfg_panel_info(__panel_para_t * info)
{
memset(info,0,sizeof(__panel_para_t));
//屏的基本信息 HX8357C
#if 1 //横屏分辨率
info->lcd_x = 320;
info->lcd_y = 480;
#else //竖屏分辨率
info->lcd_x = 480;
info->lcd_y = 320;
#endif
info->lcd_dclk_freq = 12; //MHz
info->lcd_pwm_freq = 1; //KHz
info->lcd_srgb = 0; //0x00202020;
info->lcd_swap = 0;
//屏的接口配置信息
info->lcd_if = 1; //0:HV , 1:8080 I/F, 2:TTL I/F, 3:LVDS
//屏的HV模块相关信息
info->lcd_hv_if = 0;
info->lcd_hv_hspw = 0;
info->lcd_hv_lde_iovalue = 0;
info->lcd_hv_lde_used = 0;
info->lcd_hv_smode = 0;
info->lcd_hv_syuv_if = 0;
info->lcd_hv_vspw = 0;
//屏的HV配置信息
info->lcd_hbp = 3;
info->lcd_ht = 480;
info->lcd_vbp = 3;
info->lcd_vt = (2 * 450);
//屏的IO配置信息
info->lcd_io_cfg0 = 0x00000000;
info->lcd_io_cfg1 = 0x00000000;
info->lcd_io_strength = 0;
//TTL屏幕的配置信息
info->lcd_ttl_ckvd = 0;
info->lcd_ttl_ckvh = 0;
info->lcd_ttl_ckvt = 0;
info->lcd_ttl_datainv_en = 0;
info->lcd_ttl_datainv_sel= 0;
info->lcd_ttl_datarate = 0;
info->lcd_ttl_oehd = 0;
info->lcd_ttl_oehh = 0;
info->lcd_ttl_oevd = 0;
info->lcd_ttl_oevh = 0;
info->lcd_ttl_oevt = 0;
info->lcd_ttl_revd = 0;
info->lcd_ttl_revsel = 0;
info->lcd_ttl_sthd = 0;
info->lcd_ttl_sthh = 0;
info->lcd_ttl_stvdl = 0;
info->lcd_ttl_stvdp = 0;
info->lcd_ttl_stvh = 0;
//hx8357c屏幕的配置信息
info->lcd_frm = 0; //2; //0: disable; 1: enable rgb666 dither; 2:enable rgb656 dither
//info->lcd_cpu_if = 4; //16: color will become red;
}
static void LCD_init_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, Lcd_cpuisr_proc);
}
static void LCD_exit_isr(__u32 sel)
{
LCD_cpu_register_irq(sel, 0);
}
static __s32 LCD_open_flow(__u32 sel)
{
LCD_OPEN_FUNC(sel, LCD_power_on , 10); //打开LCD供电,并延时10ms
LCD_OPEN_FUNC(sel, TCON_open , 200); //打开LCD控制器,并延时200ms
LCD_OPEN_FUNC(sel, LCD_open_cmd , 100); //通过IO配置LCD模组为工作模式,并延时100ms
LCD_OPEN_FUNC(sel, LCD_bl_close , 0); //打开背光,并延时0ms
LCD_OPEN_FUNC(sel, LCD_init_isr , 0); //初始化CPU PANEL 中断服务程序,并延时 0ms
return 0;
}
static __s32 LCD_close_flow(__u32 sel)
{
LCD_CLOSE_FUNC(sel, LCD_exit_isr , 0); //关闭CPU PANEL中断服务程序,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_bl_close , 0); //关闭背光,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_close_cmd , 0); //通过IO配置LCD模组为掉电/休眠模式,并延时0ms
LCD_CLOSE_FUNC(sel, TCON_close , 0); //关闭LCD 控制器,并延时0ms
LCD_CLOSE_FUNC(sel, LCD_power_off , 1700); //关闭LCD供电,并延时1700ms
return 0;
}
/*
*********************************************************************************************************
* POWER ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_power_on(__u32 sel)
{
LCD_POWER_EN(sel, 1);
}
static void LCD_power_off(__u32 sel)
{
LCD_POWER_EN(sel, 0);
}
/*
*********************************************************************************************************
* BACK LIGHT ON
*
* Description:
*
* Arguments :
*
* Returns :
*
* Note :
*********************************************************************************************************
*/
static void LCD_bl_open(__u32 sel)
{
LCD_BL_EN(sel, 1);
}
static void LCD_bl_close(__u32 sel)
{
LCD_BL_EN(sel, 0);
}
static void lcd_cpu_cmdset(void)
{
HX8357C_CMD(0xB9);
HX8357C_DATA(0xFF);
HX8357C_DATA(0x83);
HX8357C_DATA(0x57);
LCD_delay(120*6000);
HX8357C_CMD(0xB6);
HX8357C_DATA(0x2C); //VCOMDC
HX8357C_CMD(0x11); //Exit Sleep
LCD_delay(120*60000);
HX8357C_CMD(0x35); // TE ON
HX8357C_CMD(0x3A);
HX8357C_DATA(0x05); //262K
#if 0
HX8357C_CMD(0x36);
HX8357C_DATA(0x00); //0x60 horizontal show // 0x00 vertical show
#endif
HX8357C_CMD(0xB0);
HX8357C_DATA(0x68); //70Hz
HX8357C_CMD(0xCC); //Set Panel
HX8357C_DATA(0x09);
HX8357C_CMD(0xB1);
HX8357C_DATA(0x00); //DP
HX8357C_DATA(0x15); //BT
HX8357C_DATA(0x13); //VSPR
HX8357C_DATA(0x13); //VSNR
HX8357C_DATA(0x83); //AP
HX8357C_DATA(0x48); //FS
HX8357C_CMD(0xC0);
HX8357C_DATA(0x50); //OPON
HX8357C_DATA(0x50); //OPON
HX8357C_DATA(0x01); //STBA
HX8357C_DATA(0x3C); //STBA
HX8357C_DATA(0x1E); //STBA
HX8357C_DATA(0x08); //GEN
HX8357C_CMD(0xB4);
HX8357C_DATA(0x01); //NW
HX8357C_DATA(0x40); //RTN
HX8357C_DATA(0x00); //DIV
HX8357C_DATA(0x2A); //DUM
HX8357C_DATA(0x2A); //DUM
HX8357C_DATA(0x0D); //GDON
HX8357C_DATA(0x78); //GDOFF
HX8357C_CMD(0xE0);
HX8357C_DATA(0x02); //1
HX8357C_DATA(0x08); //2
HX8357C_DATA(0x11); //3
HX8357C_DATA(0x23); //4
HX8357C_DATA(0x2C); //5
HX8357C_DATA(0x40); //6
HX8357C_DATA(0x4A); //7
HX8357C_DATA(0x52); //8
HX8357C_DATA(0x48); //9
HX8357C_DATA(0x41); //10
HX8357C_DATA(0x3C); //11
HX8357C_DATA(0x33); //12
HX8357C_DATA(0x2E); //13
HX8357C_DATA(0x28); //14
HX8357C_DATA(0x27); //15
HX8357C_DATA(0x1B); //16
HX8357C_DATA(0x02); //17 v1
HX8357C_DATA(0x08); //18
HX8357C_DATA(0x11); //19
HX8357C_DATA(0x23); //20
HX8357C_DATA(0x2C); //21
HX8357C_DATA(0x40); //22
HX8357C_DATA(0x4A); //23
HX8357C_DATA(0x52); //24
HX8357C_DATA(0x48); //25
HX8357C_DATA(0x41); //26
HX8357C_DATA(0x3C); //27
HX8357C_DATA(0x33); //28
HX8357C_DATA(0x2E); //29
HX8357C_DATA(0x28); //30
HX8357C_DATA(0x27); //31
HX8357C_DATA(0x1B); //32
HX8357C_DATA(0x00); //33
HX8357C_DATA(0x01); //34
#if 0 // //竖屏窗口设置
HX8357C_CMD(0x2a);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0x3f);
HX8357C_CMD(0x2b);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0xdf);
HX8357C_CMD(0x2c);
#else //横屏窗口设置
HX8357C_CMD(0x2b);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0x3f);
HX8357C_CMD(0x2a);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0xdf);
HX8357C_CMD(0x2c);
#endif
LCD_delay(120*60000);
HX8357C_CMD(0x29); // display on
LCD_delay(120*60000);
HX8357C_CMD(0x2c);
}
static void LCD_open_cmd(__u32 sel)
{
__u32 id = 0;
LCD_CPU_AUTO_FLUSH(0,0);
__inf("LCD_BOOT: disable auto mode for setting!!!!!!!!!!!!!!!!\n");
LCD_delay(600);
//LCD_CPU_RD(0, 0x0000,&id);
//__inf("==LCD_BOOT: id to read back is %x\n",id);
LCD_CPU_RD(0, 0x0004, &id);
__inf("==LCD_BOOT: id to read back is %x\n",id);
//setting panel
lcd_cpu_cmdset();
__inf("LCD_BOOT: lcd_cpu_cmdset!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
LCD_CPU_AUTO_FLUSH(0,1);
__inf("LCD_BOOT: LCD_CPU_AUTO_FLUSH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
}
static void LCD_close_cmd(__u32 sel)
{
}
void Lcd_cpuisr_proc(void)
{
#if 0 // //竖屏窗口设置
HX8357C_CMD(0x2a);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0x3f);
HX8357C_CMD(0x2b);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0xdf);
HX8357C_CMD(0x2c);
#else //横屏窗口设置
HX8357C_CMD(0x2b);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0x3f);
HX8357C_CMD(0x2a);
HX8357C_DATA(0x00);
HX8357C_DATA(0x00);
HX8357C_DATA(0x01);
HX8357C_DATA(0xdf);
HX8357C_CMD(0x2c);
#endif
}
void LCD_get_panel_funs_0(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}
void LCD_get_panel_funs_1(__lcd_panel_fun_t * fun)
{
fun->cfg_panel_info = LCD_cfg_panel_info1;
fun->cfg_open_flow = LCD_open_flow;
fun->cfg_close_flow = LCD_close_flow;
}