uboot移植笔记

合集下载

u-boot学习笔记

u-boot学习笔记

2014.4.16 u-boot学习笔记u-boot版本:u-boot-2014.01-rc1作者:charles.lu参考资料:《ARM嵌入式系统开发:软件设计与优化》,《S3C2440手册》,《嵌入式linux应用开发完全手册》韦东山教学视频,《嵌入式bootloader技术内幕》。

目的:1)分析源码; 2)移植到飞凌嵌入式S3C2440开发板首先看第一阶段的u-boot代码。

打开文件arch/arm/cpu/arm920t/start.S.globl _start_start: b start_codeldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq代码从_start处开始执行。

b start_code即跳转到start_code(b还有后面常有的bl是ARM9跳转指令,若要学习指令可参考《ARM嵌入式系统开发:软件设计与优化》)。

我们往下走,找到start_code,可知首先是硬件初始化,分别做如下工作:1.设置CPU为SVC32模式2.关看门狗3.禁止所有中断4.设置时钟分频这里,对于具体的硬件初始化细节,可以参考《S3C2440手册》,为什么要这么做就不讲了,可以参考上述的书籍。

#if defined(CONFIG_AT91RM9200DK)||defined(CONFIG_AT91RM9200EK) 在头文件include/configs/smdk2410.h中没有这个宏定义,所以这个#if 和#endif里的代码不用管。

后面又有一个宏定义,区分S3C2440和S3C2410。

#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit5.跳转到cpu_init_crit,代码在下面。

uboot移植笔记

uboot移植笔记

uboot移植笔记u-boot-2015-01移植笔记一、修改编译器路径修改顶层Makefile文件,查找CROSS_COMPILE =,注释掉if判断,增加一行CROSS_CMPILE = arm-linux- (根据编译器不同这个自行添加,在这里感谢胡茂晓同学)。

二、复制平台相近board1、进入board子目录下的samsung子目录,复制trats2文件夹为自己平台名字的文件夹(这里笔者使用iTop4412)。

2、进入iT op4412子目录,修改为。

3、修改Makefile,将trats2改为iT op4412。

三、修改板子相应配置1、从源码根目录下进入include/configs目录,复制为。

2、从源码根目录下进入configs目录,复制trats2_defconfig为iTop4412_defconfig。

3、修改iT op4412_defconfig,将CONFIG_DEFAULT_DEVICE_TREE="exynos4412-trats2"改为CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。

四、增加自己的Device Tree Source1、从源码根目录下进入arch/arm/Dts目录,复制 exynos4412- 。

2、修改当前目录下的Makefile文件,将dtb-$(CONFIG_EXYNOS4) += \\\\\修改成dtb-$(CONFIG_EXYNOS4) += \\\\\\五、制作顶层.config文件1、在源码根目录下使用命令make menuconfig(貌似刚支持图形界面配置)。

2、先配置基本的,Architecture select 选项选择ARM architecture,architecture选项的子选项Target select选择Samsun EXYNOS;EXYNOS board select选项选择Exynos4412 Trat2 board。

uboot移植日记

uboot移植日记

在at91rm9200上移植u-boot1 前言:最近写驱动写应用感觉有点乏味了,像玩点新鲜的,于是我拿手里的那块H9200E开发板玩玩移植UBOOT,参考开发板提供的uboot的源码我移植了一个ubot-1.1.1。

目的是通过移植了解掌握atmel 的at91rm9200的启动流程个uboot的启动流程和移植要点及其方法。

我把在移植uboot过程中遇到的问题记录下来,希望能帮助自己在以后的移植过程中更快的找到方向,也希望能帮助初学的朋友少走些弯路。

开发板的硬件配置SDRAM 32MNORFLASH 4M (atmel的AT49BV322A)NANDFLASH 64M (SAMSUNG的K9F1208U0B)2 移植思路我认为要想真正的理解和成功的移植uboot得先弄明白at91rm9200的启动流程和ubot的启动方法at91rm9200有片内引导和片外引导 2 种启动方式,由一根跳线控制。

