u-boot移植总结(四)u-boot-2010.09框架分析
(一)本次移植是基于FL2440,板子的基本硬件:
|
CPU |
型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz |
|
SDRAM |
H57V2562GTR-75C 2片*32MB=64MB,挂载于nGCS6 (0x3000 0000) |
|
NANDFLASH |
型号:K9F2G08U0B 大小:256MB |
|
Network Adapter (网卡) |
DM9000AEP 10/100M自适应,挂载于nGCS4 (0x2000 0000) |
|
LED |
5个LED(LED0~3)I/O口指示灯,LED5电源指示灯,LED9核心板3.3V指示灯 LED0~LED3分别接GPB6,GPB6,GPB8,GPB10 |
|
BEEP(蜂鸣器) |
接在GPB0/TOUT0 |
(二)U-Boot的整体框架:
|
arch |
cpu处理器相关代码,其中每款cpu都包含了相关代码和处理器体系相关的初始化文件。其中U-Boot开始执行第一个文件start.S,主要做最早其的系统初始化,代码重定向和设置系统堆栈,为第二阶段的C程序奠定基础。而其中的board.c文件,几乎是U-Boot的所有架构第二阶段代码入口函数和相关初始化函数存放的地方。 |
|
board |
已经支持的所有开发板相关文件,其中包含SDRAM初始化代码、Flash底层驱动、板级初始化文件。其中的config.mk文件定义了TEXT_BASE,也的代码在内存的真实地址,非常重要。 |
|
drivers |
含几乎所有外围芯片的驱动,网卡、USB、串口、LCD、Nand Flash等等 |
|
common |
与处理器体系结构无关的通用代码,U-Boot的命令解析代码,/common/command.c、所有命令的上层代码cmd_*.c、Uboot环境变量处理代码env_*.c、等都位于该目录下 |
|
Disk,fs,net |
支持的CPU无关的重要子系统; 磁盘驱动的分区处理代码,文件系统:FAT、JFFS2、EXT2等;网络协议:NFS、TFTP、RARP、DHCP等等; |
|
include |
头文件,包括各CPU的寄存器定义,文件系统、网络等等;configs子目录下的文件是与目标板相关的配置头文件 |
|
doc |
U-Boot的说明文档,在修改配置文件的时候可能用得上 |
|
api |
部扩展应用程序的API和范例,第三方函数 |
|
nand_spl onenand_ipl post |
一些特殊构架需要的启动代码和上电自检程序代码 |
|
Makefile config.mk rules.mk |
控制整个编译过程的主Makefile文件和规则文件 |
|
tools |
编译S-Record或U-Boot映像等相关工具,制作bootm引导的内核映像文件工具mkimage源码就在此 |
|
boards.cfg |
板子配置添加,如:板子为ly440,在编译阶段需要先make ly2440_config读出文件配置 |
|
COPYING README MAINTAINERS CREDITS |
一些介绍性的文档、版权说明 |
其中红色字体标识的是比较重要的,也是主要修改文件.
(三)本次基于FL2440板子修改u-boot-2010.09,第二阶段初始化函数分析
1,测试
在boards.cfg文件添加板子配置
Makefile添加制作好交叉编译器buildroot-2011.11
测试编译,make ly2440_config 读取配置文件
由于Samsung的smdk2410与s3c2440很类似,以smdk2410为蓝本,提高修改代码效率
<strong><span style="font-size:24px;">[zhouguangfeng@centos6 u-boot-2010.09]$ cd board
[zhouguangfeng@centos6 board]$ mkdir -p lingyun/ly2440
[zhouguangfeng@centos6 board]$ cp samsung/smdk2410/* lingyun/ly2440
[zhouguangfeng@centos6 board]$ ls lingyun/ly2440
config.mk flash.c lowlevel_init.S Makefile smdk2410.c
[zhouguangfeng@centos6 board]$ mv lingyun/ly2440/smdk2410.c lingyun/ly2440/ly2440.c
[zhouguangfeng@centos6 board]$ ls lingyun/ly2440
config.mk flash.c lowlevel_init.S ly2440.c Makefile
[zhouguangfeng@centos6 board]$ </span></strong>
具体修改不详细展开
2,U-Boot开始,第一个执行Start.S在u-boot移植总结(一)start.S分析(点击链接)有总结,这里总结一些第二阶段关于板子初始化的函数:U-Boot使用一个数组init_sequence来存储对于大多数开发板都要执行的初始化函数的函数指针。init_sequence数组中有较多的编译选项,去掉编译选项后init_sequence数组如下所示:
typedef int(init_fnc_t) (void); //申明一种函数类型,返回值int,参数void
init_fnc_t*init_sequence[] = {
board_init, /*开发板相关的配置--board/lingyun/ly2440/ly2440.c */
timer_init, /*时钟初始化--arch/arm/cpu/arm920t/s3c24x0/timer.c*/
env_init, /*初始化环境变量--common/env_flash.c 或common/env_nand.c*/
init_baudrate, /*初始化波特率-- arch/arm/lib/board.c */
serial_init, /*串口初始化--drivers/serial/serial_s3c24x0.c*/
console_init_f, /* 控制通讯台初始化阶段1-- common/console.c */
display_banner, /*打印U-Boot版本、编译的时间-- arch/arm/lib/board.c */
dram_init, /*配置可用的RAM--board/lingyun/ly2440/ly2440.c */
display_dram_config, /* 显示RAM大小-- arch/arm/lib/board.c*/
NULL,
};
其中的board_init函数在board/lingyun/ly2440/ly2440.c中定义,该函数设置了MPLLCOM,UPLLCON,以及一些GPIO寄存器的值,还设置了U-Boot机器码和内核启动参数地址 :
#if defined(CONFIG_S3C2410)
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
#endif
#if defined(CONFIG_S3C2440)
/* arch number of S3C2440-Board ,MINI2440机器代码*/
gd->bd->bi_arch_number = MACH_TYPE_MINI2440 ;
#endif
/* 内核启动参数地址 */
gd->bd->bi_boot_params=0x30000100;
FL2440使用2片32MB的SDRAM组成了64MB的内存,接在存储控制器的BANK6,地址空间是0x3000
0000~0x3400 0000。在include/configs/ly2440.h中PHYS_SDRAM_1和PHYS_SDRAM_1_SIZE分别被定义为0x30000000和0x04000000(64M)。
其中的dram_init函数在board/lingyun/ly2440/ly2440.c中定义如下:
int dram_init (void)
{
gd->bd->bi_dram[0].start= PHYS_SDRAM_1;
gd->bd->bi_dram[0].size= PHYS_SDRAM_1_SIZE;
return 0;
}
分析完上述的数据结构,下面来分析start_armboot函数:
voidstart_armboot (void)
{
init_fnc_t**init_fnc_ptr;
char *s;
… …
/*
计算全局数据结构的地址gd,在include/asm/global_data.h有定义 */
gd =(gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
… …
memset((void*)gd, 0, sizeof (gd_t));
gd->bd= (bd_t*)((char*)gd - sizeof(bd_t)); /*bd结构体在arch/arm/include/asm/u-boot.h定义,保存关于板子信息*/
memset(gd->bd, 0, sizeof (bd_t));
gd->flags|= GD_FLG_RELOC;
monitor_flash_len= _bss_start - _armboot_start;
/* 逐个调用init_sequence数组中的初始化函数 */
for(init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if((*init_fnc_ptr)() != 0) {
hang();
}
}
/*armboot_start在arch/arm/cpu/arm920t/start.S中被初始化为u-boot.lds连接脚本中的_start
*/
mem_malloc_init(_armboot_start - CONFIG_SYS_MALLOC_LEN,
CONFIG_SYS_MALLOC_LEN);
/* NAND Flash初始化*/
#ifdefined(CONFIG_CMD_NAND)
puts("NAND: ");
nand_init(); /* go init the NAND */
#endif
… …
/*配置环境变量,重新定位 */
env_relocate();
… …
/* 从环境变量中获取IP地址 */
gd->bd->bi_ip_addr= getenv_IPaddr ("ipaddr");
stdio_init(); /* get the devices list going. */
jumptable_init();
… …
console_init_r(); /* fully init console as a device */
… …
/* enableexceptions */
enable_interrupts();
#ifdefCONFIG_USB_DEVICE
usb_init_slave();
#endif
/* Initialize from environment*/
if ((s =getenv ("loadaddr")) != NULL) {
load_addr= simple_strtoul (s, NULL, 16);
}
#ifdefined(CONFIG_CMD_NET)
if ((s =getenv ("bootfile")) != NULL) {
copy_filename(BootFile, s, sizeof (BootFile));
}
#endif
… …
/*网卡初始化 */
#ifdefined(CONFIG_CMD_NET)
#ifdefined(CONFIG_NET_MULTI)
puts("Net: ");
#endif
eth_initialize(gd->bd);
#if defined(CONFIG_RESET_PHY_R)
debug ("Reset Ethernet PHY\n");
reset_phy();
#endif
#endif
/*main_loop() can return to retry autoboot, if so just run it again. */
for (;;){
main_loop();
}
/*NOTREACHED - no way out of command loop except booting */
}
main_loop函数在common/main.c中定义。一般情况下,进入main_loop函数时,超过include/configs/ly2440.h中定义的CONFIG_BOOTDELAY
时间,而没有按下ESC,则U-Boot引导加载系统内核。
u-boot移植总结(四)u-boot-2010.09框架分析的更多相关文章
- Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档
0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...
- Linux摄像头驱动学习之:(四)UVC-摄像头驱动框架分析
UVC: USB Video ClassUVC驱动:drivers\media\video\uvc\ uvc_driver.c分析:1. usb_register(&uvc_driver.dr ...
- Spring Boot 项目学习 (三) Spring Boot + Redis 搭建
0 引言 本文主要介绍 Spring Boot 中 Redis 的配置和基本使用. 1 配置 Redis 1. 修改pom.xml,添加Redis依赖 <!-- Spring Boot Redi ...
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
- Spring Boot 启动(四) EnvironmentPostProcessor
Spring Boot 启动(四) EnvironmentPostProcessor Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698. ...
- Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置
0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...
- 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密
学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA AES RSA AES 混合加密 整合 前言: 为了提高安全性采用了RS ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(四):集成 MyBatis 框架
引入依赖 Spring Boot对于MyBatis的支持需要引入mybatis-spring-boot-starter的pom文件. <dependency> <groupId> ...
- spring boot 系列之五:spring boot 通过devtools进行热部署
前面已经分享过四篇随笔: spring boot 系列之一:spring boot 入门 spring boot 系列之二:spring boot 如何修改默认端口号和contextpath spri ...
随机推荐
- SQL语句调优 - 索引上的数据检索方法
如果一张表上没有聚集索引,数据将会随机的顺序存放在表里.以dbo.SalesOrderDetail_TEST为例子.它的上面没有聚集索引,只有一个在SalesOrderID上的非聚集索引.所以表格的每 ...
- 微软MVC对架构的一点思考
毕业即将三年,在学校学习.做毕设一直使用拖控件的 Winform\WebForm,工作后公司采用MVC3架构做项目. 下面使用mvc的个人总结 : 1.架构上分层清晰.便于研发,耦合性好 2.缓存机制 ...
- (笔记)Linux内核学习(四)之系统调用
一 用户空间和内核空间 Linux内核将这4G字节虚拟地址空间的空间分为两部分: l 将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”. l ...
- IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字
概述 吐槽下IOS下 的图形绘图,代码冗长,不得不自己重新封装方法.整理形成本文. 绘制线 // 绘制直线 + (void)toDrawLineFromX:(CGFloat)x1 Y:(CGFloat ...
- iOS开发备忘录:自定义UINavigationBar背景图片和Back按钮
iOS项目,根据设计图,有时需要自定义UIView的UINavigationBar的背景.可以切出来一张1像素左右的背景图片,来充当UINavigationBar的背景. 可以利用Navigation ...
- Devexpress treelist 树形控件 实现带三种状态的CheckBox
树形控件是使用频率很高的一种控件.对于属性控件往往需要下面两个功能 1.TreeList带有CheckBox,并且节点要有三种状态(所有的子节点都选中,所有的子节点都没选择,一部分子节点选中).使用 ...
- android手机出现sqlite3 not found的解决方法
解决方法如下: 1.如果/system目录为不可读写的,需要挂载为读写: C:\Users\easteq>adb shell root@android:/ # mount -o remount, ...
- Maven更新子模块的版本号
mark! 已写成了另一篇,不要打我.
- Ubuntu主题美化--使用WPS风格
五一就这么过去了,我也没有出去玩,一个人闲的蛋疼,无聊就把ubuntu美化一下. 闲话不多说,先看效果: 壁纸是我自己制作的的,如果喜欢另存一下下面这张图设置成背景就可以了,分辨率是1366x768. ...
- Lua和C语言的交互——C API
Lua可作为扩展性语言(Lua可以作为程序库用来扩展应用的功能),同时也是个可扩展的语言(Lua程序中可以注册由其他语言实现的函数). C和Lua交互的部分称为C API.C API是一个C代码与Lu ...