S3C2440移植uboot之支持NORFLASH
上节S3C2440移植uboot之支持NAND启动修改了代码支持了NAND启动。这节我们分析uboo使其支持NORFLASH的操作。
1.分析启动错误
上一节启动uboot出现如下所示,我们搜索下错误代码Flash:
上面的Flash: *** failed ***
是属于uboot第二阶段函数board_init_r()里的代码, 代码如下所示(位于arch/arm/lib/board.c):
/*第二阶段*/
void board_init_r(gd_t *id, ulong dest_addr) //gd uboot重定位地址
{
... ...
puts("Flash: "); //打印flash:
flash_size = flash_init(); //初始化nor_flash
if (flash_size > 0)
{
... ...
print_size(flash_size, "\n"); //打印nor_flash的大小
}
else
{
puts(failed); //打印数组failed[]="*** failed ***\n";
hang(); //进入while中,并打印: ### ERROR ### Please RESET the board ###
}
#if defined(CONFIG_CMD_NAND)
puts("NAND: "); //打印NAND:
nand_init(); //初始化nand_flah
... ...
}
从上面代码看出, board_init_r()会来初始化nor,由于新的uboot不支持nor,所以flash_init()初始失败,然后打印一串错误代码后,等待复位.
由于2440在nand启动时,会自动装载nand的前4k内容,所以不支持norflash,因为nor的前4k内容被nand占用.
2.修改代码
所以修改上面代码,避免nand启动一直卡住,将:
else
{
puts(failed); //打印数组failed[]="*** failed ***\n";
hang(); //进入while中,并打印: ### ERROR ### Please RESET the board ###
}
改为:
else
{
puts("0 KB\r\n"); //打印0 KB
}
在u-boot-2012.04.01\drivers\mtd\cfi_flash.c文件中增加定义
#define _DEBUG 1
#define DEBUG //调试模式
打印如下调试信息
然后使用nor启动新的uboot,打印出调试信息:
打印出norflash的厂家ID=0xC2,设备ID=0x2249,显然uboot匹配读出的ID没有成功.
搜索JEDEC PROBE字段,找到位于board_init_r()->flash_init()->flash_detect_legacy():
如上图所示,该函数会进入board_init_r()->flash_init()->flash_detect_legacy()->jedec_flash_match(),里面会通过两个ID来匹配jedec_table[].
3.在匹配数组中添加我们的NORFLASH
接下来向jedec_table[]里添加norflash:MT29LV160DB(位于drivers/mtd/jedec_flash.c)
参考手册如下
修改后代码如下:
/*MX29LV160DB*/
{
.mfr_id = (u16)MX_MANUFACT, //厂家ID0x00C200C2 (读nor,便是0xc2)
.dev_id = 0x2249, //设备ID
.name = "MXIC MX29LV160DB",
.uaddr = {
[1] = MTD_UADDR_0x0555_0x02AA /* 数组[1]表示是16位nor,解锁地址为:0x555,0x2AA */
},
.DevSize = SIZE_2MiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 4, //4种不同的扇区规格
.regions = {
ERASEINFO(16*1024, 1),
ERASEINFO(8*1024, 2),
ERASEINFO(32*1024, 1),
ERASEINFO(64*1024, 31),
}
},
重新烧写看打印信息,出现这么一段ERROR:
ERROR:too many flash sectors
说flash的扇区太多了,搜索找到位于drivers/mtd/jedec_flash.c中:
显然是CONFIG_SYS_MAX_FLASH_SECT宏小于我们flash的扇区,所以打印ERROR。
所以修改CONFIG_SYS_MAX_FLASH_SECT宏定义(位于include/configs/smdk2440.h),并去掉之前定义的DEBUG调试宏(位于u-boot-2012.04.01\drivers\mtd\cfi_flash.c)
4.然后重新烧写
输入flinfo命令(flash info),就能查看flash的信息了:
然后通过uboot命令,检测nor的读写是否正确:
查看内容
往内存写数据
5.解决栈设置错误的问题
拷贝的数据和源数据内容不同,可能是我们的栈设置有问题。
(关于内存分布可以看这个图)内存分布
由于之前重定位,清除bss之后栈一直指向30000000的位置,每调用一个函数栈应该会变化。由于我们的设置问题,导致栈一直卡在30000000的位置,所以拷贝数据后再比较源数据和目的数据就会出错。
修改start.s启动文件
call_board_init_f:
/*注意这里 ,把声明放文件开头编译会报错。只能放这里*/
.globl base_sp
base_sp:
.long 0
ldr r0,=0x00000000
bl board_init_f
/*unsigned int id 的值存在r0中,正好给board_init_r使用*/
ldr r1, =_TEXT_BASE
/*重新设置栈到之前的位置 指向原来addr_sp += 128;*/
ldr sp,base_sp
/*调用第二阶段代码*/
bl board_init_r
在board.c中将之前的栈的地址传回来
同时在board.c中定义外部引用
重新烧写
usb 1 30000000 //使用usb下载到SDRAM上,1表示一直下载,直到完成
//然后打开DNW,传输新的uboot.bin给usb
protect off all //关闭nor的写保护
erase 0 +7FFFF //擦除nor上的 0~7FFFF地址内容, (512k*1024-1)=+7FFF=擦除长度=512kb,要大于新的uboot.bin才行
cp.b 30000000 0 80000 //将SDRAM上的新的uboot.bin,拷贝到nor上(烧写512K)
protect off all
erase 80000 8ffff /*擦除512K*/
cp.b 32000000 80000 1000 /*从32000000拷贝1000字节数据到80000位置*/
cmp.b 32000000 80000 1000 /*比较拷贝的数据是否相同*/
现在我们的NORFLASH就支持了NOR的操作。
下一节S3C2440移植uboot之支持NANDFLASH操作我们将移植uboot支持NANDFLASH的操作。
有任何问题,均可通过公告中的二维码联系我
S3C2440移植uboot之支持NORFLASH的更多相关文章
- mini2440移植uboot 2014.04(一)
最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...
- mini2440移植uboot 2014.04(二)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...
- mini2440移植uboot 2014.04(三)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...
- 04.移植u-boot
1.读readme获取信息 1.1 由Building the Software可知,需修改顶层makefile,指定架构和编译器 ifeq ($(HOSTARCH),$(ARCH)) ...
- S3C2440 移植最新5.2linux内核
基于 移植uboot后. 1. 移植linux内核 1.1 下载源码 打开 https://www.kernel.org/ 直接肝最新的 5.2.8 下载完后,在ubuntu里解压备用. 1.2 搭建 ...
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- 1.ok6410移植bootloader,移植u-boot,学习u-boot命令
ok6410移植u-boot 既然是移植u-boot当然首先需要u-boot源码,这里的u-boot代码是由国嵌提供的. 一.配置编译u-boot A. 解压 u-boot 压缩文件 B. 进入解压生 ...
- S5PV210之Sate210-F DIY硬件,移植uboot,kernel,android 活动现在已经进入实施阶段吗,欢迎广大网友参与 !
大家一起来diy 超低价四核的exynos4412或者Cortex A8S5pv210开源开发板 商业版Sate210已经完成了好久了.Sate4412 也已经出来.但是这两个接口非常全,主要是针对企 ...
- 3.移植uboot-使板卡支持nor、nand
在上一章,我们添加了nor,nand启动后,uboot启动出如下图所示: 上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码, 代码如下 ...
- 移植U-Boot时遇到的问题
1. 在lowlevel_init过程中,本来想实现一个串口直接打印字符串的过程,编译的时候出现了问题,说是发现代码执行段没有对齐:“unaligned opcodes detected in exe ...
随机推荐
- 【matlab混沌理论】1.4.双摆杆的不同参数模型
双摆杆运动模型.初始条件的微小差异,会导致千差万别的运动现象,这是混沌理论重要体现.主要考虑初始条件有两摆杆长度.质量.初始摆杆角度.重力加速度. input: % 参数定义 L1 = 1; % 第一 ...
- Mybatis-Flex核心功能之@Column
1.是什么? MyBatis-Flex 提供了 @Column 用来对字段进行更多的配置 public @interface Column { /** * 字段名称 */ String value() ...
- 一款开源免费美观的WinForm UI控件库 - ReaLTaiizor
前言 今天推荐一款基于MIT license开源.免费.美观的.NET WinForm UI控件库:ReaLTaiizor. 什么是WinForm? WinForm是一个传统的桌面应用程序框架,它基于 ...
- ElasticSearch之Clear cache API
本方法用于清理缓存. 命令样例如下: curl -X POST "https://localhost:9200/testindex_001/_cache/clear?pretty" ...
- ElasticSearch之Search settings
相关参数 indices.query.bool.max_clause_count 本参数当前已失效. search.max_buckets 本参数用于控制在单个响应中返回的聚合的桶的数量. 默认值为6 ...
- DVWA CSRF:Cross-site request forgery(跨站请求伪造)全等级
CSRF:Cross-site request forgery(跨站请求伪造) 目录: CSRF:Cross-site request forgery(跨站请求伪造) 1.Low 2.Medium 3 ...
- c#5.0/6.0/7.0
发现很多.net 程序员水平一直停留在c#3.0阶段,现在来整理下c#5.0/6.0/7.0新语法新特性. 人生需要不断充电,不断去get新技能而不是固步自封,对于我自己而言,虽不盲目追求新技术,但每 ...
- 微信小程序实时噪声分贝
为了做一个能够检测实时噪声分贝的小程序,网上找了很多例子,基本没有完整的代码,手写了一个,话不多说直接上效果图 实现实时录音的功能,并且能够根据声音分贝大小转动仪表盘显示实时的分贝,运用echart实 ...
- Redis系列(二):解读redis.conf文件、配置、初步使用
一.解读redis.conf配置文件 # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k =&g ...
- C++篇:第六章_指针_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 六.指针 (一)指针规则 两个指针不能进行加法运算,因为指针是变量,其值是另一个 ...