请选择 进入手机版 | 继续访问电脑版

雨滴科技技术论坛

 找回密码
 立即注册
查看: 6589|回复: 9

在MT6735平台下驱动LCD屏(2)

  [复制链接]

256

主题

1499

帖子

6975

积分

论坛元老

Rank: 8Rank: 8

积分
6975
扫一扫,手机访问本帖
发表于 2017-3-30 22:12:49 | 显示全部楼层 |阅读模式
本帖最后由 JefferySimon 于 2018-5-12 16:18 编辑

    经过三天重新梳理操作步骤和代码,成功将LCD屏驱动起来,效果如下图所示:
P70330-093143.png

  下面是具体实现的步骤:
一、在kernel-3.10kernel-3.10/drivers/misc/mediatek/lcm下添加LCD屏驱动文件以及修改一些配置
1.进入kernel-3.10/drivers/misc/mediatek/lcm文件夹
  1. cd ~/mt6735/kernel-3.10/drivers/misc/mediatek/lcm
复制代码
1.png
   2.新建一个文件夹,用于存放自己屏幕的驱动代码和Makefile文件
  1. mkdir st7701_dsi_vdo_xind (dsi: display serial lnterface  vdo:video  xind)
复制代码
2.png

   3. 复制一份屏幕模板,在这个模板上添加自己屏幕参数,这里用的是旧屏作为模板:
  1. cp -r ../otm8018b_dsi_vdo_xind/ .
复制代码
   4. 修改Makefile里面的内容:
  1. #
  2. # Makefile for misc devices that really don't fit anywhere else.
  3. #
  4. include $(srctree)/drivers/misc/mediatek/Makefile.custom


  5. obj-y += st7701_dsi_vdo_xind.o
复制代码

3.png
4.png
5.将otm8018b_dsi_vdo_xind.c 更名为:st7701_dsi_vdo_xind.c
  1. mv  otm8018b_dsi_vdo_xind.c  st7701_dsi_vdo_xind.c
复制代码
5.png
6.进入:st7701_dsi_vdo_xind.c
  1. vi st7701_dsi_vdo_xind.c
复制代码
  7. 初始化参数:
  将参考的初始化参数复制到这个结构体里面
  1. static struct LCM_setting_table lcm_init_setting[] = {
  2.         {0xff,5,{0x77,0x01,0x00,0x00,0x10}},
  3.         {0xC0,2,{0x63,0x00}},
  4.         {0xC1,2,{0x0C,0x07}},
  5.         {0xC2,2,{0x31,0x08}},
  6.         {0xB0,16,{0x40,0x02,0x87,0x0E,0x15,0x0A,0x03,0x0A,0x0A,0x18,0x08,0x16,0x13,0x07,0x09,0x19}},
  7.         {0xB1,16,{0x40,0x01,0x86,0x0D,0x13,0x09,0x03,0x0A,0x09,0x1C,0x09,0x15,0x13,0x91,0x16,0x19}},
  8.         {0xff,5,{0x77,0x01,0x00,0x00,0x11}},
  9.         {0xb0,1,{0x4d}},
  10.         {0xb1,1,{0x58}},
  11.         {0xb2,1,{0x07}},
  12.         {0xb3,1,{0x80}},
  13.         {0xb5,1,{0x47}},

  14.         {0xB7,1,{0x8A}},
  15.         {0xB8,1,{0x21}},
  16.         {0xC1,1,{0x78}},
  17.         {0xC2,1,{0x78}},
  18.         {0xD0,1,{0x88}},

  19.         {REGFLAG_DELAY, 100, {}},

  20.         {0xe0,3,{0x00,0x00,0x02}},
  21.         {0xe1,11,{0x06,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x20,0x20}},
  22.         {0xe2,13,{0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00}},
  23.         {0xe3,4,{0x00,0x00,0x33,0x33}},
  24.         {0xe4,2,{0x44,0x44}},
  25.         {0xe5,16,{0x09,0x31,0xBE,0xA0,0x0B,0x31,0xBE,0xA0,0x05,0x31,0xBE,0xA0,0x07,0x31,0xBE,0xA0}},
  26.         {0xe6,4,{0x00,0x00,0x33,0x33}},
  27.         {0xe7,2,{0x44,0x44}},
  28.         {0xe8,16,{0x08,0x31,0xBE,0xA0,0x0A,0x31,0xBE,0xA0,0x04,0x31,0xBE,0xA0,0x06,0x31,0xBE,0xA0}},
  29.         {0xEA,16,{0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00}},
  30.         {0xeb,7,{0x02,0x02,0x00,0x00,0x00,0x00,0x00}},
  31.         {0xEC,2,{0x02,0x02}},
  32.         {0xed,16,{0xF5,0x47,0x6F,0x0B,0x8F,0x9F,0xff,0xff,0xff,0xff,0xF9,0xF8,0xB0,0xF6,0x74,0x5f}},
  33.         {0xef,12,{0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04}},

  34.         {0xff,5,{0x77,0x01,0x00,0x00,0x00}},

  35.         {0X35,1,{0X00}},

  36.         {0x11,1,{0x00}},
  37.         {REGFLAG_DELAY, 120, {}},

  38.         {0x29,1, {0x00}},
  39.         {REGFLAG_DELAY, 50, {}},
  40.         {REGFLAG_END_OF_TABLE, 0x00, {}}
  41. };
