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

上一篇文章我们已经修改了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
更多资源分享,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++深度剖析教程4】C++的二阶构造模式

今天学习的是C中的二阶构造模式&#xff0c;二阶构造模式只是设计模式中的简单的模式&#xff0c;是一种软件设计的方法&#xff0c;并没有我们想象的那么高深&#xff0c;设计模式也是一样&#xff0c;只不过是一系列的设计方法&#xff0c;只要我们懂得了原理&#xff0c;那么…

【C++深度剖析教程5】C++中类的静态成员函数

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交流资源…

eclipse 工程中使用引入maven项目遇到maven-resources-plugin:2.6 找不到

1.开始eclipse 配置本地库 首先是从maven 官网下载maven 组件 其次是配置 maven 环境和java 配置jdk 类似这里就不做介绍了 配置完环境后修改\apache-maven-3.3.9\conf\settings.xml 中的<localRepository> 设置本地仓库 然后配置eclipse 下面图中执行较为重要&#xff…

移植uboot之修改代码支持NorFlash记录

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天我们的任务是修改uboot源码支持NorFlash。 上两篇关于uboot移植的文章&#xff0c;我们修改了uboot源代码&#xff0c;支持了串口的输出&#xff…

移植uboot之修改代码支持NorFlash记录续集

接着上一篇文章写的内容&#xff08;上一篇文章链接&#xff1a;移植uboot之修改代码支持NORFLASH&#xff09;&#xff0c;上一篇结尾测试flash的擦除读写功能&#xff0c;结果无法写flash&#xff0c;卡在了这里&#xff1a; 前面已经擦除成功&#xff0c;这里写内容写不进…

C#开发终端式短信的原理和方法

本文示例源代码或素材下载 简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物&#xff0c;通讯发达的今天短信已经成为人们交流的重要手段&#xff0c;其中也蕴含着巨大的市场和经济利益&#xff0c;掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星。本文…

移植uboot之修改代码支持NorFlash记录续集二

先说一个事&#xff1a;我会在最后把移植好的uboot&#xff0c;内核&#xff0c;分别做一个补丁文件&#xff0c;以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~ 上一个移植uboot续集&#xff0c;我们解决了无法写flash的问题&#xff…

Mysql function(函数)

1.mysql 拼接函数 1. 1CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候&#xff0c;只要其中一个是NULL,那么将返回NULL 1.2 CONCAT_WS(separator,str1,str2,...)说明 : string1,string2代表字符串,concat_ws 代表 conca…

【C++深度剖析教程6】C++之友元

这几天在复习数学考试&#xff0c;都没有学C&#xff0c;今天抽空来学一点。 什么是友元&#xff1f; 友元是C中的一种关系友元发生在函数与类之间或者类与类之间友元关系是单向的&#xff0c;不能传递 在具体讲解友元的性质之前&#xff0c;我们先来看看一个程序&#xff…

call stack and stack buffer overflow

http://en.wikipedia.org/wiki/Call_stack http://en.wikipedia.org/wiki/Stack_buffer_overflow Stack_buffer_overflow里提到的frame pointer 的位置不一样&#xff0c;不同的系统实现应该是不一样的。 运行时的栈是从高地址向低地址分配的&#xff0c;堆是从低地址向高地址…

【C++深度剖析教程8】C++的操作符重载的概念

之前学习了类的函数重载的概念&#xff0c;今天学习操作符重载的概念。在这之前我们先看一个例子&#xff1a; 上面是一个复数的加法&#xff0c;a为复数的实部&#xff0c;b为复数的虚部&#xff0c;在main函数里我想实现复数c1与c2的加法。很显然&#xff0c;正常的号操作符…

大数据开发者应该知道的分布式系统 CAP 理论

无论你是一个系统架构师&#xff0c;还是一个普通开发&#xff0c;当你开发或者设计一个分布式系统的时候&#xff0c;CAP理论是无论如何也绕不过去的。本文就来介绍一下到底什么是CAP理论&#xff0c;如何证明CAP理论&#xff0c;以及CAP的权衡问题。 CAP理论概述 CAP理论&a…

设计模式记--Observer Pattern观察者模式

观察者模式——定义了对象之间的一对多依赖&#xff0c;这样一来&#xff0c;当一个对像改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新. 从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需要有发布者(Publish),也可称为被观察的目标 (…

【C++深度剖析教程9】初探C++标准库

在这之前&#xff0c;我写的C程序不能叫做标准的C程序&#xff0c;因为里面写的大多数还带有C语言的影子。今天我们来学习C标准库。 首先看一下例子&#xff1a;操作符<<的原生意义是按位左移。那么我们重载这个操作符&#xff0c;将变量或者常量&#xff0c;左移到一个…

员工考核UI网页界面(PS大屏文件资料)

现分享人员管理可视化数据统计网页UI、员工考核数据可视化UI网页界面模版的UI源文件&#xff0c;供UI设计师们快速获取PSD源文件完成工作。 若需更多 大屏组件&#xff0c;请移步小7的另一篇文章&#xff1a;数据可视化大屏组件&#xff0c;大屏PSD设计源文件(大屏UI设计规范)…

docker 使用中遇到的问题

1.执行docker run hello 命令建立镜像过程中报错 开始以为是加速器的问题&#xff0c;将/etc/docker/daemon.json 文件删除还是不行 后来执行了这两条命令&#xff1a;就不报错了如下图&#xff1a; systemctl daemon-reloadsystemctl restart docker.service 参考&#xff1…

maven 解决冲突

1.Maven之jar包冲突解决&#xff08;理解maven 产生冲突的原因&#xff09; 导致jar包冲突的原因 1、mvn的传递依赖特性&#xff1a;mvn编译打包除了会引入直接申明的依赖&#xff0c;还会引入间接申明的依赖 2、mvn的依赖仲裁规则&#xff1a; 1&#xff09;. 按照项目总控P…

jz2440开发板修改UBOOT支持NAND FLASH

很多天没有看嵌入式的东西了&#xff0c;今天来看一下&#xff0c;继续之前移植uboot到jz2440开发板。今天我们来实现Uboot支持NAND FLASH。 在之前的文章里&#xff08;点击连接查看之前的记录&#xff09;&#xff0c;我们为了编译通过把NAND FLASH 给屏蔽掉了&#xff0c;现…

i.MX6网卡驱动程序fec.c的分析(AR8035网卡驱动程序的详细分析)之二

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天接着分析上次没有分析完的i.MX6网卡驱动程序。上一篇分析了iMX6网卡驱动程序的driver与device的加载过程&#xff08;点击可以查看上一篇文章&…

阅读ethercat官方文档关于ethercat网卡驱动程序的一些内容

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 改造iMX6&#xff08;fec&#xff09;网卡驱动程序前期工作之&#xff1a;阅读ethercat-1.5.2.pdf文档的第四章内容。 ethercat-1.5.2.pdf文档链接&a…