rk3399起動log_kernelつかの間の問題

環境: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フラッシュ、その後、表示画面のデスクトップへのペンギンまで...... 

添付の公式ガイダンス文書:

 

 

 

 

おすすめ

転載: www.cnblogs.com/weishengzhong/p/12050400.html