高通lk屏幕向kernel傳參

来源:https://www.cnblogs.com/linhaostudy/archive/2019/10/22/11720678.html
-Advertisement-
Play Games

LK把相關參數報存到cmdline上: 在 上`gcdb_display_cmdline_arg`函數里: 調用過程如圖所示: aboot_init()函數裡面: target_display_panel_node()函數裡面: 這是將command_line保存下來: ...


LK把相關參數報存到cmdline上:

Bootable\bootloader\lk\dev\gcdb\display\gcdb_display_param.cgcdb_display_cmdline_arg函數里:

調用過程如圖所示:

aboot_init()-->
target_display_panel_node()-->
gcdb_display_cmdline_arg(panel_name, pbuf, buf_size)

aboot_init()函數裡面:

#define DISPLAY_DEFAULT_PREFIX "mdss_mdp"
..........
if (cmdline) {
    if ((strstr(cmdline, DISPLAY_DEFAULT_PREFIX) == NULL) &&
        target_display_panel_node(device.display_panel,
        display_panel_buf, MAX_PANEL_BUF_SIZE) &&
        strlen(display_panel_buf)) {
        cmdline_len += strlen(display_panel_buf);
    }
}

target_display_panel_node()函數裡面:


bool gcdb_display_cmdline_arg(char *panel_name, char *pbuf, uint16_t buf_size)
{
    char *dsi_id = NULL;
    char *panel_node = NULL;
    char *slave_panel_node = NULL;
    uint16_t dsi_id_len = 0, panel_node_len = 0, slave_panel_node_len = 0;
    uint32_t arg_size = 0;
    bool ret = true;
    bool rc;
    char *default_str;
    int panel_mode = SPLIT_DISPLAY_FLAG | DUAL_PIPE_FLAG | DST_SPLIT_FLAG;
    int prefix_string_len = strlen(DISPLAY_CMDLINE_PREFIX);

    panel_name += strspn(panel_name, " ");

    rc = mdss_dsi_set_panel_node(panel_name, &dsi_id, &panel_node,
            &slave_panel_node, &panel_mode);
    if (!rc) {
        if (panelstruct.paneldata && target_cont_splash_screen()) {
            dsi_id = panelstruct.paneldata->panel_controller;
            panel_node = panelstruct.paneldata->panel_node_id;
            panel_mode =
                panelstruct.paneldata->panel_operating_mode &
                                panel_mode;
            slave_panel_node =
                panelstruct.paneldata->slave_panel_node_id;
        } else {
            if (target_is_edp())
                default_str = "0:edp:";
            else
                default_str = "0:dsi:0:";

            arg_size = prefix_string_len + strlen(default_str);
            if (buf_size < arg_size) {
                dprintf(CRITICAL, "display command line buffer is small\n");
                return false;
            }

            strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
            pbuf += prefix_string_len;
            buf_size -= prefix_string_len;

            strlcpy(pbuf, default_str, buf_size);
            return true;
        }
    }

    if (dsi_id == NULL || panel_node == NULL) {
        dprintf(CRITICAL, "panel node or dsi ctrl not present\n");
        return false;
    }

    if (panel_mode && slave_panel_node == NULL) {
        dprintf(CRITICAL, "slave node not present in dual dsi case\n");
        return false;
    }

    dsi_id_len = strlen(dsi_id);
    panel_node_len = strlen(panel_node);
    if (!slave_panel_node)
        slave_panel_node = NO_PANEL_CONFIG;
    slave_panel_node_len = strlen(slave_panel_node);

    arg_size = prefix_string_len + dsi_id_len + panel_node_len +
                        LK_OVERRIDE_PANEL_LEN + 1;

    arg_size += DSI_1_STRING_LEN + slave_panel_node_len;

    if (buf_size < arg_size) {
        dprintf(CRITICAL, "display command line buffer is small\n");
        ret = false;
    } else {
        strlcpy(pbuf, DISPLAY_CMDLINE_PREFIX, buf_size);
        pbuf += prefix_string_len;
        buf_size -= prefix_string_len;

        strlcpy(pbuf, LK_OVERRIDE_PANEL, buf_size);
        pbuf += LK_OVERRIDE_PANEL_LEN;
        buf_size -= LK_OVERRIDE_PANEL_LEN;

        strlcpy(pbuf, dsi_id, buf_size);
        pbuf += dsi_id_len;
        buf_size -= dsi_id_len;

        strlcpy(pbuf, panel_node, buf_size);

        pbuf += panel_node_len;
        buf_size -= panel_node_len;

        strlcpy(pbuf, DSI_1_STRING, buf_size);
        pbuf += DSI_1_STRING_LEN;
        buf_size -= DSI_1_STRING_LEN;
        strlcpy(pbuf, slave_panel_node, buf_size);
    }
end:
    return ret;
}

最終傳給賦值給cmdline的就是從mdss_mdp3.panel=1:dsi:0:qcom,mdss_dsi_tianshan_qhd_video:1:none

kernel獲取LK保存的pbuf

調用順序:

start_kernel()-->
setup_arch()-->
set_command_line()-->

這是將command_line保存下來:


