移植最新u-boot之裁剪和修改默认参数

Hello$word Hello$word     2022-08-02     287

关键词:

1、下载、建立source insight工程、编译、烧写、如果无运行分析原因
  tar xjf u-boot-2012.04.01.tar.bz2
  cd u-boot-2012.04.01
  make smdk2410_config
  make


2. 分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程

  a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
  b. 如果bootloader比较大,要把它重定位到SDRAM
  c. 把内核从NAND FLASH读到SDRAM
  d. 设置"要传给内核的参数"
  e. 跳转执行内核

2.1 set the cpu to SVC32 mode
2.2 turn off the watchdog
2.3 mask all IRQs by setting all bits in the INTMR
2.4 设置时钟比例
2.5 设置内存控制器
2.6 设置栈,调用C函数board_init_f
2.7 调用函数数组init_sequence里的各个函数
2.7.1 board_early_init_f : 设置系统时钟、设置GPIO
......
2.8 重定位代码:
2.8.1 从NOR FLASH把代码复制到SDRAM
2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"
现在把程序复制到了SDRAM
需要修改代码,把"基于0地址编译得到的地址"改为新地址
2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs
2.9 clear_bss
2.10 调用C函数board_init_r:第2阶段的代码

 


可以修改配置定义CONFIG_S3C2440


3. 修改U-BOOT代码
3.1 建一个单板
  cd board/samsung/
  cp smdk2410 smdk2440 -rf
  cd ../../include/configs/
  cp smdk2410.h smdk2440.h
修改boards.cfg:
仿照
  smdk2410 arm arm920t - samsung s3c24x0
添加:
  smdk2440 arm arm920t - samsung s3c24x0

3.2 烧写看结果
3.3 调试:
a. 阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置

编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot

3.4 乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440
处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410
  #define CONFIG_S3C2440
  //#define CONFIG_CMD_NAND
3.5 修改UBOOT支持NAND启动
原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"
使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)
3.5.1 去掉 "-pie"选项
  arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行

3.5.2 参考"毕业班第1课"的start.S, init.c来修改代码
把init.c放入board/samsung/smdk2440目录, 修改Makefile
修改CONFIG_SYS_TEXT_BASE为0x33f80000
修改start.S
3.5.3 修改board_init_f, 把relocate_code去掉
3.5.4 修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面
  ./arch/arm/cpu/u-boot.lds:

  board/samsung/smdk2440/libsmdk2440.o

3.6 修改UBOOT支持NOR FLASH
  driversmtdjedec_flash.c 加上新的型号
  #define CONFIG_SYS_MAX_FLASH_SECT (128)

修复了重定时留下来的BUG:SP要重新设置


3.7 修改UBOOT支持NAND FLASH
修改:include/configs/smdk2440.h: #define CONFIG_CMD_NAND

把driversmtd ands3c2410_nand.c复制为s3c2440_nand.c

分析过程:
  nand_init
  nand_init_chip
  board_nand_init
  设置nand_chip结构体, 提供底层的操作函数
  nand_scan
  nand_scan_ident
  nand_set_defaults
  chip->select_chip = nand_select_chip;
  chip->cmdfunc = nand_command;
  chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;

  nand_get_flash_type
  chip->select_chip
  chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
  nand_command() // 即可以用来发命令,也可以用来发列地址(页内地址)、行地址(哪一页)
  chip->cmd_ctrl
  s3c2440_hwcontrol

  chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
  *maf_id = chip->read_byte(mtd);
  *dev_id = chip->read_byte(mtd);


