技术分享 | i.MX8M Mini适配MIPI转eDP芯片

发布时间:2024-5-8 10:20    发布者:武汉万象奥科
关键词: NXP , i.MX8M Mini , Display , Linux , ARM , Display , Linux , ARM

1. 方案概述
此方案使用HD-8MMN-CORE的核心板搭配TI公司的芯片SN65DSI86转换芯片实现。
SN65DSI86作为一款MIPI DSIeDP的芯片,支持双通道DSI输入,最大四通道显示输出,最大支持4K@60fps输出,WUXGA 1080P。本方案中将采用单通道DSI输入,双通道DP输出到1080p的屏幕。
HD8MMN-CORE系列工业级核心板基于NXP(Freescale) i.MX8MM系列Cortex-A53高性能处理器设计,支持硬件加密,支持摄像头接口、USB3.0接口、HDMI/MIPIPCIe、千兆以太网接口、多路串口等,适用于快速开发一系列最具创新性的应用,如多媒体应用、人机界面、工业4.0、车载终端以及边缘计算设备等。
2硬件原理图
注:硬件修改REFCLK上需要贴上27M的晶振,TEST2引脚需要通过4.7K电阻上拉到1.8V.
3软件实现3.1软件介绍
l  内核版本:Linux5.10;
l  SN65DSI86驱动:drivers/gpu/drm/bridge/ti-sn65dsi86.c
l Panel驱动:drivers/gpu/drm/panel/panel-simple.c
3.2驱动移植
内核配置,需要打开如下两项
  1. CONFIG_DRM_TI_SN65DSI86=y



  2. CONFIG_DRM_PANEL_SIMPLE=y

复制代码

