上一篇文章我们已经修改了uboot源码使其能够正常打印输出了,但是输出停到了nand启动那里,所以这篇文章就来记录如何修改源码使uboot支持NAND启动。

原来的代码在链接时加了”-pie”选项, 使得u-boot.bin里多了”(.rel)”, “*(.dynsym)”使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)。

1.去掉 “-pie”选项
在文件:arch/arm/config.mk的第75行,去掉:LDFLAGS_u-boot += -pie

2.在这之前会编写好一个init.c程序,拿到这里来用,init.c程序的编写会放到另一篇博客中,这里直接提供代码,代码链接为:init.c程序
将之前写好的文件init.c放到board/samsung/smdk2440目录, 并且修改Makefile,将init.c编译进去如下图:

3.修改start.S文件
start.S中有代码:

/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f:ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ldr r0,=0x00000000bl  board_init_f

将这一部分代码改为:

ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8-byte alignment for ABI compliance *//* lyy */bl   nand_init_llmov r0, #0ldr r1, _TEXT_BASEldr r2, _bss_end_ofsbl copy_code_to_sdrambl clear_bssldr pc,=call_board_init_f/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f:ldr r0,=0x00000000bl  board_init_f/* unsigned int的值存在r0里,正好给board_init_r */ldr r1, _TEXT_BASE/* 调用第二阶段的代码*/bl board_init_r

4.删除重定位代码:
这下面的一大段代码是重定位代码,我们在这里不需要它,需要将其全部删除

