ubootはブートロゴを表示し、カーネルに入った後もブートロゴは表示されたままになります。
現在、ubootのコードを修正すると、uboot終了時にディスプレイが閉じられず、カーネルがロードされるまでロゴが表示され続けるという問題が発生しています。
LVDSディスプレイに関する情報については、以下の処理方法があります。
+ if (strcmp(scmi_pd->name, "display") == 0) {
+ scmi_pd->genpd.flags = GENPD_FLAG_ACTIVE_WAKEUP | GENPD_FLAG_RPM_ALWAYS_ON;
+ }
現在の問題は、
カーネル時間の3秒後、カーネルの表示モジュールが起動すると、カーネルは緑色の画面を表示し、カーネルのロゴを正常に表示できなくなります。
kernel.log:
カーネルが実行されると、ubootのロゴがカーネルのロゴに切り替わり、画面が2秒間真っ暗になります。
kernel_green.log:
ディスプレイの電源ドメインを維持し、リセットを避けてください。カーネルディスプレイモジュールが実行されると、緑色の画面が表示されます。
--- a/drivers/pmdomain/arm/scmi_pm_domain.c
+++ b/drivers/pmdomain/arm/scmi_pm_domain.c
@@ -105,6 +105,9 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev)
scmi_pd->genpd.power_on = scmi_pd_power_on;
scmi_pd->genpd.flags = GENPD_FLAG_ACTIVE_WAKEUP;
+ if (strcmp(scmi_pd->name, "display") == 0) {
+ scmi_pd->genpd.flags = GENPD_FLAG_ACTIVE_WAKEUP | GENPD_FLAG_RPM_ALWAYS_ON;
+ }
if (!strcmp(scmi_pd->name, "hsio_top"))
scmi_pd->genpd.flags = 0;ディスプレイインターフェース: lvds
理論的には、カーネルのディスプレイ関連ドライバはU-Bootの状態を維持し、二次初期化を経ずに直接ディスプレイ動作モードに入るべきである。
あるいは、初期化プロセスはカーネルの動作モードに直接かつ迅速に切り替えてカーネルのロゴを表示することもできます。
カーネル内でどのように処理すればよいでしょうか?
カーネルに表示される関連設定はDRMフレームワークを通じて構成され、そのためには基盤となるハードウェアドライバをDRMフレームワークに適合させる必要がある。
こんにちは、
LVDS に適切な dts ファイルを使用していますか?Android のプリビルドイメージでテストしましたか?
LVDSに適切なdtsファイルを使用していますか?
----> LVDS画面は既に表示済みです。
LVDSスクリーンは、U-Bootおよびカーネル実行中にロゴを表示できます。
ubootによってロゴが表示された後、システムがカーネルに切り替わり、ディスプレイモジュールデバイスが再初期化されると、ディスプレイの電源ドメインが最初にオフになり、その後オンになるため、2秒間画面が黒くなります。
画面が真っ暗になるとは思っていません。
カーネルがディスプレイモジュールを再初期化する際に、ubootの設定を継承し、カーネルロゴを直接表示した後、Androidに入り、ブートアニメーションを直接表示することを期待しています。この過程で、画面が真っ黒になるのを避けたい。
現在、ubootに修正を加え、uboot終了時にロゴ画像が閉じないようにしました。
diff --git a/arch/arm/lib/bootm.cb/arch/arm/lib/bootm.c
インデックス 81e8ddae..c6f1f8e8 100644
--- a/arch/arm/lib/bootm.c
+++ b/arch/arm/lib/bootm.c
@@ -72,7 +72,7 @@ static void announce_and_cleanup(int fake)
#endif
#if defined(CONFIG_VIDEO_LINK)
- video_link_shut_down();
+ //video_link_shut_down();
#endif
U-Bootとカーネルの両方でPWMバックライト制御に修正を加え、カーネルドライバがスムーズに制御を引き継げるようにしました。
ubootからカーネルへのPWMバックライトはオフにリセットされません。
さらに、カーネル内のディスプレイ電源ドメインへの継続的な電力供給を確保するために、ディスプレイ電源ドメインの変更を試みました。しかし、この変更の結果、ディスプレイが正常に表示されなくなってしまいました。カーネルのロゴを切り替えた後、画面が緑色に表示された。
この例外はどのように処理すればよいでしょうか?DPUの設定に問題があり、それが原因でディスプレイパイプ全体が誤動作しているようです。
Androidのプリビルドイメージでテストしましたか?
-->はい、LVDSの表示機能は既に正常に動作していると確信しています。
Androidのコードは変更していません
GENPD_FLAG_RPM_ALWAYS_ONフラグを追加した後、DPU95はed_cont_shdld_doneで常にタイムアウトします。
その結果、DPU95に渡されるすべてのパラメータが無効になる。
DPU95の設定方法は?DPU開発に関する関連資料はありますか?
+ if (strcmp(scmi_pd->name, "display") == 0) {
+ scmi_pd->genpd.flags = GENPD_FLAG_ACTIVE_WAKEUP | GENPD_FLAG_RPM_ALWAYS_ON;
+ }
static void dpu95_crtc_atomic_enable(struct drm_crtc *crtc,
struct drm_atomic_state *state)
{
struct dpu95_drm_device *dpu_drm = to_dpu95_drm_device(crtc->dev);
struct dpu95_crtc *dpu_crtc = to_dpu95_crtc(crtc);
struct drm_encoder *encoder = &dpu_drm->encoder[dpu_crtc->stream_id];
bool enc_is_dsi = encoder->encoder_type == DRM_MODE_ENCODER_DSI;
pr_err("liucx %s:%d \n", __func__, __LINE__);
if (!liucx_logo_keep) {
//return;
}
//dpu95_crtc_disable(crtc);
drm_crtc_vblank_on(crtc);
enable_irq(dpu_crtc->dec_shdld_irq);
enable_irq(dpu_crtc->db_shdld_irq);
enable_irq(dpu_crtc->ed_cont_shdld_irq);
dpu95_fg_enable_clock(dpu_crtc->fg, enc_is_dsi);
dpu95_ed_pec_sync_trigger(dpu_crtc->ed_cont);
dpu95_db_shdtokgen(dpu_crtc->db);//CONTROLTRIGGER SHDTOKGEN
dpu95_fg_shdtokgen(dpu_crtc->fg);
dpu95_fg_enable(dpu_crtc->fg);
//always timeout,why?How does DPU generate this interrupt?
DPU95_CRTC_WAIT_FOR_COMPLETION_TIMEOUT(ed_cont_shdld_done);
DPU95_CRTC_WAIT_FOR_COMPLETION_TIMEOUT(db_shdld_done);
DPU95_CRTC_WAIT_FOR_COMPLETION_TIMEOUT(dec_shdld_done);
disable_irq(dpu_crtc->ed_cont_shdld_irq);
disable_irq(dpu_crtc->db_shdld_irq);
disable_irq(dpu_crtc->dec_shdld_irq);
DPU95_CRTC_WAIT_FOR_FRAMEGEN_PRIMARY_SYNCUP(dpu_crtc->fg);
/* ignore initial empty primary pixel FIFO read status, just clear it */
dpu95_fg_primary_clear_channel_status(dpu_crtc->fg);
dpu95_crtc_queue_state_event(crtc);//发送一个event,用于处理vblank事件
}linuxRMを参照してください。
https://www.nxp.com/docs/en/reference-manual/RM00293.pdf
また、ドライバを確認することもできます。
Linux DPU95 DRMドライバツリーは、drivers/gpu/drm/imx/dpu95/にあります。
Linux-tn-imx/ドライバ/gpu/drm/imx/dpu95 (tn-imx_6.18.2_1.0.0-stable) · TechNexion/Linux-tn-imx · GitHub
dpu95-crtc.c
dpu95-extdst.c
dpu95-domainblend.c
U-Boot imx95_dpu.c
よく分かりません。
U-Boot imx95_dpu.c について言及されましたが、その機能は何ですか?そして、私は何をすればいいですか?
ファイル U-Boot imx95_dpu.c は、U-Boot 用の DPU ドライバです。
カーネルからU-BootにDPUドライバを移植すべきでしょうか?
DPU95ディスプレイコントローラーの開発マニュアルはありますか?
現状では、dpu95はubootの状態を維持する必要があります。カーネル内では、この状況においてdpu95の動作原理を参照し、レジスタを設定することでdpu95の初期化を完了させる必要がある。