上电MCU检测BMS的电平,如果是高则选择片内ROM启动,如果是低则从外部flash启动。

(1)片外引导执行烧在flash上的引导程序。

(2)片内引导 at91rm9200内部本身有128k的片内rom,其固化了一个bootloader和uploader,片内引导时启动uploader,uploader开启xmodem协议,等待用户上传程序,上传的程序将载入片内SRAM,重映射,然后pc跳转到片内SRAM执行上传的用户程序。

注:片内SRAM只有16k,除去3-4k片内启动程序的占用的部分数据空间,因此下载的程序大小限制在12k内。

官方at91rm9200DK u-boot Flash Programming Solutions文档提供的解决方案如下。

开发板flash上没有引导程序,于是只能用片内引导方式,载入一个12k以内的小程序到内部SRAM运行,而这个小程序初始化SDRAM后,再把u-boot下载到SDRAM运行(u-boot大于12k),pc跳到SDRAM的u-boot位置运行u-boot,u-boot启动后再用u-boot自己的flash烧写命令把自己烧到flash去,以后就可以片外flash启动了。

移植笔记从Norflash启动的uboot

移植笔记从Norflash启动的uboot

移植笔记从Norflash启动的uboot uboot移植记录之一uboot整个移植过程我们可以分为三个阶段:一,移植可以从Nor flash启动的uboot这个阶段是移植一个最简单的uboot,可以烧在Nor flash内运行.二,移植支持Nand flash驱动的uboot加入Nand flash驱动的支持,可以在uboot命令行下操作Nand flash.但还未能从Nand flash启动,只能在Nor flash内运行.三,移植可以从Nor flash启动的uboot可以烧录在Nand flash,并设置从Nand flash启动运行uboot.分三个阶段进行移植,可以对整个uboot的移植过程及原理更加清晰明了,同时降低了发现问题时解决问题的困难度和解决范围.首先介绍移植可以从Nor flash启动的uboot. 这个阶段相对简单一点,是移植一个最简单的uboot,可以烧在Nor flash内运行.不需要修改太多的东西。

步骤如下: 测试一下默认的smdk2410_config配置能否在你的板子上正常运行 1.编译uboot1.1.4#make smdk2410_config#make ARCH=arm注:编译针对arm的平台时,uboot默认使用arm-linux-gcc编译,若交叉编译器名字不一样,需要自行在Makefile里修改。

会出现两个错误.错误信息一:cc1: Invalid option `abi=apcs-gnu'make[1]: *** [hello_world.o] Error 1make[1]: Leaving directory `/root/u-boot-1.1.4/examples'make: *** [examples] Error 2解决办法:出错的文件是/cpu/arm920t/下的config.mk:将PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) 改成: PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,$(callcc-option,-mabi=apcs-gnu,))错误信息二:make[1]: *** No rule to make target `hello_world.srec', needed by`all'. Stop. make[1]: Leaving directory `/work/src/u-boot-1.1.4/examples' 解决方法:打开 examples/Makefile把example文件夹下的Makefile中的第126行%.srec: % 改成 %.srec: %.o第129行的%.bin: % 改成 %.bin: %.o2.若编译成功,则会在uboot源码下产生u-boot.bin文件。

ARM9-UBOOT移植学习笔记

ARM9-UBOOT移植学习笔记

U-BOOT移植【我所理解的u-boot移植】其实u-boot类似于windows最底层的BIOS,为上层的一些指令、文件提供一个平台;由于在实际的嵌入式开发中,出于对硬件设备要求、存储空间大小、成本等的考虑就要在u-boot 移植过程中进行适当的修改,以满足客服要求、达到较高的性能。