复制代码

   8. lcm_compare_id 函数获取并且比较LCD屏IDreturn ((0x7701== id) ? 1:0); 系统根据返回值判断是否获取到LCD屏ID有多个屏幕的时,可根据ID号切换显示。
  1. static unsigned int lcm_compare_id(void)
  2. {         
  3.         int id=0;
  4.         unsigned char buffer[4];
  5.         unsigned int array[16];  
  6.         char id_high=0;
  7.        char id_low=0;
  8.         
  9.         SET_RESET_PIN(1);
  10.         MDELAY(10);
  11.         SET_RESET_PIN(0);
  12.         MDELAY(10);
  13.         SET_RESET_PIN(1);
  14.         MDELAY(120);

  15.         array[0] = 0x00023700;
  16.         dsi_set_cmdq(array, 1, 1);
  17.         read_reg_v2(0xA1, &buffer[0], 2);

  18.        id_high=buffer[0];
  19.        id_low=buffer[1];
  20.        id=(id_high<<8)| id_low;
  21.         
  22.         #ifdef BUILD_LK
  23.                 printf("st7701_fwvga_dsi_vdo_lcm_drv %s:0x%2x,0x%2x,0x%2x,0x%2x id=0x%x\n", __func__,buffer[0],buffer[1],buffer[2],buffer[3], id);
  24.         #else
  25.                 printk("st7701_fwvga_dsi_vdo_lcm_drv %s:0x%2x,0x%2x,0x%2x,0x%2x id=0x%x\n", __func__,buffer[0],buffer[1],buffer[2],buffer[3], id);
  26.         #endif
  27.         
  28.     return ((0x7701 == id) ? 1:0);        // 读到LCD屏ID,返回值为1;否则,返回值为0
  29. }
复制代码
  
  9.修改LCM_DRIVER   以及.name = “名字使系统能够调用st7701_dsi_vdo_xind.c里面的函数
  1. LCM_DRIVER st7701_dsi_vdo_xind_lcm_drv =
  2. {
  3.         .name           = "st7701_dsi_vdo_xind",
  4.         .set_util_funcs = lcm_set_util_funcs,
  5.         .get_params     = lcm_get_params,
  6.         .init           = lcm_init,
  7.         .suspend        = lcm_suspend,
  8.         .resume         = lcm_resume,
  9.         .compare_id     = lcm_compare_id,
  10.         .init_power     = lcm_init_power,
  11.         .resume_power   = lcm_resume_power,
  12.         .suspend_power  = lcm_suspend_power,
  13.         //.esd_check    = lcm_esd_check,
  14.         //.esd_recover  = lcm_esd_recover,
  15.         #if (LCM_DSI_CMD_MODE)
  16.                 .update         = lcm_update,
  17.         #endif
  18. };
复制代码
  以上修改好之后,保存并退出vi

  10.进入mt65xx_lcm_list.c 添加声明
  1. vi ~/mt6735/kernel-3.10/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c
复制代码
9.png
10.png


   二、在lk/dev/lcm下添加LCD屏驱动文件以及修改一些配置
   1.进入~/mt6735/bootable/bootloader/lk/dev/lcm 目录下
  1. cd ~/mt6735/bootable/bootloader/lk/dev/lcm
