uboot 2014移植手册

合集下载

uboot移植

uboot移植
stage1完成初始化硬件,为stage2准备内存空间,将 stage2复制到内存中,设置堆栈然后跳转到stage2
多阶段的 Boot Loader
Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序): ·硬件设备初始化。 ·为加载 Boot Loader 的 stage2 准备 RAM 空间。 ·拷贝 Boot Loader 的 stage2 到 RAM 空间中。 ·设置好堆栈。 ·跳转到 stage2 的 C 入口点。 Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):
Bootloader的通用性质
一.Bootloader与嵌入式linux的关系
一个嵌入式系统从软件角度来看分为四个层次: 1.引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。 通常用 ram disk 来作为 root fs。
Bootloader综述 U-boot介绍 u-boot编译及配置 u-boot的启动过程及工作原理 u-boot命令使用说明 u-boot 的移植过程
Uboot渊源
Uboot是德国DENX小组的开发用于多种嵌入式 CPU的bootloader程序, UBoot不仅仅支持嵌入式 Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式 操作系统。UBoot除了支持PowerPC系列的处理器 外,还能支持MIPS、 x86、ARM、NIOS、XScale 等诸多常用系列的处理器。 从下面地址下载uboot的源代码。 /projects/uboot

uboot移植手册Ver.B[1]

uboot移植手册Ver.B[1]
wwwxcembedcomxc2440开发板uboot移植手册xc2440开发板uboot移植开发手册20111020verb小超嵌入式工作室wwwxcembedcomxcembedblogchinaunixnetwwwxcembedcomxc2440开发板uboot移植手册版本更新说明版本号修改日期修改说明20110920初稿建立20111020修改makefile中配置选项说明page8修改norflash驱动配置选项page16修改第八部分内容page38第十部分前加入说明page43wwwxcembedcomxc2440开发板uboot移植手册目录版本更新说明二增加对s3c2440平台的支持三修改norflash驱动支持16四添加nand驱动和nand启动方式19五增加串口xmodem协议30六加入网卡dm9000驱动支持33七加入mtdnand分区35八启动zimage内核的支持usb设备驱动支持39十烧写nand进度显示43十一烧写yaffs2文件系统支持wwwxcembedcomxc2440开发板uboot移植手册前言关于本手册本手册为xc2440开发板配套教程之一介绍了uboot在xc2440开发板的移植过程供用户参考
XC2440 开发板 uboot 移植手册
版本更新说明
版本号 A B
修改日期 2011-09-20 2011-10-20
修改说明
初稿建立
修改Makefile中配置选项说明 Page8
修改Norflash驱动配置选项 Page16
ቤተ መጻሕፍቲ ባይዱ
修改第八部分内容
Page38
第十部分前加入说明
Page43
室 作 工 式 入 嵌 超 小


修改 lowlevel_init.S 文件

uboot移植资料

uboot移植资料

uboot移植资料u-boot-1.3.4 移植到S3C2440 (带有某些解析)移植u-boot-1.3.4到S3C2440一.预备知识:1. 首先,U-Boot1.3.4还没有支持s3c2440,移植仍是用2410的文件稍作修改而成的。

2. 2440和2410的区别:2440和2410的区别主要是2440的主频更高,增加了摄像头接口和AC‘97音频接口;寄存器方面,除了新增模块的寄存器外,移植所要注意的是NAND FlASH控制器的寄存器有较大的变化、芯片的时钟频率控制寄存器(芯片PLL的寄存器)有一定的变化。

其他寄存器基本是兼容的。

3. 你开发板的boot方式是什么,开发板上电以后是怎么执行的。

一般来说三星的开发板有三种启动方式:nand、nor、ram。

具体用那一种方式来启动决定于CPU的0M[0:1]这两个引脚,具体请参考S3C2440的datasheetnand:对于2440来说,CPU是不给nand-flash分配地址空间的,nand-flash只相当于CPU的一个外设,S3C2440做了一个从nand-flash启动的机制。

开发板一上电,CPU就自动复制nand-flash里面的前4K-Bytes内容到S3C2440内部集成的SDRAM,然后把4K内容所在的RAM映射到S3C2440的0地址,从0地址开始执行。

这4K的内容主要负责下面这些工作:初始化中断矢量、设定CPU的工作模式为SVC32模式、屏蔽看门狗、屏蔽中断、初始化时钟、把整个u-boot重定向到外部SDRAM、跳到主要的C函数入口。

nor: 早期的时候利用nor-flash启动的方式比较多,就是把u-boot烧写到nor-flash里面,直接把nor-flash映射到S3C2440的0地址,上电从0地址开始执行。