我所采用的LINUX操作系统是Ubuntu-10.04;u-boot的版本是 1.1.6;编译器为:arm-linux-gcc-3.4.5;【如何进行u-boot的移植】step 1:下载gcc交叉编译器及u-bootgcc下载地址:ftp:///pub/gnu/gccu-boot下载地址:/projects/u-boot/step 2:配置编译环境下面的操作基本就是结合“终端”来操作了;在“终端”(下简称ZD)中输入:arm-linux-gcc -v 回车;此时一般都会显示:.....(内容已省略)找不到命令;这说明了linux中缺少gcc交叉编译器开发环境的路径;这样应该手动添加路径。

方法如下:首先,在文件系统中新建一个文件夹,在ZD中输入:sudo mkdir /usr/local/arm 创建一个属于arm 开发板的文件夹,存放gcc交叉编译器。

然后,在ZD中输入:sudo gedit /etc/bash.bashrc进入bash.bashrc文件添加一个编译环境的入口路径:PATH=/usr/local/arm/3.4.5/bin:$PATH (这里提醒下,不要凭个人习惯随意的添加空格,不然运行会通不过。

)其实这里就是gcc安装到/usr/local/arm路径下,保存;接着在ZD中:.(空格)/etc/bash.bashrc 重新运行该bash.bashrc文件。

再在ZD中:arm-linux-gcc -v 这样子不会再显示“找不到命令”了,而是会显示gcc版本号等相关信息。

小结:通过以上的几个步骤,就完成了编译环境的设定,即以后gcc交叉编译器就作为编译的环境(我是这样子理解的)。

UBOOT-1.1.6一些文件功能分析_prodigal

UBOOT-1.1.6一些文件功能分析_prodigal

141745169S3C2440裸奔讨论群Prodigal UBOOT学习笔记之部分:这是今天下午分析的文件,贴出来希望对大家帮助,分析了文件后对移植理解又更深了一步。

UBOOT移植体会:看下笔记记录时间,UBOOT这环节是从3月10号开始的,其中包括了几个学习环节:UBOOT 启动分析,UBOOT移植,UBOOT常见文件分析。

在移植中感觉最大的收获:倒不是成功的移植几个程序(说实话,在移植过程中,思维一直都是别人的,我们大都做的只是代码搬运,这样学着你是不是觉得很迷茫?),而是对UBOOT文件系统更加熟悉,更加清晰,也学会了一些错误分析的方法。

在UBOOT移植过程中:我不断问自己:要是自己移植的并不是S3C2440,而是一个我不熟悉的开发板,那我又应该怎么修改?也许我不喜欢被动的感觉吧。