复制代码

    2. 在lk下添加LCD屏驱动文件以及修改一些配置与在kernel-3.10/drivers/misc/mediatek/lcm下类似。这里,我直接将修改好的文件从kernel-3.10/drivers/misc/mediatek/lcm/拷贝到lk/dev/lcm/
  1. cp~/mt6735/kernel-3.10/drivers/misc/mediatek/lcm/st7701_dsi_vdo_xind/   ~/mt6735/bootable/bootloader/lk/dev/lcm
复制代码
11.png
  3.因为是从/kernel-3.10/drivers/misc/mediatek/lcm/st7701_dsi_vdo_xind/复制过来的,Makefile与st7701_dsi_vdo_xind.c已经修改过了,这里不用重复修改。
    同样,要在lk/dev/lcm/mt65xx_lcm_list.c 文件添加st7701相关的声明
  1. vi lk/dev/lcm/mt65xx_lcm_list.c
复制代码



    4. 配置lk下的.mk文件
  1. vi  ~/mt6735/bootable/bootloader/lk/project/p6s_65u_l1.mk
复制代码
12.png


   三、配置config
   1. 打开配置文件:p6s_65u_l1_defconfig
  1. vi ~/mt6735/kernel-3.10/arch/arm64/configs/p6s_65u_l1_defconfig
复制代码
   2. 在vi/vim中搜索LCM,方法是:/LCM
13.png
14.png

   3.我要修改CONFIG_CUSTOM_KERNEL_LCM 以及下面的CONFIG_LCM_HEIGHT CONFIG_LCM_WIDTH,但是不能直接在这里修改,直接在vi/vim下修改如果会影响到其他config,并且不会有提     醒,因此我要在menu界面下修改。
  步骤是:
   1)新建一个文件
  1. mkdir  out1
复制代码
   2)输入指令
  1. ARCH=arm64 make O=out1 p6s_65u_l1_defconfig
复制代码
   3)进入修改p6s_65u_l1_defconfig的界面:
  1. ARCH=arm64 make O=out1 menuconfig      //修改配置
复制代码
15.png

   4)用方向键选择:Device Drivers à Misc devices à MediaTek Properitary Configuration àCUSTOM_KERNEL_LCM。当出现如下界面,在输入框内输入屏幕驱动所在的文件的文件名,例如:
16.png
17.png

   5)再找到修改屏幕大小也就是屏幕分辨率的选项:
18.png
19.png
20.png

   6)修改好之后保存,输入p6s_65u_l1_defconfig,选择OK 保存修改,之后退出:
21.png
22.png

   7)经过以上的修改,所有的配置都保存在p6s_65u_l1_defconfig,将新的配置文件p6s_65_l1_defconfig复制到~/mt6735/kernel-3.10/arch/arm64/configs 替换掉旧的配置文件p6s_65u_l1_defconfig
  1. cp ~/mt6735/kernel-3.10/out1/p6s_65u_l1_defconfig  ~/mt6735/kernel-3.10/arch/arm64/configs/
复制代码
   
   8)最后,编译系统
  1. make 2>&1 | tee build.log
复制代码

  四、之前出现的白屏,是因为旧屏的compare_id 返回值设为1,也就是说系统默认读取旧屏的ID,没有去读取其他添加上去的屏的ID

23.png



本帖衔接下帖:
在MT6735平台下驱动LCD屏(1)
(出处: 雨滴科技技术论坛)
《《 雨滴科技 》》
雨润万物,滴水成河
回复

使用道具 举报

0

主题

7

帖子

46

积分

新手上路

Rank: 1

积分
46
发表于 2017-7-20 10:22:18 | 显示全部楼层
代码当中的printf和printk打印的东西为什么在uart log中没有找到?
回复 支持 反对

使用道具 举报

256

主题

1499

帖子

6975

积分

论坛元老

Rank: 8Rank: 8

积分
6975
 楼主| 发表于 2017-7-20 10:31:00 | 显示全部楼层
lhw 发表于 2017-7-20 10:22
代码当中的printf和printk打印的东西为什么在uart log中没有找到?

你是在哪打印的?
《《 雨滴科技 》》
雨润万物,滴水成河
回复 支持 反对

使用道具 举报

2

主题

40

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-11 09:25:26 | 显示全部楼层
研究。。。。。
回复

使用道具 举报

0

主题

3

帖子

35

积分

新手上路

Rank: 1

