Linux之uboot分析与移植20160601

说一下uboot分析与移植:

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

drivers\mtd\jedec_flash.c 加上新的型号

#define CONFIG_SYS_MAX_FLASH_SECT (128)

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

3.7 修改UBOOT支持NAND FLASH

修改:include/configs/smdk2440.h: #define CONFIG_CMD_NAND

把drivers\mtd\nand\s3c2410_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

附笔者的学习笔记,字写的不好勿怪,将就看吧:

1).uboot介绍以及最终目的:

2).分析makefile找到第一个执行的文件:

3).源码分析:

4)uboot中命令实现:

5)uboot启动内核:

时间: 2024-11-12 15:13:32

Linux之uboot分析与移植20160601的相关文章

18.13 Uboot分析与移植

18.13.1 使用JLink烧写Nor Flash JLink只支持烧写NOR Flash,不支持烧写Nand Flash. 1.准备工作:JLink的USB口接到电脑上,JLink的JTAG口用排线和开发板的JTAG口相连,开发板设为NorFlash启动并上电 2.启动J-Flash. 3.File>Open Project,找到s3c2440.jflash 4.Target>Connect:显示连接成功 5. File>Open data file:选择需要烧写的Uboot.bin

U-Boot分析与移植之U-Boot的启动流程

U-Boot的启动流程:

嵌入式linux开发uboot移植(三)——uboot启动过程源码分析

嵌入式linux开发uboot移植(三)--uboot启动过程源码分析 一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现:BL2阶段主要是对外部设备如网卡.Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现. 1.BL1阶段 uboot的BL1阶段代码通常放在start.s文件中,用汇编语言实现,其主要代码功能如下:

嵌入式linux开发uboot移植(二)——uboot工程源码目录分析

嵌入式linux开发uboot移植(二)--uboot工程源码目录分析 本文分析的uboot为uboot_smdkv210,是三星官方发布的基于S5PV210评估开发板对应的uboot. 一.uboot源码目录结构解析 1.cpu 本文件夹下的子文件与处理器相关,每个文件夹代表一种CPU系列.每个子目录中都包括cpu.c.interrupts.c.start.S文件. cpu.c主要用于初始化CPU.设置指令Cache和数据Cache等 interrupt.c主要用于设置系统的各种中断和异常 s

嵌入式linux开发uboot移植(五)——uboot命令体系

嵌入式linux开发uboot移植(五)--uboot命令体系 本文将根据SMDKV210开发板的三星官方uboot源码分析uboot的命令体系.内容 包括uboot的命令体系的实现机制,uboot命令是如何执行的,以及如何在uboot中添加一个自定义的命令. 一.uboot命令体系简介 uboot命令体系代码放在uboot/common中,包括cmd_xxx.c.command.c .main.c源码文件.uboot实现命令体系的方法是每一个uboot命令对应一个函数,与shell的实现是一致

嵌入式linux开发uboot移植(四)——uboot启动内核的机制

嵌入式linux开发uboot移植(四)--uboot启动内核的机制 一.嵌入式系统的分区 嵌入式系统部署在Flash设备上时,对于不同SoC和Flash设备,bootloader.kernel.rootfs的分区是不同的.三星S5PV210规定启动设备的分区方案如下: SD/MMC设备的分区方案: NandFlash设备的分区方案: 嵌入式系统在启动时,uboot.kernel.rootfs不能随意存放,必须存放在规划好的相应分区,在启动过程中uboot.kernel会到相应分区加载相应内容,

2.uboot和系统移植-第5部分-2.5.uboot源码分析1-启动第一阶段

第一部分.章节目录 2.5.1.start.S引入 2.5.2.start.S解析1 2.5.3.start.S解析2 2.5.4.start.S解析3 2.5.5.start.S解析4 2.5.6.start.S解析5 2.5.7.start.S解析6 2.5.8.start.S解析7 2.5.9.uboot重定位详解 2.5.10.start.S解析8 2.5.11.start.S解析9 2.5.12.start.S解析10 2.5.13.start.S解析11 第二部分.章节介绍 2.5.

嵌入式linux开发uboot移植(七)——三星官方uboot的移植

嵌入式linux开发uboot移植(七)--三星官方uboot的移植 友善之臂Smart210开发板是基于三星SMDKV210评估板裁剪.调整而来的.因此三星官方发布的基于SMDKV210评估板的uboot是移植uboot到Smart210开发板的最合适uboot版本.本文将SMDKV210的uboot移植到Smart210开发板.Smart210开发板的配置如下: SoC:Samsung S5PV210 SDRAM:512MB DDR2 RAM FLASH存储:2G MLC NAND Flas

嵌入式linux开发uboot移植(一)——uboot项目简介

嵌入式linux开发uboot移植(一)--uboot项目简介 一.uboot简介 U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM.8xxROM.PPCBOOT逐步发展演化而来的开放源码项目. 在操作系统方面,U-Boot不仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统.目前支持的目标操作系统是OpenBSD, NetBSD, Fre