/**
 * mdss_dsi_find_panel_of_node(): find device node of dsi panel
 * @pdev: platform_device of the dsi ctrl node
 * @panel_cfg: string containing intf specific config data
 *
 * Function finds the panel device node using the interface
 * specific configuration data. This configuration data is
 * could be derived from the result of bootloader's GCDB
 * panel detection mechanism. If such config data doesn't
 * exist then this panel returns the default panel configured
 * in the device tree.
 *
 * returns pointer to panel node on success, NULL on error.
 */
static struct device_node *mdss_dsi_find_panel_of_node(
        struct platform_device *pdev, char *panel_cfg)
{
    int len, i;
    int ctrl_id = pdev->id - 1;
    char panel_name[MDSS_MAX_PANEL_LEN];
    char ctrl_id_stream[3] =  "0:";
    char *stream = NULL, *pan = NULL;
    struct device_node *dsi_pan_node = NULL, *mdss_node = NULL;

    len = strlen(panel_cfg);
    if (!len) {
        /* no panel cfg chg, parse dt */
        pr_debug("%s:%d: no cmd line cfg present\n",
             __func__, __LINE__);
        goto end;
    } else {
        if (ctrl_id == 1)
            strlcpy(ctrl_id_stream, "1:", 3);

        stream = strnstr(panel_cfg, ctrl_id_stream, len);
        if (!stream) {
            pr_err("controller config is not present\n");
            goto end;
        }
        stream += 2;

        pan = strnchr(stream, strlen(stream), ':');
        if (!pan) {
            strlcpy(panel_name, stream, MDSS_MAX_PANEL_LEN);
        } else {
            for (i = 0; (stream + i) < pan; i++)
                panel_name[i] = *(stream + i);
            panel_name[i] = 0;
        }

        pr_debug("%s:%d:%s:%s\n", __func__, __LINE__,
             panel_cfg, panel_name);

        mdss_node = of_parse_phandle(pdev->dev.of_node,
                         "qcom,mdss-mdp", 0);

        if (!mdss_node) {
            pr_err("%s: %d: mdss_node null\n",
                   __func__, __LINE__);
            return NULL;
        }
        dsi_pan_node = of_find_node_by_name(mdss_node,
                            panel_name);
        if (!dsi_pan_node) {
            pr_err("%s: invalid pan node, selecting prim panel\n",
                   __func__);
            goto end;
        }
        return dsi_pan_node;
    }
end:
    //最後如果都沒有匹配到的話,就使用這個qcom,dsi-pref-prim-pan節點上的
    if (strcmp(panel_name, NONE_PANEL))
        dsi_pan_node = mdss_dsi_pref_prim_panel(pdev);

    return dsi_pan_node;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 現在.net core跨平臺了,相信大部分人都把core的程式部署在了linux環境中,或者部署在了docker容器中,與之對應的,之前都是部署在windows環境中,在win中,我們可以用windbg來調試。但是在linux環境下 我們可以採用lldb(這隻是一種,還有其他方式) 環境 li ...
  • 強制刪除文件(夾)的方法,不問原理,簡單粗暴! 在桌面右鍵新建一個.txt文件,不妨命名為del.txt,把下麵兩行代碼複製進去,保存,關閉。 DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 將del.txt另存為del.bat(註意:新的尾碼是.bat)。 最後,把想要刪除 ...
  • (以下內容親手完成,如果需要搬走記得把寫博的小白的名字和郵箱一起搬走) 出來玩(學習),總是要還的! 有不明的問題的時候,都來博客園轉轉,總能找到答案或者靈感,開博3個月都沒發一篇帖(不曉得管理員有何感想,不會封我的號吧),不能只是索取沒有付出。小白一枚琢磨了半天才扒拉明白Telnet服務搭建(照葫 ...
  • 在安裝Shutter軟體之前,先安裝依賴包,下載地址: 1、libgoocanvas-common_1.0.0-1_all.deb http://launchpadlibrarian.net/226687719/libgoocanvas-common_1.0.0-1_all.deb 2、libgoo ...
  • 剛安裝完系統後,採用的是樹莓派通過網線連接筆記本wifi共用方式聯網,後面考慮不使用網線,讓樹莓派使用wifi聯網。 一、配置無線網路 1、通過ssh登錄樹莓派,輸入用戶名和密碼後,輸入如下命令進入圖形界面設置: 2、在配置界面選擇網路 3、輸入wifi的ssid和passwd 4、重啟樹莓派,在筆 ...
  • 使用 chroot 建立沙盒環境 chroot 提供了更改當前進程及其子進程的可見根目錄的操作,運行在此隔離環境中的應用程式無法訪問新的目錄樹之外的文件和命令。這樣的隔離環境稱作 chroot 監獄 ( chroot jail )。通常, chroot 用於建立沙盒環境,以及在單用戶模式或救援模式下 ...
  • linux監控的幾個常用命令(對於伺服器後端程式猿很重要,必須掌握): dump the traffic on a network, 根據用戶定義對網路上的包進行截獲的包分析工具, 功能和查看pcap包的wireshark工具差不懂 iostat 統計CPU及網路、設備和分區IO的數據,具體命令行參 ...
  • [root@elegant-snap-3 you-get]# wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py--2019-10-22 05:15:00-- https://raw.githu... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...