環境:rk3399のLinux SDKのLinuxカーネルのバージョン4.4.179 ubootバージョン201709
症状:
ubootステージlogo.bmpは正常で、かつ瞬間を示し始めlogo_kernel.bmpし続けたが、デスクトップのコンテンツまで継続する、しかしつかの間、画面の後に黒い画面を表示することができたがlogo_kernel.bmpすることができます......
トラブルシューティング:
ビューの起動ログ:
[4.212505 ] ################## show_loader_logo #######################
[4.262751] ## ########## fb_find_logo深さ= 24 #############
[4.262751 ]解放drm_logoメモリ:3348K
[4.325082]コンソール:カラーフレームバッファデバイスへの切り替え100x80 [4.375269]なRockchip-DRMディスプレイサブシステム:FB0:フレームバッファデバイス
私はDRMメモリが無料で見つかった、show_loader_logo関数を参照してください
構造体drm_atomic_state *状態、* OLD_STATE。 構造体device_node * NP = drm_dev-> DEV-> of_node。 構造体drm_mode_config * mode_config =&drm_dev-> mode_config。 構造体device_node *ルート、*ルート。 構造体rockchip_drm_mode_set *セット、* tmpに、*解除。 LIST_HEAD mode_set_listをストラクト。 LIST_HEAD mode_unset_listをストラクト。 符号なしの数plane_mask = 0。 int型RET; printk(「##################%S ####################### \ R \ nは」、__ func__)。 ルート= of_get_child_by_name(NP、 "ルート")。 (!ルート){場合 dev_warn(drm_dev-> DEV、 "解析表示リソース\ nに失敗しました")。 リターン; } IF(init_loader_memory(drm_dev)){ dev_warn(drm_dev-> DEV、 "解析ローダメモリできませんでした。\ n"); リターン; } INIT_LIST_HEAD(&mode_set_list)。 INIT_LIST_HEAD(&mode_unset_list)。 drm_modeset_lock_all(drm_dev)。 状態= drm_atomic_state_alloc(drm_dev)。 (!状態){もし dev_err(drm_dev-> DEV、 "ALLOC原子状態にできませんでした。\ n"); RET = -ENOMEM。 後藤err_unlock; } 状態- > acquire_ctx = mode_config-> acquire_ctx。 for_each_child_of_node(根、ルート){ (of_device_is_available(ルート)!)もし 続けます。 セット= of_parse_display_resource(drm_dev、ルート)。 (!セット)であれば 続けます。 IF(setup_initial_state(drm_dev、状態、セット)){ drm_framebuffer_unreference(セット- > FB); INIT_LIST_HEAD(&セット- >ヘッド); list_add_tail(&セット- >ヘッド、&mode_unset_list)。 持続する; INIT_LIST_HEAD(&セット- >ヘッド); list_add_tail(&セット- >ヘッド、&mode_set_list)。 } / * * mode_unset_listストア未接続のルートルートのCRTC場合は、 *を使用していない、我々はそれを閉じる必要があります。 * / list_for_each_entry_safe(解除、TMP、&mode_unset_list、ヘッド){ 構造体rockchip_drm_mode_set * tmp_set。 int型found_used_crtc = 0; (unset-> hdisplay && unset->の場合 list_for_each_entry_safe(セット、tmp_set、&mode_set_list、ヘッド){ IF(セット- > CRTC == unset-> CRTC){ のprintk(」 found_used_crtc = 1。 持続する; } } もし(found_used_crtc!の){ 構造体drm_crtc * CRTC = unset-> CRTC。 INTパイプ= drm_crtc_index(CRTC)。 構造体rockchip_drm_private * PRIV = drm_dev-> dev_private。 printk( "############近い未使用CRTC ########### \ R \ n"); priv-> crtc_funcs [パイプ] - > crtc_close(CRTC)。 } } list_del(&unset->ヘッド) kfree(未設定)。 } IF(list_empty(&mode_set_list)){ dev_warn(drm_dev-> DEV、 "任意ローダ表示を見つけられないことができません\ n"); RET = -ENXIO。 後藤err_free_state; } / * *状態は初期のデバイスのセーブ状態への状態を入れ替える 比較することができ、新しい状態が来そうならば、古い状態など*のDRM deivces 更新にステータスが必要裁判官にこの状態で*。 * / drm_atomic_helper_swap_state(drm_dev、状態)。 drm_atomic_state_free(状態)。 IF(IS_ERR(状態)){ OLD_STATE = drm_atomic_helper_duplicate_state(drm_dev、 mode_config-> acquire_ctx)。 IF(IS_ERR(OLD_STATE)){ dev_err(drm_dev-> DEV、 "アトミック状態\ Nを複製することができませんでした")。 RET = PTR_ERR_OR_ZERO(OLD_STATE)。 後藤err_free_state; } 状態= drm_atomic_helper_duplicate_state(drm_dev、 mode_config-> acquire_ctx)。 *我々は、いずれかがupdate_stateに失敗見たくありません。 dev_err(drm_dev-> DEV、 "アトミック状態を複製することができなかった\ n"); RET = PTR_ERR_OR_ZERO(状態)。 後藤err_free_old_state; } 状態- > acquire_ctx = mode_config-> acquire_ctx。 list_for_each_entry(セット、&mode_set_list、ヘッド) / * (RET){場合 / * WARN_ON(update_state(drm_dev、状態、設定、および数plane_mask))。 RET = drm_atomic_commit(状態)。 drm_atomic_clean_old_fb(drm_dev、数plane_mask、RET)。 list_for_each_entry_safe(セット、TMP、&mode_set_list、ヘッド){ list_del(&セット- >ヘッド) kfree(セット)。 } / * *可能性のgetデッドロックはここですか? * / WARN_ON(RET == -EDEADLK)。 *原子が失敗したコミットた場合の表示状態を復元します。 * / drm_atomic_helper_swap_state(drm_dev、OLD_STATE)。 後藤err_free_old_state; } // rockchip_free_loader_memory(drm_dev)。 // drm_atomic_state_free(OLD_STATE)。 drm_modeset_unlock_all(drm_dev)。 リターン; err_free_old_state: drm_atomic_state_free(OLD_STATE)。 err_free_state: drm_atomic_state_free(状態)。 err_unlock: drm_modeset_unlock_all(drm_dev)。 (RET)の場合 dev_err(drm_dev-> DEV、 "ローダーのロゴを表示できませんでした。\ n"); rockchip_free_loader_memory(drm_dev)。 }
一般そこフレームバッファの内容にバックアップ記憶領域であり、バックアップframbuffer領域の内容が更新された場合に充填した後に再割り当て、内容が更新される表示を示しているということを意味する......
つかの間の画像の中核問題を解決することができるスタートアップ相FBの更新を禁止します:
RK政府はまた、ソリューションの多くを提供してきましたが、私のために、この現象は適用されません。logo.c内のLinuxカーネル内部のコンフィギュレーション・ファイルは、カーネルイメージのショーを指定した場合、問題の根は、古いメカニズムフレームバッファの互換性のためにRKにする必要がありますが、このあなたがfalseに設定さlogos_freed内部fb_logo_late_init機能にlogo.cファイルで上記の手順に従わない場合logo_kernel.bmpは、カーネルディレクトリに表示ファイルに影響を与えるだろう、logo.c指定された画像が表示され、私のバージョンがあります現象いくつかのペンギン......起動プロセスは次のとおりです。ubootのステージショーlogo.bmp通常、その後logo_kernel.bmpフラッシュ、その後、表示画面のデスクトップへのペンギンまで......
添付の公式ガイダンス文書: