全志A10 Bootload加载过程分析
DRAM: 1024MB
SUNXI SD/MMC:0
U-Boot 2012.10-04277-g7aa9f04 (Mar10 2013 - 00:36:40) Allwinner Technology
CPU: SUNXI Family
Board: Cubieboard
I2C: ready
DRAM: 1 GiB
MMC: SUNXI SD/MMC:0
*** Warning- bad CRC, using default environment
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
** Unable to use mmc0:1for fatload **
Loading file "uEnv.txt" from mmc device 0:1
Failed to mount ext2 filesystem...
** Bad ext2 partitionor disk - mmc0:1**
ext2load - load binary file from a Ext2 filesystem
Usage:
ext2load <interface><dev[:part]> [addr] [filename] [bytes]
- load binary file 'filename' from 'dev' on 'interface'
to address 'addr' from ext2 filesystem
Loading file "boot/uEnv.txt" from mmc device 0:1
Failed to mount ext2 filesystem...
** Bad ext2 partitionor disk - mmc0:1**
ext2load - load binary file from a Ext2 filesystem
Usage:
ext2load <interface><dev[:part]> [addr] [filename] [bytes]
- load binary file 'filename' from 'dev' on 'interface'
to address 'addr' from ext2 filesystem
** Unable to use mmc0:1for fatload **
Loading file "boot.scr" from mmc device 0:1
Failed to mount ext2 filesystem...
** Bad ext2 partitionor disk - mmc0:1**
ext2load - load binary file from a Ext2 filesystem
Usage:
ext2load <interface><dev[:part]> [addr] [filename] [bytes]
- load binary file 'filename' from 'dev' on 'interface'
to address 'addr' from ext2 filesystem
Loading file "boot/boot.scr" from mmc device 0:1
Failed to mount ext2 filesystem...
** Bad ext2 partitionor disk - mmc0:1**
ext2load - load binary file from a Ext2 filesystem
Usage:
ext2load <interface><dev[:part]> [addr] [filename] [bytes]
- load binary file 'filename' from 'dev' on 'interface'
to address 'addr' from ext2 filesystem
** Unable to use mmc0:1for fatload **
sun4i#
{
u32 boot_device;
debug(">>spl:board_init_r()\n");
puts(">>spl:board_init_r()\n");
#ifdef CONFIG_SYS_SPL_MALLOC_START
mem_malloc_init(CONFIG_SYS_SPL_MALLOC_START,
CONFIG_SYS_SPL_MALLOC_SIZE);
#endif
timer_init();
#ifdef CONFIG_SPL_BOARD_INIT
spl_board_init();
#endif
boot_device = spl_boot_device(); //检测启动设备,此处返回BOOT_DEVICE_MMC1
debug("boot device - %d\n", boot_device);
switch (boot_device) {
#ifdef CONFIG_SPL_RAM_DEVICE
case BOOT_DEVICE_RAM:
spl_ram_load_image();
break;
#endif
#ifdef CONFIG_SPL_MMC_SUPPORT
case BOOT_DEVICE_MMC1:
case BOOT_DEVICE_MMC2:
case BOOT_DEVICE_MMC2_2:
spl_mmc_load_image(); //通过mmc读取image
break;
#endif
#ifdef CONFIG_SPL_NAND_SUPPORT
case BOOT_DEVICE_NAND:
spl_nand_load_image();
break;
#endif
#ifdef CONFIG_SPL_NOR_SUPPORT
case BOOT_DEVICE_NOR:
spl_nor_load_image();
break;
#endif
#ifdef CONFIG_SPL_YMODEM_SUPPORT
case BOOT_DEVICE_UART:
spl_ymodem_load_image();
break;
#endif
#ifdef CONFIG_SPL_SPI_SUPPORT
case BOOT_DEVICE_SPI:
spl_spi_load_image();
break;
#endif
#ifdef CONFIG_SPL_ETH_SUPPORT
case BOOT_DEVICE_CPGMAC:
#ifdef CONFIG_SPL_ETH_DEVICE
spl_net_load_image(CONFIG_SPL_ETH_DEVICE);
#else
spl_net_load_image(NULL);
#endif
break;
#endif
default:
debug("SPL: Un-supported Boot Device\n");
hang();
}
switch (spl_image.os) {
case IH_OS_U_BOOT:
debug("Jumping to U-Boot\n");
break;
#ifdef CONFIG_SPL_OS_BOOT
case IH_OS_LINUX:
debug("Jumping to Linux\n");
spl_board_prepare_for_linux();
jump_to_image_linux((void *)CONFIG_SYS_SPL_ARGS_ADDR);
#endif
default:
debug("Unsupported OS image.. Jumping nevertheless..\n");
}
jump_to_image_no_args();
}
u32 cfg;
#ifdef CONFIG_SPL_NOR_SUPPORT
/* TODO */
#endif
#ifdef CONFIG_SPL_MMC_SUPPORT
cfg = sunxi_gpio_get_cfgpin(SUNXI_GPC(7));
if( cfg == SUNXI_GPC7_SDC2_CLK )
return BOOT_DEVICE_MMC2;
#endif
#ifdef CONFIG_SPL_NAND_SUPPORT
cfg = sunxi_gpio_get_cfgpin(SUNXI_GPC(2));
if( cfg == SUNXI_GPC2_NCLE )
return BOOT_DEVICE_NAND;
#endif
#ifdef CONFIG_SPL_MMC_SUPPORT
cfg = sunxi_gpio_get_cfgpin(SUNXI_GPF(2));
if( cfg == SUNXI_GPF2_SDC0_CLK )
return BOOT_DEVICE_MMC1;
#endif
/* if we are here, something goes wrong. Fall back on MMC */
return BOOT_DEVICE_MMC1;
}
{
struct mmc *mmc;
int err;
u32 boot_mode;
mmc_initialize(gd->bd);
/* We register only one device. So, the dev id is always 0 */
mmc = find_mmc_device(0);
if (!mmc) {
puts("spl: mmc device not found!!\n");
hang();
}
err = mmc_init(mmc);
if (err) {
printf("spl: mmc init failed: err - %d\n", err);
hang();
}
boot_mode = spl_boot_mode(); // sunxi的代码在此处直接返回了MMCSD_MODE_RAW
if (boot_mode == MMCSD_MODE_RAW) {
debug("boot mode - RAW\n");
mmc_load_image_raw(mmc);
#ifdef CONFIG_SPL_FAT_SUPPORT
} else if (boot_mode == MMCSD_MODE_FAT) {
debug("boot mode - FAT\n");
mmc_load_image_fat(mmc);
#endif
} else {
puts("spl: wrong MMC boot mode\n");
hang();
}
}
{
u32 image_size_sectors, err;
const struct image_header *header;
header = (struct image_header*)(CONFIG_SYS_TEXT_BASE -
sizeof(struct image_header));
/* read image header to find the image size & load address */
err = mmc->block_dev.block_read(0,
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR, 1,
(void *)header);
if (err <= 0)
goto end;
spl_parse_image_header(header);
/* convert size to sectors - round up */
image_size_sectors = (spl_image.size + mmc->read_bl_len- 1) /
mmc->read_bl_len;
/* Read the header too to avoid extra memcpy */
err = mmc->block_dev.block_read(0,
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR,
image_size_sectors, (void *)spl_image.load_addr); //此处确定了Uboot读取位置
end:
if (err <= 0) {
printf("spl: mmc blk read err - %d\n", err);
hang();
}
}
#define CONFIG_SYS_U_BOOT_MAX_SIZE_SECTORS (400)/* 200KB, enough for a full u-boot.bin */
全志A10 Bootload加载过程分析相关推荐
- 全志A10/A20 Bootloader加载过程分析
原文 : http://blog.csdn.net/allen6268198/article/details/12905425 从这里开始:http://linux-sunxi.org/Bootabl ...
- 【转】全志A10/A20 Bootloader加载过程分析
原文 : http://blog.csdn.net/allen6268198/article/details/12905425 从这里开始:http://linux-sunxi.org/Bootabl ...
- 转 A10/A20 Bootloader加载过程分析
A10/A20 Bootloader加载过程分析 注:由于全志A10和A20在加载Bootloader过程方面基本一致,下面仅以A20叙述,但同时也适用于A10.另外在不需要区分Cubieboard1 ...
- 转:A10/A20 Bootloader加载过程分析
来自:http://blog.csdn.net/allen6268198/article/details/12905425 A10/A20 Bootloader加载过程分析 注:由于全志A10和A20 ...
- Chromium插件(Plugin)模块(Module)加载过程分析
在Chromium中,每一个Plugin都对应一个Module,称为Plugin Module.一个Plugin Module可创建多个Plugin Instance.每一个Plugin Instan ...
- Android-GnssHal层gps.xxx.so查找与加载过程分析
Android-GnssHal层gps.xxx.so查找与加载过程分析 gps.xxx.so不是在系统编译的时候直接prelink的而是在运行阶段由gnss hal service动态查找并加载的; ...
- HarmonyOS镜像,HarmonyOS驱动加载过程分析
HDF(硬件驱动程序基础)驱动程序框架为驱动器开发人员提供驱动程序框架功能,包括驱动器加载,驱动服务管理和驱动程序消息传递机制.它旨在构建一个统一的驱动器架构平台,为驾驶开发人员提供更准确,更高效的开 ...
- vue项目结构及启动文件加载过程分析
vue项目结构及启动文件加载过程分析 一.vue项目结构 1.导入项目 准备好开发工具Visual Studio Code,导入生成的项目案例.我的Vue版本: 2.项目目录及文件说明 2.1.项目主 ...
- Bootloader加载过程分析
注:由于全志A10和A20在加载Bootloader过程方面基本一致,下面仅以A20叙述,但同时也适用于A10.另外在不需要区分Cubieboard1和Cubieboard2的情况下,统称为Cubie ...
最新文章
- 剑指offer:面试题37. 序列化二叉树
- BL1551模拟开关,封装SC70-6
- JUC多线程:CountDownLatch、CyclicBarrier、Semaphore同步器原理总结
- boost::multi_index模块相关的测试程序
- 谈谈C#的私有成员的一个有趣的现象!
- matlab 细化函数,MATLAB图像处理工具箱函数(细化篇).doc
- HLG 1532 The Bookcase
- vsftp匿名访问目录_怎么更改vsftp匿名用户的默认登录目录/var/ftp?
- MySQL删除命令_DELETE
- linux中搜索指定字符串的方法
- python车牌识别_Python-车牌识别
- 在wps里面怎么设置触发器_wps触发器怎么设置
- 百度迁徙大数据整理(2019-2020)
- 西方文化系列讲座之希腊文化(下)
- 贝叶斯算法(bayesian)在反垃圾邮件中的应用
- java开发-微信支付
- php照片管理源码,PHP图片管理 Coppermine Photo v1.5.22 多国语言版
- 【Unity】打包报错 com.android.buil.gradle.internal.tasks.workers$ActionFacade
- 百万级别中文文本分类
- rua出300道四则运算题
热门文章
- 安装tomcat和jdk 步骤
- Android之Notification制作多媒体控制器
- php 邮件发送验证码,发送验证码邮件有什么好的解决方案?
- linux下proc目录,Linux /proc目录详解
- 属性被分为八大类不包括_家庭软装八大类有哪些 软装八大类风格有什么特点...
- python对excel数据求和_96、python操作excel求和
- MySQL8权限,角色
- 【离散数学中的数据结构与算法】十一 错排问题
- 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念
- redis 思维导图