Serial RGB 点亮 854x480 屏
首先确认芯片型号是否为 V821L2-WXX,其他型号不支持 Serial RGB 显示。
V821 视频输出规格如下:
- Serial RGB interface,up to 800x480@60fps
- Serial 8-bit i8080 interface, up to 800x480@60fps
- Dither function for RGB888, RGB666 and RGB565
- Support BT.656 interface for NTSC and PAL
- Supports Fsync(Frame Synchronization) for camera sensor
这次点的屏幕是基于 NV3049F 驱动 IC 的 854x480 Serial RGB 屏。屏幕型号为 F450003
串行RGB是相对于并行RGB来说,而并不是说它只用一根线来发数据,只要通过多个时钟周期才能把一个像素的数据发完,那么这样的RGB接口就是串行RGB。也叫做 8 位 RGB 屏。
Serial RGB 时序如下:
引脚配置如下:
V821 | 引脚复用功能 | TFT 模块 |
---|---|---|
PD1—PD8 | LCD-D3—LCD-D12 | D0—D7 |
PD12 | LCD-VSYNC | VSYNC |
PD11 | LCD-HSYNC | HSYNC |
PD9 | LCD-CLK | CLK |
PD10 | LCD-DE | DE |
PD14 | GPIO OUTPUT(3 线 SPI 初始化使用) | CS |
PD15 | GPIO OUTPUT(3 线 SPI 初始化使用) | SCK |
PD16 | GPIO OUTPUT(3 线 SPI 初始化使用) | SDA |
PD17 | GPIO OUTPUT(3 线 SPI 初始化使用) | RESET |
编写 LCD 显示屏驱动
准备驱动框架
前往屏幕驱动路径:bsp/drivers/video/sunxi/disp2/disp/lcd/
下,将
bsp/drivers/video/sunxi/disp2/disp/lcd/default_panel.c
bsp/drivers/video/sunxi/disp2/disp/lcd/default_panel.h
复制一份作为模板
然后改名为此款屏幕的驱动:
打开 bsp/drivers/video/sunxi/disp2/disp/lcd/f450003.c
文件,将 default_panel
改为 f450003
同时修改 name
,为屏幕实际名称
头文件也一并修改
获取屏幕初始化序列
首先询问屏厂提供初始化序列,和屏幕手册。
屏厂会提供一个初始化代码:
////////////////NV3049F+BOE4.5////////////////////
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x30);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x49);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x01);
Write_LCD_REG_CMD(0xe2);
Write_LCD_REG_DATA(0x00);
Write_LCD_REG_CMD(0xe2);
Write_LCD_REG_DATA(0x00);
//Write_LCD_REG_CMD(0xF1);
//Write_LCD_REG_DATA(0x0e);//bist
Write_LCD_REG_CMD(0x14);
Write_LCD_REG_DATA(0x08);//vbp_para[7:0]
Write_LCD_REG_CMD(0x11);
Write_LCD_REG_DATA(0x08);//vfp_para[7:0]
Write_LCD_REG_CMD(0x16);
Write_LCD_REG_DATA(0x14);//hfp
Write_LCD_REG_CMD(0x19);
Write_LCD_REG_DATA(0x19);//hbp
Write_LCD_REG_CMD(0x15);//vbp_seri[7:0]
Write_LCD_REG_DATA(0x08);
Write_LCD_REG_CMD(0x12);//vfp_seri[7:0]
Write_LCD_REG_DATA(0x08);
Write_LCD_REG_CMD(0x17);//hfp_seri
Write_LCD_REG_DATA(0x14);
Write_LCD_REG_CMD(0x1A);//hbp_seri
Write_LCD_REG_DATA(0x19);
Write_LCD_REG_CMD(0x20);
Write_LCD_REG_DATA(0x5c);
Write_LCD_REG_CMD(0x21);
Write_LCD_REG_DATA(0x02);//20241227
Write_LCD_REG_CMD(0x3b);
Write_LCD_REG_DATA(0x04);//LVD
Write_LCD_REG_CMD(0x41);
Write_LCD_REG_DATA(0x32);
Write_LCD_REG_CMD(0x45);
Write_LCD_REG_DATA(0x03);
Write_LCD_REG_CMD(0x46);
Write_LCD_REG_DATA(0x55);
//////////////SOURCE/////////////////
Write_LCD_REG_CMD(0x51);
Write_LCD_REG_DATA(0x36);
Write_LCD_REG_CMD(0x52);
Write_LCD_REG_DATA(0x01);
Write_LCD_REG_CMD(0x53);
Write_LCD_REG_DATA(0x20);
Write_LCD_REG_CMD(0x54);
Write_LCD_REG_DATA(0x12);
Write_LCD_REG_CMD(0x55);
Write_LCD_REG_DATA(0x01);
Write_LCD_REG_CMD(0x56);
Write_LCD_REG_DATA(0x03);
Write_LCD_REG_CMD(0x57);
Write_LCD_REG_DATA(0x37);
//Write_LCD_REG_CMD(0x59);
//Write_LCD_REG_DATA(0x00);
//Write_LCD_REG_CMD(0x5A);
//Write_LCD_REG_DATA(0x00);
Write_LCD_REG_CMD(0x5B);
Write_LCD_REG_DATA(0x82);
Write_LCD_REG_CMD(0x5C);
Write_LCD_REG_DATA(0x10);
Write_LCD_REG_CMD(0x5D);
Write_LCD_REG_DATA(0x80);//
Write_LCD_REG_CMD(0x79);
Write_LCD_REG_DATA(0xFE);
Write_LCD_REG_CMD(0x7D);
Write_LCD_REG_DATA(0x08);
//////////////SOURCE/////////////////
Write_LCD_REG_CMD(0x90);
Write_LCD_REG_DATA(0x00);//VSP
Write_LCD_REG_CMD(0x91);
Write_LCD_REG_DATA(0x00);//VSN
Write_LCD_REG_CMD(0x95);
Write_LCD_REG_DATA(0x0c);
Write_LCD_REG_CMD(0x94);
Write_LCD_REG_DATA(0x08);
Write_LCD_REG_CMD(0x96);
Write_LCD_REG_DATA(0x16);
Write_LCD_REG_CMD(0x98);
Write_LCD_REG_DATA(0x33);
Write_LCD_REG_CMD(0xca);
Write_LCD_REG_DATA(0x14);
Write_LCD_REG_CMD(0xc8);
Write_LCD_REG_DATA(0x6e);
Write_LCD_REG_CMD(0xcc);
Write_LCD_REG_DATA(0x12);
Write_LCD_REG_CMD(0xe7);
Write_LCD_REG_DATA(0x30);
Write_LCD_REG_CMD(0xA0);
Write_LCD_REG_DATA(0x30);
Write_LCD_REG_CMD(0xB4);
Write_LCD_REG_DATA(0x30);
Write_LCD_REG_CMD(0xA1);
Write_LCD_REG_DATA(0x22);
Write_LCD_REG_CMD(0xB5);
Write_LCD_REG_DATA(0x21);
Write_LCD_REG_CMD(0xA2);
Write_LCD_REG_DATA(0x20);
Write_LCD_REG_CMD(0xB6);
Write_LCD_REG_DATA(0x1E);
Write_LCD_REG_CMD(0xA5);
Write_LCD_REG_DATA(0x0F);
Write_LCD_REG_CMD(0xB9);
Write_LCD_REG_DATA(0x11);
Write_LCD_REG_CMD(0xA6);
Write_LCD_REG_DATA(0x08);
Write_LCD_REG_CMD(0xBA);
Write_LCD_REG_DATA(0x07);
Write_LCD_REG_CMD(0xA7);
Write_LCD_REG_DATA(0x08);
Write_LCD_REG_CMD(0xBB);
Write_LCD_REG_DATA(0x08);
Write_LCD_REG_CMD(0xA3);
Write_LCD_REG_DATA(0x40);
Write_LCD_REG_CMD(0xB7);
Write_LCD_REG_DATA(0x42);
Write_LCD_REG_CMD(0xA4);
Write_LCD_REG_DATA(0x40);
Write_LCD_REG_CMD(0xB8);
Write_LCD_REG_DATA(0x42);
Write_LCD_REG_CMD(0xA8);
Write_LCD_REG_DATA(0x0F);
Write_LCD_REG_CMD(0xBC);
Write_LCD_REG_DATA(0x0E);
Write_LCD_REG_CMD(0xA9);
Write_LCD_REG_DATA(0x15);
Write_LCD_REG_CMD(0xBD);
Write_LCD_REG_DATA(0x14);
Write_LCD_REG_CMD(0xAA);
Write_LCD_REG_DATA(0x15);
Write_LCD_REG_CMD(0xBE);
Write_LCD_REG_DATA(0x15);
Write_LCD_REG_CMD(0xAB);
Write_LCD_REG_DATA(0x15);
Write_LCD_REG_CMD(0xBF);
Write_LCD_REG_DATA(0x14);
Write_LCD_REG_CMD(0xAC);
Write_LCD_REG_DATA(0x10);
Write_LCD_REG_CMD(0xC0);
Write_LCD_REG_DATA(0x10);
Write_LCD_REG_CMD(0xAD);
Write_LCD_REG_DATA(0x11);
Write_LCD_REG_CMD(0xC1);
Write_LCD_REG_DATA(0x12);
Write_LCD_REG_CMD(0xAE);
Write_LCD_REG_DATA(0x10);
Write_LCD_REG_CMD(0xC2);
Write_LCD_REG_DATA(0x13);
Write_LCD_REG_CMD(0xAF);
Write_LCD_REG_DATA(0x0f);
Write_LCD_REG_CMD(0xC3);
Write_LCD_REG_DATA(0x12);
Write_LCD_REG_CMD(0xB0);
Write_LCD_REG_DATA(0x10);
Write_LCD_REG_CMD(0xC4);
Write_LCD_REG_DATA(0x10);
Write_LCD_REG_CMD(0xB1);
Write_LCD_REG_DATA(0x08);
Write_LCD_REG_CMD(0xC5);
Write_LCD_REG_DATA(0x0A);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x30);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x49);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x03);
///////////////////////////GOA//////////////////////////////
Write_LCD_REG_CMD(0x27);
Write_LCD_REG_DATA(0x88);
Write_LCD_REG_CMD(0x28);
Write_LCD_REG_DATA(0x06);
Write_LCD_REG_CMD(0x29);
Write_LCD_REG_DATA(0x04);
Write_LCD_REG_CMD(0x36);
Write_LCD_REG_DATA(0x88);
Write_LCD_REG_CMD(0x37);
Write_LCD_REG_DATA(0x05);
Write_LCD_REG_CMD(0x38);
Write_LCD_REG_DATA(0x03);
Write_LCD_REG_CMD(0x2a);
Write_LCD_REG_DATA(0x11);
Write_LCD_REG_CMD(0x2b);
Write_LCD_REG_DATA(0x60);
Write_LCD_REG_CMD(0x2c);
Write_LCD_REG_DATA(0x80);
Write_LCD_REG_CMD(0x79);
Write_LCD_REG_DATA(0x3f);
Write_LCD_REG_CMD(0x7a);
Write_LCD_REG_DATA(0x3f);
Write_LCD_REG_CMD(0x7B);
Write_LCD_REG_DATA(0x30);
Write_LCD_REG_CMD(0x80);
Write_LCD_REG_DATA(0x85);
Write_LCD_REG_CMD(0x81);
Write_LCD_REG_DATA(0x13);
Write_LCD_REG_CMD(0x82);
Write_LCD_REG_DATA(0x5a);
Write_LCD_REG_CMD(0x83);
Write_LCD_REG_DATA(0x05);
Write_LCD_REG_CMD(0x84);
Write_LCD_REG_DATA(0x60);
Write_LCD_REG_CMD(0x85);
Write_LCD_REG_DATA(0x80);
Write_LCD_REG_CMD(0x88);
Write_LCD_REG_DATA(0x84);
Write_LCD_REG_CMD(0x89);
Write_LCD_REG_DATA(0x13);
Write_LCD_REG_CMD(0x8A);
Write_LCD_REG_DATA(0x5b);
Write_LCD_REG_CMD(0x8B);
Write_LCD_REG_DATA(0x11);
Write_LCD_REG_CMD(0x8C);
Write_LCD_REG_DATA(0x60);
Write_LCD_REG_CMD(0x8D);
Write_LCD_REG_DATA(0x80);
Write_LCD_REG_CMD(0x8E);
Write_LCD_REG_DATA(0x83);
Write_LCD_REG_CMD(0x8F);
Write_LCD_REG_DATA(0x13);
Write_LCD_REG_CMD(0x90);
Write_LCD_REG_DATA(0x5c);
Write_LCD_REG_CMD(0x91);
Write_LCD_REG_DATA(0x11);
Write_LCD_REG_CMD(0x92);
Write_LCD_REG_DATA(0x60);
Write_LCD_REG_CMD(0x93);
Write_LCD_REG_DATA(0x80);
Write_LCD_REG_CMD(0x94);
Write_LCD_REG_DATA(0x82);
Write_LCD_REG_CMD(0x95);
Write_LCD_REG_DATA(0x13);
Write_LCD_REG_CMD(0x96);
Write_LCD_REG_DATA(0x5d);
Write_LCD_REG_CMD(0x97);
Write_LCD_REG_DATA(0x11);
Write_LCD_REG_CMD(0x98);
Write_LCD_REG_DATA(0x60);
Write_LCD_REG_CMD(0x99);
Write_LCD_REG_DATA(0x80);
///////////////////////////GOA//////////////////////////////
/////////////////////////GOA MAP//////////////////////
Write_LCD_REG_CMD(0xD0);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xD1);
Write_LCD_REG_DATA(0x1A);
Write_LCD_REG_CMD(0xD2);
Write_LCD_REG_DATA(0x0A);
Write_LCD_REG_CMD(0xD3);
Write_LCD_REG_DATA(0x0C);
Write_LCD_REG_CMD(0xD4);
Write_LCD_REG_DATA(0x04);
Write_LCD_REG_CMD(0xD5);
Write_LCD_REG_DATA(0x1B);
Write_LCD_REG_CMD(0xD6);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xD7);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xD8);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xD9);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xDA);
Write_LCD_REG_DATA(0x1f);
Write_LCD_REG_CMD(0xDB);
Write_LCD_REG_DATA(0x1f);
Write_LCD_REG_CMD(0xDC);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xDD);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xDE);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xDF);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xE0);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xE1);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xE2);
Write_LCD_REG_DATA(0x1f);
Write_LCD_REG_CMD(0xE3);
Write_LCD_REG_DATA(0x1f);
Write_LCD_REG_CMD(0xE4);
Write_LCD_REG_DATA(0x1f);
Write_LCD_REG_CMD(0xE5);
Write_LCD_REG_DATA(0x1f);
Write_LCD_REG_CMD(0xE6);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xE7);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xE8);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xE9);
Write_LCD_REG_DATA(0x1F);
Write_LCD_REG_CMD(0xEA);
Write_LCD_REG_DATA(0x1B);
Write_LCD_REG_CMD(0xEB);
Write_LCD_REG_DATA(0x05);
Write_LCD_REG_CMD(0xEC);
Write_LCD_REG_DATA(0x0D);
Write_LCD_REG_CMD(0xED);
Write_LCD_REG_DATA(0x0B);
Write_LCD_REG_CMD(0xEE);
Write_LCD_REG_DATA(0x1A);
Write_LCD_REG_CMD(0xEF);
Write_LCD_REG_DATA(0x1F);
/////////////////////////GOA MAP//////////////////////
//Write_LCD_REG_CMD(0xf7);
//Write_LCD_REG_DATA(0x20);
//Write_LCD_REG_CMD(0xf8);
//Write_LCD_REG_DATA(0x20);
//HL Temp test
Write_LCD_REG_CMD(0xf7);
Write_LCD_REG_DATA(0x50);
Write_LCD_REG_CMD(0xf8);
Write_LCD_REG_DATA(0x50);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x30);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x49);
Write_LCD_REG_CMD(0xFF);
Write_LCD_REG_DATA(0x00);
Write_LCD_REG_CMD(0xF1);
Write_LCD_REG_DATA(0xC4);//
//Write_LCD_REG_CMD(0x35);
//Write_LCD_REG_DATA(0x00);
//Write_LCD_REG_CMD(0x3A);
//Write_LCD_REG_DATA(0x50);
Write_LCD_REG_CMD(0x11);
Write_LCD_REG_DATA(0x00);
Delay(600);
Write_LCD_REG_CMD(0x29);
Write_LCD_REG_DATA(0x00);
Delay(500);
由于是 RGB 屏幕,RGB 屏幕需要使用独立的接口去写初始化代码,查询屏幕驱动 IC 手册可知是使用的是 3 线 9 BIT SPI 协议:
其通过第一个 BIT 高低区分是 Command 还是 Data。
正常情况下 SPI 发送为 8 Bit 模式,不支持 9 Bit 发送。这里一般采用 GPIO 模拟生成 SPI 时序方式。
先配置设备树,设置对应的引脚
lcd_gpio_0 = <&pio PD 17 GPIO_ACTIVE_LOW>; // RESET
lcd_gpio_1 = <&pio PD 15 GPIO_ACTIVE_LOW>; // SCK
lcd_gpio_2 = <&pio PD 16 GPIO_ACTIVE_LOW>; // SDA
lcd_gpio_3 = <&pio PD 14 GPIO_ACTIVE_LOW>; // CS
然后编写驱动代码,模拟该时序
#define LCD_MOSI_PIN (2) // lcd_gpio_2
#define LCD_CLK_PIN (1) // lcd_gpio_1
#define LCD_RST_PIN (0) // lcd_gpio_0
#define LCD_CS_PIN (3) // lcd_gpio_3
static void spi_send_data(u32 sel, u8 i)
{
u8 n;
for (n = 0; n < 8; n++) {
if (i & 0x80)
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 1);
else
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 0);
i <<= 1;
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 1);
}
}
static void spi_write_cmd(u32 sel, u8 i)
{
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 1);
spi_send_data(sel, i);
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 1);
}
static void spi_write_data(u32 sel, u8 i)
{
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 1);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 1);
spi_send_data(sel, i);
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 1);
}
实现屏幕初始化
把上面实现的 GPIO 模拟 3SPI 函数写入驱动程序。
然后实现 LCD_panel_init
函数内容,写入初始化时序。
实现开关屏函数,主要是操作 RST 引脚
实现完整驱动
完整驱动如下:
头文件:
#ifndef __f450003_H__
#define __f450003_H__
#include "panels.h"
extern struct __lcd_panel f450003;
#endif
驱动:
#include "f450003.h"
#define LCD_MOSI_PIN (2) // lcd_gpio_2
#define LCD_CLK_PIN (1) // lcd_gpio_1
#define LCD_RST_PIN (0) // lcd_gpio_0
#define LCD_CS_PIN (3) // lcd_gpio_3
static void LCD_power_on(u32 sel);
static void LCD_power_off(u32 sel);
static void LCD_bl_open(u32 sel);
static void LCD_bl_close(u32 sel);
static void LCD_panel_init(u32 sel);
static void LCD_panel_exit(u32 sel);
static void LCD_cfg_panel_info(struct panel_extend_para *info)
{
u32 i = 0, j = 0;
u32 items;
u8 lcd_gamma_tbl[][2] = {
/* {input value, corrected value} */
{0, 0},
{15, 15},
{30, 30},
{45, 45},
{60, 60},
{75, 75},
{90, 90},
{105, 105},
{120, 120},
{135, 135},
{150, 150},
{165, 165},
{180, 180},
{195, 195},
{210, 210},
{225, 225},
{240, 240},
{255, 255},
};
u32 lcd_cmap_tbl[2][3][4] = {
{
{LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
{LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
{LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
},
{
{LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
{LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
{LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
},
};
items = sizeof(lcd_gamma_tbl) / 2;
for (i = 0; i < items - 1; i++) {
u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
for (j = 0; j < num; j++) {
u32 value = 0;
value =
lcd_gamma_tbl[i][1] +
((lcd_gamma_tbl[i + 1][1] -
lcd_gamma_tbl[i][1]) * j) / num;
info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
(value << 16) + (value << 8) + value;
}
}
info->lcd_gamma_tbl[255] =
(lcd_gamma_tbl[items - 1][1] << 16) +
(lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
}
static s32 LCD_open_flow(u32 sel)
{
/* open lcd power, and delay 50ms */
LCD_OPEN_FUNC(sel, LCD_power_on, 30);
/* open lcd power, than delay 200ms */
LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
/* open lcd controller, and delay 100ms */
LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 100);
/* open lcd backlight, and delay 0ms */
LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
return 0;
}
static s32 LCD_close_flow(u32 sel)
{
/* close lcd backlight, and delay 0ms */
LCD_CLOSE_FUNC(sel, LCD_bl_close, 0);
/* close lcd controller, and delay 0ms */
LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 0);
/* open lcd power, than delay 200ms */
LCD_CLOSE_FUNC(sel, LCD_panel_exit, 200);
/* close lcd power, and delay 500ms */
LCD_CLOSE_FUNC(sel, LCD_power_off, 500);
return 0;
}
static void LCD_power_on(u32 sel)
{
/* config lcd_power pin to open lcd power0 */
sunxi_lcd_power_enable(sel, 0);
sunxi_lcd_gpio_set_value(0, LCD_RST_PIN, 0);
sunxi_lcd_delay_ms(100);
sunxi_lcd_gpio_set_value(0, LCD_RST_PIN, 1);
sunxi_lcd_pin_cfg(sel, 1);
}
static void LCD_power_off(u32 sel)
{
sunxi_lcd_pin_cfg(sel, 0);
/* config lcd_power pin to close lcd power0 */
sunxi_lcd_gpio_set_value(0, LCD_RST_PIN, 0);
sunxi_lcd_power_disable(sel, 0);
}
static void LCD_bl_open(u32 sel)
{
sunxi_lcd_pwm_enable(sel);
sunxi_lcd_backlight_enable(sel);
}
static void LCD_bl_close(u32 sel)
{
/* config lcd_bl_en pin to close lcd backlight */
sunxi_lcd_backlight_disable(sel);
sunxi_lcd_pwm_disable(sel);
}
static void spi_send_data(u32 sel, u8 i)
{
u8 n;
for (n = 0; n < 8; n++) {
if (i & 0x80)
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 1);
else
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 0);
i <<= 1;
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 1);
}
}
static void spi_write_cmd(u32 sel, u8 i)
{
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 1);
spi_send_data(sel, i);
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 1);
}
static void spi_write_data(u32 sel, u8 i)
{
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_MOSI_PIN, 1);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 0);
sunxi_lcd_gpio_set_value(sel, LCD_CLK_PIN, 1);
spi_send_data(sel, i);
sunxi_lcd_gpio_set_value(sel, LCD_CS_PIN, 1);
}
static void LCD_panel_init(u32 sel)
{
spi_write_cmd(sel, 0x01);
sunxi_lcd_delay_ms(6);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x30);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x49);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x01);
spi_write_cmd(sel, 0xe2);
spi_write_data(sel, 0x00);
spi_write_cmd(sel, 0xe2);
spi_write_data(sel, 0x00);
// spi_write_cmd(sel, 0xF1);
// spi_write_data(sel, 0x0e); //bist
spi_write_cmd(sel, 0x14);
spi_write_data(sel, 0x08); //vbp_para[7:0]
spi_write_cmd(sel, 0x11);
spi_write_data(sel, 0x08); //vfp_para[7:0]
spi_write_cmd(sel, 0x16);
spi_write_data(sel, 0x14); //hfp
spi_write_cmd(sel, 0x19);
spi_write_data(sel, 0x19); //hbp
spi_write_cmd(sel, 0x15); //vbp_seri[7:0]
spi_write_data(sel, 0x08);
spi_write_cmd(sel, 0x12); //vfp_seri[7:0]
spi_write_data(sel, 0x08);
spi_write_cmd(sel, 0x17); //hfp_seri
spi_write_data(sel, 0x14);
spi_write_cmd(sel, 0x1A); //hbp_seri
spi_write_data(sel, 0x19);
spi_write_cmd(sel, 0x20);
spi_write_data(sel, 0x5c);
spi_write_cmd(sel, 0x21);
spi_write_data(sel, 0x02);
spi_write_cmd(sel, 0x3b);
spi_write_data(sel, 0x04); //LVD
spi_write_cmd(sel, 0x41);
spi_write_data(sel, 0x32);
spi_write_cmd(sel, 0x45);
spi_write_data(sel, 0x03);
spi_write_cmd(sel, 0x46);
spi_write_data(sel, 0x55);
//////////////SOURCE/////////////////
spi_write_cmd(sel, 0x51);
spi_write_data(sel, 0x36);
spi_write_cmd(sel, 0x52);
spi_write_data(sel, 0x01);
spi_write_cmd(sel, 0x53);
spi_write_data(sel, 0x20);
spi_write_cmd(sel, 0x54);
spi_write_data(sel, 0x12);
spi_write_cmd(sel, 0x55);
spi_write_data(sel, 0x01);
spi_write_cmd(sel, 0x56);
spi_write_data(sel, 0x03);
spi_write_cmd(sel, 0x57);
spi_write_data(sel, 0x37);
//Write_LCD_REG(0x0000,0x0059);
//Write_LCD_REG(0x0000,0x0100);
//Write_LCD_REG(0x0000,0x005A);
//Write_LCD_REG(0x0000,0x0100);
spi_write_cmd(sel, 0x5B);
spi_write_data(sel, 0x82);
spi_write_cmd(sel, 0x5C);
spi_write_data(sel, 0x10);
spi_write_cmd(sel, 0x5D);
spi_write_data(sel, 0x80); //
spi_write_cmd(sel, 0x79);
spi_write_data(sel, 0xFE);
spi_write_cmd(sel, 0x7D);
spi_write_data(sel, 0x08);
//////////////SOURCE/////////////////
spi_write_cmd(sel, 0x90);
spi_write_data(sel, 0x00); //VSP
spi_write_cmd(sel, 0x91);
spi_write_data(sel, 0x00); //VSN
spi_write_cmd(sel, 0x95);
spi_write_data(sel, 0x0c);
spi_write_cmd(sel, 0x94);
spi_write_data(sel, 0x08);
spi_write_cmd(sel, 0x96);
spi_write_data(sel, 0x16);
spi_write_cmd(sel, 0x98);
spi_write_data(sel, 0x33);
spi_write_cmd(sel, 0xca);
spi_write_data(sel, 0x14);
spi_write_cmd(sel, 0xc8);
spi_write_data(sel, 0x6e);
spi_write_cmd(sel, 0xcc);
spi_write_data(sel, 0x12);
spi_write_cmd(sel, 0xe7);
spi_write_data(sel, 0x30);
spi_write_cmd(sel, 0xA0);
spi_write_data(sel, 0x30);
spi_write_cmd(sel, 0xB4);
spi_write_data(sel, 0x30);
spi_write_cmd(sel, 0xA1);
spi_write_data(sel, 0x22);
spi_write_cmd(sel, 0xB5);
spi_write_data(sel, 0x21);
spi_write_cmd(sel, 0xA2);
spi_write_data(sel, 0x20);
spi_write_cmd(sel, 0xB6);
spi_write_data(sel, 0x1E);
spi_write_cmd(sel, 0xA5);
spi_write_data(sel, 0x0F);
spi_write_cmd(sel, 0xB9);
spi_write_data(sel, 0x11);
spi_write_cmd(sel, 0xA6);
spi_write_data(sel, 0x08);
spi_write_cmd(sel, 0xBA);
spi_write_data(sel, 0x07);
spi_write_cmd(sel, 0xA7);
spi_write_data(sel, 0x08);
spi_write_cmd(sel, 0xBB);
spi_write_data(sel, 0x08);
spi_write_cmd(sel, 0xA3);
spi_write_data(sel, 0x40);
spi_write_cmd(sel, 0xB7);
spi_write_data(sel, 0x42);
spi_write_cmd(sel, 0xA4);
spi_write_data(sel, 0x40);
spi_write_cmd(sel, 0xB8);
spi_write_data(sel, 0x42);
spi_write_cmd(sel, 0xA8);
spi_write_data(sel, 0x0F);
spi_write_cmd(sel, 0xBC);
spi_write_data(sel, 0x0E);
spi_write_cmd(sel, 0xA9);
spi_write_data(sel, 0x15);
spi_write_cmd(sel, 0xBD);
spi_write_data(sel, 0x14);
spi_write_cmd(sel, 0xAA);
spi_write_data(sel, 0x15);
spi_write_cmd(sel, 0xBE);
spi_write_data(sel, 0x15);
spi_write_cmd(sel, 0xAB);
spi_write_data(sel, 0x15);
spi_write_cmd(sel, 0xBF);
spi_write_data(sel, 0x14);
spi_write_cmd(sel, 0xAC);
spi_write_data(sel, 0x10);
spi_write_cmd(sel, 0xC0);
spi_write_data(sel, 0x10);
spi_write_cmd(sel, 0xAD);
spi_write_data(sel, 0x11);
spi_write_cmd(sel, 0xC1);
spi_write_data(sel, 0x12);
spi_write_cmd(sel, 0xAE);
spi_write_data(sel, 0x10);
spi_write_cmd(sel, 0xC2);
spi_write_data(sel, 0x13);
spi_write_cmd(sel, 0xAF);
spi_write_data(sel, 0x0f);
spi_write_cmd(sel, 0xC3);
spi_write_data(sel, 0x12);
spi_write_cmd(sel, 0xB0);
spi_write_data(sel, 0x10);
spi_write_cmd(sel, 0xC4);
spi_write_data(sel, 0x10);
spi_write_cmd(sel, 0xB1);
spi_write_data(sel, 0x08);
spi_write_cmd(sel, 0xC5);
spi_write_data(sel, 0x0A);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x30);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x49);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x03);
///////////////////////////GOA//////////////////////////////
spi_write_cmd(sel, 0x27);
spi_write_data(sel, 0x88);
spi_write_cmd(sel, 0x28);
spi_write_data(sel, 0x06);
spi_write_cmd(sel, 0x29);
spi_write_data(sel, 0x04);
spi_write_cmd(sel, 0x36);
spi_write_data(sel, 0x88);
spi_write_cmd(sel, 0x37);
spi_write_data(sel, 0x05);
spi_write_cmd(sel, 0x38);
spi_write_data(sel, 0x03);
spi_write_cmd(sel, 0x2a);
spi_write_data(sel, 0x11);
spi_write_cmd(sel, 0x2b);
spi_write_data(sel, 0x60);
spi_write_cmd(sel, 0x2c);
spi_write_data(sel, 0x80);
spi_write_cmd(sel, 0x79);
spi_write_data(sel, 0x3f);
spi_write_cmd(sel, 0x7a);
spi_write_data(sel, 0x3f);
spi_write_cmd(sel, 0x7B);
spi_write_data(sel, 0x30);
spi_write_cmd(sel, 0x80);
spi_write_data(sel, 0x85);
spi_write_cmd(sel, 0x81);
spi_write_data(sel, 0x13);
spi_write_cmd(sel, 0x82);
spi_write_data(sel, 0x5a);
spi_write_cmd(sel, 0x83);
spi_write_data(sel, 0x05);
spi_write_cmd(sel, 0x84);
spi_write_data(sel, 0x60);
spi_write_cmd(sel, 0x85);
spi_write_data(sel, 0x80);
spi_write_cmd(sel, 0x88);
spi_write_data(sel, 0x84);
spi_write_cmd(sel, 0x89);
spi_write_data(sel, 0x13);
spi_write_cmd(sel, 0x8A);
spi_write_data(sel, 0x5b);
spi_write_cmd(sel, 0x8B);
spi_write_data(sel, 0x11);
spi_write_cmd(sel, 0x8C);
spi_write_data(sel, 0x60);
spi_write_cmd(sel, 0x8D);
spi_write_data(sel, 0x80);
spi_write_cmd(sel, 0x8E);
spi_write_data(sel, 0x83);
spi_write_cmd(sel, 0x8F);
spi_write_data(sel, 0x13);
spi_write_cmd(sel, 0x90);
spi_write_data(sel, 0x5c);
spi_write_cmd(sel, 0x91);
spi_write_data(sel, 0x11);
spi_write_cmd(sel, 0x92);
spi_write_data(sel, 0x60);
spi_write_cmd(sel, 0x93);
spi_write_data(sel, 0x80);
spi_write_cmd(sel, 0x94);
spi_write_data(sel, 0x82);
spi_write_cmd(sel, 0x95);
spi_write_data(sel, 0x13);
spi_write_cmd(sel, 0x96);
spi_write_data(sel, 0x5d);
spi_write_cmd(sel, 0x97);
spi_write_data(sel, 0x11);
spi_write_cmd(sel, 0x98);
spi_write_data(sel, 0x60);
spi_write_cmd(sel, 0x99);
spi_write_data(sel, 0x80);
///////////////////////////GOA//////////////////////////////
/////////////////////////GOA MAP//////////////////////
spi_write_cmd(sel, 0xD0);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xD1);
spi_write_data(sel, 0x1A);
spi_write_cmd(sel, 0xD2);
spi_write_data(sel, 0x0A);
spi_write_cmd(sel, 0xD3);
spi_write_data(sel, 0x0C);
spi_write_cmd(sel, 0xD4);
spi_write_data(sel, 0x04);
spi_write_cmd(sel, 0xD5);
spi_write_data(sel, 0x1B);
spi_write_cmd(sel, 0xD6);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xD7);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xD8);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xD9);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xDA);
spi_write_data(sel, 0x1f);
spi_write_cmd(sel, 0xDB);
spi_write_data(sel, 0x1f);
spi_write_cmd(sel, 0xDC);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xDD);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xDE);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xDF);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xE0);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xE1);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xE2);
spi_write_data(sel, 0x1f);
spi_write_cmd(sel, 0xE3);
spi_write_data(sel, 0x1f);
spi_write_cmd(sel, 0xE4);
spi_write_data(sel, 0x1f);
spi_write_cmd(sel, 0xE5);
spi_write_data(sel, 0x1f);
spi_write_cmd(sel, 0xE6);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xE7);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xE8);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xE9);
spi_write_data(sel, 0x1F);
spi_write_cmd(sel, 0xEA);
spi_write_data(sel, 0x1B);
spi_write_cmd(sel, 0xEB);
spi_write_data(sel, 0x05);
spi_write_cmd(sel, 0xEC);
spi_write_data(sel, 0x0D);
spi_write_cmd(sel, 0xED);
spi_write_data(sel, 0x0B);
spi_write_cmd(sel, 0xEE);
spi_write_data(sel, 0x1A);
spi_write_cmd(sel, 0xEF);
spi_write_data(sel, 0x1F);
/////////////////////////GOA MAP//////////////////////
//Write_LCD_REG(0x0000,0x00f7);
//Write_LCD_REG(0x0000,0x0120);
//Write_LCD_REG(0x0000,0x00f8);
//Write_LCD_REG(0x0000,0x0120);
//HL Temp test
spi_write_cmd(sel, 0xf7);
spi_write_data(sel, 0x50);
spi_write_cmd(sel, 0xf8);
spi_write_data(sel, 0x50);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x30);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x49);
spi_write_cmd(sel, 0xFF);
spi_write_data(sel, 0x00);
spi_write_cmd(sel, 0xF1);
spi_write_data(sel, 0xC4); //
//Write_LCD_REG(0x0000,0x0035);
//Write_LCD_REG(0x0000,0x0100);
//Write_LCD_REG(0x0000,0x003A);
//Write_LCD_REG(0x0000,0x0150);
//spi_write_cmd(sel, 0x21);
//spi_write_data(sel, 0x00);
spi_write_cmd(sel, 0x11);
spi_write_data(sel, 0x00);
sunxi_lcd_delay_ms(200);
spi_write_cmd(sel, 0x29);
spi_write_data(sel, 0x00);
}
static void LCD_panel_exit(u32 sel)
{
spi_write_cmd(sel, 0x10);
spi_write_cmd(sel, 0x28);
}
/* sel: 0:lcd0; 1:lcd1 */
static s32 LCD_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
{
return 0;
}
struct __lcd_panel f450003 = {
/* panel driver name, must mach the lcd_drv_name in sys_config.fex */
.name = "f450003",
.func = {
.cfg_panel_info = LCD_cfg_panel_info,
.cfg_open_flow = LCD_open_flow,
.cfg_close_flow = LCD_close_flow,
.lcd_user_defined_func = LCD_user_defined_func,
}
,
};
配置编译驱动
编辑 bsp/drivers/video/sunxi/disp2/disp/lcd/Kconfig
文件,增加新驱动配置
config LCD_SUPPORT_F450003
bool "LCD support F450003 panel"
default n
help
if you want to support F450003 panel for display driver, select it.
编辑 bsp/drivers/video/sunxi/disp2/disp/Makefile
增加配置
disp-$(CONFIG_LCD_SUPPORT_F450003) += lcd/f450003.o
编辑 bsp/drivers/video/sunxi/disp2/disp/lcd/panels.c
新增屏幕引用
#if IS_ENABLED(CONFIG_LCD_SUPPORT_F450003)
&f450003_panel,
#endif
编辑 bsp/drivers/video/sunxi/disp2/disp/lcd/panels.h
新增屏幕引用
#if IS_ENABLED(CONFIG_LCD_SUPPORT_F450003)
extern struct __lcd_panel f450003_panel;
#endif
获取屏幕时序
由于使用的是 Serial RGB,其 RGB 时序参考入下图所示。
屏幕时序参数与屏幕时间显示数据如下图所示:
这里需要注意的是,对于该接口,SoC总共需要三个周期才能发完一个pixel,所以我们配置时序的时候,需要满足
或者
要么配置 3 倍 lcd_ht
要么 3 倍 lcd_dclk_freq
。
此时一般询问屏厂,让其提供 RGB 时序配置,将时序参数配置为:
lcd_dclk_freq = <77>;
lcd_hbp = <23>;
lcd_ht = <1479>;
lcd_hspw = <2>;
lcd_vbp = <8>;
lcd_vt = <870>;
lcd_vspw = <2>;
配置设备树
设备树配置如下:
&disp {
disp_init_enable = <1>;
disp_mode = <0>;
screen0_output_type = <1>;
screen0_output_mode = <4>;
screen0_to_lcd_index = <0>;
screen1_output_type = <3>;
screen1_output_mode = <10>;
screen1_to_lcd_index = <2>;
screen1_output_format = <0>;
screen1_output_bits = <0>;
screen1_output_eotf = <4>;
screen1_output_cs = <257>;
screen1_output_dvi_hdmi = <2>;
screen1_output_range = <2>;
screen1_output_scan = <0>;
screen1_output_aspect_ratio = <8>;
fb_format = <0>;
fb_num = <1>;
fb_debug = <1>;
/*<disp channel layer zorder>*/
fb0_map = <0 0 0 16>;
fb0_width = <480>;
fb0_height = <854>;
/*<disp channel layer zorder>*/
fb1_map = <0 2 0 16>;
fb1_width = <300>;
fb1_height = <300>;
/*<disp channel layer zorder>*/
fb2_map = <1 0 0 16>;
fb2_width = <1280>;
fb2_height = <720>;
/*<disp channel layer zorder>*/
fb3_map = <1 1 0 16>;
fb3_width = <300>;
fb3_height = <300>;
chn_cfg_mode = <1>;
disp_para_zone = <1>;
};
&lcd0 {
lcd_used = <1>;
lcd_driver_name = "f450003";
lcd_backlight = <50>;
lcd_if = <0>;
lcd_x = <480>;
lcd_y = <854>;
lcd_width = <60>;
lcd_height = <100>;
lcd_dclk_freq = <71>;
lcd_pwm_used = <0>;
lcd_pwm_ch = <7>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <0>;
lcd_hbp = <23>;
lcd_ht = <1479>;
lcd_hspw = <2>;
lcd_vbp = <8>;
lcd_vt = <870>;
lcd_vspw = <2>;
lcd_frm = <0>;
lcd_io_phase = <0x0000>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
lcd_hv_if = <8>;
lcd_hv_clk_phase = <1>;
lcd_hv_srgb_seq = <10>;
lcd_hv_sync_polarity = <0>;
lcd_gpio_0 = <&pio PD 17 GPIO_ACTIVE_LOW>; // RST
lcd_gpio_1 = <&pio PD 15 GPIO_ACTIVE_LOW>; // SCK
lcd_gpio_2 = <&pio PD 16 GPIO_ACTIVE_LOW>; // SDA
lcd_gpio_3 = <&pio PD 14 GPIO_ACTIVE_LOW>; // CS
pinctrl-0 = <&rgb8_pins_a>, <&rgb8_pins_ctl_a>;
pinctrl-1 = <&rgb8_pins_b>, <&rgb8_pins_ctl_b>;
};
测试屏幕
使用命令查看 TCON 彩条,这个彩条是由 TCON 发出的,操作更加底层。
echo 1 > /sys/class/disp/disp/attr/colorbar
使用命令查看 DE 彩条,这个彩条是由 DE 合成发出的,如果 DE 出问题则可以看到 TCON 彩条看不到 DE 彩条。
如果刚才开了 TCON 彩条,记得先关一下,TCON 彩条优先级更高
echo 0 > /sys/class/disp/disp/attr/colorbar
echo 8 > /sys/class/disp/disp/attr/colorbar
FAQ
RGB接口显示抖动有花纹
- 改大时钟管脚的管脚驱动能力,改大。
- 修改时钟相位,也就是修改
lcd_hv_clk_phase
。由于发送端和接收端时钟相位的不同导致接收端解错若干位。
黑屏无显示
黑屏,没有屏幕信号输出
首先确认芯片型号是否为 V821L2-WXX,其他型号不支持 I8080 显示。
完全黑屏,背光也没有
- 屏驱动添加失败。驱动没有加载屏驱动,导致背光电源相关函数没有运行到。
- 屏驱动加载成功,但是没有执行到开背光函数(可以在uboot的屏驱动中加打印确认开屏流程的执行情况)。这时候大概率是屏驱动的开屏函数没有执行完,uboot就执行完毕进入内核了。需要在满足屏手册上电时序要求的情况下,尽量减少延迟。
- PWM 配置和背光电路的问题,另外就是直接测量下硬件测量下相关管脚和电压,再检查屏是否初始化成功。
黑屏但是有背光
- 没送图层。如果应用没有送任何图层那么表现的现象就是黑屏。
- SoC端的显示接口模块没有供电。SoC端模块没有供电自然无法传输视频信号到屏上。
- 复位脚没有复位。如果有复位脚,请确保硬件连接正确,确保复位脚的复位操作有放到屏驱动中。
board.dts
中lcd0
有严重错误。第一个是lcd
的timing
搞错了,请严格按照屏手册中的提示来写。第二个就是,接口类型搞错。- 屏的初始化命令不对。包括各个步骤先后顺序,延时等,这个时候请找屏厂确认初始化命令。