手機(jī)網(wǎng)站開發(fā)工具6培訓(xùn)學(xué)校
OpenHarmony南向之LCD顯示屏
概述
LCD(Liquid Crystal Display)驅(qū)動(dòng),通過對(duì)顯示器上下電、初始化顯示器驅(qū)動(dòng)IC(Integrated Circuit)內(nèi)部寄存器等操作,使其可以正常工作。
HDF Display驅(qū)動(dòng)模型
LCD器件驅(qū)動(dòng)是顯示框架最底層的部分。
向上對(duì)接到 Display 公共 HAL 層,輔助 HDI 的實(shí)現(xiàn)。通過Display-HDI對(duì)圖形服務(wù)提供各類驅(qū)動(dòng)能力接口;
向下對(duì)接顯示屏 panel 器件,驅(qū)動(dòng)屏幕正常工作,自上而下打通顯示全流程通路。
所以驅(qū)動(dòng)LCD主要在于LCD panel器件驅(qū)動(dòng)。
LCD接口通??煞譃镸IPI DSI接口、TTL接口和LVDS接口,這里以rk3568平臺(tái)為例,是常見的mipi接口的顯示屏
驅(qū)動(dòng)主要分為2大部分:hcs配置和panel驅(qū)動(dòng)
- vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs
- drivers/hdf_core/framework/model/display/driver/panel/
下面就這2大部分分別來簡單分析下
hcs配置及流程
hcs配置
display :: host {hostName = "display_host";device_hdf_drm_panel :: device {device0 :: deviceNode {policy = 0;priority = 197;preload = 0;moduleName = "HDF_DRMPANEL";}}device_hdf_disp :: device {device0 :: deviceNode {policy = 2;priority = 196;permission = 0660;moduleName = "HDF_DISP";serviceName = "hdf_disp";}}device_lcd :: device {...device3 :: deviceNode {policy = 0;priority = 100;preload = 0;moduleName = "LCD_ILI9881_ST_5P5";}}device_pwm_bl :: device {device0 :: deviceNode {policy = 0;priority = 95;preload = 0;moduleName = "PWM_BL";deviceMatchAttr = "pwm_bl_dev";}}device_backlight :: device {device0 :: deviceNode {policy = 2;priority = 90;preload = 0;permission = 0660;moduleName = "HDF_BL";serviceName = "hdf_bl";}}
}
大致流程
從上面的hcs配置可以看出,這里使用的是 DRM Panel,根據(jù) priority值,驅(qū)動(dòng)加載的順序依次為:
1:HDF_BL:
2:PWM_BL
3:LCD
4:HDF_DISP
5:HDF_DRMPANEL
這個(gè)順序是跟驅(qū)動(dòng)代碼里面的邏輯是相匹配的,LCD驅(qū)動(dòng)在init的時(shí)候會(huì)注冊panel(RegisterPanel),然后在HDF_DISP驅(qū)動(dòng)的init中會(huì)通過 GetPanelManager獲取注冊的panelManager, 并使用 panelManager來 DispManagerInit,HDF_DRMPANEL驅(qū)動(dòng)在init的時(shí)候會(huì)通過 GetDispManager獲取在前面初始化的 DispManager,并使用DRM框架的接口來init和add相應(yīng)drm_panel,且將mipi接口聯(lián)系起來,整個(gè)過程是環(huán)環(huán)相扣。
panel驅(qū)動(dòng)
Panel驅(qū)動(dòng)中最核心的主要是實(shí)現(xiàn)以下接口:
struct PanelData {struct HdfDeviceObject *object;int32_t (*init)(struct PanelData *panel); /*panel的軟件初始化*/int32_t (*on)(struct PanelData *panel); /*主要控制上電*/int32_t (*off)(struct PanelData *panel); /*主要控制下電*/int32_t (*prepare)(struct PanelData *panel); /*亮屏硬件時(shí)序初始化, 通過MIPI DCS發(fā)送亮屏初始化序列*/int32_t (*unprepare)(struct PanelData *panel); /*滅屏硬件時(shí)序初始化, 通過MIPI DCS發(fā)送滅屏代碼*/struct PanelInfo *info; /*Panel的一些參數(shù)。見下方*/enum PowerStatus powerStatus;struct PanelEsd *esd;struct BacklightDev *blDev;void *priv;
};
在驅(qū)動(dòng)初始化接口中實(shí)例化后使用 RegisterPanel接口向display模型注冊該panel驅(qū)動(dòng)
以 ili9881_st_5p5MIPI顯示屏驅(qū)動(dòng)為例來看看大致的流程:
.../*獲取panel節(jié)點(diǎn),rk一般都使用的 simple panel*/panelNode = of_find_compatible_node(NULL, NULL, "simple-panel-dsi");if (panelNode == NULL) {HDF_LOGE("%s of_find_compatible_node fail", __func__);goto FAIL;}/*通過panel節(jié)點(diǎn)進(jìn)一步獲取mipi dsi的節(jié)點(diǎn)*/panel_dev->dsiDev = of_find_mipi_dsi_device_by_node(panelNode);if (panel_dev->dsiDev == NULL) {HDF_LOGE("%s of_find_mipi_dsi_device_by_node fail", __func__);goto FAIL;}/*獲取power節(jié)點(diǎn)*/panel_dev->supply = devm_regulator_get(&panel_dev->dsiDev->dev, "power");if (panel_dev->supply == NULL) {HDF_LOGE("Get regulator fail");goto FAIL;}/*獲取其他gpio控制節(jié)點(diǎn),需根據(jù)硬件配置**/panel_dev->enable_gpio = devm_gpiod_get_optional(&panel_dev->dsiDev->dev, "enable", GPIOD_ASIS);if (IS_ERR(panel_dev->enable_gpio)) {HDF_LOGE("get enable_gpio fail");goto FAIL;}.../*初始化PanelData mipi_dsi_device結(jié)構(gòu)體,下面會(huì)展開詳細(xì)說明*/PanelResInit(panel_dev);.../*注冊到Panel Manager*/if (RegisterPanel(&panel_dev->panel) != HDF_SUCCESS) {HDF_LOGE("RegisterPanel fail");goto FAIL;}...
PanelResInit函數(shù)主要是關(guān)鍵結(jié)構(gòu)體(struct PanelData和 struct mipi_dsi_device )的實(shí)例化:
/*mipi dsi 的一些參數(shù)*/
panel_dev->dsiDev->lanes = 4; /* 4: dsi,lanes ,number of active data lanes */
panel_dev->dsiDev->format = MIPI_DSI_FMT_RGB888; // dsi,format pixel format for video mode MIPI_DSI_FMT_RGB888
panel_dev->dsiDev->mode_flags = (MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM \| MIPI_DSI_MODE_EOT_PACKET);panel_dev->panel.info = &g_panelInfo; /*Panel的一些參數(shù)。見下方*/
panel_dev->panel.init = PanelInit; /*panel的軟件初始化,這里為空函數(shù)*/
panel_dev->panel.on = PanelOn; /*主要控制上電*/
panel_dev->panel.off = PanelOff; /*主要控制下電*/
panel_dev->panel.prepare = PanelPrepare; /*亮屏硬件時(shí)序初始化, 通過MIPI DCS發(fā)送亮屏初始化代碼*/
panel_dev->panel.unprepare = PanelUnprepare; /*滅屏硬件時(shí)序初始化, 通過MIPI DCS發(fā)送滅屏代碼*/
panel_dev->panel.priv = panel_dev->dsiDev;
這里,在v3.2版本的代碼里,最終還是調(diào)用的是Linux下mipi dsi相關(guān)的接口,并沒有使用OH實(shí)現(xiàn)的mipi的驅(qū)動(dòng)接口
panel相關(guān)的硬件參數(shù)定義,這個(gè)主要跟顯示屏硬件有關(guān),這些參數(shù)的具體含義可參看:《做鴻蒙應(yīng)用開發(fā)到底學(xué)習(xí)些啥?》
static struct PanelInfo g_panelInfo = {.width = 720, /* width */.height = 1280, /* height */.hbp = 40, /* horizontal back porch */.hfp = 40, /* horizontal front porch */.hsw = 10, /* horizontal sync width */.vbp = 15, /* vertical back porch */.vfp = 10, /* vertical front porch */.vsw = 36, /* vertical sync width */.clockFreq = 75000000, /* clock */.pWidth = 68, /* physical width */.pHeight = 121, /* physical height */.connectorType = DRM_MODE_CONNECTOR_DPI, /* DRM_MODE_CONNECTOR_DPI=17 */.blk = { BLK_PWM, MIN_LEVEL, MAX_LEVEL, DEFAULT_LEVEL },
};
總結(jié)
以上的內(nèi)容主要簡單介紹了OpenHarmony南向之LCD顯示屏,沒有具體到代碼分析,移植等細(xì)節(jié)。
要想成為一名鴻蒙高級(jí)開發(fā),以上知識(shí)點(diǎn)是必須要掌握的,除此之外,還需要掌握一些鴻蒙應(yīng)用開發(fā)相關(guān)的一些技術(shù),需要我們共同去探索。
為了節(jié)省大家一些查找的時(shí)間,這邊聯(lián)合幾位行業(yè)大佬,為大家準(zhǔn)備了一份《Open Harmony4.0&Next》的學(xué)習(xí)導(dǎo)圖,從入門到進(jìn)階再到南北向開發(fā)實(shí)戰(zhàn)的一整套完整體系,想要學(xué)習(xí)了解更多鴻蒙開發(fā)的相關(guān)知識(shí)可以借鑒:《做鴻蒙應(yīng)用開發(fā)到底學(xué)習(xí)些啥?》
?
除了以上的知識(shí)內(nèi)容,我還為大家整理了一份《鴻蒙 (Harmony OS)開發(fā)學(xué)習(xí)手冊》都是整理成PDF文檔方式,分享給大家參考學(xué)習(xí):《鴻蒙開發(fā)學(xué)習(xí)指南》
《鴻蒙 (Harmony OS)開發(fā)學(xué)習(xí)手冊》
一、入門必看
1. 應(yīng)用開發(fā)導(dǎo)讀(ArkTS)
2. 應(yīng)用開發(fā)導(dǎo)讀(Java)
3.......
?
二、HarmonyOS 概念
1. 系統(tǒng)定義
2. 技術(shù)架構(gòu)
3. 技術(shù)特性
4. 系統(tǒng)安全
5......
?
三、如何快速入門?《鴻蒙基礎(chǔ)入門開發(fā)寶典!》
1. 基本概念
2. 構(gòu)建第一個(gè)ArkTS應(yīng)用
3. 構(gòu)建第一個(gè)JS應(yīng)用
4. ……
?
四、開發(fā)基礎(chǔ)知識(shí)
1. 應(yīng)用基礎(chǔ)知識(shí)
2. 配置文件
3. 應(yīng)用數(shù)據(jù)管理
4. 應(yīng)用安全管理
5. 應(yīng)用隱私保護(hù)
6. 三方應(yīng)用調(diào)用管控機(jī)制
7. 資源分類與訪問
8. 學(xué)習(xí)ArkTS語言
9. ……
?
五、基于ArkTS 開發(fā)
1. Ability開發(fā)
2. UI開發(fā)
3. 公共事件與通知
4. 窗口管理
5. 媒體
6. 安全
7. 網(wǎng)絡(luò)與鏈接
8. 電話服務(wù)
9. 數(shù)據(jù)管理
10. 后臺(tái)任務(wù)(Background Task)管理
11. 設(shè)備管理
12. 設(shè)備使用信息統(tǒng)計(jì)
13. DFX
14. 國際化開發(fā)
15. 折疊屏系列
16. ……
?
更多了解更多鴻蒙開發(fā)的相關(guān)知識(shí)可以參考:《做鴻蒙應(yīng)用開發(fā)到底學(xué)習(xí)些啥?》