• 跟踪一下 u-boot 2011.09 MLO在 nandflash 下运行的流程

  • 首先,直接进入 start.S

    // arch/arm/cpu/armv7/start.S
36 .globl _start
37 _start: b reset
// ... ... 136 reset:
137 bl save_boot_params // ... ...
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 的 board_init_f 在 arch/arm/cpu/armv7/omap-common/spl.c 里面

    // arch/arm/cpu/armv7/omap-common/spl.c
57 void board_init_f(ulong dummy)
58 {
59 /*
60 * We call relocate_code() with relocation target same as the
61 * CONFIG_SYS_SPL_TEXT_BASE. This will result in relocation getting
62 * skipped. Instead, only .bss initialization will happen. That's
63 * all we need
64 */
65 debug(">>board_init_f()\n");
66 relocate_code(CONFIG_SPL_STACK, &gdata, CONFIG_SPL_TEXT_BASE);
// 这里又跳回 start.S
67 }
  • 回到 start.S

    arch/arm/cpu/armv7/start.S
221 .globl relocate_code // 全局函数
222 relocate_code:
223 mov r4, r0 /* save addr_sp */
224 mov r5, r1 /* save addr of gd */
225 mov r6, r2 /* save addr of destination */ // ... 上面是将 代码拷贝到 memory (RAM)上的过程
336 _board_init_r_ofs:
337 .word board_init_r - _start
// 下面就跳到 SPL 的 board_init_r
  • SPL 的board_init_r 是在 arch/arm/cpu/armv7/omap-common/spl.c 里面

    arch/arm/cpu/armv7/omap-common/spl.c
