写在前面:

我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看。

此外目前我在gitHub上准备一些李航的《统计学习方法》的实现算法,目标将书内算法全部手打实现,欢迎参观并打星。GitHib传送门

正文

移植的uboot使用NOR启动,不支持NAND,这次就是修改代码以支持NAND。
之前uboot的Makefile里面有-pie,前面写到了,这是为了生成位置无关码,代码可以copy到任何地方。因为代码段里面是有变量的,程序去读取变量的时候要知道变量的存放地址,你移到别的地方,变量的存储位置肯定会变。位置无关就是额外在一块内存区域中存放变量的地址信息,当移动代码的时候,要去读取这块区域,重新修改变量的读取地址。
1.去掉“pie选项”。
设置NAND启动的时候,cpu会自动从NAND里面读取4k代码到片内内存,所以设置pie的话,代码的体积会比较大,不利于复制到片内内存,重定位之前的代码应该少于4k。
现在不清楚这个pie在哪,所以命令:grep "\-pie" * -R,返回

arch/x86/config.mk:LDFLAGS_FINAL += --gc-sections -pie
arch/arm/config.mk:LDFLAGS_u-boot += -pie
doc/README.arm-relocation:At arch level: add linker flag -pie

看起来第二个比较像,所以打开第二个文件:

vi arch/arm/config.mk

找到LDFLAGS_u-boot += -pie,前面加上#注释掉,保存退出。这样应该把pie选项去掉了,实际等make完以后,看看链接文件就能知道了。

2.添加NAND代码。之前写过NAND的代码,直接将文件init放到\board\samsung\smdk2440
将这个文件添加到SI工程里。找到start.S,一路往下看,设置时钟之后是板子片内各种资源的初始化,我把NAND的代码放到时钟和资源初始化中间。

/* 重定位 */ldr sp, =0x34000000bl nand_initmov r0,     #0ldr   r1, =_startldr     r2, = __bss_startsub   r2, r2, r1bl copy_code_to_sdrambl clear_bss

a.要做一些修改,因为调用了C函数,要设置栈,下面板子资源初始化也调用了C,直接将它的栈设置拿过来

ldr  sp, =(CONFIG_SYS_INIT_SP_ADDR) bic sp, sp, #7 /* 8-byte alignment for ABI compliance */

然后跳转到nand_init初始化nand。uboot里面有很多nand_init重名函数,将其修改为nand_init_ll。其他不用修改。

b.调用copy_code_to_sdram的时候有三个参数,第一个是0不变,第二个是代码的初始位置。之前写了_start,但是这是一条伪汇编指令,如果_start这个值很复杂,编译的时候可能把这个值放到别的合适的位置,就可能不在4k以内了,cpu复制4k到片内内存以后,可能就没有复制_start这个值,程序执行的时候就懵逼了,要代码重定位,找不到第二个参数了。所以为了保证在4k内,人为写一个值(猜测这样子这条代码就不算伪汇编,保存的地址就可以保证在4K内)。实际上
两种写法意思是一样的,只是担心出问题。所以改为

ldr r1, _TEXT_BASE

_TEXT_BASE有定义:

_TEXT_BASE:.word CONFIG_SYS_TEXT_BASE
#define CONFIG_SYS_TEXT_BASE    0x0

把CONFIG_SYS_TEXT_BASE 值改为0x33f00000
因为内存一共64M,就是34000000,在内存的顶部是uboot的存放空间,这里给uboot留了1M的空间,让代码copy进去。64M-1M=0x33f00000。

copy_code_to_sdram的第三个参数是copy的长度,查看start.S可以看到

_bss_start_ofs:.word __bss_start - _start

__bss_段是存放初始值为0的变量,bss段的文件是不会存在在bin文件里面的,所以__bss_start - _start就是二进制文件的长度。copy的长度就写为_bss_start_ofs。

copy_code_to_sdram文件内部查看以后发现不需要修改
clear_bss需要修改一些值。

void clear_bss (void)
{extern int __bss_start, __bss_end;int *p = &__bss_start;for (; p < &__bss_end; p++)*p = 0;
}

源文件的bss段的结束地址定义为__bss_end,在这个uboot中为__bss_end__,修改即可。

因此汇编中的代码段改为,同时去掉原先的clear_bss

ldr  sp, =(CONFIG_SYS_INIT_SP_ADDR) bic sp, sp, #7 /* 8-byte alignment for ABI compliance */bl  nand_init_llmov r0,     #0//ldr     r1, =_startldr r1, _TEXT_BASEldr   r2, _bss_start_ofs;bl copy_code_to_sdrambl clear_bss

