Skip to main content

LCD_MIPI TFT屏幕驱动添加说明

本文适用于在linux与rtos添加mipi接口的tft_lcd屏幕驱动,主要介绍屏幕需要配置的参数以及如何添加代码.

一 添加驱动代码

目录以及文件的添加按照已有的驱动代码进行复制.

ad100为例:

linux下添加lcd_st7797需要添加或修改以下文件(module_driver目录下):

1

rtos下添加lcd_st7701s、lcd_st7797需要添加或修改以下文件:

2

二 重要结构体说明

// module_driver/soc/x2600_510/fb/lcdc_data.h

struct lcdc_data {
/* video mode */
const char *name;
unsigned int refresh; // 控制器向tft屏幕刷数据的帧率
unsigned int xres; // 屏幕显示区域的宽
unsigned int yres; // 屏幕显示区域的高
unsigned int pixclock; // 自动计算
// 屏幕的porch,见代码段后的附加图片
unsigned int left_margin; // 对应horizontal_back_porch (HBP)
unsigned int right_margin; // 对应horizontal_front_porch (HFP)
unsigned int upper_margin; // 对应vertical_back_porch (VBP)
unsigned int lower_margin; // 对应vertical_front_porch (VFP)

unsigned int hsync_len; // 水平同步时间(单位:lines)
unsigned int vsync_len; // 垂直同步时间(单位:lines)

enum fb_fmt fb_fmt; // fb色彩格式(对应应用层色彩,如lvgl仅支持rgb888 与 argb8888),默认 fb_fmt_ARGB8888
enum lcdc_lcd_mode lcd_mode; // TFT_MIPI
enum lcdc_out_format out_format; // 输出给屏幕的颜色格式(与color_coding对应)

/* 略 */

// 除屏幕特殊说明外,多为默认值,一般注意 num_of_lanes 即可
struct {
unsigned char num_of_lanes; // 几线的mipi
unsigned char virtual_channel;
unsigned int byte_clock;
unsigned char max_hs_to_lp_cycles;
unsigned char max_lp_to_hs_cycles;
unsigned short max_bta_cycles;
enum dsih_color_coding color_coding; // mipi传输色彩格式需要与 out_format 对应 如OUT_FORMAT_RGB888 对应 COLOR_CODE_24BIT
enum lcdc_signal_polarity data_en_polarity;
enum lcdc_signal_level hsync_active_level;
enum lcdc_signal_level vsync_active_level;

enum dsih_video_mode video_mode;
enum lcdc_signal_polarity color_mode_polarity;
enum lcdc_signal_polarity shut_down_polarity;

enum mipi_dsi_18bit_type color_type_18bit;

enum lcdc_te_type slcd_te_pin_mode
enum lcdc_signal_polarity slcd_te_data_transfered_edge;
} mipi;

/* 略 */

int height; // 屏的物理高度,单位毫米
int width; // 屏的物理宽度,单位毫米

int (*power_on)(struct lcdc *lcdc); // 上电(包含控制reset时序)
int (*power_off)(struct lcdc *lcdc);
void (*lcd_init)(void); // lcd初始化(包含初始化列表写入)
};

struct dsi_cmd_packet {
unsigned char packet_type; // 数据包类型 常见为0x05(单字数据)0x15(双字节数据)与0x39(多字节数据)
/**
* 依据packet_type不同代表不同含义
* 0x05时,cmd0_or_wc_lsb有效,为单字节的数据
* 0x15时,cmd0_or_wc_lsb -- 双字节低位,cmd1_or_wc_msb -- 双字节高位
* 0x39时,cmd0_or_wc_lsb有效,为数据长度,cmd_data为数据指针
*/
unsigned char cmd0_or_wc_lsb;
unsigned char cmd1_or_wc_msb;
unsigned char *cmd_data;
};

图片包含的信息均由屏幕厂家提供:

3

三 示例

3.1 屏幕参数

以st7701s的一款屏幕为例

屏幕显示的相关信息如下:

4

对应代码:

.xres = 480,
.yres = 854,
.left_margin = 60,
.right_margin = 100,
.upper_margin = 18,
.lower_margin = 16,
.hsync_len = 50,
.vsync_len = 8,

3.2 初始化代码

得到的初始化代码如下(部分)

Void ST7701S_PanelInitialCode (void)
{
//---------------------ST7701S Reset Sequence--------------------------------//
LCD_Nreset(1);
Delayms (1); //Delay 1ms
LCD_Nreset(0);
Delayms (1); //Delay 1ms
LCD_Nreset(1);
Delayms (120); //Delay 120ms
//---------------------Bank0 Setting-----------------------------------------//
//---------------------Display Control setting-------------------------------//
WriteComm (0xFF);
WriteData (0x77);
WriteData (0x01);
WriteData (0x00);
WriteData (0x00);
WriteData (0x10);
/* 略 */
WriteComm (0x11);
Delayms (120); //Delay 120ms
WriteComm (0x29);
}

3.2.1 reset时序

其中ST7701S Reset Sequence为reset的时序,控制io口电平,需在power_on函数中控制。

static int st7701s_frd450_power_on(struct lcdc *lcdc)
{
if (st7701s_frd450_regulator)
regulator_enable(st7701s_frd450_regulator);

m_gpio_direction_output(gpio_lcd_power_en, 1);

msleep(10);

// reset sequence
m_gpio_direction_output(gpio_lcd_rst, 1);
msleep(1);
m_gpio_direction_output(gpio_lcd_rst, 0);
msleep(1);
m_gpio_direction_output(gpio_lcd_rst, 1);
msleep(120);

m_gpio_direction_output(gpio_lcd_backlight_en, 1);

return 0;
}

3.2.2 写入初始化列表

厂家提供的初始化代码形式不一, 如本例中使用WriteComm表示一个新包的开始和第一个字节的数据, WriteData为其余字节的数据. 转换到我们的代码如下:

5

通过dsi_write_cmddsi_cmd_packet数组写入

如果遇到写入需要延迟需求, 将代码分段写入:

6