0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OKMX8MM-C开发板UBOOT添加新的显示支持

飞凌嵌入式 2022-01-07 16:09 次阅读

OKMX8MM-C开发板基于NXP公司的i.MX8MMini 四核64位处理器设计,采用核心板+底板结构,主频最高1.8GHz,Cortex-A53架构;2GB DDR4 RAM,支持一个通用型Cortex-M4 400MHz内核处理器提供多种外设接口,如MIPI-CSI、MIPI-DSIUSB、PCIe、UART 、eCSPI 、IIC和千兆以太网。本文主要讲解OKMX8MM-C开发板平台uboot添加新的显示支持。

一、MIPI接口能够连接的显示设备

OKMX8MM-C开发板只有一个MIPI DSI显示接口,这个接口除了可以连接MIPI显示屏,还可以通过MIPI转LVDS模块,连接LVDS显示屏或HDMI显示屏。

其中MIPI显示屏还分为需要配置和不需要配置的。

1、不需要配置的MIPI屏

MIPI接口的显示屏分为需要DSI进入命令模式配置后才能显示的MIPI屏和不需要配置的MIPI屏。不需要配置的MIPI屏比较简单,只要MIPI DSI接口正常输出信号就能正常显示,飞凌嵌入式OKMX8MM-C开发板提供的1024x600分辨率的7寸MIPI屏就是一块不需要配置的MIPI屏,它默认就工作在4lanes高速模式下,只需要将CPU内的显示相关的模块配置好,并让其开始工作,MIPI屏就能够正常显示。

2、需要配置的MIPI屏

需要配置的MIPI屏,DSI接口在输出显示信号前需要进入命令模式对显示屏进行配置,配置参数一般由屏体厂家提供。NXP i.MX8MM 评估套件使用的OLED屏RM67191,就是一款需要配置的MIPI显示屏。

3、MIPI转LVDS和HDMI模块

这个模块能将MIPI信号转换为LVDS或HDMI信号,通过这个模块可以连接LVDS显示屏或者HDMI显示屏。MIPI转LVDS&HDMI模块需要通过I2C配置转接,将包含对应的显示屏的显示参数等信息配置到芯片内,然后MIPI接口输出对应的显示信号。

二、UBOOT阶段的LOGO显示

