移植u-boot-2015.07之修改程序支持检测nor flash
1.修改一些基本的显示设置
- 先更改一下smdk2440.c里面的board_init函数里面的MACH_TYPE_SMDK2410为MACH_TYPE_S3C2440,这个参数与内核启动有关,暂时修改,具体作用不知道
- smdk2440.h里面的
#define CONFIG_SYS_PROMPT "SMDK2410 # "
改为#define CONFIG_SYS_PROMPT "SMDK2440 # "
2.使用新的检测方法检测NOR Flash
puts("Flash: ");
flash_size = flash_init();
if (!flash_detect_legacy(cfi_flash_bank_addr(i), i)) /* 此条件为假,不执行下面的语句 */
flash_get_size(cfi_flash_bank_addr(i), i);
/* 检测失败,返回 */
- 更改flash检测方法,不使用旧的flash_detect_legacy,直接使用flash_get_size(cfi_flash_bank_addr(i), i);
修改smdk2440.h里面的#define CONFIG_SYS_MAX_FLASH_SECT (19)为#define CONFIG_SYS_MAX_FLASH_SECT (128),原因是板子上的nor flash块区大于19
拷贝文件,重新编译下载,可以看到已经能够检测到nor flash的存在了
3.使用老的检测方法进行nor flash的检测
由于nor flash可以像内存一样的读写,所以相应来说添加 nor flash 的支持是非常容易的
使用flash_detect_legacy(cfi_flash_bank_addr(i), i)进行检测
在 jedec_flash.c 里面的jedec_table里面添加这样的语句,在最后一行添加
{
.mfr_id = (u16)MX_MANUFACT, //厂家 id
.dev_id = MX29LV160, //设备 id,芯片手册上面有,饿哦的是 0x2249
.name = "MXIC MX29LV160", //flash 描述。不重要
.uaddr = {
[1] = MTD_UADDR_0x0555_0x02AA /* x16 */ //解锁地址需要发出的命令,参照芯片手册
},
.DevSize = SIZE_2MiB, //整个 nor flash 的大小
.CmdSet = P_ID_AMD_STD, //
.NumEraseRegions = 4, //擦除域,有几种大小的块就有几个擦除域,
.regions = {
ERASEINFO(0x04000, 1), //参照芯片手册里面的块信息
ERASEINFO(0x02000, 2),
ERASEINFO(0x08000, 1),
ERASEINFO(0x10000, 31),
}
},在开头加上 #define MX29LV160 0x2249
由于在 Crt0.S 里面 ldr sp, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp */ 这条语句的作用,我们不用再去设置 SP 的新地址了.新版本的好处。
4.GD_START_ADDR_SP宏定义的实现
在 lib 目录下面的 asm-offsets.c 里面有下面的语句
#include <common.h>
#include <linux/kbuild.h>
int main(void)
{
/* Round up to make sure size gives nice stack alignment */
DEFINE(GENERATED_GBL_DATA_SIZE,
(sizeof(struct global_data) + 15) & ~15);
DEFINE(GENERATED_BD_INFO_SIZE,
(sizeof(struct bd_info) + 15) & ~15);
DEFINE(GD_SIZE, sizeof(struct global_data));
DEFINE(GD_BD, offsetof(struct global_data, bd));
#ifdef CONFIG_SYS_MALLOC_F_LEN
DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base));
#endif
DEFINE(GD_RELOCADDR, offsetof(struct global_data, relocaddr));
DEFINE(GD_RELOC_OFF, offsetof(struct global_data, reloc_off));
DEFINE(GD_START_ADDR_SP, offsetof(struct global_data, start_addr_sp));
return 0;
}
#ifndef __LINUX_KBUILD_H
#define __LINUX_KBUILD_H
#define DEFINE(sym, val) \
asm volatile("\n.ascii \"->" #sym " %0 " #val "\"" : : "i" (val))
#define BLANK() asm volatile("\n.ascii \"->\"" : : )
#define OFFSET(sym, str, mem) \
DEFINE(sym, offsetof(struct str, mem))
#define COMMENT(x) \
asm volatile("\n.ascii \"->#" x "\"")
#endif
#define DEFINE(sym, val) \
就是用来生成
asm volatile("\n.ascii \"->" #sym " %0 " #val "\"" : : "i" (val))#define sym val
这样的宏定义,这个宏定义使得在汇编文件里面可以轻易的使用 sym
这个宏定义所代表的值,汇编里面不支持指针类型的操作,有了这个宏定义,如果sym
符号代表的是包含有指针操作的结构体变量,它也可以被汇编文件使用。