U-Boot之啓動第二階段

基於samsung的Exynos 4412,U-Boot版本爲2010.03

U-Boot啓動之第一階段中,我們知道了U-Boot是通過start_armboot這個函數進入第二階段的,所以我們從這個函數開始分析。

	init_fnc_t **init_fnc_ptr;
	char *s;
	int mmc_exist = 0;

定義一個二級指針,後面會用到

	/* Pointer is writable since we allocated a register for it */
	gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
	/* compiler optimization barrier needed for GCC >= 3.4 */
	__asm__ __volatile__("": : :"memory");

	memset ((void*)gd, 0, sizeof (gd_t));
	gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
	memset (gd->bd, 0, sizeof (bd_t));

定義一個gd數據結構用來存放一些信息,存放什麼信息,感興趣的自己進去看看,無非就是一些芯片、板子以及系統相關的信息

	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
		if ((*init_fnc_ptr)() != 0) {
			hang ();
		}
	}

這裏有一個init_sequence,這是一個函數指針數組名,這個數組裏面具體有哪些函數,自己去看吧,無非就是一些初始化、設置信息。將這個函數指針賦值給前面定義的二級指針。這段代碼的意思就是執行init_sequence裏面的初始化函數

	for (;;) {
		main_loop ();
	}

直接到最後,到這裏start_armboot這個函數就結束了,下面開始了main_loop

	for (;;) {
#ifdef CONFIG_BOOT_RETRY_TIME
		if (rc >= 0) {
			/* Saw enough of a valid command to
			 * restart the timeout.
			 */
			reset_cmd_timeout();
		}
#endif
		len = readline (CONFIG_SYS_PROMPT);

		flag = 0;	/* assume no special flags for now */
		if (len > 0)
			strcpy (lastcommand, console_buffer);
		else if (len == 0)
			flag |= CMD_FLAG_REPEAT;
#ifdef CONFIG_BOOT_RETRY_TIME
		else if (len == -2) {
			/* -2 means timed out, retry autoboot
			 */
			puts ("\nTimed out waiting for command\n");
# ifdef CONFIG_RESET_TO_RETRY
			/* Reinit board to run initialization code again */
			do_reset (NULL, 0, 0, NULL);
# else
			return;		/* retry autoboot */
# endif
		}
#endif

		if (len == -1)
			puts ("<INTERRUPT>\n");
		else
			rc = run_command (lastcommand, flag);

		if (rc <= 0) {
			/* invalid command or not repeatable, forget it */
			lastcommand[0] = 0;
		}
	}

中間的配置,初始化什麼的,我們不看,直接看最後。當我們進入u-boot模式後,其實就是進入了這個循環裏面,這個循環的任務就是重複地掃描控制檯信息,看看,我們有沒有發來什麼命令,如果有的話就執行,執行完繼續循環掃描,直到我們採取了某些操作終止了這個循環。

u-boot第二階段到這裏就結束了,u-boot第二階段的主要任務就是準備控制檯環境,然後進入一個無限循環等待我們的命令

提示:不要太在意中間那些初始化代碼,因爲,對於不同的芯片、不同的板子,這些初始化代碼都不一樣,所以看這些東西沒有什麼意義,但是,無論什麼樣的芯片,什麼樣的板子,只要是用了u-boot,上面我介紹的流程,它肯定是要經歷的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章