OKMX8MM-C开发板默认添加了
  • 1024x600的7寸屏MIPI7

  • 自定义7MIPI显示(MIPICUSTOM);

  • MIPI转HDMI的1920x1080 (MIPI2HDMI1920x1080

  • 1280x720 (MIPI2HDMI1280x720

  • 640x480 (MIPI2HDMI640x480

  • 10.1寸1280x800LVDS显示屏(MIPI2HDMI1280x800

  • 自定义MIPI转LVDS(MIPI2HDMICUSTOM)。

小编截取了MIPI7和MIPI2HDMI_1280x720的完整的显示参数,分别对应了直接连接MIPI屏和通过MIPI转LVDS&HDMI模块连接LVDS或HDMI显示屏。

  1. structdisplay_info_tconst displays[] = {

  2. {

  3. .bus = LCDIF_BASE_ADDR,

  4. .addr = 0,

  5. .pixfmt = 24,

  6. .detect = NULL,

  7. .enable = do_enable_mipi_led,

  8. .mode = {

  9. .name = "MIPI7",

  10. .refresh = 60,

  11. .xres = 1024,

  12. .yres = 600,

  13. .pixclock = 22733, /* 43987200 */

  14. .left_margin = 48,

  15. .right_margin = 40,

  16. .upper_margin = 16,

  17. .lower_margin = 13,

  18. .hsync_len = 48,

  19. .vsync_len = 3,

  20. .sync = FB_SYNC_EXT,

  21. .vmode = FB_VMODE_NONINTERLACED

  22. }

  23. },

  24. ...

  25. {

  26. .bus = LCDIF_BASE_ADDR,

  27. .addr = 0,

  28. .pixfmt = 24,

  29. .detect = NULL,

  30. .enable = do_enable_mipi2hdmi,

  31. .mode = {

  32. .name = "MIPI2HDMI_1280x720",

  33. .refresh = 60,

  34. .xres = 1280,

  35. .yres = 720,

  36. .pixclock = 13468, //74250000

  37. .left_margin = 220,

  38. .right_margin = 110,

  39. .upper_margin = 20,

  40. .lower_margin = 5,

  41. .hsync_len = 40,

  42. .vsync_len = 5,

  43. .sync = FB_SYNC_EXT,

  44. .vmode = FB_VMODE_NONINTERLACED

  45. }

  46. },

  47. ...

  48. }

1、如何选择显示参数

UBOOT阶段通过读取UBOOT的环境变量panel的值来判定使用哪一组显示参数,可以通过UBOOT命令行或者UBOOT菜单设置panel的值,方法可以参考飞凌嵌入式提供的用户手册UBOOT代码通过判断哪组参数的mode字段的name值和panel的值相等就选择哪组参数,例如panel的值等于MIPI7,那么就会选择MIPI7对应的那组显示参数,也就是飞凌嵌入式提供的1024x600分辨率的7寸MIPI屏。

2、自定义参数是什么意思

我们在调试显示的时候需要修改panel对应的显示参数结构体内的参数,自定义参数是指可以通过UBOOT命令行设置环境变量来修改显示参数结构体内的参数。自定义参数的用法是panel的值设置为MIPI2HDMI_CUSTOM或MIPI_CUSTOM,代码通过读取环境变量customvideomode,然后解析xres、yres等参数的值替显示参数结构体内的xres、yres等参数,其代码实现如下。

  1. int board_video_skip(void)

  2. {

  3. int i;

  4. int ret = 0;

  5. charconst*panel = env_get("panel");

  6. if(!panel) {

  7. ...

  8. } else{

  9. for(i = 0; i < display_count; i++) {

  10. if(!strcmp(panel, displays[i].mode.name))

  11. break;

  12. }

  13. }

  14. if(i < display_count) {

  15. if(!strcmp(panel, "MIPI_CUSTOM") || !strcmp(panel, "MIPI2HDMI_CUSTOM")) {

  16. charconst* options = env_get("custom_video_mode");

  17. char*opt = strdup(options);

  18. get_mode_frome_env(&displays[i], opt);

  19. }

  20. ...


  1. staticvoid get_mode_frome_env(structdisplay_info_t*dev, char*options)

  2. {

  3. char*opt;

  4. while((opt = strsep(&options, ",")) != NULL) {

  5. if(!*opt)

  6. continue;

  7. if(!strncmp(opt, "xres=", 5)) {

  8. dev->mode.xres = simple_strtoul(opt + 5, NULL, 0);

  9. } elseif(!strncmp(opt, "yres=", 5)) {

  10. dev->mode.yres = simple_strtoul(opt + 5, NULL, 0);

  11. } elseif(!strncmp(opt, "pixclock=", 9)) {

  12. dev->mode.pixclock = simple_strtoul(opt + 9, NULL, 0);

  13. } elseif(!strncmp(opt, "left_margin=", 12)) {

  14. dev->mode.left_margin = simple_strtoul(opt + 12, NULL, 0);

  15. } elseif(!strncmp(opt, "right_margin=", 13)) {

  16. dev->mode.right_margin = simple_strtoul(opt + 13, NULL, 0);

  17. } elseif(!strncmp(opt, "upper_margin=", 13)) {

  18. dev->mode.upper_margin = simple_strtoul(opt + 13, NULL, 0);

  19. } elseif(!strncmp(opt, "lower_margin=", 13)) {

  20. dev->mode.lower_margin = simple_strtoul(opt + 13, NULL, 0);

  21. } elseif(!strncmp(opt, "hsync_len=", 10)) {

  22. dev->mode.hsync_len = simple_strtoul(opt + 10, NULL, 0);

  23. } elseif(!strncmp(opt, "vsync_len=", 10)) {

  24. dev->mode.vsync_len = simple_strtoul(opt + 10, NULL, 0);

  25. } elseif(!strncmp(opt, "sync=", 5)) {

  26. dev->mode.sync = simple_strtoul(opt + 5, NULL, 0);

  27. } elseif(!strncmp(opt, "vmode=", 6)) {

  28. dev->mode.vmode = simple_strtoul(opt + 6, NULL, 0);

  29. } elseif(!strncmp(opt, "refresh=", 8)) {

  30. dev->mode.refresh = simple_strtoul(opt + 8, NULL, 0);

  31. }

  32. }

  33. printf("use custom mode %s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %08X, %08X \n ", \

  34. dev->mode.name,dev->mode.refresh, dev->mode.xres, dev->mode.yres, dev->mode.pixclock, \

  35. dev->mode.left_margin, dev->mode.right_margin, dev->mode.upper_margin, dev->mode.lower_margin, \

  36. dev->mode.hsync_len, dev->mode.vsync_len, dev->mode.sync, dev->mode.vmode);

  37. }

三、UBOOT新增显示调试

UBOOT新增显示屏时,先确认增加的是哪种类型的显示屏,下面跟着小编一起对不同的显示屏进行调试。

1、MIPI转LVDS和HDMI模块

MIPI转LVDS和HDMI模块,能够正常显示的条件是:

  • 显示结构体内配置当前显示屏的显示参数;
  • I2C下发正确的配置参数到转接模块。
I2C需要下发的配置参数是通过显示参数计算得出,所以当连接LVDS或HDMI显示时,只需要正确配置显示参数就能让UBOOT正常显示LOGO。飞凌嵌入式提供的代码已经默认支持了640x480、1280x720、1920x1080、1280x800四种分辨,如果选择这几种分辨率的显示屏,直接通过菜单显示即可(LVDS接口分辨率最大支持到1280x800)。如果要添加其它分辨率的显示屏,飞凌嵌入式提供了一组可以自定义显示的参数,只需要将panel的值设置为”MIPI2HDMICUSTOM“,然后设置环境变量customvideo_mode,修改你需要的xres、yres等值后保存环境变量,重启检测能否显示LOGO。在启动的过程可以看到新设置的显示参数,方便验证修改的是否成功。

  1. ...

  2. u-boot=> setenv panel MIPI2HDMI_CUSTOM

  3. u-boot=> setenv custom_video_mode xres=1024,yres=768

  4. u-boot=> sa

  5. SavingEnvironment to MMC... Writing to MMC(1)... OK

  6. u-boot=> reset

  7. resetting ...

  8. ...

  9. LoadingEnvironment from MMC... OK

  10. use custom mode MIPI2HDMI_CUSTOM: 60, 1024, 768, 12048, 200, 64, 24, 1, 136, 3, 00000004, 00000000

  11. ...

2、不需配置的MIPI显示屏

不需配置的MIPI屏,只需要修改显示参数即可正常显示LOGO。飞凌嵌入式开发板默认支持分辨率为1024x600的显示屏,如需添加新的此类型的显示屏,飞凌嵌入式提供了一组可以自定义显示的参数,只需要将panel的值设置为”MIPICUSTOM“,然后设置环境变量customvideo_mode,修改你需要的xres、yres等值后保存环境变量,重启检测能否显示LOGO。在启动的过程可以看到新设置的显示参数,方便验证修改是否成功。

  1. ...

  2. u-boot=> setenv panel MIPI_CUSTOM

  3. u-boot=> setenv custom_video_mode xres=800,yres=600,pixclock=20000,refresh=55

  4. u-boot=> sa

  5. SavingEnvironment to MMC... Writing to MMC(1)... OK

  6. u-boot=> reset

  7. resetting ...

  8. ...

  9. LoadingEnvironment from MMC... OK

  10. use custom mode MIPI_CUSTOM: 55, 800, 600, 20000, 48, 40, 16, 13, 48, 3, 00000004, 00000000

  11. Display: MIPI_CUSTOM (800x600)

  12. Video: 800x600x24

  13. ...

3、需要配置的MIPI显示屏

这种显示屏对比不需配置的MIPI显示屏多了一步配置,可以参照原厂提供的RM67191进行修改。

首先,添加一组显示参数,显示参数根据显示屏修改,修改文件board/freescale/imx8mmevk/imx8mmevk.c。


  1. {

  2. .bus = LCDIF_BASE_ADDR,

  3. .addr = 0,

  4. .pixfmt = 24,

  5. .detect = NULL,

  6. .enable = do_enable_mipi_led,

  7. .mode = {

  8. .name = "RM67191_OLED",

  9. .refresh = 60,

  10. .xres = 1080,

  11. .yres = 1920,

  12. .pixclock = 7575, /* 132000000 */

  13. .left_margin = 34,

  14. .right_margin = 20,

  15. .upper_margin = 4,

  16. .lower_margin = 10,

  17. .hsync_len = 2,

  18. .vsync_len = 2,

  19. .sync = FB_SYNC_EXT,

  20. .vmode = FB_VMODE_NONINTERLACED

  21. }

  22. }

然后修改这组参数的使能函数


  1. void do_enable_mipi_led(structdisplay_info_tconst*dev)

  2. {

  3. imx_iomux_v3_setup_multiple_pads(backlight_pads,

  4. ARRAY_SIZE(backlight_pads));

  5. gpio_request(IMX_GPIO_NR(1, 1), "backlight");

  6. gpio_direction_output(IMX_GPIO_NR(1, 1), 0);

  7. gpio_request(IMX_GPIO_NR(1, 8), "DSI EN");

  8. gpio_direction_output(IMX_GPIO_NR(1, 8), 0);

  9. mdelay(10);

  10. gpio_direction_output(IMX_GPIO_NR(1, 8), 1);

  11. /* enable the dispmix & mipi phy power domain */

  12. call_imx_sip(FSL_SIP_GPC, FSL_SIP_CONFIG_GPC_PM_DOMAIN, DISPMIX, true, 0);

  13. call_imx_sip(FSL_SIP_GPC, FSL_SIP_CONFIG_GPC_PM_DOMAIN, MIPI, true, 0);

  14. /* Put lcdif out of reset */

  15. disp_mix_bus_rstn_reset(imx8mm_mipi_dsim_plat_data.gpr_base, false);

  16. disp_mix_lcdif_clks_enable(imx8mm_mipi_dsim_plat_data.gpr_base, true);

  17. /* Setup mipi dsim */

  18. sec_mipi_dsim_setup(&imx8mm_mipi_dsim_plat_data);

  19. rm67191_init();

  20. rm67191_dev.name = dev->mode.name;

  21. imx_mipi_dsi_bridge_attach(&rm67191_dev); /* attach rm67191 device */

  22. }


  1. struct mipi_dsi_client_dev rm67191_dev = {

  2. .channel = 0,

  3. .lanes = 4,

  4. .format = MIPI_DSI_FMT_RGB888,

  5. .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |

  6. MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE,

  7. };

修改显示屏驱动drivers/video/rm67191.c,在函数int rm67191lcdsetup(struct mipidsiclientdev *paneldev)添加自己的屏的初始化序列。

修改完成后编译测试。

注意:uboot代码不开源,修改代码需要联系销售人员

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板
    +关注

    关注

    25

    文章

    4942

    浏览量

    97176
收藏 人收藏

    评论

    相关推荐

    基于哪吒开发板部署YOLOv8模型

    2024英特尔 “走近开发者”互动活动-哪吒开发套件免费试 用 AI 创新计划:哪吒开发板是专为支持入门级边缘 AI 应用程序和设备而设计,能够满足人工智能学习、
    的头像 发表于 11-15 14:13 143次阅读
    基于哪吒<b class='flag-5'>开发板</b>部署YOLOv<b class='flag-5'>8</b>模型

    设计用于TMS320C203评估的TMS320C203 DSP开发板

    电子发烧友网站提供《设计用于TMS320C203评估的TMS320C203 DSP开发板.pdf》资料免费下载
    发表于 10-28 10:23 0次下载
    设计用于TMS320<b class='flag-5'>C</b>203评估的TMS320<b class='flag-5'>C</b>203 DSP<b class='flag-5'>开发板</b>

    设计TMS320C548/9 DSP开发板

    电子发烧友网站提供《设计TMS320C548/9 DSP开发板.pdf》资料免费下载
    发表于 10-26 10:13 0次下载
    设计TMS320<b class='flag-5'>C</b>548/9 DSP<b class='flag-5'>开发板</b>

    NXP FRDM-MCXC444开发板在RT-Thread环境下的上手过程

    NXP FRDM-MCXC444开发板是一款基于MCX C444 MCU的高性能开发板,它集成了丰富的硬件资源和接口,支持快速原型设计。本文将为读者提供一份详细的RT-Thread上手
    的头像 发表于 10-12 11:51 317次阅读
    NXP FRDM-MCXC444<b class='flag-5'>开发板</b>在RT-Thread环境下的上手过程

    RK3568开发板支持AMP双系统

    RK3568开发板支持AMP双系统
    的头像 发表于 06-04 15:33 631次阅读
    RK3568<b class='flag-5'>开发板</b><b class='flag-5'>支持</b>AMP双系统

    飞凌嵌入式i.MX 8M Plus开发板的OTA远程升级方案

    的方式,可升级系统内核、文件系统和应用。接下来,将以飞凌嵌入式OKMX8MP-C开发板为例,基于Linux 5.4.70版本内核,展示升级前后的切换效果。 切换前,系统启动读取系统的boot.0
    的头像 发表于 06-03 17:59 686次阅读
    飞凌嵌入式i.MX <b class='flag-5'>8</b>M Plus<b class='flag-5'>开发板</b>的OTA远程升级方案

    利用i.MX8MM开发板制作开机动画

    的 psplash 和 psplash-write 文件拷贝到开发板出厂文件系统/usr/bin 目录下。 okmx8mm login:root Last login: Thu Jun 20
    发表于 05-30 16:26

    【活动】4款AI开发板任你选,紧跟人工智能的风口

    CZ3456 OK3588-C[/url]——————————OKMX8MP-C开发板优惠券 [url=58₤OHPSWJuB30y₤ https://m.tb.cn/h.gao5Njo CZ3458
    发表于 04-19 13:31

    fpga开发板与linux开发板区别

    FPGA开发板与Linux开发板是两种不同的硬件开发平台,各自具有不同的特点和应用场景。在以下的文章中,我将详细介绍FPGA开发板和Linux开发板
    的头像 发表于 02-01 17:09 2079次阅读

    带你玩转AM62x开发板显示接口

      1 LVDS接口规格   飞凌嵌入式OK6254-C开发板提供2个4-lane LVDS显示串行接口,每lane最高支持1.19Gbps;单个LVDS接口
    发表于 01-11 09:09

    带你玩转AM62x开发板显示接口——LVDS的显示和修改方式

    说,我们进入正题。1LVDS接口规格飞凌嵌入式OK6254-C开发板提供2个4-laneLVDS显示串行接口,每lane最高支持1.19Gbps;单个LVDS接口
    的头像 发表于 01-05 08:02 1189次阅读
    带你玩转AM62x<b class='flag-5'>开发板</b>的<b class='flag-5'>显示</b>接口——LVDS的<b class='flag-5'>显示</b>和修改方式

    【全志T113-i】OK113i-S开发板-2适配10寸LCD显示

    前言本文介绍如何在OK113i-S开发板上适配一个自己的10寸LCD。OK113i-S 是一个优秀的开发板支持lvds 单8,双8
    发表于 12-20 10:31

    【全志T113-i】OK113i-S开发板-适配10寸LCD显示

    前言本文介绍如何在OK113i-S开发板上适配一个自己的10寸LCD。OK113i-S 是一个优秀的开发板支持lvds 单8,双8
    发表于 12-18 17:07

    调出好画面!带你玩转飞凌嵌入式AM62x开发板显示接口

    小编会分上、下两篇文章详细介绍OK6254-C开发板显示方案,本文将先为大家带来RGB的显示和修改方式。
    的头像 发表于 12-08 11:35 929次阅读
    调出好画面!带你玩转飞凌嵌入式AM62x<b class='flag-5'>开发板</b>的<b class='flag-5'>显示</b>接口

    玩转AM62x开发板显示接口调试

    选择非原厂的其他屏体进行适配,而在这个过程中可能会遇到一些无法适配问题。 以飞凌嵌入式AM62x系列的OK6254-C开发板为例,它拥有LVDS和RGB两种显示接口,最多支持2路
    发表于 12-08 11:23