ram: 直接把u-boot放到外部SDRAM上跑,这一般debug时候用到。

4. u-boot程序的入口地址问题要理解程序的入口地址,自然想到的是连接文件,首先看看开发板相对于某个开发板的连接文件"/board/你的开发板/u-boot.lds",看一个2410的例子:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/start.o (.text)*(.text)}. = ALIGN(4);.rodata : { *(.rodata) }. = ALIGN(4);.data : { *(.data) }. = ALIGN(4);.got : { *(.got) }__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;. = ALIGN(4);__bss_start = .;.bss : { *(.bss) }_end = .;}(1) 从ENTRY(_start)可以看出u-boot的入口函数是_start,这个没错(2) 从. = 0x00000000也许可以看出_start的地址是0x00000000,事实并不是这样的,这里的0x00000000没效,在连接的时候最终会被TETX_BASE所代替的,具体请参考u-boot根目录下的config.mk.(3) 网上很多说法是_start=TEXT_BASE,我想这种说法也是正确的,但没有说具体原因。

uuboot 移植流程

uuboot 移植流程

uuboot 移植流程U-Boot 移植流程介绍U-Boot是一个开源的引导加载程序,常用于嵌入式系统中。

移植U-Boot可以将其适配到不同的硬件平台上,以满足特定需求。

本文将详细说明U-Boot移植的流程。

准备工作1.硬件选型:根据项目需求,选择适合的硬件平台。

2.获取源代码:从U-Boot官方网站或仓库下载最新版本的源代码。

3.安装交叉编译工具链:根据目标硬件平台的指令集架构,选择合适的交叉编译工具链,并进行安装。

4.了解目标硬件平台:熟悉目标硬件平台的架构、引导方式、存储器布局等相关信息。

移植流程1.配置编译环境:设置交叉编译工具链的环境变量,以确保正确编译U-Boot源代码。

2.配置U-Boot:修改U-Boot源代码中的配置文件,根据目标硬件平台的特性和需求进行相应配置。

–配置目标硬件平台的处理器类型、存储器布局等基本信息。

–配置启动方式,如通过网络(TFTP)或存储介质(SD卡、NAND Flash)等进行启动。

–配置启动流程,如引导加载程序的加载顺序、启动脚本等。

3.添加适配代码:根据目标硬件平台的需求,编写适配代码,包括引导加载程序和设备驱动等。

–引导加载程序:为目标硬件平台选择合适的程序入口点,配置启动参数,加载适配的设备驱动等。

–设备驱动:根据目标硬件平台的外设,编写相应的设备驱动代码,以支持外设的初始化和操作。

4.编译U-Boot:使用交叉编译工具链,编译修改后的U-Boot源代码。

–执行make clean清除之前的编译结果。

–执行make命令编译U-Boot源代码。

5.烧录和运行:将编译生成的U-Boot镜像烧录到目标硬件平台,并进行测试。

–根据目标硬件平台的烧录方式(串口、JTAG等),将U-Boot镜像烧录到目标设备。

–启动目标设备,观察U-Boot的启动信息是否正常输出,检查设备驱动是否正常加载。

6.调试和优化:根据实际情况,进行U-Boot的调试和性能优化。

–使用调试工具进行调试,如调试器、串口打印信息等。

移植SD卡启动盘之uboot

移植SD卡启动盘之uboot

移植SD卡启动盘之uboot要想深入学习uboot,需要自定义uboot,进行源码级的uboot移植。

本篇将对进行基于u-boot-201404版本的移植进行讲解。

一、准备源码1 在ubuntu下,新建文件目录2 将EVB-T335T光盘目录src下的linux源码和u-boot源码,复制到ubuntu下3 将EVB-T335T光盘目录toolchains下的交叉编译器,arm-2010和gcc-linaro-xx,得到到ubuntu下4 将EVB-T335T光盘目录rootfs下的根文件系统buildroot,得到到ubuntu下二、编译uboot1 配置交叉编译器(1)解压tar xfj arm-2010.09.tar.bz2(2)设置sudo vim /etc/profileexport PATH=$PATH:/home/rabbit/evb-t335/arm-2010.09/binsource /etc/profile2 解压u-boottar xfj u-boot-2014.04-rc2-00037-gbaecd31.tar.bz23 配置u-bootmake com335x_sd_256_config其中com335x代表核心板为com335x,sd代表从SD卡启动,或emmc代表从板载的emmc 启动,或nand代表为nandflash;256表示com-335是256M的DDR,如果是128M或512M,则设置为相应的值;这些信息,可以从uboot源码主目录下的boards.cfg文件中找到:如下图所示:最后执行命令,得出如下结果:4 编译u-bootmake ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-这样,就生成了我们需要的MLO和u-boot.img文件5 根据以前的方法,将MLO和u-boot.img移植到SD卡上,上电启动,输出如下信息:到此,uboot算是移植成功,接下来,进行linux内核的移植。

