board.c分析

计算起始地址

这个文件的位置在uboot_jiuding\lib_arm

在start.S 的413行跳转到这
ldr pc, _start_armboot
_start_armboot:
.word start_armboot

void start_armboot (void)
{
   
	
	**init_fnc_ptr;			##init_fnc_t 这是一个函数类型 ,在412行定义;这个定义看着像是函数指针,但是不是。	init_fnc_ptr 是一个二重函数指针,指向一个函数指针数组
	char *s;
	int mmc_exist = 0;
#if !defined(CFG_NO_FLASH) || defined (CONFIG_VFD) || defined(CONFIG_LCD)
	ulong size;
#endif

#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
	unsigned long addr;
#endif

#if defined(CONFIG_BOOT_MOVINAND)
	uint *magic = (uint *) (PHYS_SDRAM_1);
#endif

	/* Pointer is writable since we allocated a register for it */
#ifdef CONFIG_MEMORY_UPPER_CODE /* by scsuh */
	ulong gd_base;				//gd_base在DDR中内存分配的起始地址
	//gd_base = uboot区()+ 为栈分配的内存2M - 堆区(912KB)- 栈区(512KB)- 几十字节
	gd_base = CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE - sizeof(gd_t);		@@计算起始地址,确保分配的内存紧凑且安全
#ifdef CONFIG_USE_IRQ
	gd_base -= (CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ);
#endif
	gd = (gd_t*)gd_base;  //强制类型转换,给结构体指针赋值,使他指向结构体
#else
	gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
#endif

	/* compiler optimization barrier needed for GCC >= 3.4 */
	__asm__ __volatile__("": : :"memory");		//gcc的内嵌汇编,防止高版本的GCC过度优化

	memset ((void*)gd, 0, sizeof (gd_t));  //清除gd指向的内存里的内容
	gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); 	//在gd_t结构体下边留出bd_t结构体的内存(堆栈的内存是是向上走的);
	memset (gd->bd, 0, sizeof (bd_t));

	monitor_flash_len = _bss_start - _armboot_start;

global_data类型的结构体 别名gd_t

位置在uboot_jiuding\include\asm-arm/global_data.h

typedef	struct	global_data {
   
	bd_t		*bd;				//bd_t 结构体 ,用于存放开发板的硬件信息
	unsigned long	flags;		//存放标志位
	unsigned long	baudrate;		//波特率
	unsigned long	have_console;	//布尔类型存放0、1  	/* serial_init() was called */   
	unsigned long	reloc_off;	//重定位的偏移量  /* Relocation Offset */
	unsigned long	env_addr;		//	布尔类型 ,环境变量结构体的偏移量    /* Address  of Environment struct */
	unsigned long	env_valid;  //布尔类型 判断当前内存的环境变量可不可用	/* Checksum of Environment valid? */
	unsigned long	fb_base;	//缓存的基地址			/* base address of frame buffer */
#ifdef CONFIG_VFD
	unsigned char	vfd_type;	/* display type */
#endif
#if 0
	unsigned long	cpu_clk;	/* CPU clock in Hz!		*/
	unsigned long	bus_clk;
	phys_size_t	ram_size;	/* RAM size */
	unsigned long	reset_status;	/* reset status register at boot */
#endif
	void		**jt;		/* jump table */
} gd_t;

bd_info类型的结构体 别名bd_t

主要存放板级信息(全局变量 )
位置在uboot_jiuding\include\asm-arm/u-boot.h

typedef struct bd_info {
   
    int			bi_baudrate; //波特率 	/* serial console baudrate */
    unsigned long	bi_ip_addr;   //板子的IP地址	/* IP Address */
    unsigned char	bi_enetaddr[6]; /* Ethernet adress */
    struct environment_s	       *bi_env;
    ulong	        bi_arch_number;	//板子的机器码			/* unique id for this board */
    ulong	        bi_boot_params;	//启动参数的地址		/* where this board expects params */
    struct				/* RAM configuration */
    {
   
	ulong start;
	ulong size;
    }			bi_dram[CONFIG_NR_DRAM_BANKS];		@@DDR的信息
#ifdef CONFIG_HAS_ETH1
    /* second onboard ethernet port */
    unsigned char   bi_enet1addr[6];		//第二个网卡
#endif
} bd_t;

遍历函数指针数组

//init_sequence 是一个函数指针数组  ; 判断*init_fnc_ptr != NULL ;//函数成功返回0
	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
   
		if ((*init_fnc_ptr)() != 0) {
   //函数不成功
			hang (); //挂起,启动失败
		}//初始化板级硬件时不能出现任何错误
	}

定义函数指针数组

412行到442行

typedef int (init_fnc_t) (void);		##函数类型   返回值是int类型 参数为void
														##函数指针是这样 typedef int (*init_fnc_t) (void)
int print_cpuinfo (void); /* test-only */

init_fnc_t *init_sequence[] = {
   
	cpu_init,		/* basic cpu dependent setup */
#if defined(CONFIG_SKIP_RELOCATE_UBOOT)		//没有定义
	reloc_init,		/* Set the relocation done flag, must
				   do this AFTER cpu_init(), but as soon
				   as possible */
#endif
	board_init,		/* basic board dependent setup */
	interrupt_init,		/* set up exceptions */
	env_init,		/* initialize environment */
	init_baudrate,		/* initialze baudrate settings */
	serial_init,		/* serial communications setup */
	console_init_f,		/* stage 1 init of console */
	display_banner,		
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值