移植u-boot-2015.07-rc3之修改代码支持NorFlash启动并真正支持NorFlash读写(五)
2015-08-02 22:20
459 查看
上一节中讲到,以spl方式启动的uboot和以NorFlash启动的代码不能共用一套u-boot代码,所以这一节讲解修改目前的uboot代码支持NorFlash启动。当然你得先保存修改到目前的uboot代码,并且由于有前面修改的铺垫,这一节修改尽量言简意赅。
在修改之前啰嗦两句,uboot从NandFlash启动的主流程是:垫脚石中的代码拷贝NandFlash中的u-boot代码到内存A处并跳转到A处运行,在A处的uboot自动计算新的内存地址B并把A处的uboot代码拷贝至B处,跳转到B处执行。
uboot从NorFlash启动时由于cpu在NorFlash中就可以完成寻址、取指,所以uboot直接就可以在NorFlash中运行。因此uboot从NorFlash启动的话就没必要把NorFlash中的代码拷贝到内存A处了,NorFlash启动的uboot直接在NorFlash中运行后会自动计算出一个内存地址B,然后把NorFlash中的uboot拷贝到内存B处并跳转到B处的uboot执行。
下面就来修改现有的代码以支持NorFlash启动:
修改到这里,make编译,编译通过。使用JLink/JTag下载到NorFlash中,以nor启动就能看到uboot已经正常输出了。同样的,在drivers/mtd/cfi_flash.c中添加debug的宏定义以输出uboot读取到的NorFlash信息:
在上图中我们可以看到读取到NorFlash的ID已经不是f0 ea00 0了,现在读取到的是1 2249 0,对比这张NorFlash芯片的命令时序图可以确定现在读取到的NorFlash信息已经正确:
在上一节中我们讲到,uboot是拿读取到的这个Manufacturer ID、Device ID与drivers/mtd/jedec_flasf.c文件中的jedec_table[]数组比较,有匹配的数组元素uboot就认为支持这款NorFlash芯片,并根据数组元素中的信息来操作NorFlash。那么我们现在根据NorFlash的信息自己来添加一个数组元素,为了这个元素一定会被遍历到,把这个元素添加在宏开关之外。
结果上面的修改,uboot已经能支持NorFlash读写了,现在来测试一下:
本节实现了uboot从NorFlash启动,并能够支持NorFlash读写,往后的uboot移植包括NandFlash支持、DM9000支持、mtdparts命令支持、uboot裁剪及启动参数修改、yaffs文件系统烧写支持,在后面这些移植过程中就不区分spl启动还是NorFlash启动了,两种启动方式修改的过程和地方是完全一样的。
下一节修改代码支持NandFlash读写命令。
压缩命令: tar zcvf u-boot-2015.07rc3-serial_ok.tar.gz u-boot-2015.07-rc3 |
uboot从NorFlash启动时由于cpu在NorFlash中就可以完成寻址、取指,所以uboot直接就可以在NorFlash中运行。因此uboot从NorFlash启动的话就没必要把NorFlash中的代码拷贝到内存A处了,NorFlash启动的uboot直接在NorFlash中运行后会自动计算出一个内存地址B,然后把NorFlash中的uboot拷贝到内存B处并跳转到B处的uboot执行。
下面就来修改现有的代码以支持NorFlash启动:
make menuconfig 取消SPL启动 Boot images ---> [ ] SUPPORT_SPL |
smdk2440.h中: 23 #define CONFIG_S3C2440 24 #define CONFIG_SMDK2440 25 #define CONFIG_SYS_TEXT_BASE 0x0 |
start.S中: 取消在start.S中添加的CONFIG_SPL_BUILD宏开关 53 /*#if defined(CONFIG_SPL_BUILD)*/ 54 #ifdef CONFIG_S3C24X0 55 /* turn off the watchdog */ 56 57 # if defined(CONFIG_S3C2400) 58 # define pWTCON 0x15300000 128 /*#endif*/ /* CONFIG_SPL_BUILD */ 129 130 bl _main |
lowlevel_init.S中: 118 ldr r0, =SMRDATA 119 ldr r1, =CONFIG_SYS_TEXT_BASE 120 /*ldr r1, =0x0*/ 121 sub r0, r0, r1 |
crt0.S 100 sub sp, sp, #CONFIG_SYS_MALLOC_F_LEN 101 str sp, [r9, #GD_MALLOC_BASE] 102 #endif 103 /* 104 #if defined(CONFIG_SPL_BUILD) 105 106 ldr r0, = CONFIG_UBOOT_NAND_ADDR 107 ldr r1, =CONFIG_SYS_TEXT_BASE 108 ldr r2, =CONFIG_UBOOT_LENGTH 109 110 bl copy_code_to_sdram 111 112 ldr pc, =CONFIG_SYS_TEXT_BASE 113 114 #else 115 */ 116 /* mov r0, #0 not needed due to above code */ 117 ldr r0,=0x00000000 118 bl board_init_f 119 120 /*#endif*/ 121 122 #if ! defined(CONFIG_SPL_BUILD) |
drivers/mtd/cfi_flash.c中 #include <common.h> #include <asm/processor.h> #include <asm/io.h> #include <asm/byteorder.h> #include <asm/unaligned.h> #include <environment.h> #include <mtd/cfi_flash.h> #include <watchdog.h> //#define _DEBUG 1 #define debug(fmt, args...) printf(fmt, ##args) |
在上图中我们可以看到读取到NorFlash的ID已经不是f0 ea00 0了,现在读取到的是1 2249 0,对比这张NorFlash芯片的命令时序图可以确定现在读取到的NorFlash信息已经正确:
在上一节中我们讲到,uboot是拿读取到的这个Manufacturer ID、Device ID与drivers/mtd/jedec_flasf.c文件中的jedec_table[]数组比较,有匹配的数组元素uboot就认为支持这款NorFlash芯片,并根据数组元素中的信息来操作NorFlash。那么我们现在根据NorFlash的信息自己来添加一个数组元素,为了这个元素一定会被遍历到,把这个元素添加在宏开关之外。
drivers/mtd/jedec_flash.c文件中: 403 #endif 404 405 //MiNi2440 USE SPANSION's S29AL016J70TFI02 406 { 407 .mfr_id = (u16)0x00010001, 408 .dev_id = 0x2249, 409 .name = "SPANSION's S29AL016J70TFI02", 410 .uaddr = { 411 [1] = MTD_UADDR_0x0555_0x02AA /* x16 */ 412 }, 413 .DevSize = SIZE_2MiB, /*set SIZE_1MiB is OK*/ 414 .CmdSet = P_ID_AMD_STD, 415 .NumEraseRegions= 4, 416 .regions = { 417 ERASEINFO(16*1024,1), 418 ERASEINFO(8*1024,2), 419 ERASEINFO(32*1024,1), 420 ERASEINFO(64*1024,31), 421 } 422 }, 423 424 425 }; 426 427 static inline void fill_info(flash_info_t *info, const struct amd_flash_info *j edec_entry, ulong base) |
现在解释每一项的含以及为什么这么填: .mfr_id 是厂商ID 读取到的是0x01,观察数组中其他这一项的写法赋值(u16)0x00010001 .dev_id 设备ID 读取到的是2249,类比其他项赋值0x2249 .name 不重要,随便填 .uaddr 观察数组元素其他这一项的写法,可以知道16位时需要填1,8位填0,而我们的NorFlash采用的是16根数据线,所以是1;后面的MTD_UADDR_0x0555_0x02AA由于绝大多是这一项都是这么填的,先这样填,错了再回来修改 .DevSize NorFlash大小,当然是2M .CmdSet 先设置成 P_ID_AMD_STD,错了再改 .NumEraseRegions如果NorFlash由10块128k的区域、20块256k的区域组成,那么这个值就该填2,如果全部的块都是一样大的,那么就填1,查看手册可以看到这段话: Flexible Sector Architecture – One 16 Kbyte, two 8 Kbyte, one 32 Kbyte, and thirty-one 64 Kbyte sectors (byte mode) – One 8 Kword, two 4 Kword, one 16 Kword, and thirty-one 32 Kword sectors (word mode) 所以这一项填4 .regions 就是对.NumEraseRegions的具体表述,根据上面手册中的那段话就应该把这一项配置成 ERASEINFO(16*1024,1), ERASEINFO(8*1024,2), ERASEINFO(32*1024,1), ERASEINFO(64*1024,31), |
修改jedec_flash.c后保存make,把u-boot.bin下载到NorFlash中,可以看到已经能正常识别NorFlash大小了,但是有这么一句错误提示: Flash: ERROR: too many flash sectors 遇到这种莫名的问题就是要grep把这句话的源码出处查出来分析原因: root@ubuntu:/home/uboot/u-boot-2015.07-rc3# grep "too many flash sectors" * -nR drivers/mtd/cfi_flash.c:2149: printf("ERROR: too many flash sectors\n"); Binary file drivers/mtd/cfi_flash.o matches Binary file drivers/mtd/jedec_flash.o matches drivers/mtd/jedec_flash.c:482: printf("ERROR: too many flash sectors\n"); 打开两个文件,两个都把问题指向CONFIG_SYS_MAX_FLASH_SECT宏,这个宏原先定义的值太小,我们把这个值修改为128 smdk2440.h文件: #define CONFIG_SYS_MAX_FLASH_SECT (128) |
终端下: SMDK2410 # flinfo //查看NorFlash信息 Bank # 1: SPANSION's S29AL016J70TFI02 flash (16 x 16) Size: 2 MB in 35 Sectors AMD Legacy command set, Manufacturer ID: 0x01, Device ID: 0x2249 Erase timeout: 30000 ms, write timeout: 100 ms Sector Start Addresses: 00000000 RO 00004000 RO 00006000 RO 00008000 RO 00010000 RO 00020000 RO 00030000 RO 00040000 RO 00050000 RO 00060000 RO 00070000 RO 00080000 00090000 000A0000 000B0000 000C0000 000D0000 000E0000 000F0000 00100000 00110000 00120000 00130000 00140000 00150000 00160000 00170000 00180000 00190000 001A0000 001B0000 001C0000 001D0000 001E0000 001F0000 SMDK2410 # protect off all //取消NorFlash保护 Un-Protect Flash Bank # 1 SMDK2410 # erase 80000 8ffff //擦除80000到8ffff的数据 目前u-boot.bin大 //小为509kb,80000就是512k大小,不能擦到uboot . done Erased 1 sectors SMDK2410 # cp.b 30000000 80000 1000 //从0x30000000拷贝大小为0x1000的数据 //到NorFlash中0x80000处 Copy to Flash... 9....8....7....6....5....4....3....2....1....done SMDK2410 # cmp.b 30000000 80000 1000 //比较刚才拷贝的数据是否正确 Total of 4096 byte(s) were the same //全部相同说明读写都没问题 SMDK2410 # |
下一节修改代码支持NandFlash读写命令。
相关文章推荐
- 移植u-boot-2015.07-rc3之增加smdk2440开发板框架支持(一)
- 移植u-boot-2015.07-rc3之修改代码支持SDRAM和SPL启动(二)
- 移植u-boot-2015.07-rc3之修改代码支持串口(三)
- 移植u-boot-2015.07-rc3之修改代码支持NorFlash(四)
- 移植u-boot-2015.07-rc3之uboot裁剪及启动参数修改(九)
- 移植u-boot-2015.07-rc3之修改代码支持mtdparts命令(八)
- 移植u-boot-2015.07-rc3之修改代码支持DM9000网卡(七)
- 移植u-boot-2015.07-rc3之修改代码支持NandFlash(六)
- C++ 函数的重载 ,重写,隐藏
- 文件编程之系统调用方式
- C++ 输入函数 cin>>、cin.getline()和cin.get()区别
- C++ 读取键盘输入(cin/cin.getline()/cin.get()/cin.clear())
- Java--浅析Java中的final关键字
- Spring核心组件之Bean
- 在myeclipse的java web项目中手动添加jstl的步骤
- php笔记
- JAVA基础一大堆0802集合+泛型
- c#region
- 转Intellij支持Eclipse的代码格式化文件