上节S3C2440移植uboot之支持NAND启动修改了代码支持了NAND启动。这节我们分析uboo使其支持NORFLASH的操作。

1.分析启动错误

  上一节启动uboot出现如下所示,我们搜索下错误代码Flash:

  上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码, 代码如下所示(位于arch/arm/lib/board.c):

  1. /*第二阶段*/
  2. void board_init_r(gd_t *id, ulong dest_addr) //gd uboot重定位地址
  3. {
  4. ... ...
  5.   puts("Flash: ");            //打印flash:
  6.   flash_size = flash_init(); //初始化nor_flash
  7.   if (flash_size > 0)
  8.   {
  9. ... ...
  10. print_size(flash_size, "\n"); //打印nor_flash的大小
  11.   }
  12.   else
  13.   {
  14.     puts(failed); //打印数组failed[]="*** failed ***\n";
  15.     hang(); //进入while中,并打印: ### ERROR ### Please RESET the board ###
  16.   }
  17. #if defined(CONFIG_CMD_NAND)
  18. puts("NAND: "); //打印NAND:
  19. nand_init(); //初始化nand_flah
  20. ... ...
  21. }

  从上面代码看出, board_init_r()会来初始化nor,由于新的uboot不支持nor,所以flash_init()初始失败,然后打印一串错误代码后,等待复位.

  由于2440在nand启动时,会自动装载nand的前4k内容,所以不支持norflash,因为nor的前4k内容被nand占用.

2.修改代码

  所以修改上面代码,避免nand启动一直卡住,将:

  1. else
  2. {
  3.   puts(failed); //打印数组failed[]="*** failed ***\n";
  4.   hang(); //进入while中,并打印: ### ERROR ### Please RESET the board ###
  5. }

  改为:

  1. else
  2. {
  3.   puts("0 KB\r\n"); //打印0 KB
  4. }

  在u-boot-2012.04.01\drivers\mtd\cfi_flash.c文件中增加定义

  1. #define _DEBUG 1
  2. #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)

  参考手册如下



  修改后代码如下:

  1. /*MX29LV160DB*/
  2. {
  3. .mfr_id = (u16)MX_MANUFACT, //厂家ID0x00C200C2 (读nor,便是0xc2)
  4. .dev_id = 0x2249, //设备ID
  5. .name = "MXIC MX29LV160DB",
  6. .uaddr = {
  7. [1] = MTD_UADDR_0x0555_0x02AA /* 数组[1]表示是16位nor,解锁地址为:0x555,0x2AA */
  8. },
  9. .DevSize = SIZE_2MiB,
  10. .CmdSet = P_ID_AMD_STD,
  11. .NumEraseRegions= 4, //4种不同的扇区规格
  12. .regions = {
  13. ERASEINFO(16*1024, 1),
  14. ERASEINFO(8*1024, 2),
  15. ERASEINFO(32*1024, 1),
  16. ERASEINFO(64*1024, 31),
  17. }
  18. },



  重新烧写看打印信息,出现这么一段ERROR:

  1. 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启动文件

  1. call_board_init_f:
  2. /*注意这里 ,把声明放文件开头编译会报错。只能放这里*/
  3. .globl base_sp
  4. base_sp:
  5. .long 0
  6. ldr r0,=0x00000000
  7. bl board_init_f
  8. /*unsigned int id 的值存在r0中,正好给board_init_r使用*/
  9. ldr r1, =_TEXT_BASE
  10. /*重新设置栈到之前的位置 指向原来addr_sp += 128;*/
  11. ldr sp,base_sp
  12. /*调用第二阶段代码*/
  13. bl board_init_r

  在board.c中将之前的栈的地址传回来



  同时在board.c中定义外部引用

  重新烧写

  1. usb 1 30000000 //使用usb下载到SDRAM上,1表示一直下载,直到完成
  2. //然后打开DNW,传输新的uboot.bin给usb
  3. protect off all //关闭nor的写保护
  4. erase 0 +7FFFF //擦除nor上的 0~7FFFF地址内容, (512k*1024-1)=+7FFF=擦除长度=512kb,要大于新的uboot.bin才行
  5. cp.b 30000000 0 80000 //将SDRAM上的新的uboot.bin,拷贝到nor上(烧写512K)
  6. protect off all
  7. erase 80000 8ffff /*擦除512K*/
  8. cp.b 32000000 80000 1000 /*从32000000拷贝1000字节数据到80000位置*/
  9. cmp.b 32000000 80000 1000 /*比较拷贝的数据是否相同*/



  现在我们的NORFLASH就支持了NOR的操作。

  下一节S3C2440移植uboot之支持NANDFLASH操作我们将移植uboot支持NANDFLASH的操作。

