Tinkerboard2/lcd

From wiki
Jump to: navigation, search


1.简介

tinker board 2s开发板上有一个mipi dsi接口,可用来接LCD。接口位置如下:

Tinker2s top.png

2.加载环境

./docker_builder/docker-builder-run.sh
source build/envsetup.sh
lunch WW_Tinker_Board_2-userdebug

3.配置设备树文件

cd kernel
vim arch/arm64/boot/dts/rockchip/rk3399-tinker_board_2.dtsi

3.1 初始化序列

找到下面的内容

Dsi.png

一般情况下LCD屏会有初始化和反初始化的过程,但是在实际应用中,一般还很少会用到反初始化,所以LCD面板厂家一般都是只提供初始化代码,在MIPI DSI驱动中,我们需要将这些厂家提供的初始化代码转换为相应的DCS序列。在dsi,lanes = <4>;属性下面添加panel-init-sequence属性,如果LCD屏有反初始化,就添加panel-exit-sequence属性。例如:

dsi,lanes = <4>;
panel-init-sequence = [
    15 00 02 80 ac
    15 00 02 81 b8
    15 00 02 82 09
    15 00 02 83 78
    15 00 02 84 7f
    15 00 02 85 bb
    15 00 02 86 70
];

格式说明:第一条命令解析:15 00 02 80 ac,头3个字节(16进制)分别代表数据类型、延时时间(单位是ms)、数据长度、剩下的就是具体的数据。

数据类型:

  • 05:代表只有一个数据
  • 15:代表有两个数据,在上述命令中只有两个数据,所以对应命令的数据类型是15
  • 39:代表超过两个数据

延时时间:没有延时就填0,延时2ms就填02。注意填写的是16进制

数据长度:后面有两个数据就填02,只有一个数据就填01,注意填写的是16进制

数据:对于只有两个数据的,一般来说第一个数据代表地址,第二个数字代表设置的值

3.2 mipi dsi设备树时序配置

修改display-timings节点

在native-mode = <&timing84>;下面添加如下内容:

//以下时序参数由屏厂家提供
timing10: timing10  {
    clock-frequency = <65000000>; //DCLK
    hactive = <1024>;             //hactive
    vactive = <600>;              //vactive
    hfront-porch = <160>;         //hfp
    hback-porch = <160>;          //hbp
    hsync-len = <10>;             //hsa
    vfront-porch = <12>;          //vfp
    vsync-len = <1>;              //vsa
    vback-porch = <23>;           //vbp
    hsync-active = <0>;           //hync 极性控制 置 1 反转极性
    vsync-active = <0>;           //vsync 极性控制 置 1 反转极性
    de-active = <1>;              //DEN 极性控制
    pixelclk-active = <0>;        //dclk 极性控制
};
//再将
native-mode = <&timing84>;
//改为自己配置的时序
native-mode = <&timing10>;

4. 修改lcd通用驱动文件

tinker board 2s的通用dsi驱动文件在内核文件夹下的drivers/gpu/drm/panel/panel-simple.c文件。但是tinker board 2s下的panel-simple.c默认不是通用lcd驱动文件,需要修改配置成通用lcd驱动文件。修改如下:

//在static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)函数里,在int dsi_id添加一个宏定义开关
int dsi_id;
//改为
#if defined(CONFIG_TINKER_MCU)
int dsi_id;
#endif

//在static int panel_simple_enable(struct drm_panel *panel)函数内,在static bool the_first_time_rpi_enable = true;处添加宏定义开关
static bool the_first_time_rpi_enable = true;
//改为
#if defined(CONFIG_TINKER_MCU)
static bool the_first_time_rpi_enable = true;
#endif

//修改内核目录下的drivers/input/touchscreen/tinker_ft5406.c
//将static int tinker_ft5406_probe(struct i2c_client *client,const struct i2c_device_id *id)函数内的
while(!tinker_mcu_is_connected(dsi_id) && !tinker_mcu_ili9881c_is_connected(dsi_id) && timeout > 0) {
    msleep(50);
    timeout--;
}
改为
#if defined(CONFIG_TINKER_MCU)
while(!tinker_mcu_is_connected(dsi_id) && !tinker_mcu_ili9881c_is_connected(dsi_id) && timeout > 0) {
    msleep(50);
    timeout--;
}
#endif
//还有将
if (tinker_mcu_ili9881c_is_connected(dsi_id)) {
    ts_data->screen_width = 720;
    ts_data->screen_height = 1280;
    ts_data->xy_reverse = 0;
} else {
    ts_data->screen_width = 800;
    ts_data->screen_height = 480;
    ts_data->xy_reverse = 1;
}
改为
#if defined(CONFIG_TINKER_MCU)
    if (tinker_mcu_ili9881c_is_connected(dsi_id)) {
        ts_data->screen_width = 720;
        ts_data->screen_height = 1280;
        ts_data->xy_reverse = 0;
    } else {
        ts_data->screen_width = 800;
        ts_data->screen_height = 480;
        ts_data->xy_reverse = 1;
    }
#endif

//修改drivers/gpu/drm/panel/下的Makefile文件。将MakeFile里面的obj-y += panel-asus.o改为# obj-y += panel-asus.o

5. 配置内核

配置内核有两种方式:一是配置菜单,二是修改tinker_board_2_defconfig。

方法一:配置菜单

//在终端输入以下命令
make  ARCH=arm64 tinker_board_2_defconfig android-10.config rk3399.config
make  ARCH=arm64 menuconfig //打开内核配置菜单

在内核配置菜单选择中找到

Device Drivers --->
  Graphics support --->
    Display Panels --->
      <*> support for toshiba tc358762 panel
      <*> ASUS ILI9881c panel
按空格键将support for toshiba tc358762 panel和ASUS ILI9881c panel设置为不编译。

再在内核配置菜单中找到

Device Drivers --->
 Misc devices --->
  <*> tinker mcu 
  <*> tinker mcu ili9881c 
按空格键将tinker mcu和tinker mcu ili9881c设置为不编译。

Tinker2s menu.png

5.1 编译内核

make ARCH=arm64 tinker_board_2.img -j8

方法二:修改tinker_board_2_defconfig

打开内核目录下的arch/arm64/configs/tinker_board_2_defconfig文件,可以使用以下命令:

vim arch/arm64/configs/tinker_board_2_defconfig

//将下面的
CONFIG_DRM_PANEL_ASUS_ILI9881C=y
CONFIG_DRM_PANEL_TOSHIBA_TC358762=y
CONFIG_TINKER_MCU=y
CONFIG_TINKER_MCU_ILI9881C=y
//改为
# CONFIG_DRM_PANEL_ASUS_ILI9881C is not set
# CONFIG_DRM_PANEL_TOSHIBA_TC358762 is not set
# CONFIG_TINKER_MCU is not set
# CONFIG_TINKER_MCU_ILI9881C is not set

5.2 编译内核

cd ..
./build.sh -K