UBOOT移植验

UBOOT移植验

U-BOOT移植实验u-boot简介u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, u-boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。

u-boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。

u-boot源码目录介绍u-boot的启动过程1 启动流程我们一般把bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

1 阶段1,汇编代码,对于s3c2410是cpu/arm920t/start.s文件。

主要流程如下:关闭看门狗禁掉所有中断设置以CPU的频率把自己拷贝到RAM配置内存区控制寄存器配置的栈空间进入C代码部分2 阶段2是C语言代码,在lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数。

这个函数调用一系列的初始化函数,然后进入主UBOOT命令行,进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

当用户输入启动linux的命令的时候,u-boot会将kernel 映像(zImage)和从nand flash 上读到RAM 空间中,为内核设置启动参数,调用内核,从而启动linux。

u-boot移植要点:我们可以总结出bootloader的两大功能:1 是下载功能,既通过网口、串口或者USB口下载文件到RAM中。

2 是对flash芯片的读写功能。

u-boot对S3C2410已经有了很好的支持,我们在移植过程中主要是完善u-boot对nand flash的读写功能。

U-boot-2014.07移植教程(基于s5pv210)

U-boot-2014.07移植教程(基于s5pv210)

ldr sp, =(CONFIG_SPL_STACK)
#else
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
sub sp, sp, #GD_SIZE /* allocate one GD above SP */
继续走:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_cp15
bl cpu_init_crit
#endif
bl _main cpu_init_crit 其实是调用 lowlevel_init,该函数有 2 个地方:变量
到底运行哪个呢?看对应目录下的 makefile: arch\arm\cpu\armv7 下的 makefile: ifneq ($(CONFIG_AM43XX)$(CONFIG_ AM33X X)$(CONFIG_OM AP44XX)$(CONFIG_OM AP54 XX)$(CONFIG_TEGRA)$(CONFIG_MX6)$(CONFIG_TI81XX)$(CONFIG_AT91FAMILY)$(C ONFIG_SUNXI),) ifneq ($(CONFIG_SKIP_LOWLEVEL_INIT),y) obj-y += lowlevel_init.o endif endif 明显,我们没有定义那一堆变量中的任意一个,所以这个不会被编译。 board\samsung\smdkc100 中的 makefile: obj-y += lowlevel_init.o 实际编译后确实这这个文件夹下出现了 lowlevel_init.o,就是它。 看 lowlevel_init:

u-boot移植详细文档

u-boot移植详细文档

u‐boot移植详细文档作者:Tekkaman Ninja作者博客:整理:Coolbor Xie一、Boot Loader的概念和功能1、嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。

而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。

有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。

而S3C24x0则很简单,只有Norboot和Nandboot。

(2)Linux kernel 和drivers。

(3)文件系统。

包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。

它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。

(4)应用程序。

用户自定义的应用程序,存放于文件系统之中。

在Flash 存储器中,他们的一般分布如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。

