iMX8M系列技術貼 | OKMX8MM-C開發板UBOOT新增新的顯示支援
OKMX8MM- C 開發板基於 NXP公司的 i.MX8MMini 四核64位處理器設計,採用 核心板+底板結構,主頻最高1.8GHz, Cortex-A53架構;2GB DDR4 RAM,支援一個通用型Cortex®- M4 400MHz核心處理器提供多種外設介面,如MIPI-CSI、MIPI-DSI、USB、PCIe、UA RT 、eC SPI 、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螢幕。
struct display_info_t const displays[] = {
{
.bus = LCDIF_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_mipi_led,
.mode = {
.name = "MIPI7",
.refresh = 60,
.xres = 1024 ,
.yres = 600,
.pixclock = 22733, /* 43987200 */
.left_margin = 48,
.right_margin = 40,
.upper_margin = 16,
.lower_margin = 13,
.hsync_len = 48,
.vsync_len = 3,
.sync = FB_SYNC_EXT,
.vmode = FB_VMODE_NONINTERLACED
}
},
...
{
.bus = LCDIF_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_mipi2hdmi,
.mode = {
.name = "MIPI2HDMI_1280x720",
.refresh = 60,
.xres = 1280,
.yres = 720,
.pixclock = 13468, //74250000
.left_margin = 220,
.right_margin = 110,
.upper_margin = 20,
.lower_margin = 5,
.hsync_len = 40,
.vsync_len = 5,
.sync = FB_SYNC_EXT,
.vmode = FB_VMODE_NONINTERLACED
}
},
...
}
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等引數,其程式碼實現如下。
int board_video_skip(void)
{
int i;
int ret = 0;
char const *panel = env_get("panel");
if (!panel) {
...
} else {
for (i = 0; i < display_count; i++) {
if (!strcmp(panel, displays[i].mode.name))
break;
}
}
if (i < display_count) {
if(!strcmp(panel, "MIPI_CUSTOM") || !strcmp(panel, "MIPI2HDMI_CUSTOM")) {
char const* options = env_get("custom_video_mode");
char *opt = strdup(options);
get_mode_frome_env(&displays[i], opt);
}
...
static void get_mode_frome_env(struct display_info_t *dev, char *options)
{
char *opt;
while ((opt = strsep(&options, ",")) != NULL) {
if (!*opt)
continue;
if (!strncmp(opt, "xres=", 5)) {
dev->mode.xres = simple_strtoul(opt + 5, NULL, 0);
} else if (!strncmp(opt, "yres=", 5)) {
dev->mode.yres = simple_strtoul(opt + 5, NULL, 0);
} else if (!strncmp(opt, "pixclock=", 9)) {
dev->mode.pixclock = simple_strtoul(opt + 9, NULL, 0);
} else if (!strncmp(opt, "left_margin=", 12)) {
dev->mode.left_margin = simple_strtoul(opt + 12, NULL, 0);
} else if (!strncmp(opt, "right_margin=", 13)) {
dev->mode.right_margin = simple_strtoul(opt + 13, NULL, 0);
} else if (!strncmp(opt, "upper_margin=", 13)) {
dev->mode.upper_margin = simple_strtoul(opt + 13, NULL, 0);
} else if (!strncmp(opt, "lower_margin=", 13)) {
dev->mode.lower_margin = simple_strtoul(opt + 13, NULL, 0);
} else if (!strncmp(opt, "hsync_len=", 10)) {
dev->mode.hsync_len = simple_strtoul(opt + 10, NULL, 0);
} else if (!strncmp(opt, "vsync_len=", 10)) {
dev->mode.vsync_len = simple_strtoul(opt + 10, NULL, 0);
} else if (!strncmp(opt, "sync=", 5)) {
dev->mode.sync = simple_strtoul(opt + 5, NULL, 0);
} else if (!strncmp(opt, "vmode=", 6)) {
dev->mode.vmode = simple_strtoul(opt + 6, NULL, 0);
} else if (!strncmp(opt, "refresh=", 8)) {
dev->mode.refresh = simple_strtoul(opt + 8 , NULL, 0);
}
}
printf("use custom mode %s: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %08X, %08X \n ", \
dev->mode.name,dev->mode.refresh, dev->mode.xres, dev->mode.yres, dev->mode.pixclock, \
dev->mode.left_margin, dev->mode.right_margin, dev->mode.upper_margin, dev->mode.lower_margin, \
dev->mode.hsync_len, dev->mode.vsync_len, dev->mode.sync, dev->mode.vmode);
}
三、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。在啟動的過程可以看到新設定的顯示引數,方便驗證修改的是否成功。
...
u-boot=> setenv panel MIPI2HDMI_CUSTOM
u-boot=> setenv custom_video_mode xres=1024,yres=768
u-boot=> sa
Saving Environment to MMC... Writing to MMC(1)... OK
u-boot=> reset
resetting ...
...
Loading Environment from MMC... OK
use custom mode MIPI2HDMI_CUSTOM: 60, 1024, 768, 12048, 200, 64, 24, 1, 136, 3, 00000004, 00000000
...
2、不需配置的MIPI螢幕
不需配置的MIPI屏,只需要修改顯示引數即可正常顯示LOGO。飛凌嵌入式開發板預設支援解析度為1024x600的螢幕,如需新增新的此型別的螢幕,飛凌嵌入式提供了一組可以自定義顯示的引數,只需要將panel的值設定為”MIPICUSTOM“,然後設定環境變數customvideo_mode,修改你需要的xres、yres等值後儲存環境變數,重啟檢測能否顯示LOGO。在啟動的過程可以看到新設定的顯示引數,方便驗證修改的是否成功。
...
u-boot=> setenv panel MIPI_CUSTOM
u-boot=> setenv custom_video_mode xres=800,yres=600,pixclock=20000,refresh=55
u-boot=> sa
Saving Environment to MMC... Writing to MMC(1)... OK
u-boot=> reset
resetting ...
...
Loading Environment from MMC... OK
use custom mode MIPI_CUSTOM: 55, 800, 600, 20000, 48, 40, 16, 13, 48, 3, 00000004, 00000000
Display: MIPI_CUSTOM (800x600)
Video: 800x600x24
...
3、需要配置的MIPI螢幕
這種螢幕對比不需配置的MIPI螢幕多了一步配置,可以參照原廠提供的RM67191進行修改。
首先,新增一組顯示引數,顯示引數根據螢幕修改,修改檔案board/freescale/imx8mmevk/imx8mmevk.c。
{
.bus = LCDIF_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_mipi_led,
.mode = {
.name = "RM67191_OLED",
.refresh = 60,
.xres = 1080,
.yres = 1920,
.pixclock = 7575, /* 132000000 */
.left_margin = 34,
.right_margin = 20,
.upper_margin = 4,
.lower_margin = 10,
.hsync_len = 2,
.vsync_len = 2,
.sync = FB_SYNC_EXT,
.vmode = FB_VMODE_NONINTERLACED
}
}
然後修改這組引數的使能函式
void do_enable_mipi_led(struct display_info_t const *dev)
{
imx_iomux_v3_setup_multiple_pads(backlight_pads,
ARRAY_SIZE(backlight_pads));
gpio_request(IMX_GPIO_NR(1, 1), "backlight");
gpio_direction_output(IMX_GPIO_NR(1, 1), 0);
gpio_request(IMX_GPIO_NR(1, 8), "DSI EN");
gpio_direction_output(IMX_GPIO_NR(1, 8), 0);
mdelay(10);
gpio_direction_output(IMX_GPIO_NR(1, 8), 1);
/* enable the dispmix & mipi phy power domain */
call_imx_sip(FSL_SIP_GPC, FSL_SIP_CONFIG_GPC_PM_DOMAIN, DISPMIX, true, 0);
call_imx_sip(FSL_SIP_GPC, FSL_SIP_CONFIG_GPC_PM_DOMAIN, MIPI, true, 0);
/* Put lcdif out of reset */
disp_mix_bus_rstn_reset(imx8mm_mipi_dsim_plat_data.gpr_base, false);
disp_mix_lcdif_clks_enable(imx8mm_mipi_dsim_plat_data.gpr_base, true);
/* Setup mipi dsim */
sec_mipi_dsim_setup(&imx8mm_mipi_dsim_plat_data);
rm67191_init();
rm67191_dev.name = dev->mode.name;
imx_mipi_dsi_bridge_attach(&rm67191_dev); /* attach rm67191 device */
}
struct mipi_dsi_client_dev rm67191_dev = {
.channel = 0,
.lanes = 4,
.format = MIPI_DSI_FMT_RGB888,
.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE,
};
修改螢幕驅動drivers/video/rm67191.c,在函式int rm67191lcdsetup(struct mipidsiclientdev *paneldev)新增自己的屏的初始化序列。
修改完成後編譯測試。
注意:uboot程式碼不開源,修改程式碼需要聯絡銷售人員
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989353/viewspace-2853557/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iMX8M mini開發板UBOOT新增新的顯示支援boot
- uboot顯示logo的方式bootGo
- 3、將uboot,kernel,rootfs下載到開發板上boot
- uboot 新增命令boot
- 匯頂科技GR551x系列開發板已支援OpenHarmony
- 【華為雲技術分享】物聯網常用開發板
- 店夫子商城系統開發-技術支援
- 汽車擋風玻璃配戰鬥機顯示技術?蘋果好像正在開發蘋果
- 移動web開發小貼示Web
- 美顏sdk動態貼紙開發技術詳解
- pediy系列――為程式新增顯示註冊碼的Messagebox
- 在4核心8執行緒開發板上顯示德國國旗執行緒
- Lola:調查顯示近三成中小企業缺乏技術支援
- 8K Mini-LED新型顯示技術和ULED系列結合
- 技術支援與專案開發分離薦
- 液晶顯示技術TCON介紹
- iOS開發筆記-40: UILabel上面新增uiview無法顯示iOS筆記UIView
- 2015年顯示技術領域五大技術發展趨勢
- 技術制勝突破逐新 -- 小米與天馬合作共建新型顯示技術聯合實驗室
- 累【非技術貼】
- GfK:調查顯示中國在新技術接受度上處於全球領先
- 10 天開發前臺系統技術系列
- javascript動態隱藏顯示技術(轉)JavaScript
- 【萬里征程——Windows App開發】如何使用貼上板WindowsAPP
- 七、資料庫技術的發展及新技術資料庫
- ModStart:擁抱新技術,率先支援 Laravel 9.0Laravel
- 為OICQ 820新增顯示IP地址和埠號的功能 (轉貼) (17千字)
- Android 開發有哪些新技術出現?Android
- 雨滴式的顯示圖片 (cloud 轉貼) (轉)Cloud
- Android開發系列八:怎麼混合顯示圖片和文字Android
- ASP.NET的層次資料顯示技術 (轉)ASP.NET
- 口算題寶/口算訓練機 VK1622方案開發,LCD液晶顯示驅動IC-提供方案或技術支援
- “2017年顯示周”註冊開啟國際顯示學會(SID)首屈一指的國際顯示技術盛會,行業專家將帶來行業最新技術行業
- 專業貼膜技術
- 前端開發技術的發展前端
- 樂眾商城系統開發/技術支援/樂眾商城卷軸開發模型模型
- Camera開發系列之一 顯示攝像頭實時畫面
- iOS開發之顯示微博表情iOS