01.include/configs/smdk2410.hFUNCTION:一些预定义配置①上层配置信息②Fin=12MHz③MMU IRQ/FIQ④malloc池大小、全局变量池大小⑤硬件设备:网卡我的网卡是DM9000⑥选择串行控制台配置⑦实时时钟RTC⑧波特率设置以及串口overwrite允许⑨预定义命令CONFIG_COMMANDS⑩网络配置*/⑪一些杂乱的配置信息:主要是UBOOT控制台显示设置⑫用PWM定时器4计时10ms(15625),所以1s就应该设置为15625*100⑬可设置的波特率:一般使用115200⑭堆栈大小设置⑮物理内存空间的设置:SDRAM,FLASH⑯FLASH与环境组织⑰擦除与写FLASH的最大时间:02.board/smdk2410/lowlevel_init.SFUNCTION:初始化存储控制器03.board/smdk2410/smdk2410.cFUNCTION:初板子的初始化配置①配置Fout(MPLL)②配置usb输出频率(UPLL)③平台依赖的相关部件的初始化3.1设置系统时钟3.2设置I/O端口3.3读取板子ID3.4UBOOT参数存放位置3.5使能icache与dcache3.5检测内存映射04.include/s3c2410.hFUNCTION:①UART与SPI选用的通道②ECC参数设置③UART的选择④S3C2410芯片上功能部件寄存器的起始地址⑤S3C2410芯片上功能部件寄存器的起始地址的获取函数⑥ISR相关的地址定义⑥这什么玩意??PENDING BIT⑦这什么玩意??清除Pending,这下懂了,就是清除中断挂起寄存器05.include/s3c24x0.hFUNCTION:部件相关的结构体定义06.include/asm-arm/global_data.hFUNCTION:lobal data used for startup functions①定义gd_t(struct global_data)类型的结构体②全局数据标志③宏定义DECLARE_GLOBAL_DATA_PTR07.include/asm-arm/u-boot.hFUNCTION:boot information for Linux kernel 08.include/common.hFUNCTION:目前用到的是:对函数的声明还有几个文件,但目前暂时不想分析只贴这个文件:board/smdk2410/smdk2410.c(并不是说其他的怎么样,而是因为这个文件让我学会了很多东西)/**(C)Copyright2002*Sysgo Real-Time Solutions,GmbH<>*Marius Groeger<mgroeger@sysgo.de>**(C)Copyright2002*David Mueller,ELSOFT AG,<d.mueller@elsoft.ch>**See file CREDITS for list of people who contributed to this*文件CREDITS列出了所有对此做出贡献的人*project.**This program is free software;you can redistribute it and/or一*modify it under the terms of the GNU General Public License as*published by the Free Software Foundation;either version2of些*the License,or(at your option)any later version.**This program is distributed in the hope that it will be useful,*but WITHOUT ANY WARRANTY;without even the implied warranty of说*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the*GNU General Public License for more details.**You should have received a copy of the GNU General Public License明*along with this program;if not,write to the Free Software*Foundation,Inc.,59Temple Place,Suite330,Boston,*MA02111-1307USA*/FUNCTION:初板子的初始化配置①配置Fout(MPLL)②配置usb输出频率(UPLL)③平台依赖的相关部件的初始化3.1设置系统时钟3.2设置I/O端口3.3读取板子ID3.4UBOOT参数存放位置3.5使能icache与dcache3.5检测内存映射/*下面头文件在include/目录下*/#include<common.h>#include<s3c2410.h>DECLARE_GLOBAL_DATA_PTR;/*必须增加这一行才能使用gd变量*//*①配置Fout(MPLL)*/#define FCLK_SPEED1#if FCLK_SPEED==0/*Fout=203MHz,Fin=12MHz for Audio*/#define M_MDIV0xC3#define M_PDIV0x4#define M_SDIV0x1#elif FCLK_SPEED==1/*Fout=202.8MHz*/#define M_MDIV0xA1#define M_PDIV0x3#define M_SDIV0x1#endif/*②配置usb输出频率(UPLL)*/#define USB_CLOCK1#if USB_CLOCK==0#define U_M_MDIV0xA1#define U_M_PDIV0x3#define U_M_SDIV0x1#elif USB_CLOCK==1#define U_M_MDIV0x48#define U_M_PDIV0x3#define U_M_SDIV0x2#endif/**delay函数加上“static inline”是有原因的,*这样可以使得编译*.c时,delay嵌入其他函数中,编译结果中只有其他函数一个函数。

AM335x UBOOT移植记录

AM335x UBOOT移植记录

board_init_r 第 2 阶段的初始化,在 board.c 文件中
enable_caches 这个函数没有做什么内容
board_init
第 2 次初始化平台,这里可以初始化其他内容了,和平台相关
mem_malloc_init 初始化 malloc 内存
nanபைடு நூலகம்_init
初始化 NAND(CONFIG_CMD_NAND 需要定义)
uboot 的代码运行流程 u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7 start.s 入口运行文件
bl save_boot_params 跳转到 lowlevel_init.S 该 文 件 在 (arch\arm\cpu\armv7\omap-common) , 如 果 是 MLO 则 会 定 义
1、.boards.depend 2、include/config.h
/* Automatically generated - do not edit */ #define CONFIG_BOARDDIR board/ti/am335x #include <config_cmd_defaults.h> #include <config_defaults.h> #include <configs/am335x_evm.h> #include <asm/config.h> 3、include/config.mk ARCH = arm CPU = armv7 BOARD = am335x VENDOR = ti SOC = ti81xx
这个目录下的几个文件,start.s 这个是程序的入口执行文件 u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7/omap-common u-boot-2011.09-psp04.06.00.08/arch/arm/cpu/armv7/ti81xx