2、在嵌入式Linux中为什么要有BootLoader在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:1. CPU 寄存器的设置: R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach‐types); R2=内核启动参数在 RAM 中起始基地址;2. CPU 模式: 必须禁止中断(IRQs和FIQs); CPU 必须 SVC 模式;3. Cache 和 MMU 的设置: MMU 必须关闭;指令 Cache 可以打开也可以关闭; 数据 Cache 必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NFADDR = page & 0xff; for (i = 0; i < 10; i++); NFADDR = (page >> 8) & 0xff; for (i = 0; i < 10; i++); NFADDR = (page >> 16) & 0xff; for (i = 0; i < 10; i++); }
2、修改时钟
在 start.S 中增加对时钟的初始化,并在 board\samsung\smdk2440\smdk2410.c 的 int board_early_init_f(void)里取消对 时钟初始化的代码。 start.S:
ldr r0, =0x4c000014 // mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1 mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8 str r1, [r0] /* 如果 HDIVN 非 0,CPU 的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */ mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */ orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */ mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */ #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01)) /* MPLLCON = S3C2440_MPLL_200MHZ */
arch/arm/cpu/built-in.o (.text*)
修改 smdk2440.h 里的 CONFIG_SYS_TEXT_BASE 的值为:
#define CONFIG_SYS_TEXT_BASE 0x33f00000
至此,uboot 应该能初始化时钟和内存。
5、修改重定位代码
a、在 addr 的最后位置,去掉
来 S3C2410 单板下的所有文件拷贝到 2440 下。 c、在 include/configs 下执行:cp smdk2410.h smdk2440.h。拷贝原来 2410
的配置文件。 d、发现顶层 makefiel 的一个小 bug:make distclean 的时候,不删除 ln -s 生成
#define TXD0READY (1<<2)
பைடு நூலகம்
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);
static int isBootFromNorFlash(void) {
volatile int *p = (volatile int *)0; int val;
/* NAND FLASH 控制器 */ #define NFCONF (*((volatile unsigned long *)0x4E000000)) #define NFCONT (*((volatile unsigned long *)0x4E000004)) #define NFCMMD (*((volatile unsigned char *)0x4E000008)) #define NFADDR (*((volatile unsigned char *)0x4E00000C)) #define NFDATA (*((volatile unsigned char *)0x4E000010)) #define NFSTAT (*((volatile unsigned char *)0x4E000020))
(*(volatile unsigned long *)0x50000000) (*(volatile unsigned long *)0x50000004) (*(volatile unsigned long *)0x50000008) (*(volatile unsigned long *)0x5000000c) (*(volatile unsigned long *)0x50000010) (*(volatile unsigned char *)0x50000020) (*(volatile unsigned char *)0x50000024) (*(volatile unsigned long *)0x50000028)
3、初始化内存
在 lowlevel_init.S 里修改 SMRDATA:对应的数值: SMRDATA:
.long 0x22011110 //BWSCON .long 0x00000700 //BANKCON0 .long 0x00000700 //BANKCON1 .long 0x00000700 //BANKCON2 .long 0x00000700 //BANKCON3 .long 0x00000740 //BANKCON4 .long 0x00000700 //BANKCON5 .long 0x00018005 //BANKCON6 .long 0x00018005 //BANKCON7 .long 0x008C04F4 // REFRESH .long 0x000000B1 //BANKSIZE
u-boot 2014.01 移植手册
移植环境: JZ2440 v2 arm-linux-gcc 4.3.2 u-boot-2014.01
参考资料: 韦东山 linux 开发视频
本 uboot 工程的补丁下载: /detail/callmefriend/7089867
void clear_bss(void) {
extern int __bss_start, __bss_end; int *p = &__bss_start;
for (; p < &__bss_end; p++) *p = 0;
}
void nand_init_ll(void) { #define TACLS 0 #define TWRPH0 1 #define TWRPH1 0
val = *p; *p = 0x12345678; if (*p == 0x12345678) {
/* 写成功, 是 nand 启动 */ *p = val; return 0; } else { /* NOR 不能像内存一样写 */ return 1; } }
/* *src=0; dest=0x33f80000;len=0x73250 **/ void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len) {
int i = 0;
/* 如果是 NOR 启动 */ if (isBootFromNorFlash()) {
while (i < len) {
dest[i] = src[i]; i++; } } else { //nand_init(); nand_read_ll((unsigned int)src, dest, len); } }
原文地址: /callmefriend/article/details/21954279
1、增加对 2440 的支持。 a、修改 boards.cfg,仿照 2410,增加 2440. b、在 board/samsung/目录下执行:cp smdk2410/ smdk2440 -rf 。将原
/* 设置时序 */ NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4); /* 使能 NAND Flash 控制器, 初始化 ECC, 禁止片选 */ NFCONT = (1<<4)|(1<<1)|(1<<0); }
static void nand_select(void) {
// addr -= gd->mon_len;
// addr &= ~(4096 - 1);
addr = CONFIG_SYS_TEXT_BASE;
b、在 start.S 里 bl cpu_init_crit 后增加 nand 初始化和 copy 代码,并清 BSS,同
时在增加 copy nand 文件的源文件 init.c:
NFCONT &= ~(1<<1); }
static void nand_deselect_ll(void) {
NFCONT |= (1<<1);
}
static void nand_cmd(unsigned char cmd) {
volatile int i; NFCMMD = cmd; for (i = 0; i < 10; i++); }
static void nand_wait_ready_ll(void) {
while (!(NFSTAT & 1)); }
static unsigned char nand_data(void) {
return NFDATA; } /* *src=0; dest=0x33f80000;len=0x73250 */ void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len) {
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7
4、修改链接选项
在 arch/arm/config.mk 里,取消-pie 选项
相关文档
最新文档