uboot.2015.07移植之驱动NOR Flash(6)

移植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 符号代表的是包含有指针操作的结构体变量,它也可以被汇编文件使用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值