u-boot2011.09 启动流程记录
start
arch/arm/cpu/armv7/start.S
36 .globl _start
37 _start: b reset
136 reset:
137 bl save_boot_params
138 /*
139 * set the cpu to SVC32 mode
140 */
141 mrs r0, cpsr
142 bic r0, r0, #0x1f
143 orr r0, r0, #0xd3
144 msr cpsr,r0
206 call_board_init_f:
207 ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
208 bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
209 ldr r0,=0x00000000
210 bl board_init_f // ----> 前置初始化 SPL
321 #ifndef CONFIG_SYS_ICACHE_OFF
322 mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
323 mcr p15, 0, r0, c7, c10, 4 @ DSB
324 mcr p15, 0, r0, c7, c5, 4 @ ISB
325 #endif
326 ldr r0, _board_init_r_ofs
327 adr r1, _start
328 add lr, r0, r1
329 add lr, lr, r9
330 /* setup parameters for board_init_r */
331 mov r0, r5 /* gd_t */
332 mov r1, r6 /* dest_addr */
333 /* jump to it ... */
334 mov pc, lr
335
336 _board_init_r_ofs:
337 .word board_init_r - _start // 后置初始化, u-boot.img
board_init_f
264 void board_init_f(ulong bootflag)
265 {
// ... ...
281 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
282 if ((*init_fnc_ptr)() != 0) {
283 hang ();
284 }
285 }
// ... ..
235 init_fnc_t *init_sequence[] = {
236 #if defined(CONFIG_ARCH_CPU_INIT)
237 arch_cpu_init, /* basic arch cpu dependent setup */
238 #endif
239 #if defined(CONFIG_BOARD_EARLY_INIT_F)
240 board_early_init_f,
241 #endif
242 timer_init, /* initialize timer */
243 #ifdef CONFIG_FSL_ESDHC
244 get_clocks,
245 #endif
246 env_init, /* initialize environment */
247 init_baudrate, /* initialze baudrate settings */
248 serial_init, /* serial communications setup */
249 console_init_f, /* stage 1 init of console */
250 display_banner, /* say that we are here */
251 #if defined(CONFIG_DISPLAY_CPUINFO)
252 print_cpuinfo, /* display cpu info (and speed) */
253 #endif
254 #if defined(CONFIG_DISPLAY_BOARDINFO)
255 checkboard, /* display board info */
256 #endif
257 #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
258 init_func_i2c,
259 #endif
260 dram_init, /* configure available RAM banks */
261 NULL,
262 };
// board/aplex/ecm_5410.c
98 int dram_init(void)
99 {
100 gd->ram_size = PHYS_DRAM_1_SIZE;
101
102 return 0;
103 }
board_init_r
// arch/arm/lib/board.c
443 void board_init_r(gd_t *id, ulong dest_addr)
444 {
// ... ...
464 board_init(); /* Setup chipselects */ // i2c, pinmux gpmc init
// ... ...
523 #if defined(CONFIG_CMD_NAND)
524 puts("NAND : ");
525 nand_init(); /* go init the NAND */
526 #endif
// ... ...
// drivers/mtd/nand/ti81xx_nand.c
864 int board_nand_init(struct nand_chip *nand)
865 {
867 cs = 0;
876 while (cs < GPMC_MAX_CS) {
877 /* Check if NAND type is set */
878 if ((readl(&gpmc_cfg->cs[cs].config1) & 0xC00) == 0x800) {
879 /* Found it!! */
880 #ifdef NAND_DEBUG
881 printf("Searching for NAND device @ GPMC CS:%1d\n", cs);
882 #endif
883 break;
884 }
885 cs++;
886 }
887 if (cs >= GPMC_MAX_CS) {
888 printf("NAND: Unable to find NAND settings in "
889 "GPMC Configuration - quitting\n");
890 return -ENODEV;
891 }
892
893 nand->IO_ADDR_R = (void __iomem *)&gpmc_cfg->cs[cs].nand_dat;
894 nand->IO_ADDR_W = (void __iomem *)&gpmc_cfg->cs[cs].nand_cmd;
895
896 nand->cmd_ctrl = ti81xx_nand_hwcontrol;
897 nand->options = NAND_NO_PADDING | NAND_CACHEPRG | NAND_NO_AUTOINCR;
898 /* If we are 16 bit dev, our gpmc config tells us that */
899 if ((readl(&gpmc_cfg->cs[cs].config1) & 0x3000) == 0x1000) {
900 nand->options |= NAND_BUSWIDTH_16;
901 }
902
903 nand->chip_delay = 100;
904
905 /* required in case of BCH */
906 elm_init();
907
908 /* BCH info that will be correct for SPL or overridden otherwise. */
909 nand->priv = &bch_priv;
910
911 #ifndef CONFIG_SPL_BUILD
912 /* For undocumented reasons we need to currently keep our environment
913 * in 1-bit ECC so we configure ourself thusly. */
914 nand_curr_device = 0;
915 ti81xx_nand_switch_ecc(NAND_ECC_HW, 0);
916 #else
917 /* The NAND chip present requires that we have written data in with
918 * at least 4-bit ECC so we configure outself for that in SPL.
919 */
920 nand->ecc.mode = NAND_ECC_HW_SYNDROME;
921 nand->ecc.layout = &hw_bch8_nand_oob;
922 nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
923 nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
924 nand->ecc.steps = CONFIG_SYS_NAND_ECCSTEPS;
925 nand->ecc.total = CONFIG_SYS_NAND_ECCTOTAL;
926 nand->ecc.hwctl = ti81xx_enable_ecc_bch;
927 nand->ecc.correct = ti81xx_correct_data_bch;
928 nand->ecc.calculate = ti81xx_calculate_ecc_bch;
929
930 if (nand->options & NAND_BUSWIDTH_16)
931 nand->read_buf = nand_read_buf16;
932 else
933 nand->read_buf = nand_read_buf;
934 nand->dev_ready = ti81xx_spl_dev_ready;
935
936 ti81xx_hwecc_init_bch(nand, NAND_ECC_READ);
937 #endif
938
939 return 0;
940 }
u-boot2011.09 启动流程记录的更多相关文章
- 记录Linux启动流程的工具bootchart
/********************************************************************* * Author : Samson * Date ...
- 【转】linux-系统启动流程详解
第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 1. Linux 的启动流程分析 1.1 启动流程一览 1.2 BIOS, boot loader 与 kernel ...
- linux启动流程梳理【转】
接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下 ...
- 番外:你真的了解 Oracle 的启动流程吗?
番外系列说明:该系列所有文章都将作为独立篇章进行知识点讲解,是对其他系列博文进行的补充说明,来自于博客园AskScuti. 主题:关于数据库启动流程的三个阶段 内容预览:本篇涉及数据库启动的三个阶段分 ...
- Spring Boot启动流程详解(一)
环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...
- 嵌入式Linux驱动学习之路(五)u-boot启动流程分析
这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...
- CentOS6 启动流程图文解剖
我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linux操作系统了.那么在按下电源到输入账号和密码之前,操作系统都做了些什么?下面就来讲述在这段时间发生的动 ...
- centos启动流程[转]
启动流程概览 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯: init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行 ...
- linux内核启动流程[转]
启动流程一览 既然启动是很严肃的一件事,那我们就来了解一下整个启动的过程吧! 好让大家比较容易发现启动过程里面可能会发生问题的地方,以及出现问题后的解决之道! 不过,由於启动的过程中,那个启动管理程序 ...
随机推荐
- git server 搭建指南
搭建git服务器的经验总结 一: Server端的设置 1. 安装 git, git-core 2. 安装 ssh-server. (代码上传通道) 3. 创建git 用户 指定其目录 和所在组 4. ...
- Maven知识点整理
1. 基础:maven 概念及生命周期 ===>Nexus创建本地Maven仓库(Maven私服) https://www.cnblogs.com/zishengY/p/7794923.html ...
- chrome 插件 导出与导入,以apizza SQ为例
一.chrome 插件的导出 1.打开 chrome://extensions/ 2.打开开发者模式 3.复制插件的ID 4.搜索 通常是在:C:\Users\Lee\AppData\Local\Go ...
- appium 重新启动apk
在旧版本的appium,重新启动apk,调用startActivity方法可以随意启动一个app,并传入一个package name 和启动activity name的名称.语句如下: driver. ...
- HAproxy通过X-Forwarded-For 获取代理的上一层用户真实IP地址
现在有一个场景就是我们的haproxy作为反向代理,但是我们接了一个抗DDoS设备.所以现在haproxy记录的IP都是抗DDoS设备的IP地址,获取不到用户的真实IP 这样,我们在haproxy 上 ...
- MySQL,如何修改root帐户密码、如何解决root帐户忘记密码的问题
1. 如何修改root帐户密码 打开MySQL 5.6 Command Line Client窗口,输入当前密码登录,然后依次输入如下3条命令: use mysql; update user set ...
- Android呼叫管理服务之会话发起协议(SIP)API
原文:http://android.eoe.cn/topic/android_sdk Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话功能到你的应用程序. ...
- webapi中取文件的物理路径(server.mappath)
在Webapi中是用不了server.mappath方法的,上网搜索了一下,发现是用如下代码取得文件绝对路径: string logpath = System.Web.Hosting.HostingE ...
- 【Unity】11.4 车轮碰撞体(Wheel Collider)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 车轮碰撞体 (Wheel Collider)专门用于创建汽车或其他移动交通工具. 车轮碰撞体是一种针对地面车辆的特殊碰撞 ...
- HTML5学习笔记(三):语义化和新增结构元素
在HTML5之前,使用机器来阅读一个网页是非常困难的,我们使用不同样式的div来标记不同的内容,所以实际上机器无法得知页面的哪个部分是正文,哪个部分是标题,那么在HTML5里,针对这个问题就引入了语义 ...