本文档是全志 Melis2.0 系统的开发指引文档,旨在协助开发者了解和掌握 Melis 系统,快速搭建 Melis系统的开发环境,将 Melis2.0 系统应用到产品开发中。
首先要判断屏的接口,是 HV、CPU 还是 LVDS 接口的屏,不同的接口,硬件连线及调屏方法不一样。
1.询问客户、屏厂或则根据屏的规格书等确定。
2.通过硬件连线方式确定。
不同的接口屏,硬件连接不一样,同一接口的屏,连接方式有几种。
1.根据“屏硬件连接”确认。
2.根据原理图确认屏背光、电源、时钟、复位及扩展 IO 连接。
;---------------------------------------------------------------------------------------------------------
; 说明: 脚本中的字符串区分大小写,用户可以修改"="后面的数值,但是不要修改前面的字符串
; 描述gpio的形式:Port:端口+组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态>
; pinName = port:P[A-J]<CFG><PULL><DRV_LEVEL><DATA>
;---------------------------------------------------------------------------------------------------------
[lcd0_para]
lcd_power_used = 0
lcd_power = port:PA0<1><default><default><1>
lcd_bl_en_used = 0
;lcd_pwm_used = 0
;lcd_pwm = port:PE12<4><0><default><default>
;lcdd0 = port:PE0<3><default><default><default>
....
lcdvsync = port:PD21<2><default><default><default>
lcd_panel_para_info(__s32 sel, disp_panel_para *info) 函数中设置相关屏参,包括像素、刷新
率、前后肩、RGB 格式等。
根据屏的开屏流程函数 LCD_open_flow(__u32 sel) 修改相关函数:
1.static void LCD_power_on(__u32 sel)使能屏,设置复位时序。
2.自定义 LCD_panel_init(__u32 sel) 函数根据屏写数据的不同接口,调用相关接口,写入初始化代
码。该函数接在 LCD_power_on 函数之后即可。
比如 hv 屏可能需要 spi 或 iic 初始化,用 LP_TX 模式初始化。无需设置初始化代码的屏,不用设置。
lcd_panel_cfg.c 文件,定义了 TCON 的参数,开关屏的流程,还有对屏的初始化操作。
对 IO 位置的定义,包括电源控制,配屏使用的 GPIO,以及 LCD 控制器 IO 的定义在 sys_config.fex 中。
函数:LCD_cfg_panel_info
功能:配置 C200S 的 TCON 基本参数
原型:static void LCD_cfg_panel_info(__panel_para_t * info)
参数的定义见“3 TCON 参数说明”。
函数:LCD_open_flow
功能:定义开屏的流程
原型:static __s32 LCD_open_flow(__u32 sel)
具体说明见“2.2 开关屏流程”。
函数:LCD_close_flow
功能:定义关屏的流程
原型:static __s32 LCD_close_flow(__u32 sel)
该函数与 LCD_open_flow 对应
函数:LCD_get_panel_funs_0/ LCD_get_panel_funs_1
功能:
原型:void LCD_get_panel_funs_0(__lcd_panel_fun_t * fun)
初始化注册屏的相关操作。
开关屏的常见操作流程如图 2-2 所示。
其中,LCD_open_flow 和 LCD_close_flow 称为开关屏流程函数,方框中的函数,如 LCD_power_on,
TCON_open 等函数,称为开关屏步骤函数。
部分屏不需要写入屏初始化参数,LCD_panel_init 及 LCD_panel_exit 这两个步骤函数(图中紫色框部分)可以省去。
开屏的步骤函数有 LCD_panel_init,TCON_open, LCD_power_on,LCD_bl_open。
函数:LCD_panel_init
功能:对屏初始化
原型:static void LCD_panel_init(__u32 sel)
可参考“2.3 对屏的初始化”。部分屏不需要进行初始化操作,LCD_panel_init 及 LCD_panel_exit 这两个步骤函数可以省去。
函数:TCON_open
功能:打开 F20 TCON
原型:__s32 TCON0_open(__u32 sel)
该函数由显示驱动提供,用户无需实现。
函数:LCD_power_on
功能:打开 LCD 电源
原型:static void LCD_power_on(__u32 sel)
显示驱动提供 LCD_POWER_EN 函数可供调用,用户也可自由实现函数内容。
函数:LCD_bl_open
功能:打开 LCD 背光
原型:static void LCD_bl_open(__u32 sel)
显示驱动提供 LCD_PWM_EN 和 LCD_BL_EN 函数可供调用,用户也可自由实现函数内容。
LCD_PWM_EN,LCD_BL_EN,LCD_POWER_EN 这三个函数是通过 GPIO 控制实现电源和背光的开启关闭,IO 的位置及属性定义在 sys_config.fex 文件中。
函数:LCD_PWM_EN
功能:打开或关闭 LCD 背光调节的 PWM 信号
原型:void LCD_PWM_EN (__u32 sel, __bool b_en)
参数说明:
b_en=0:将 PWM pin 设为输入,并把 PWM 模块关闭
b_en=1:将 PWM pin 设为 PWM,并把 PWM 模块打开
对应于 sys_config.fex 文件的 lcd_pwm。
函数:LCD_BL_EN
功能:打开或关闭 LCD 背光
原型:void LCD_BL_EN (__u32 sel, __bool b_en)
参数说明:
b_en=0:设置 LCD 背光控制 IO 为对应电平,关闭背光
b_en=1:设置 LCD 背光控制 IO 为对应电平,打开背光
对应于 sys_config.fex 文件的 lcd_bl_en;
函数: LCD_POWER_EN
功能:打开或关闭 LCD 电源
原型:void LCD_POWER_EN (__u32 sel, __bool b_en)
参数说明:
b_en=0:设置 LCD 电源控制 IO 为对应电平,关闭 LCD 电源
b_en=1:设置 LCD 电源控制 IO 为对应电平,打开 LCD 电源
对应于 sys_config.fex 文件的 lcd_power。
关屏的步骤函数与开屏的步骤函数相对应。
函数:LCD_open_flow
功能:初始化开关屏的步骤流程
原型:static __s32 LCD_open_flow(__u32 sel)
函数常用内容为:
static __s32 LCD_open_flow(__u32 sel)
{
LCD_OPEN_FUNC(sel, LCD_power_on,10);
LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
LCD_OPEN_FUNC(sel, TCON_open, 100);
LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
return 0;
}
如上,初始化整个开屏的流程步骤为四个:
1、打开 LCD 电源,再延迟 10ms;
2、初始化屏,再延迟 50ms;
3、打开 C200S TCON,再延迟 200ms;
4、打开背光,再延迟 0ms。
LCD_open_flow 函数只会系统初始化的时候调用一次,执行每个 LCD_OPEN_FUNC 即是把对应的开屏步骤函数进行注册,并没有执行该开屏步骤函数。LCD_open_flow 函数的内容必须统一用 LCD_OPEN_FUNC(sel, function, delay_time)进行函数注册的形式,确保正常注册到开屏步骤中。
函数:LCD_OPEN_FUNC
功能:注册开屏步骤函数到开屏流程中
原型:void LCD_OPEN_FUNC(__u32 sel, LCD_FUNC func, __u32 delay)
参数说明:
func 是一个函数指针,其类型是:void (*LCD_FUNC) (__u32 sel),用户自己定义的函数必须也要用统一的形式。比如:
void user_defined_func(__u32 sel)
{
//do something
}
delay 是执行该步骤后,再延迟的时间,时间单位是毫秒。
一部分屏需要进行初始化操作,在开屏步骤函数中,对应于 LCD_panel_init 函数。在 C200S 中,提供了两种方式对屏的初始化。
一种是通过 8080 总线的方式,使用的是 LCDIO(PD,PH)。这种初始化方式,用于 CPU 屏中,其总线的引脚位置定义与 CPU 屏一致。
一种是 SPI 或 IIC 等串行的方式,使用的是 C200S 的 GPIO 引脚模拟实现。模拟 GPIO 的引脚位置定义见于sys_config.fex 中。
IO 模拟串行接口初始化可以参考附录中的实例。
IO 的位置(PIN 脚)定义,默认属性(输入输出)定义及默认输出值在 sys_config.fex,具体请参考 2.5.2。
显示驱动提供 3 个接口函数可供使用。说明如下:
函数:LCD_GPIO_read
功能:读取 LCD_GPIO PIN 脚上的电平
原型:__s32 LCD_GPIO_read(__u32 sel,__u32 io_index);
参数说明:
io_index = 0:对应于 sys_config.fex 中的 lcd_gpio_0
io_index = 1:对应于 sys_config.fex 中的 lcd_gpio_1
io_index = 2:对应于 sys_config.fex 中的 lcd_gpio_2
io_index = 3:对应于 sys_config.fex 中的 lcd_gpio_3
函数返回值为对应 IO 的输入电平,只用于该 GPIO 定义为输入的情形。
函数:LCD_GPIO_write
功能:LCD_GPIO PIN 脚上输出高电平或低电平
原型:__s32 LCD_GPIO_write(__u32 sel,__u32 io_index, __u32 data);
参数说明:
io_index = 0:对应于 sys_config.fex 中的 lcd_gpio_0
io_index = 1:对应于 sys_config.fex 中的 lcd_gpio_1
io_index = 2:对应于 sys_config.fex 中的 lcd_gpio_2
io_index = 3:对应于 sys_config.fex 中的 lcd_gpio_3
data = 0:对应 IO 输出低电平
data = 1:对应 IO 输出高电平
只用于该 GPIO 定义为输出的情形。
函数:LCD_GPIO_set_attr
功能:设置 LCD_GPIO PIN 脚为输入或输出模式
原型:__s32 LCD_GPIO_set_attr(__u32 sel,__u32 io_index, __bool b_output);
参数说明:
io_index = 0:对应于 sys_config.fex 中的 lcd_gpio_0
io_index = 1:对应于 sys_config.fex 中的 lcd_gpio_1
io_index = 2:对应于 sys_config.fex 中的 lcd_gpio_2
io_index = 3:对应于 sys_config.fex 中的 lcd_gpio_3
b_output = 0:对应 IO 设置为输入
b_output = 1:对应 IO 设置为输出
CPU 屏的初始化可以参考“附录”的实例。
显示驱动提供 5 个接口函数可供使用。如下:
函数:LCD_CPU_WR
功能:设定 CPU 屏的指定寄存器为指定的值
原型:void LCD_CPU_WR(__u32 sel, __u32 index, __u32 data)
函数内容为
void LCD_CPU_WR(__u32 sel, __u32 index, __u32 data)
{
LCD_CPU_WR_INDEX(sel, index);
LCD_CPU_WR_DATA(sel, data);
}
实现了 8080 总线上的两个写操作。
LCD_CPU_WR_INDEX 实现第一个写操作,这时 PIN 脚 RS(A1)为低电平,总线数据上的数据内容为参数index 的值。
LCD_CPU_WR_DATA 实现第二个写操作,这时 PIN 脚 RS(A1)为高电平,总线数据上的数据内容为参数data 的值。
函数:LCD_CPU_WR_INDEX
功能:设定 CPU 屏为指定寄存器
原型:void LCD_CPU_WR(__u32 sel, __u32 index, __u32 data)
void LCD_CPU_WR_INDEX(__u32 sel,__u32 index);
具体说明见 LCD_CPU_WR。
函数:LCD_CPU_WR_DATA
功能:设定 CPU 屏寄存器的值为指定的值
原型:void LCD_CPU_WR_DATA(__u32 sel, __u32 data);
具体说明见 LCD_CPU_WR。
函数:LCD_CPU_AUTO_FLUSH
功能:开启 CPU 屏的刷新
原型:void LCD_CPU_AUTO_FLUSH(__u32 sel, __bool en);
参数说明:
en = 1:8080 总线上开始传送显示 BUFFER 的数据,实现 CPU 屏的刷新
函数:LCD_cpu_register_irq
功能:设置 LCD_GPIO PIN 脚为输入或输出模式
原型:void LCD_CPU_register_irq(__u32 sel, void (*Lcd_cpuisr_proc) (void))
注册 cpu 屏的中断处理函数,驱动会在每个 vblanking 中断里调用一下用户注册的中断处理函数
Lcd_cpuisr_proc。
CPU 屏的初始化对应于开屏步骤函数的 LCD_panel_init。在 CPU 屏 LCD_panel_init 函数的最后,需要进行两个操作步骤:
1、使用 LCD_CPU_register_irq 注册 CPU 屏的中断处理函数 Lcd_cpuisr_proc,该函数的内容,可以是CPU 屏 GRAM 的 X 和 Y 坐标设置为零的操作,以保证异步屏每帧进行一次同步。
2、调用 LCD_CPU_AUTO_FLUSH(sel,1)打开显示数据传送。
示例如下:
static void LCD_panel_init(__u32 sel)
{
kgm281i0_init(sel); //initial lcd panel
kgm281i0_write_gram_origin(sel); //set gram origin
LCD_CPU_register_irq(sel,Lcd_cpuisr_proc); //resgister cpu irq func
LCD_CPU_AUTO_FLUSH(sel,1); //start sent gram data
}
区别于模拟串行接口的初始化,LCD_open_flow 中,CPU 屏的初始化 LCD_panel_init 放在 TCON_open之后,示例如下:
static __s32 LCD_open_flow(__u32 sel)
{
LCD_OPEN_FUNC(sel, LCD_power_on,10);
LCD_OPEN_FUNC(sel, TCON_open, 100);
LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
return 0;
}
用户有可能有需要自己对某些 GPIO 进行操作,显示驱动封装了几个函数提供给用户,它们屏避了操作系统间的差异,也就是说在不同的操作系统中都可以使用。
函数:OSAL_GPIO_Request
功能:申请 GPIO;
原型:__hdle OSAL_GPIO_Request(user_gpio_set_t *gpio_list, __u32 group_count_max);
参数说明:
gpio_list 为 GPIO 的设置,该结构体如下:
typedef struct
{
char gpio_name[32];
int port;
int port_num;
int mul_sel;
int pull;
int drv_level;
int data;
} user_gpio_set_t;
group_count_max: 要设置 GPIO 的个数. 函数返回: 成功返回 GIPO 的句柄, 失败返回 0.
函数:OSAL_GPIO_Release
功能:释放 GPIO. 原型:__s32 OSAL_GPIO_Release(__hdle p_handler, __s32 if_release_to_default_status);
参数说明:
p_handler: GPIO 的句柄.
if_release_to_default_status: 0/1: 表示释放后的GPIO处于输入状态;2: 表示释放后的 GPIO状态不变. 函数返回:成功返回 0, 失败返回错误号
将 GIPO PH6 输出高电平,示例如下:
static void LCD_vcc_on(__u32 sel)
{
user_gpio_set_t gpio_list;
int hdl;
gpio_list.port = 8;// 1:A; 2:B; 3:C; 4:D;5:E;6:F;7:G;8:H.....
gpio_list.port_num = 6;
gpio_list.mul_sel = 1;
gpio_list.pull = 0;
gpio_list.drv_level = 0;
gpio_list.data = 1;
hdl = OSAL_GPIO_Request(&gpio_list, 1);
OSAL_GPIO_Release(hdl, 2);
};
驱动提供了毫秒和微秒级的延时给用户使用, 不过建议如果延时时间比较长的话可以在开关屏流程里
新添新的函数. 因为在 boot 系统里延时是死等的,效率会比较低;如果放在开关屏流程里的话会启用 timmer去做延时,在延时期间 CPU 可以做其它的工作.
函数:LCD_delay_ms
功能:延时 ms 毫秒
原型:void LCD_delay_ms(__u32 ms)
函数:LCD_delay_us
功能:延时 us 微秒
原型:void LCD_delay_us(__u32 us)
设置相应值的对应含义为:
0:HV(RGB 同步屏)接口
1:CPU(8080)接口
2:TTL
3:LVDS 接口
Lcd HV panel Interface
这个参数只有在 lcd_if=0 时才有效。定义 RGB 同步屏下的几种接口类型。
设置相应值的对应含义为:
0:Parallel RGB
1:Serial RGB/ Serial YUV
该参数结合 3.1.3 的 lcd_hv_smode 定义了屏的接口类型。
Lcd HV panel Serial Mode
这个参数只有在 lcd_if=0 且 lcd_hv_if=1 时才有效。定义 RGB 同步串行接口屏的类型。
设置相应值的对应含义为:
0:Serial RGB
1:Serial YUV(CCIR656)
RGB 同步屏的接口类型可参考“附录 5.1.1 HV RGB 同步屏接口”。
Lcd HV panel Serial RGB output Interface
这个参数只有在 lcd_if=0 且 lcd_hv_if=1 且 lcd_hv_smode=0(Serial RGB)时才有效。
(lcd_hv_s888_if & 0xC)>>2 得到的值,定义了奇数行 RGB 输出的顺序
0: R→G→B
1: B→R→G
2: G→B→R
(lcd_hv_s888_if & 0x3)得到的值,定义了偶数行 RGB 输出的顺序
0: R→G→B
1: B→R→G
2: G→B→R
Lcd HV panel Serial YUV output Interface
这个参数只有在 lcd_if=0 且 lcd_hv_if=2 且 lcd_hv_smode=1(Serial YUV)时才有效。
(lcd_hv_syuv_if & 0xC)>>2 得到的值,定义了 YUV 输出格式
0:YUYV
1:YVYU
2:UYVY
3:VYUY
(lcd_hv_syuv_if & 0x3) 得到的值,定义 CCIR656 编码时 F 相对有效行延迟的行数
0:F toggle right after active video line
1:Delay 2 lines (CCIR NTSC)
2:Delay 3 lines (CCIR PAL)
Lcd CPU panel Interface
这个参数只有在 lcd_if=1 时才有效。
设置相应值的对应含义为:
0:18bit×1cycle parallel (RGB666)
4:16bit×1cycle parallel (RGB565)
5:9bit×2cycle serial (RGB666)
7:8bit×2cycle serial (RGB565)
Lcd LVDS panel Bit Width
设置相应值对应含义为:
0:24bit
1:18bit
相关说明可参见“附录 5.1.3 LVDS 屏接口”
Lcd LVDS Mode
这个参数只有在 lcd_lvds_bitwidth=0 时才有效
设置相应值对应含义为:
0:NS mode
1:JEIDA mode
NS mode 和 JEIDA mode 的说明可参见“附录 5.1.3 LVDS 屏接口”。
显示屏宽的像素个数
显示屏高的像素个数
Horizontal Total time
指一行总的 dclk 的 cycle 个数。见图 3-1。
Horizontal Back Porch
指有效行间,行同步信号(hsync)开始,到有效数据开始之间的 dclk 的 cycle 个数。见图 3-1。
Vertical Total time
指两场的总行数。见图 3-2。
Vertical Back Porch
指场同步信号(vsync)开始,到有效数据行开始之间的行数。见图 3-2。
Horizontal Sync Pulse Width
指行同步信号的宽度。单位为 1 个 dclk 的时间(即是 1 个 data cycle 的时间)。
见图 3-1。
Vertical Sync Pulse Width
指场同步信号的宽度。单位为行。见图 3-2
Data Clock Frequency
指 PIN 总线上数据的传送频率。单位为 MHz。
屏幕刷新帧数 = (dclk_freq) / (ht×vt/2)
Lcd IO Configuration0
这个参数提供 RGB 同步屏的相位调节。
lcd_dclk_freq < 40 时,该参数可设置为 0x00000000,0x04000000,0x10000000,0x14000000,
0x20000000,0x24000000,对应 LCD DCLK 的六个不同相位。
lcd_dclk_freq > 40 时,该参数可设置为 0x00000000,0x04000000 对应 LCD DCLK 的两个不同相位。
补充说明 1:hbp 在部分屏规格书的定义里并不包括 hspw。这种情况下,要正确配置 AW 的 TCON,
hbp(aw)=hbp(panel)+hspw(panel)。vbp 的定义同 hbp。
补充说明 2:F20 的 TCON 中,图 3-1 中的 hfp,图 3-2 中的 vfp 不能为 0。
Lcd backlight PWM Frequency
这个参数配置 lcd_pwm 信号的频率,单位为 KHz。 F20 中可以输出的 PWM 频率为 1KHz-100KHz。
Lcd Gamma Correction Enable
设置相应值的对应含义为:
0:TCON 的 Gamma 校正关闭
1:TCON 的 Gamma 校正打开
设置为 1 时,需要对 lcd_gamma_tbl [256]进行赋值。
Lcd Gamma Table
该参数为一个数组__u32 lcd_gamma_tbl[256];
lcd_gamma_tbl[n] = rout<<16 | gout<<8 | bout<<0 表示:输入 r=n 时,输出 r=rout;输入 g=n 时,
输出 g=gout;输入 b=n 时,输出 b=bout。
用户使用 Gamma 校正功能时,可以使用函数 lcd_gamma_gen(__panel_para_t * info)对其赋值,函数
内容可自由实现。具体可参考附录中的实例。
路径:\eMod\drv_display\lcd\lcd_bak
下载地址:
固件镜像修改工具 ImageModify.exe下载 ImageModify_20230906.rar
下载地址:
USB刷机工具 PhoenixSuit下载 PhoenixSuit_CN_V1.1.1_20230906.rar
下载地址:
全志Melis2.0 用户手册.pdf下载 documents_20230906_melis_v2.0.rar
下载地址:
全志melis2.0 sdk源码库下载 melis2.0-sdk-release_20230906V2.0.rar