3.8 修改UBOOT支持DM9000网卡
  eth_initialize
  board_eth_init
  cs8900_initialize

  *** ERROR: `ethaddr‘ not set
  set ipaddr 192.168.1.17
  set ethaddr 00:0c:29:4d:e4:f4
  set serverip 192.168.1.3

 

4. 易用性修裁剪及制作补丁

内核打印出来的分区信息
  0x00000000-0x00040000 : "bootloader"
  0x00040000-0x00060000 : "params"
  0x00060000-0x00260000 : "kernel"
  0x00260000-0x10000000 : "root"

  nand erase 60000 200000
  nand write 30000000 60000 200000

  tftp 30000000 uImage
  nand erase.part kernel
  nand write 30000000 kernel

烧写JFFS2
  tftp 30000000 fs_mini_mdev.jffs2
  nand erase.part rootfs
  nand write.jffs2 30000000 0x00260000 5b89a8

  set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

烧写YAFFS
  tftp 30000000 fs_mini_mdev.yaffs2
  nand erase.part rootfs
  nand write.yaffs 30000000 260000 889bc0

更新UBOOT:
  tftp 30000000 u-boot_new.bin; protect off all; erase 0 3ffff; cp.b 30000000 0 40000


制作补丁:
  diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask.patch

分析"重定位之修改代码为新地址":
  #ifndef CONFIG_SPL_BUILD
  /*
  * fix .rel.dyn relocations
  */
  ldr r0, _TEXT_BASE /* r0 <- Text base */
  // r0=0, 代码基地址

  sub r9, r6, r0 /* r9 <- relocation offset */
  // r9 = r6-r0 = 0x33f41000 - 0 = 0x33f41000

  ldr r10, _dynsym_start_ofs /* r10 <- sym table ofs */
  // r10 = 00073608

  add r10, r10, r0 /* r10 <- sym table in FLASH */
  // r10 = 00073608 + 0 = 00073608

  ldr r2, _rel_dyn_start_ofs /* r2 <- rel dyn start ofs */
  // r2=0006b568

  add r2, r2, r0 /* r2 <- rel dyn start in FLASH */
  // r2=r2+r0=0006b568

  ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */
  // r3=00073608

  add r3, r3, r0 /* r3 <- rel dyn end in FLASH */
  // r3=r3+r0=00073608

  fixloop:
  ldr r0, [r2] /* r0 <- location to fix up, IN FLASH! */
  1. r0=[0006b568]=00000020

  add r0, r0, r9 /* r0 <- location to fix up in RAM */
  1. r0=r0+r9=00000020 + 0x33f41000 = 0x33f41020

  ldr r1, [r2, #4]
  1. r1=[0006b568+4]=00000017

  and r7, r1, #0xff
  1. r7=r1&0xff=00000017

  cmp r7, #23 /* relative fixup? */
  1. r7 == 23(0x17)

  beq fixrel
  cmp 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]
  1. r1=[00000020]=000001e0

  add r1, r1, r9
  1. r1=r1+r9=000001e0 + 0x33f41000 = 33F411E0

  fixnext:
  str r1, [r0]
  1. [0x33f41020] = 33F411E0

  add r2, r2, #8 /* each rel.dyn entry is 8 bytes */
  1. r2=r2+8=0006b568+8=6B570

  cmp r2, r3
  1.

  blo fixloop
  #endif

 【转】韦东山 老师教学笔记

u-boot移植---代码修改---支持norflash

一、问题定位    开发板重启后打印了2个提醒和一个错误,caches的提醒先不看,看看flash和nand下面的提醒,badCRC,Usingdefaultenviroment,我们可以定位Usingdefaultenviroment定位到代码位置,如下:    Env_common.c(common)   ... 查看详情

u-boot移植---代码修改---时钟修改sdram

  最开始已经建立了新单板以及配置文件,现在就需要做的是代码的修改,配置成适合目标板使用的u-boot。一、时钟修改  在代码流程分析中,我们知道,系统的启动是:设置CPU为管理员模式关闭看门狗屏蔽中断设置启动参... 查看详情

六,移植uboot-设置默认环境变量,完善u-boot(代码片段)

文档时间:2018-08-14交叉编译器:arm-linux-gcc-4.3.2Ubuntu版本:16.04uboot版本:2013.10 1,修改uboot默认环境变量前面章节得到的uboot串口打印信息如下:可以看出,读出的是坏的CRC,使用默认的环境变量,搜索"usingdefaultenvironment",... 查看详情

u-boot移植---修改前工作:代码流程分析3---代码重定位

一、重定位    1.以前版本的重定位      2.新版本        我们的程序不只涉及一个变量和函数,我们若想访问程序里面的地址,则必须使用SDRAM处的新地址,即我们的程序里面的变量和函数必须修改地址。... 查看详情

u-boot移植(十三)---代码修改---支持文件系统及补丁制作

一、烧写文件系统1.1jffs2烧写  1.下载文件系统:tftp30000000fs_mini_mdev.jffs2    2.擦除文件的块:nanderase.partrootfs    3.烧入文件系统:nandwrite.jffs2300000000x00260000 5b89a8    4.设置启动参数:setbootargsconsole=ttySAC0root=/d... 查看详情

u-boot移植---代码修改---存储控制器

一、CPU访问芯片的条件    CPU通过访问存储控制器,来读取外部设备的数据。  CPU想访问一个芯片,需要如下条件(配置信息):地址线数据线:8位/16位/32位数据宽度时钟/频率 其他芯片相关的特性:比如SDRAM,有行地... 查看详情

u-boot移植---代码修改---nand

一、NAND原理    NAND无地址空间,地址和数据的发送都依赖于LDATA[0:7]这一串数据总线。     不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K+64 个byte,一个块的大小是(128K+4K)b... 查看详情

u-boot-1.1.6移植

1.新建开发板相应目录和文件①在boad目录下添加my2440文件夹,拷贝smdk2410目录下所有文件,修改文件名把smdk2410.c改为my2440.c  在include/congfigs文件夹建立配置文件my2440.h(将smdk2410.h直接复制为my2440.h)②修改两个Makefile   ... 查看详情

04.移植u-boot

1.读readme获取信息   1.1由BuildingtheSoftware可知,需修改顶层makefile,指定架构和编译器   ifeq($(HOSTARCH),$(ARCH))   CROSS_COMPILE?=arm-linux-   endif   查看详情

u-boot移植---修改前工作:代码流程分析1

一、代码执行总体流程图1.1代码路径 U-boot.lds(archarmcpu) vectors.S(archarmlib) start.S(archarmcpuarm920t) lowlevel_init.S(boardsamsungjz2440) crt0.S(archarmlib)relocate.S(archarmlib) 查看详情

怎样移植u-boot和linux到s3c2440开发板

...绍如何实现该功能,并组成一个最简单的系统,这不仅要移植uboot,还要移植linux内核及创建一个根文件系统。首先我们对nandflash进行分区,规划好每个文件存放在nandflash的位置。下面是nandflash的分区:第0分区:0x000000000000-0x00000... 查看详情

linux系统移植:u-boot常用指令(上)(代码片段)

文章目录Linux系统移植:U-Boot常用指令(上)一、U-Boot命令行二、U-Boot常用命令(上)2.1help帮助命令2.2信息查询命令2.3环境变量修改命令2.4内存操作命令2.5网络操作命令Linux系统移植:U-Boot常用指令(... 查看详情

全志h3系统移植|移植主线最新uboot2023.04和kernel6.1.11到nanopineo开发板(代码片段)

文章目录环境说明uboot移植kernel移植rootfs移植测试环境说明OS:Ubuntu20.04.5LTSGCC:arm-none-linux-gnueabihf-gcc10.3.0编译器下载地址:Downloads|GNU-ADownloads–ArmDeveloperuboot移植当前最新版本v2023.04-rc2下载地址:https://github.com/u-boot/u-boot/archive/re... 查看详情

tiny4412-1312__uboot移植(代码片段)

...链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi要移植的u-boot版本:u-boot-2016-11Tiny4412开发板硬件版本为:  底板:  Tiny4412SDK1312B  核心板:Tiny4412-1306 1.获取U-BOOT源码从FTP站点下载: ftp://ftp.denx.... 查看详情

x-007friendlyarmtiny4412u-boot移植之内存初始化

 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&l 查看详情

u-boot移植---代码修改---支持dm9000网卡

一、准备工作1.1原理图    CONFIG_DM9000_BASE  片选信号是接在nGCS4引脚,若要确定网卡的基地址,则要根据片选信号的接口去确定。  在三星2440的DATASHEET中memorycontrol这一章的Figure5-1.S3C2440AMemoryMapafterReset已经说明了片选4的... 查看详情

u-boot移植---修改前工作:代码流程分析2

一、vectors.S1.1代码地址  vectors.S(archarmlib) 1.2流程跳转      跳转符号B为start.S中的reset执行代码,暂且先不看,先看看vector.S中的执行。1.3代码分析  ldr{条件}目的寄存器<存储器地址>1_start:23#ifdefCONFIG_SYS_DV_NOR_B... 查看详情

u-boot-2014.10移植添加mtdparts命令和分区(代码片段)

添加mtdparts命令,改命令可以查看当前分区,在启动参数里面可以以分区名代表地址和长度grep"cmd_mtdpart"*-nR  搜索可知,mtdpart在cmd_mtdparts.c里面定义  common/Makefile:147:obj-$(CONFIG_CMD_MTDPARTS)+=cmd_mtdparts.o因此需要定义CONFI... 查看详情