uboot学习与移植笔记整理

uboot学习与移植笔记整理

Part1:remap.remap比较简单,和MMU的功能可以看做是等价的,只是一般remap地址估定为0x0 ,网上有个帖子叫<<ARM remap与重定位摘抄>>专门讲了它对remap的理解,对remap的作用是这样讲的: 当ARM处理器上电或者Reset之后,处理器从0x0取指。

因此,必须保证系统上电时,0x0处有指令可以执行。

所以,上电的时候,0x0地址处必定是ROM或者Flash(NOR)。

但是,为了加快启动的速度,也方便可以更改异常向量表,加快中断响应速度,往往把异常向量表映射到更快、更宽(32bit/16bit)的RAM中。

但是异常向量表的开始地址是由ARM架构决定的,必须位于0x0处,因此,必须把RAM映射到0x0。

文中提到了ARM处理器remap的三种情况,如下1)如果处理器有专门的寄存器可以完成Remap。

那么Remap是通过Remap寄存器的相应bit置1完成的。

如Atmel AT91xx2)如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank的起始地址,那么只要把RAM的起始地址编程为0x0,也可以完成remap。

如samsung s3c4510 .3)如果上面两种机制都没有,那么Remap就不要做了。

因为处理器实现决定了SDRAM对应的bank地址是不能改变的。

如Samsung S3c2410.不过我的看法有点稍微不一样,如果上面两种机制都没有,那么Remap就不要做了,它给的典型例子是Samsung S3c2410 ,2410虽然sdram对应的bank地址不能改变,但它有MMU功能, MMU可以起到remap的作用,常用的最典型的应该是例子Samsung S3c44b0,它既没有mmu,又SDRAM对应地址有没办法改变.顺便补充下除了4510可以改变每个bank的地址,还有华邦的w90P740(arm7),呵呵,我现在用的U就是这款U,可以把bank的地址随意的设置.2.relocate .relocate (地址重定位),个人觉得这个是boot里面最麻烦也是最核心的部分,刚开始看boot代码的时候,它简直是我的噩梦,不知道大家分析boot的源码流程是否这样,也可能我大学不是计算机的,没学过编译原理(现在也没看过)对链接和加载一无所知,有两个星期非常痛苦,就是不懂人家boot里面的链接脚本为什么要那样写.网上关于uboot的帖子很多,但对链接加载这块,始终写的不详细,不知道是不是太过于基础了,高手都不愿意讲,最后自己找资料,发现其实一切痛苦的根源都是对链接和加载不太清楚造成的,但个人感觉boot除了初始化以外就是搬运程序,如何搬运?为什么要那样搬运都需要对硬件板的地址分布很清楚?而这些都是链接决定的,所以非弄清楚不可!1.我们为什么需要relocate ? 经济方面,(nandflash和norflash 每兆价格相差悬殊),把boot代码放在norflash里面(为什么不放在nandflash里面,因为nandflash读需要驱动支持,norflash可以直接访问),boot通常很小,只需要占用几十k的空间,所以只需要很小的norflash芯片,这样很便宜,而把应用程序通常很大,所以用价格低廉nandflash来储存,实际应用,通过执行boot程序,把nandflash里面代码和数据搬运到内存中来执行,这样比程序直接放在norflash里执行,可以.另外还有运行速度方面的差别,程序在norflash里执行的速度远远小于在sdram中执行的速度,为了追求更高的速度,也需要relocate,让程序在sdram里面执行.2.关于加载域(VMA)和运行域(LMA)(加载域和运行域,加载域是程序代码在ROM、FLASH中的排列次序及地址安排,运行域是程序运行时代码在SRAM、SDRAM中地址安排;存储代码时按照加载域存放在FLASH中,运行时再从FLASH中取出代码到RAM运行域运行,一段代码的加载域和存储域可以不同),杜春雷在它那本经典的<<arm体系结构与编程>>一书专门有一章来讲加载域和运行域不一致的情况,但我当初接触了它的这些加载域和运行域后,看uboot的lds ,uboot的lds没有设置LMA,只是设置了VMA,为此我疑惑很久.直到耐心的看了那本链接器和加载器的书才豁然明白( /viewthread.php?tid=817770 ),任何一个链接器和加载器的基本工作都非常简单: 将更抽象的名字与更底层的名字绑定起来,好让程序员使用更抽象的名字编写代码,链接器的就是把源文件进行符号解析,把解析出来的符号和地址的进行绑定,把全局变量,函数,标号等等这些符合和地址绑定起来.3.boot上电后开始能够正确执行还有个很重要的原因,是要保证boot在系统加电或复位后最初执行的代码是跟地址无关的,(即在代码搬运前所执行的代码是与地址无关),地址无关即地址无关代码生成的这个映象文件可以被放在内存中的任何一个地址上运行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