同时clear_bss改为

void clear_bss (void)
{extern int __bss_start, __bss_end__;int *p = &__bss_start;for (; p < &__bss_end__; p++)*p = 0;
}

c.去掉自带的重定位代码。
进入board_init_f函数,找到relocate_code(addr_sp, id, addr);注释掉。
因为后面的代码是在SDRAM,bl是相对跳转指令,使用

ldr  pc, =call_board_init_f

这样一下就从片内内存跳到SDRAM中了。

d.下面是调用第二阶段的代码。

/* 调用第二阶段代码 */bl board_init_r

有两个参数gd_t *gd, ulong dest_addr。ID和目的地址。目的地址就是程序的链接地址。

ldr  r1, _TEXT_BASE

ID可以观察到在board_init_f中有获得,直接添加返回值为id。返回值存在r0,就省得我们再做别的事了。

e.差不多改完了,把init文件添加进uboot,

vi board/samsung/smdk2440/Makefile

在COBJS := smdk2410.o这句话后面加上init.o
保存退出。

f.修改链接脚本,把Start.o init之类的文件放到代码的最前头,这样能保证需要的代码都在4k里。

vi arch/arm/cpu/u-boot.lds. = 0x00000000;. = ALIGN(4);.text :{__image_copy_start = .;CPUDIR/start.o (.text)*(.text)}

board/samsung/smdk2440/libsmdk2440.o (.text)添加进去变成:

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

g:编译,有一些错误,比如之前增加了board_init_f的返回值,原先是没有的,改一下就行了。

h.烧到NAND,启动,成功

移植uboot第四步:设置NAND启动相关推荐

  1. 移植uboot第六步:支持NANDFlash

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  2. 移植uboot第五步:支持NORFlash

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  3. 移植uboot第八步:裁剪、修改默认参数、分区

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  4. 移植uboot第七步:支持DM9000

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  5. 移植uboot第三步:修改时钟

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  6. 移植u-boot到S3C2440之从内存启动

    本文将uboot移植到S3C2440,略过最麻烦的需要计算的ROM移植部分,直接从内存启动S3C2440. 文章目录 一.前置知识 1. Linux可执行文件介绍 存放态: 运行态: ELF 2. b ...

  7. UEFI 基础教程 (十四) - 设置默认启动项为UEFI Shell

    一 编写源代码 OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c UINTN BootOptionPriority ( CONST EFI_BO ...

  8. 移植uboot第十步:制作uboot补丁

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  9. uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)

    项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...

最新文章

  1. OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时
  2. CentOS的改变系统启动级别
  3. 关于业务架构的一些思考与实践
  4. “李宏毅老师对不起,我要去追这门美女老师的课了” ,台大陈蕴侬深度学习课程最新资料下载...
  5. resize和reverse的区别
  6. 暑期训练日志----2018.8.3
  7. 一次难忘的 MTS 故障的排除过程
  8. 使用批处理文件,自动设置计算机IP地址
  9. 360手机助手电脑版 v2.4.0.1251 官方版
  10. 关于Terra和Aqua的轨道问题整理
  11. Hashcat破解微软Office加密文件密码
  12. Debian 10 安装fonts-noto-cjk
  13. 网络连接三种方式-桥接模式
  14. VMware Workstation Pro详细安装教程
  15. java 软键盘_【学习笔记】【java appium】软键盘搜索、回车按钮
  16. Jenkins项目自动化部署工具的安装、配置及使用
  17. python软件下载对电脑配置要求-Python实现的读取电脑硬件信息功能示例
  18. 怎样为计算机创建一个新的用户名,如何创建电脑用户名 电脑用户名是什么怎么修改...
  19. 生于七八十年代,我们的童年是这样的
  20. 计算机操作熟练说明,Mac新手必看教程,教你快速熟练mac电脑操作

热门文章

  1. LeetCode Contains Duplicate II(hash)
  2. Incorrect number of FETCH variables
  3. mysql中的G标志实现纵向显示
  4. qt中关闭窗口资源释放问题
  5. Qt中禁止调节窗口大小
  6. 网络编程学习笔记(UDP的connect函数)
  7. blfs(systemd版本)学习笔记-配置远程访问和管理lfs系统
  8. 90 vuex axios
  9. 类的成员函数 只声明 不定义
  10. 一步步学习SpringBoot(一) 快速搭建一个web