109 void board_init_r(gd_t *id, ulong dummy)
110 {
111 u32 boot_device;
112 debug(">>spl:board_init_r()\n");
113
114 timer_init();
115 i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
116
117 #ifdef CONFIG_SPL_BOARD_INIT
118 spl_board_init(); // 启动了 I2C, 并使用I2C控制 PMIC
119 #endif
120
121 boot_device = omap_boot_device(); // 选择启动设备,是nand还是mmc
122
123 switch (boot_device) {
124 #ifdef CONFIG_SPL_MMC_SUPPORT
125 case BOOT_DEVICE_MMC1:
126 case BOOT_DEVICE_MMC2:
127 printk("Booting from MMC...\n");
128 spl_mmc_load_image();
129 break;
130 #endif
131 #ifdef CONFIG_SPL_NAND_SUPPORT
132 case BOOT_DEVICE_NAND:
133 printk("Booting from NAND...\n");
134 spl_nand_load_image();
135 break;
    arch/arm/cpu/armv7/omap-common/spl_nand.c
33 void spl_nand_load_image(void)
34 {
35 struct image_header *header;
36 switch (omap_boot_mode()) {
37 case NAND_MODE_HW_ECC:
38 debug("spl: nand - using hw ecc\n");
39 gpmc_init();
40 nand_init();
41 break;
42 default:
43 puts("spl: ERROR: This bootmode is not implemented - hanging");
44 hang();
45 }
// …
65 nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
66 CONFIG_SYS_NAND_PAGE_SIZE, (void *)header);
67 spl_parse_image_header(header);
// 实现完了 spl 加载到 u-boot.img
68 nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
69 spl_image.size, (void *)spl_image.load_addr);
70 nand_deselect();
71 }
  • nand_init( 的实现在 drivers/mtd/nand/nand_spl_simple.c 里面

    drivers/mtd/nand/nand_spl_simple.c
224 /* nand_init() - initialize data to make nand usable by SPL */
225 void nand_init(void)
226 {
227 /*
228 * Init board specific nand support
229 */
230 mtd.priv = &nand_chip;
231 nand_chip.IO_ADDR_R = nand_chip.IO_ADDR_W =
232 (void __iomem *)CONFIG_SYS_NAND_BASE;
233 nand_chip.options = 0;
234 board_nand_init(&nand_chip);
235
236 if (nand_chip.select_chip)
237 nand_chip.select_chip(&mtd, 0);
238 }
  • board_nand_init 的实现在 drivers/mtd/nand/ti81xx_nand.c

    drivers/mtd/nand/ti81xx_nand.c
924 int board_nand_init(struct nand_chip *nand)
925 {
926 /* int32_t gpmc_config = 0; */
927 cs = 0;
928
929 /*
930 * xloader/Uboot's gpmc configuration would have configured GPMC for
931 * nand type of memory. The following logic scans and latches on to the
932 * first CS with NAND type memory.
933 * TBD: need to make this logic generic to handle multiple CS NAND
934 * devices.
935 */
936 while (cs < GPMC_MAX_CS) {
937 /* Check if NAND type is set */
938 if ((readl(&gpmc_cfg->cs[cs].config1) & 0xC00) == 0x800) {
939 /* Found it!! */
940 #ifdef NAND_DEBUG
941 printf("Searching for NAND device @ GPMC CS:%1d\n", cs);
942 #endif
943 break;
944 }
945 cs++;
946 }
947 if (cs >= GPMC_MAX_CS) {
948 printf("NAND: Unable to find NAND settings in "
949 "GPMC Configuration - quitting\n");
950 return -ENODEV;
951 }
952
953 nand->IO_ADDR_R = (void __iomem *)&gpmc_cfg->cs[cs].nand_dat;
954 nand->IO_ADDR_W = (void __iomem *)&gpmc_cfg->cs[cs].nand_cmd;
955
956 nand->cmd_ctrl = ti81xx_nand_hwcontrol;
957 nand->options = NAND_NO_PADDING | NAND_CACHEPRG | NAND_NO_AUTOINCR;
958 /* If we are 16 bit dev, our gpmc config tells us that */
959 if ((readl(&gpmc_cfg->cs[cs].config1) & 0x3000) == 0x1000) {
960 nand->options |= NAND_BUSWIDTH_16;
961 }
962
963 nand->chip_delay = 100;
964
965 /* required in case of BCH */
966 elm_init();
967
968 /* BCH info that will be correct for SPL or overridden otherwise. */
969 nand->priv = &bch_priv;
970
971 #ifndef CONFIG_SPL_BUILD
972 /* For undocumented reasons we need to currently keep our environment
973 * in 1-bit ECC so we configure ourself thusly. */
974 nand_curr_device = 0;
975 ti81xx_nand_switch_ecc(NAND_ECC_HW, 0);
976 #else
977 /* The NAND chip present requires that we have written data in with
978 * at least 4-bit ECC so we configure outself for that in SPL.
979 */
980 nand->ecc.mode = NAND_ECC_HW_SYNDROME;
981 /* nand->ecc.layout = &hw_bch8_nand_oob; */
982 nand->ecc.layout = &nand_ecclayout;
983 nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
984 nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
985 nand->ecc.steps = CONFIG_SYS_NAND_ECCSTEPS;
986 nand->ecc.total = CONFIG_SYS_NAND_ECCTOTAL;
987 nand->ecc.hwctl = ti81xx_enable_ecc_bch;
988 nand->ecc.correct = ti81xx_correct_data_bch;
989 nand->ecc.calculate = ti81xx_calculate_ecc_bch;
990
991 if (nand->options & NAND_BUSWIDTH_16)
992 nand->read_buf = nand_read_buf16;
993 else
994 nand->read_buf = nand_read_buf;
995 nand->dev_ready = ti81xx_spl_dev_ready;
996
997 ti81xx_hwecc_init_bch(nand, NAND_ECC_READ);
998 #endif
999
1000 return 0;
1001 }

am335x u-boot2011.09 SPL 流程跟踪的更多相关文章

  1. I.MX6 Linux Qt 启动流程跟踪

    /************************************************************************** * I.MX6 Linux Qt 启动流程跟踪 ...

  2. activiti流程跟踪图算法

    流程跟踪图-推导算法 工作中使用activiti实现流程图相关业务,但是上线后遇到问题,偶尔流程图出不来.查阅了一下画流程图的实现,基本上是参见:activiti-流程图颜色变化之一篇. 核心类,参见 ...

  3. Buildroot 打包文件系统流程跟踪

    /********************************************************************************* * Buildroot 打包文件系 ...

  4. u-boot2011.09 u-boot.img 的流程跟踪

    一.主要是start.S 里面的 board_init_f 以及 board_init_r 函数分析,MLO与 u-boot.omg 的区别就在这里 二. MLO 加载完毕,他会重新回到 start. ...

  5. AM335x tscadc platform driver 相关代码跟踪

    TI AM335x ti am335x_tsc.c 代码跟踪 在kernel 首层目录: 先运行make ARCH=arm tags 这个作用是建立tags文件,只含有arm架构的,利用ctag即可进 ...

  6. AM335X的应用程序自启动流程以及U盘更新应用程序记录

    在AM335X的SD卡更新系统学习记录中最后更新完系统后,以后运行应用程序都会从EMMC中取出Linux系统运行.接着介绍Linux系统是怎么自己启动我们编写的应用程序的. 1.在AM335X的SD卡 ...

  7. show create table底层流程跟踪

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 SHOW CREATE TABLE语句用于为指定表/视图显示创建的语句,本文将简要描述如何在MySQL源码里跟踪和学 ...

  8. u-boot2011.09 启动流程记录

    start arch/arm/cpu/armv7/start.S 36 .globl _start 37 _start: b reset 136 reset: 137 bl save_boot_par ...

  9. android 流程跟踪

    #记录一下 Thread cur_thread = Thread.currentThread(); StackTraceElement stack[] = cur_thread.getStackTra ...

随机推荐

  1. Android后台处理最佳实践(Best Practices for Background Jobs)

    本课将告诉你如何通过后台加载来加速应用启动和降低应用耗电. 后台跑服务 除非你做了特殊指定,否则在应用中的大部分前台操作都是在一个特殊的UI线程里面进行的.这有可能会导致一些问题,因为长时间运行的操作 ...

  2. logstash日志分析的配置和使用(转)

    logstash是一个数据分析软件,主要目的是分析log日志.整一套软件可以当作一个MVC模型,logstash是controller层,Elasticsearch是一个model层,kibana是v ...

  3. php分享二十:mysql优化

    1:垂直分割 示例一:在Users表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段.那么,为什么不把他放到另外一张表中呢 ...

  4. Oracle多表关联如何更新多个字段

    注意点:1.被update主表一定要加上过滤条件.2.查询出来更新结果集,同时也要作为被更新主表的条件,作为同步大家都是更新这部分数据.update student stu set (stu.name ...

  5. 【Unity】8.5 扩展编辑器

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 可以通过编辑器窗口 (Editor Windows) 创建自己在 Unity 中的自定义设计工具.来自EditorWin ...

  6. 行为类模式(八):状态(State)

    定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以 ...

  7. android studio - Manifest merger failed with multiple errors, see logs

    今天编译运行的时候遇到了“Error:Execution failed for task ':test:processDebugManifest'.> Manifest merger faile ...

  8. .NET MVC5+ Dapper+扩展+微软Unity依赖注入实例

    1.dapper和dapper扩展需要在线安装或者引用DLL即可 使用nuget为项目增加Unity相关的包 2.model类 public class UserInfo { public int I ...

  9. 每日英语:The Risks of Big Data for Companies

    Big data. It's the latest IT buzzword, and it isn't hard to see why. The ability to parse more infor ...

  10. 【甘道夫】HBase基本数据操作详解【完整版,绝对精品】

    引言 之前详细写了一篇HBase过滤器的文章,今天把基础的表和数据相关操作补上. 本文档参考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 所有代码均基于“ ...