有任何问题,均可通过公告中的二维码联系我

S3C2440移植uboot之支持NORFLASH的更多相关文章

  1. mini2440移植uboot 2014.04(一)

    最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...

  2. mini2440移植uboot 2014.04(二)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...

  3. mini2440移植uboot 2014.04(三)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...

  4. 04.移植u-boot

    1.读readme获取信息    1.1 由Building the Software可知,需修改顶层makefile,指定架构和编译器    ifeq ($(HOSTARCH),$(ARCH))   ...

  5. S3C2440 移植最新5.2linux内核

    基于 移植uboot后. 1. 移植linux内核 1.1 下载源码 打开 https://www.kernel.org/ 直接肝最新的 5.2.8 下载完后,在ubuntu里解压备用. 1.2 搭建 ...

  6. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  7. 1.ok6410移植bootloader,移植u-boot,学习u-boot命令

    ok6410移植u-boot 既然是移植u-boot当然首先需要u-boot源码,这里的u-boot代码是由国嵌提供的. 一.配置编译u-boot A. 解压 u-boot 压缩文件 B. 进入解压生 ...

  8. S5PV210之Sate210-F DIY硬件,移植uboot,kernel,android 活动现在已经进入实施阶段吗,欢迎广大网友参与 !

    大家一起来diy 超低价四核的exynos4412或者Cortex A8S5pv210开源开发板 商业版Sate210已经完成了好久了.Sate4412 也已经出来.但是这两个接口非常全,主要是针对企 ...

  9. 3.移植uboot-使板卡支持nor、nand

    在上一章,我们添加了nor,nand启动后,uboot启动出如下图所示: 上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码, 代码如下 ...

  10. 移植U-Boot时遇到的问题

    1. 在lowlevel_init过程中,本来想实现一个串口直接打印字符串的过程,编译的时候出现了问题,说是发现代码执行段没有对齐:“unaligned opcodes detected in exe ...

随机推荐

  1. 深度掌握TypeScript中的重载【函数重载、方法重载】

    深度掌握TypeScript中的重载[函数重载.方法重载] 1. 函数重载,方法重载的重要性 著名前端流行框架底层都用到函数重载,例如:Vue3 底层源码就多处使用到带泛型的函数重载.很多前端面试更是 ...

  2. 【UniApp】-uni-app-全局数据和局部数据

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-全局样式和局部样式 那么了解完了全局样式和局部样式之后,这篇文章我再来给大家介绍一下 UniApp 中全局数据和局部数据 搭建演示环境 ...

  3. 公司敏感数据被上传Github,吓得我赶紧改提交记录

    大家好,我是小富- 说个事吧!最近公司发生了一个事故,有同事不小心把敏感数据上传到了GitHub上,结果被安全部门扫描出来了.这件事导致公司对所有员工进行了一次数据安全的培训.对于这个事我相信,有点工 ...

  4. [HDU4117] GRE

    Recently George is preparing for the Graduate Record Examinations (GRE for short). Obviously the mos ...

  5. [ABC245G] Foreign Friends

    Problem Statement There are $N$ people and $K$ nations, labeled as Person $1$, Person $2$, $\ldots$, ...

  6. python 解析网址信息

    python 解析网址信息 本篇文章主要讲述python 中如何解析一个url的信息. 1: requests获取网页信息 #!/usr/bin/python3 # -*- coding: UTF-8 ...

  7. 工具类图片转base64

    工具类图片转base64 import sun.misc.BASE64Encoder; import java.io.FileInputStream; import java.io.IOExcepti ...

  8. ElasticSearch之Delete index API

    删除指定的索引. 同时删除索引关联的数据.分片.元数据等相关的资源,因此执行前需要慎重. 命令样例如下: curl -X DELETE "https://localhost:9200/tes ...

  9. 【scikit-learn基础】--『监督学习』之 支持向量机回归

    在机器学习中,支持向量机(Support Vector Machine)算法既可以用于回归问题,也可以用于分类问题. 支持向量机(SVM)算法的历史可以追溯到1963年,当时前苏联统计学家弗拉基米尔· ...

  10. Python——第一章:用户交互

    变量 = input(提示语)首先会在屏幕中显示出提示语, 用户输入内容. 然后把用户输入的内容交给前面的变量 案例1: a = input("请输入第一个数字:") #括号里是提 ...