积分
35
发表于 2019-7-17 13:29:43 | 显示全部楼层
按照步骤做完串口打印未找到驱动,求解是什么问题?
[    2.847750] .(0)[1:swapper/0][name:ddp_irq&][DDP/IRQ]disp_init_irq
[    2.850129] .(1)[1:swapper/0][name:disp_lcm&][DISP]disp_lcm_probe
[    2.850954] .(1)[1:swapper/0][name:disp_lcm&][DISP][disp_lcm_probe #831]ERROR:FATAL ERROR: can't found lcm driver:jd9522_hd720_dsi_vdo_qc in linux kernel driver
[    2.853025] .(1)[1:swapper/0][name:disp_lcm&][DISP][disp_lcm_probe #837]ERROR:FATAL ERROR!!!No LCM Driver defined
[    2.854348] .(1)[1:swapper/0][name:primary_display&][DISP][primary_display_init #5151]ERROR:disp_lcm_probe returns null
[    2.855756] .(1)[1:swapper/0][name:primary_display&][DISP][primary_display_get_width #7397]ERROR:lcm handle is null
[    2.857098] .(1)[1:swapper/0][name:primary_display&][DISP][primary_display_get_height #7411]ERROR:lcm handle is null
[    2.858445] .(1)[1:swapper/0][name:mtkfb&][DISP][FB Driver] fbdev->fb_pa_base = daf696e8, fbdev->fb_va_base = e1000000
回复 支持 反对

使用道具 举报

256

主题

1499

帖子

6975

积分

论坛元老

Rank: 8Rank: 8

积分
6975
 楼主| 发表于 2019-7-20 10:02:31 | 显示全部楼层
keil_arm 发表于 2019-7-17 13:29
按照步骤做完串口打印未找到驱动,求解是什么问题?
[    2.847750] .(0)[1:swapper/0][name:ddp_irq&][DDP ...

[    2.850954] .(1)[1:swapper/0][name:disp_lcm&][DISP][disp_lcm_probe #831]ERROR:FATAL ERROR: can't found lcm driver:jd9522_hd720_dsi_vdo_qc in linux kernel driver
[    2.853025] .(1)[1:swapper/0][name:disp_lcm&][DISP][disp_lcm_probe #837]ERROR:FATAL ERROR!!!No LCM Driver defined
[    2.854348] .(1)[1:swapper/0][name:primary_display&][DISP][primary_display_init #5151]ERROR:disp_lcm_probe returns null
[    2.855756] .(1)[1:swapper/0][name:primary_display&][DISP][primary_display_get_width #7397]ERROR:lcm handle is null
[    2.857098] .(1)[1:swapper/0][name:primary_display&][DISP][primary_display_get_height #7411]ERROR:lcm handle is null
这里明显提示了错误,顺着这些错误定位,看看文件命名什么的有没有匹配对
《《 雨滴科技 》》
雨润万物,滴水成河
回复 支持 反对

使用道具 举报

17

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
发表于 2019-7-31 09:18:02 | 显示全部楼层
最后的编译系统出了这个问题,请问是什么原因?
问题.png
回复 支持 反对

使用道具 举报

0

主题

1

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2019-9-24 14:26:32 | 显示全部楼层
感谢您的分享,请教一下,都设置好了,也没有报错,屏不亮可能有什么原因呀
回复 支持 反对

使用道具 举报

256

主题

1499

帖子

6975

积分

论坛元老

Rank: 8Rank: 8

积分
6975
 楼主| 发表于 2019-9-30 09:24:31 | 显示全部楼层
baron-z 发表于 2019-9-24 14:26
感谢您的分享,请教一下,都设置好了,也没有报错,屏不亮可能有什么原因呀 ...

原因有很多啊,驱动代码,硬件设备等等都检查一下
《《 雨滴科技 》》
雨润万物,滴水成河
回复 支持 反对

使用道具 举报

28

主题

111

帖子

430

积分

中级会员

Rank: 3Rank: 3

积分
430
发表于 2019-9-30 11:00:57 | 显示全部楼层
JefferySimon 发表于 2019-9-30 09:24
原因有很多啊,驱动代码,硬件设备等等都检查一下

厉害            
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
在线咨询
咨询热线
0755-26787502-8006/8016
扫一扫二维码
直接访问本站

QQ|Archiver|手机版|小黑屋|雨滴科技  

GMT+8, 2019-10-18 19:06 , Processed in 0.082881 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表