1)      设备树配置
  1. / {



  2.         osc_27m: clock-osc-27m {



  3.                 compatible =

  4. "fixed-clock";



  5.                 #clock-cells = <0>;



  6.                 clock-frequency =

  7. <27000000>;



  8.                 clock-output-names =

  9. "osc_27m";



  10.         };





  11.         lcd_backlight: lcd_backlight {



  12.                 compatible =

  13. "pwm-backlight";



  14.                 pwms = <&pwm1 0

  15. 100000>;



  16.                 status = "okay";





  17.                 brightness-levels = < 0  1

  18. 2  3  4
  19. 5  6  7
  20. 8  9



  21.                                      10 11 12

  22. 13 14 15 16 17 18 19



  23.                                      20 21 22

  24. 23 24 25 26 27 28 29



  25.                                      30 31 32

  26. 33 34 35 36 37 38 39



  27.                                      40 41 42

  28. 43 44 45 46 47 48 49



  29.                                      50 51 52

  30. 53 54 55 56 57 58 59



  31.                                      60 61 62

  32. 63 64 65 66 67 68 69



  33.                                      70 71 72

  34. 73 74 75 76 77 78 79



  35.                                      80 81 82

  36. 83 84 85 86 87 88 89



  37.                                      90 91 92

  38. 93 94 95 96 97 98 99



  39.                                     100>;



  40.                 enable-gpios = <&gpio1 1

  41. GPIO_ACTIVE_HIGH>;



  42.                 default-brightness-level =

  43. <80>;



  44.         };



  45.         panel {



  46.                 compatible =

  47. "test,test-edp-1080p";      
  48. //设置自己的屏幕匹配参数组



  49.                 backlight =

  50. <&lcd_backlight>;



  51.                 no-hpd;





  52.                 port {



  53.                         panel1_in: endpoint {



  54.                                 remote-endpoint

  55. = <&sn65_out>;



  56.                         };



  57.                 };



  58.         };



  59. };


  60. &pwm1 {



  61.         pinctrl-names = "default";



  62.         pinctrl-0 = <&pinctrl_pwm1>;



  63.         status = "okay";



  64. };






  65. &i2c4

  66. {



  67.         clock-frequency = <400000>;



  68.         pinctrl-names = "default";



  69.         pinctrl-0 = <&pinctrl_i2c4>;



  70.         status = "okay";



  71.         sn65dsi86@2d {



  72.                …….



  73.                 clock-names =

  74. "refclk";          //默认名字

  75.                               //SN65DSI86仅支持12 MHz, 19.2 MHz, 26 MHz, 27 MHz
  76. or 38.4 MHz.



  77.                 clocks = <&osc_27m>;






  78.                ……



  79.                         port@1 {



  80.                                 reg =

  81. <1>;



  82.                                 sn65_out:

  83. endpoint {



  84.                                        

  85. //data-lanes = <0 1 2 3>;

  86.                                                                         //根据eDP屏的通道数设置,这里为2通道



  87.                                        

  88. data-lanes = <0 1>;



  89. ……

复制代码

2)      驱动修改
添加显示屏的显示参数到驱动中,修改drivers/gpu/drm/panel/panel-simple.c:

tatic const struct display_timing test_edp_1080p_timing = {

  1.         .pixelclock = { 153000000, 153000000, 153000000 },


  2.         .hactive = { 1920, 1920, 1920 },


  3.         .hfront_porch = { 100, 100, 100 },


  4.         …..


  5.         .bus_format = MEDIA_BUS_FMT_RGB666_1X18,


  6.         .connector_type = DRM_MODE_CONNECTOR_eDP,


  7. };



  8. static const struct of_device_id platform_of_match[] = {


  9.         {


  10.                 .compatible = "test,test-edp-1080p",


  11.                 .data = &test_edp_1080p,


  12.         },

复制代码

修改sn65dsi86驱动以适应我们的板卡,修改drivers/gpu/drm/bridge/ti-sn65dsi86.c,修改DSI正确的模式,防止找不到注册的panel出现报错“could notfind any panel node”,开机过程中打印1次是正常的,SN65DSI86的驱动找不到Panel会被多次调用,直到找到panel为止。
  1. static int ti_sn_bridge_attach(struct drm_bridge *bridge,

                                   enum drm_bridge_attach_flags flags)

    {

    ...

            //dsi->mode_flags = MIPI_DSI_MODE_VIDEO;

            dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |

                              MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE;

复制代码


3)      调试报错
在调试过程中碰到“Link training failed, link is off”的报错,是因为SN65DSI86默认只支持ASSR模式的eDP屏幕,对于不支持ASSR模式的eDP屏,硬件上则需要将TEST2引脚拉高到1.8V,且修改相关寄存器将芯片从ASSR模式变为支持标准的DP模式,修改如下:
  1. #define SN_ENH_FRAME_REG                        0x5A

    #define  ASSR_CONTROL                           BIT(0)

    ...


  2. static int ti_sn_link_training(struct ti_sn_bridge *pdata, int dp_rate_idx,

                                   const char **last_err_str)

    {

            unsigned int val;

            int ret;

            int i;


  3.         /* set dp clk frequency value */

            regmap_update_bits(pdata->regmap, SN_DATARATE_CONFIG_REG,

                               DP_DATARATE_MASK, DP_DATARATE(dp_rate_idx));


  4.         regmap_write(pdata->regmap, 0xff, 0x07);

            regmap_write(pdata->regmap, 0x16, 0x01);

            regmap_write(pdata->regmap, 0xff, 0x00);

           /* For DisplayPort, use the standard DP scrambler seed. */

            regmap_update_bits(pdata->regmap, SN_ENH_FRAME_REG,ASSR_CONTROL, 0);

            /* enable DP PLL */

            regmap_write(pdata->regmap, SN_PLL_ENABLE_REG, 1);

    ...

复制代码

如果未接eDP屏幕会出现如下报错:
  1. [
  2. 2.299284] ti_sn65dsi86 3-002d: [drm:ti_sn_bridge_enable] ERROR Can't read lane
  3. count (-6); assuming 4

  4. [ 2.765851] ti_sn65dsi86 3-002d:
  5. [drm:ti_sn_bridge_enable] ERROR Can't read eDP rev (-6), assuming 1.1
复制代码


本文地址:https://www.eechina.com/thread-856560-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

  • Microchip视频专区
  • 安静高效的电机控制——这才是正确的方向!
  • 无线充电基础知识及应用培训教程2
  • 基于CEC1712实现的处理器SPI FLASH固件安全弹性方案培训教程
  • 想要避免发生灾难,就用MPLAB® SiC电源仿真器!
  • 贸泽电子(Mouser)专区

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表