/*------------------------------------------------------------------------------*//** void relocate_code (addr_sp, gd, addr_moni)** This "function" does not return, instead it continues in RAM* after relocating the monitor code.**/.globl  relocate_code
relocate_code:mov r4, r0  /* save addr_sp */mov r5, r1  /* save addr of gd */mov r6, r2  /* save addr of destination *//* Set up the stack                         */
stack_setup:mov sp, r4adr r0, _startcmp r0, r6beq clear_bss       /* skip relocation */mov r1, r6          /* r1 <- scratch for copy_loop */ldr r3, _bss_start_ofsadd r2, r0, r3      /* r2 <- source end address     */copy_loop:ldmia   r0!, {r9-r10}       /* copy from source address [r0]    */stmia   r1!, {r9-r10}       /* copy to   target address [r1]    */cmp r0, r2          /* until source end address [r2]    */blo copy_loop#ifndef CONFIG_SPL_BUILD/** fix .rel.dyn relocations*/ldr r0, _TEXT_BASE      /* r0 <- Text base */sub r9, r6, r0      /* r9 <- relocation offset */ldr r10, _dynsym_start_ofs  /* r10 <- sym table ofs */add r10, r10, r0        /* r10 <- sym table in FLASH */ldr r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */add r2, r2, r0      /* r2 <- rel dyn start in FLASH */ldr r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */add r3, r3, r0      /* r3 <- rel dyn end in FLASH */
fixloop:ldr r0, [r2]        /* r0 <- location to fix up, IN FLASH! */add r0, r0, r9      /* r0 <- location to fix up in RAM */ldr r1, [r2, #4]and r7, r1, #0xffcmp r7, #23         /* relative fixup? */beq fixrelcmp r7, #2          /* absolute fixup? */beq fixabs/* ignore unknown type of fixup */b   fixnext
fixabs:/* absolute fix: set location to (offset) symbol value */mov r1, r1, LSR #4      /* r1 <- symbol index in .dynsym */add r1, r10, r1     /* r1 <- address of symbol in table */ldr r1, [r1, #4]        /* r1 <- symbol value */add r1, r1, r9      /* r1 <- relocated sym addr */b   fixnext
fixrel:/* relative fix: increase location by offset */ldr r1, [r0]add r1, r1, r9
fixnext:str r1, [r0]add r2, r2, #8      /* each rel.dyn entry is 8 bytes */cmp r2, r3blo fixloop
#endifclear_bss:
#ifndef CONFIG_SPL_BUILDldr r0, _bss_start_ofsldr r1, _bss_end_ofsmov r4, r6          /* reloc addr */add r0, r0, r4add r1, r1, r4mov r2, #0x00000000     /* clear                */clbss_l:str r2, [r0]        /* clear loop...            */add r0, r0, #4cmp r0, r1bne clbss_lbl coloured_LED_initbl red_led_on
#endif

4.修改CONFIG_SYS_TEXT_BASE为0x33f00000
在代码中跳转到 :_TEXT_BASE

/* lyy */bl   nand_init_llmov r0, #0ldr r1, _TEXT_BASE

跳转到lowlevel_init.S中的这里:

_TEXT_BASE:.word   CONFIG_SYS_TEXT_BASE

然后点击:CONFIG_SYS_TEXT_BASE
跳转到smdk2440.h中的这里:

#define CONFIG_SYS_TEXT_BASE    0x0

将CONFIG_SYS_TEXT_BASE的值改为:0x33f00000
5.修改board_init_f(arch/arm/lib/board.c中), 把relocate_code去掉

//relocate_code(addr_sp, id, addr);

同时去掉下面两句代码:

/** reserve memory for U-Boot code, data & bss* round down to next 4 kB limit*///addr -= gd->mon_len;//addr &= ~(4096 - 1);

然后在这个函数的最后面加上:

return (unsigned int)id;

函数添加了int类型返回值,那么函数定义时的类型就得设置一下如下:

void board_init_f(ulong bootflag)
改为:

unsigned int board_init_f(ulong bootflag)

同时头文件中也需要定义类型:
在/include/common.h中275行有如下声明:

/* arch/$(ARCH)/lib/board.c */
void    board_init_f  (ulong) __attribute__ ((noreturn));
void    board_init_r  (gd_t *, ulong) __attribute__ ((noreturn));

将其改为:

/* arch/$(ARCH)/lib/board.c */
unsigned int board_init_f  (ulong);
void    board_init_r  (gd_t *, ulong);

__attribute__ ((noreturn));这句代码是指定没有返回值,所以需要去掉。

6.修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面
链接脚本为:/arch/arm/cpu/u-boot.lds
打开前面有一段:

.text :{__image_copy_start = .;CPUDIR/start.o (.text)*(.text)}

将其改为:

.text :{__image_copy_start = .;CPUDIR/start.o (.text)board/samsung/smdk2440/libsmdk2440.o (.text)*(.text)}

libsmdk2440.o包含了start.S, init.c, lowlevel.S,所以只需要把它放前面就行。

这些修改完之后,编译,烧写,看看效果:

这是我们将开关设置为NAND启动后的效果,至少现在已经支持了NAND启动。目前两种启动都可以了,接下来就是支持nand flash 和nor flash了,这样就可以通过NAND启动和NOR启动完全启动uboot了,我将放到另外两篇文章中讲,因为移植过程较为复杂,最后我会给出相关的移植顺序以及阅读文章的顺序,以及制作整个补丁,大家只需要打补丁,就可以一次性移植好这个uboot。

喜欢我的可以加加关注,同时也可以加我qq和微信一起学习交流
qq:1126137994
微信:liu1126137994
更多资源分享,共同进步!

移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动相关推荐

  1. 移植u-boot-2012.04.01到jz2440开发板

    今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版,通过记录学习分享,与大家一起进步!!! 1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2,建立 ...

  2. 移植Linux 3.4.2内核到JZ2440开发板(超精讲)

    Linux 3.4.2内核移植到JZ2440开发板 0.开发环境 虚拟机:VMware workstation 16 pro 宿主机操作系统:Ubuntu 16.04 开发板:JZ2440 移植内核版 ...

  3. jz2440开发板移植U-boot之修改代码支持DM9000网卡

    今天我们来移植U-boot到jz2440开发板,修改代码支持DM9000网卡.查看之前写的移植记录请点击链接:点击查看之前的移植记录 现在大多数开发板都支持DM9000网卡.我们的U-boot源码里面 ...

  4. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

  5. 移植u-boot-2012.04.01到JZ2440(二:分析启动流程)

    目录 2. 分析启动流程 2.1 u-boot.lds链接脚本 2.2 start.S启动文件     2.2.1 设置异常向量表     2.2.2 设置SVC管理模式.关看门狗.关中断.设置时钟频 ...

  6. 移植uboot-2012.04.01到JZ2440(六 设置mtd分区表)

    前言:这节继续移植uboot,让它支持mtd分区 一.mtd分区规划及其作用 uboot支持各种设备之后,接下来的工作就是烧写内核.烧写文件系统,所以需要对整块Nand Flash的空间作以规划,大致 ...

  7. (2012.01.12-2012.04.01)八十二天的学习小记

    (2012.01.12-2012.04.01)八十二天的学习小记   哈哈,原来又是过了八十二个日子了,真快啊~这次发的学习小记日期记录时间有点长,回看1月份的东西,原来已经隔了八十多个日子了,对于这 ...

  8. 五、移植u-boot-2016.03到Jz2440之修改代码支持NOR Flash

    5. 移植u-boot-2016.03修改代码支持NOR Flash 从上一节把uboot烧写到NAND启动后,最后打印出Flash: 0 Bytes,如下图所示.我们的Jz2440开发板的NOR F ...

  9. 移植QT5.6到韦东山JZ2240嵌入式开发板(史上最最最最最详细的QT移植教程)

    首先感谢http://blog.csdn.net/lizuobin2/article/details/52673494的博主,应该是韦东山团队的老师,说实话,拿到JZ2440的板子很长时间了,每次都有 ...

最新文章

  1. 使用React Router以编程方式导航
  2. 创业维艰,但我未曾放弃——一位90后创业者的自白
  3. qt windows通过usb获取手机电量_华为手机系统故障修复及系统升级
  4. python数据分析图_Python数据分析:手把手教你用Pandas生成可视化图表的教程
  5. 一个奇葩的网络问题,把技术砖家搞蒙了
  6. SQLSERVER数据仓库的构建与分析
  7. Genome Research封面文章|张勇课题组开发方法绘制胚胎发育早期转录因子结合位点图谱...
  8. ARCGIS知乎上的好文章
  9. linux引导过程和服务控制
  10. windows系统中Dotnet core runtime 安装后,无法启动次程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的解决方法...
  11. 常用js框架,js库
  12. Python 微信表情包打印发送中秋快乐
  13. deepin驱动精灵_解决宏基笔记本没有Qualcomm_Atheros_QCA9377无线驱动
  14. IDEA中自动导包设置及自动导包快捷键
  15. IDEA的依赖包报红问题
  16. Visual Studio Installer 无法下载安装,长时间停留在下载界面。vs_community__1502218517.1623916988.exe
  17. html右侧下拉菜单怎么写,HTML中下拉菜单使用
  18. python身份证号码校验
  19. excel拆分单元格内容_Excel 快捷键合集
  20. vue如何整个页面添加loading

热门文章

  1. 第十二期:七种优秀的浏览器兼容性测试工具
  2. java学习(122):treeset自定义排序
  3. 程序根据手机机型设置自定义底部导航距离
  4. vue与elementUI中给el-input绑定键盘按键--按键修饰符
  5. CSS之创建等高列布局之一
  6. html5 支持音频格式,html5中audio支持音频格式
  7. tomcat常用功能
  8. 序列化与反序列化的简单认识
  9. 树莓派安装vnc server并设置自启动
  10. 拦截器 过滤器 监听器 的区别