tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 启动
我们知道 s5pv210启动方式有非常多种,sd卡和nand flash 启动就是当中的两种,前面我们实现的都是基于sd卡启动,这节我们開始实现从nand flash 启动:
从 NAND 启动 u-boot,须要 BL1 初始化 NAND 控制器,然后从 NAND 拷贝 BL2 到 DDR 内存。这里的BL1 即我们移植的 u-boot-spl.bin,BL2 即我们移植的 u-boot.bin。在 u-boot.bin 中的 NAND 驱动比較大,它包括了非常多功能,而 u-boot-spl.bin 中仅仅须要从 NAND 拷贝BL2 到 DDR 即可了,因此我们能够在 u-boot-spl.bin
进行简单的 NAND 控制器初始化,然后使用三星提供的带 8 位硬件 ECC 的 NAND 拷贝函数来拷贝 u-boot.bin 到 DDR 内存。我们改动 board/samsung/tiny210/tiny210.c 中的 copy_bl2_to_ram 函数,在这个函数中首先推断当前是从 SD 卡启动还是从 NAND 启动,假设是从 NAND 启动则进行 NAND 初始化,然后从 NAND 拷贝BL2 到 DDR 内存,假设是从 SD 卡启动,则从 SD 卡拷贝 BL2 到 DDR 内存。我们通过读取
OMR 寄存器来推断 S5PV210 当前是从哪个设备启动的。參考手冊 Table 6-3,手冊上并没有说 OM 寄存器的地址,我是參考的三星原厂的 u-boot 代码。代码中都有具体凝视,具体请看代码:
void copy_bl2_to_ram(void)
{
/*
** ch: 通道
** sb: 起始块
** bs: 块大小
** dst: 目的地
** i: 是否初始化
*/
#define CopySDMMCtoMem(ch, sb, bs, dst, i) \
(((u8(*)(int, u32, unsigned short, u32*, u8))\
(*((u32 *)0xD0037F98)))(ch, sb, bs, dst, i)) #define MP0_1CON (*(volatile u32 *)0xE02002E0)
#define MP0_3CON (*(volatile u32 *)0xE0200320)
#define MP0_6CON (*(volatile u32 *)0xE0200380) #define NF8_ReadPage_Adv(a,b,c) (((int(*)(u32, u32, u8*))(*((u32 *)0xD0037F90)))(a,b,c)) u32 bl2Size = 250 * 1024; // 250K u32 OM = *(volatile u32 *)(0xE0000004); // OM Register
OM &= 0x1F; // 取低5位 if (OM == 0x2) // NAND 2 KB, 5cycle 8-bit ECC
{
u32 cfg = 0;
struct s5pv210_nand *nand_reg = (struct s5pv210_nand *)(struct s5pv210_nand *)samsung_get_base_nand(); /* initialize hardware */
/* HCLK_PSYS=133MHz(7.5ns) */
cfg = (0x1 << 23) | /* Disable 1-bit and 4-bit ECC */
/* 以下3个时间參数略微比计算出的值大些(我这里依次加1),否则读写不稳定 */
(0x3 << 12) | /* 7.5ns * 2 > 12ns tALS tCLS */
(0x2 << 8) | /* (1+1) * 7.5ns > 12ns (tWP) */
(0x1 << 4) | /* (0+1) * 7.5 > 5ns (tCLH/tALH) */
(0x0 << 3) | /* SLC NAND Flash */
(0x0 << 2) | /* 2KBytes/Page */
(0x1 << 1); /* 5 address cycle */ writel(cfg, &nand_reg->nfconf); writel((0x1 << 1) | (0x1 << 0), &nand_reg->nfcont);
/* Disable chip select and Enable NAND Flash Controller */ /* Config GPIO */
MP0_1CON &= ~(0xFFFF << 8);
MP0_1CON |= (0x3333 << 8);
MP0_3CON = 0x22222222;
MP0_6CON = 0x22222222; int i = 0;
int pages = bl2Size / 2048; // 多少页
int offset = 0x4000 / 2048; // u-boot.bin在NAND中的偏移地址(页地址)
u8 *p = (u8 *)CONFIG_SYS_SDRAM_BASE;
for (; i < pages; i++, p += 2048, offset += 1)
NF8_ReadPage_Adv(offset / 64, offset % 64, p);
}
else if (OM == 0xC) // SD/MMC
{
u32 V210_SDMMC_BASE = *(volatile u32 *)(0xD0037488); // V210_SDMMC_BASE
u8 ch = 0; /* 參考S5PV210手冊7.9.1 SD/MMC REGISTER MAP */
if (V210_SDMMC_BASE == 0xEB000000) // 通道0
ch = 0;
else if (V210_SDMMC_BASE == 0xEB200000) // 通道2
ch = 2;
CopySDMMCtoMem(ch, 32, bl2Size / 512, (u32 *)CONFIG_SYS_SDRAM_BASE, 0);
}
}
又一次编译,但编译之前要加入nand所用的头文件:#include <asm/arch/nand_reg.h>成功生成 spl/tiny210-spl.bin 和 u-boot.bin,将它们所有复制到 tftp server文件夹下,然后就能够使用上一节移植的
u-boot 来烧写最新的 u-boot 到 NAND FLASH。
首先从 SD 卡启动开发板 ,擦除整个 NAND FLASH:
使用 tftpboot 下载 tiny210-spl.bin 到 DDR 的起始地址 0x20000000
烧写 tiny210-spl.bin 到 NAND 的 0 地址:
使用 tftpboot 下载 u-boot.bin 到 DDR 的起始地址 0x20000000
烧写 u-boot.bin 到 NAND FLASH 的 0x4000 地址(0x0~0x3FFF 预留给 tiny210-spl.bin)
拨动拨码开关,从 NAND 启动开发板,能够观察到u-boot正常启动了,如今我们的u-boot功能基本都实现了,我把代码放在这里 ,有兴趣的朋友能够看看:tiny210_u-boot_201404_v2.0,之后即可我们都代码和功能的完好。
tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 启动的更多相关文章
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 8位硬件ECC
这节我们实现nand的ecc,保存环境变量到nand flash 中.然后把我们之前的led灯烧写到nand flash 中.开机启动.在 tiny210.h 中定义宏 CONFIG_S5PV210_ ...
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)
在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的信息打印. 在上节.我们看到调用 relocate_code 重定位.在 u-boot 的帮助文档 doc/README.arm-rel ...
- [学习资料] Tiny210(S5PV210) u-boot移植
Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...
- Spring boot 基于Spring MVC的Web应用和REST服务开发
Spring Boot利用JavaConfig配置模式以及"约定优于配置"理念,极大简化了基于Spring MVC的Web应用和REST服务开发. Servlet: package ...
- 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)
本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...
- 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁
spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...
- Spring boot 基于注解方式配置datasource
Spring boot 基于注解方式配置datasource 编辑 Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...
- Spring Boot的自动配置原理及启动流程源码分析
概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...
随机推荐
- 老漏洞easy击:CVE-2012 0158占顶!
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXF1c2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- Andriod Studio科学文章——4.常见问题解答有关编译
1.android未安装支持库 只有编译,下面的例子演示了提样: Could not find any version that matches com.android.support:appcomp ...
- Codeforces Round #311 (Div. 2) E - Ann and Half-Palindrome(字典树+dp)
E. Ann and Half-Palindrome time limit per test 1.5 seconds memory limit per test 512 megabytes input ...
- traceroute原理
traceroute原理 ICMP ICMP全称为Internet Control Message Protocol,即,网络控制报文协议. 当一个IP数据报发送失败时,最后一个路由器会向发送发传递一 ...
- AIX 常用命令和知识
BOOTLIST:#bootlist -m normal -o (查看bootlist)#bootlist -m normal (设置bootlist为空,谁要在我机器上执行我就要哭了)#boot ...
- [转]MVP模式开发
转自:http://www.jianshu.com/p/f7ff18ac1c31 基于面向协议MVP模式下的软件设计-(iOS篇) 字数9196 阅读505 评论3 喜欢11 基于面向协议MVP模式下 ...
- 第一次用IIS发布网站时遇到的两个问题
1. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的属性“targetFramework”.请注意属性 ...
- iOS的属性声明:retain和strong的区别
声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在声明Block时,使用strong和retain会有截然不同的效果.strong会等于copy,而r ...
- 抽空通过简书网学习了一下console,感觉高大上!
抽空看了一下简书中关于console的文章,为了便于自己今后查看,自己写了一遍!原文地址:http://www.jianshu.com/p/f961e1a03a56 测试代码在最下面 1.consol ...
- JSP 核心 (等待更新)
开篇:JSP的等同于servlet 编译器将其转化为.class,后执行.一旦配置在Tomcat webapps,运行访问后,在Tomcat--->work文件内出现java文件,其内容即为转化 ...