u-boot-2015-01移植笔记
一、修改编译器路径
修改顶层Makefile文件,查找CROSS_COMPILE =,注释掉if判断,增加一行CROSS_CMPILE = arm-linux- (根据编译器不同这个自行添加,在这里感谢胡茂晓同学)。

二、复制平台相近board
1、进入board子目录下的samsung子目录,复制trats2文件夹为自己平台名字的文件夹(这里笔者使用iTop4412)。

2、进入iTop4412子目录,修改为。

3、修改Makefile,将trats2改为iTop4412。

三、修改板子相应配置
1、从源码根目录下进入include/configs目录,复制为。

2、从源码根目录下进入configs目录,复制trats2_defconfig为iTop4412_defconfig。

3、修改iTop4412_defconfig,将CONFIG_DEFAULT_DEVICE_TREE="exynos4412-trats2"改为CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。

四、增加自己的Device Tree Source
1、从源码根目录下进入arch/arm/Dts目录,复制 exynos4412- 。

2、修改当前目录下的Makefile文件,将
dtb-$(CONFIG_EXYNOS4) += \
\
\
\
\
修改成
dtb-$(CONFIG_EXYNOS4) += \
\
\
\
\
\
五、制作顶层.config文件
1、在源码根目录下使用命令make menuconfig(貌似刚支持图形界面配置)。

2、先配置基本的,Architecture select 选项选择ARM architecture,architecture选项的子选项Target select选择Samsun EXYNOS;EXYNOS board select选项选择Exynos4412 Trat2 board。

3、在Device Tree Control选项下,y(yes)Run-time configuration via Device Tree,选择Provider of DTB for control 为Embedded DTB for DT control,在Default Device Tree for DT control选项下输入exynos4412-iTop4412,退出。

4、保存退出,在源码根目录下会生成.config文件,需要用命令ls –a 查看。

5、在源码根目录下使用命令vim .config,修改.config文件。

将CONFIG_SYS_BOARD="trats2" 修改成CONFIG_SYS_BOARD="iTop4412";将CONFIG_SYS_CONFIG_NAME="trats2"修改成CONFIG_SYS_CONFIG_NAME="iTop4412";将CONFIG_DEFAULT_DEVICE_TREE=""修改成CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。

(注意:每次使用make menuconfig后都要修改本条)
六、编译
使用make命令,一段代码飘过生成了。

相关文档
最新文档