JZ2440的uboot-2009-11移植<3>_支持Nor Flash

这一节是对第二阶段的代码进行移植,来支持Nor Flash

硬件环境

Nor Flash介绍

Nor Flash 是一种存储芯片,支持掉电存储、支持Executensil On Chip(片上程序运行)。所以很适合作为嵌入式中启动程序的存储介质。但是由于低写速度和擦除速度影响着他的性能,在1~16MB的闪存中较为常见。

MX29LV160D T/B 芯片

  1. 2MB的Flash(8位/16位) ,JZ2440选用数据宽度的16位

  2. 扇区分布;

    | 大小 | 8K-Byte | 16K-Byte | 32K-Byte | 64K-Byte |
    | —- | ——- | ——– | ——– | ——– |
    | 块数 | 2 | 1 | 1 | 31 |

  3. Word/Byte 模式选择,如果选用Word时需要错位连接

  4. 工作电压2.7V~3.6V

  5. 引脚封装48pin-TSOP/48ball-XFLGA/WFBGA

  6. 至少可靠性保存数据20年,擦除、编程次数10万个周期

代码分析

我们之前顺腾摸瓜,从start.S->crt0.S,在crt0.S中分别调用了两个函数:board_init_f和board_init_r。

位置

1
2
board_init_f 位于u-boot-2016.09\common\Board_f.c
board_init_r 位于u-boot-2016.09\common\Board_r.c

board_init_f功能

1
2
3
4
5
6
7
主要是初始化下面这些
timer_init, /* initialize timer */
get_clocks,
env_init,
init_baud_rate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */

board_init_r功能

1
2
3
board_init,
initr_flash
initr_nand,

代码解读

所以我们知道nor flash的设置在board_init_r里面,

  1. 进入到static int initr_flash(void) ,位于(common\Board_r.c)

  2. 1
    2
    3
    4
    5
    6
    flash_info[i].flash_id = FLASH_UNKNOWN;从这一句我们可以看出来flash__info是存储Nor flash信息的结构体
    if (!flash_detect_legacy(cfi_fla sh_bank_addr(i), i))
    flash_detect_legacy(phys_addr_t base, int banknum)
    if (jedec_flash_match(info, info->start[0]))
    int jedec_flash_match(flash_info_t *info, ulong base) 将读取到的板子ID和已有板子信息做对比
    { int ret = 0; int i; ulong mask = 0xFFFF; if (info->chipwidth == 1) mask = 0xFF; for (i = 0; i < ARRAY_SIZE(jedec_table); i++) { if ((jedec_table[i].mfr_id & mask) == (info->manufacturer_id & mask) && (jedec_table[i].dev_id & mask) == (info->device_id & mask)) { fill_info(info, &jedec_table[i], base); ret = 1; break; } return ret; }
    1
    2
    3
    4
    5
    6
    7

    #### 代码修改1

    上面分析完 ,我们就可以知道,我们只要将上面函数的饿 jedec_table结构体增加我们对应的信息就行了

    ```c
    修改添加 static const struct amd_flash_info jedec_table[] 结构体
位置
1
drivers\mtd\Jedec_flash.c
添加
1
2
3
4
5
6
7
8
9
10
11
 在结构体补充相应的信息
{ /* sheldon add for JZ2440_V2 Nor_Flash : MT29LV160DB */ .mfr_id = (u16)MX_MANUFACT, //厂家 id .dev_id = 0x2249, //设备 id
.name = "MX29LV160D",
.uaddr = {
[1] = MTD_UADDR_0x0555_0x02AA /* 1:x16 ,NOR Flash 的解锁地址 */
},
.DevSize = SIZE_2MiB, //整个 nor flash 的大小 .CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 4, //擦除域,有几种大小的块就有几个擦除域, .regions = { //查看芯片手册设置擦除块 ERASEINFO(0x10000, 31), //参照芯片手册里面的块信息 ERASEINFO(0x08000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x04000, 1),
}

代码修改2

我们还要修改myff244.h的一个宏

/#define CONFIG_SYS_MAX_FLASH_SECT (128)

因为我们的最大快区大于19了

测试

重新编译uboot 下载到板子里面,就可以看到成功。

虽然我们看到串口打印出来的信息显示支持Flash,但是我们要测试下是否真的支持了

  1. 进入到uboot的命令行

  2. 输入:flinfo

    img

    可见扇区地址,扇区数、设备ID和厂商ID都是正确的。接下来进一步确认正确与否

  3. 查看命令

    md.b A0000 10 查看0x50000地址开始的10个字节数据()

  4. 拷贝命令

    cp 30008000 A0000 10 将30008000的10个字节拷贝到A0000(A0000的地址不能低于uboot.bin的size,如果低于u-boot.bin的size ,一旦拷贝就会损坏u-boot)

  5. 擦除命令

    erase A0000 Affff 擦除A0000~Affff之间的内容

    以上这几个操作均正常,说明设备已经支持Nor flash


    NOR FLASH 移植成功

-------------本文结束感谢您的阅读-------------