uboot移植笔记
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移植笔记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移植日记
在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 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移植学习笔记
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
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移植记录
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学习与移植笔记整理
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在系统加电或复位后最初执行的代码是跟地址无关的,(即在代码搬运前所执行的代码是与地址无关),地址无关即地址无关代码生成的这个映象文件可以被放在内存中的任何一个地址上运行。
在ubuntu8[1].0.4上移植uboot
在ubuntu8.04上UBOOT移植笔记一、 与windows共享最好的做法是通过SAMBA与Windows建立共享,但是在ubuntu8.04上配置SAMBA服务器是一件非常痛苦的事,特别是对于没有经验的新手来说更是如此。
变通的做法是在UBUNTU8.04上安装SAMBA客户端,用Windows的共享来实现文件交换。
先在windows上建立一个共享文件夹,例如“SWAP”,共享权限是可读可写。
然后搜索Ubuntu的安装光盘,找到“smbclient_3.0.28a-lubuntu4_i386.deb”,双击安装。
安装完成后,在Ubuntu桌面上依次选择“位置”-“网络”,找到Windows共享主机,双击即可看到共享文件夹。
连接成功后,会在Ubuntu的桌面上产生一个映射,以后再次双击该映射图标即可。
二、 安装开发工具链1、arm-linux-gccz首先在你的用户目录下建立tools文件夹:mkdir tools (推荐使用终端操作,也可以在图形用户界面下进行)z然后从以下地址下载arm-linux-gcc-3.3.2.tar.bz2到windows的共享文件夹“/developers/linux/files/tools/arm-linux-gcc-3.3.2.tar.bz2”z将arm-linux-gcc-3.3.2.tar.bz2从共享文件夹拖到刚才建立的 tools文件夹z进入tools文件夹:cd toolsz然后解压缩:tar xvf arm-linux-gcc-3.3.2.tar.bz2,在 tools文件夹形成/usr/local/arm/3.3.2/文件夹z进入刚才形成的local文件夹:cd usr/local/z将arm文件夹拷贝到/usr/local/文件夹:sudo cp -rv arm /usr/local/z将编译器路径添加到系统环境变量export PATH=/usr/local/arm/3.3.2/bin:$PATHz检查环境变量是否添加成功:echo $PATH,在输出的信息中如果含有/usr/local/arm/3.3.2/bin,则表示添加成功。
uboot学习笔记二
U boot学习笔记(二)一、移植环境主机:Ubutu9开发板:qq2440--64MB编译器:arm-linux-gcc-3.4.5.tgzu-boot:u-boot-1.1.6.tar.bz2二、增加NAND FLASH命令#gedit include/configs/qq2440.h//增加NAND FLASH操作命令#define CONFIG_COMMANDS\(CONFIG_CMD_DFL|\CFG_CMD_CACHE|\CFG_CMD_NAND|\//增加NAND FLASH控制宏#define CFG_NAND_BASE0#define NAND_MAX_CHIPS1#define CFG_MAX_NAND_DEVICE1下面需要做的是编写board_nand_init函数(1)针对S3C2410、S3C2440NAND Flash控制器的不同来定义一些数据结构和函数,在include/s3c24x0.h文件中增加S3C2440_NAND数据结构。
/*NAND FLASH*/typedef struct{S3C24X0_REG32NFCONF;S3C24X0_REG32NFCONT;S3C24X0_REG32NFCMD;S3C24X0_REG32NFADDR;S3C24X0_REG32NFDATA;S3C24X0_REG32NFMECCD0;S3C24X0_REG32NFMECCD1;S3C24X0_REG32NFSECCD;S3C24X0_REG32NFSTAT;S3C24X0_REG32NFESTAT0;S3C24X0_REG32NFESTAT1;S3C24X0_REG32NFMECC0;S3C24X0_REG32NFMECC1;S3C24X0_REG32NFSECC;S3C24X0_REG32NFSBLK;S3C24X0_REG32NFEBLK;}/*__attribute__((__packed__))*/S3C2440_NAND;(2)在include/s3c2440.h文件中仿照S3C2410_GetBase_NAND函数定义S3C2440_GetBase_NAND函数。
uboot移植心得
最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。
参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。
U-BOOT的两个阶段启动过程:(2010.06经典版来说)第一阶段:start.S的路径位于arch\arm\cpu\arm920t\这段汇编代码一般被称作第一阶段初始化代码。
主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到内存中执行第二段初始化代码1、关闭开门狗,屏蔽所有中断2、设置分频比3、bl cpu_init_crit() 关MMU,初始化内存bl lowlevel_init() 配置内存,修改内存刷新率参数等4、relocate判断当前代码是在NORFLASH还是RAMcopy_loop循环将FLASH代码复制至RAM中5、stack_setup栈设置clear_bss_bss_start到_bss_end之间的数据清06、ldr pc , start_armboot 跳转到第二阶段//=====================================================================第二阶段:board.c的路径位于arch/arm/lib/board.c,这段代码为U-BOOT的第二阶段初始化代码。
主要作用是初始化两个重要数据结构,对SDRAM的内存分配设置,对各种需要用到的外设进行初始化,最后循环跳入main_loop()函数二阶段start_armboot分为board_init_f 和 board_init_r两部分先执行的board_init_f部分:1、为gd数据结构分配地址,并清零2、执行init_fnc_ptr函数指针数组中的各个初始化函数,如下board_early_init_f ,timer_init ,env_init init_baudrate serial_initconsole_init_f display_banner dram_init3、A、分配SDRAM高64KB为TLB,用于U-BOOTB、分配SDRAM下一单元为U-BOOT代码段,数据段,BSS段(这里插一句,原来BSS段是用来存放未初始化的全局变量与静态变量)C、接着开辟malloc空间,存bd , gd , 3个字大小的异常堆空间4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S)后执行的board_init_r部分:1、对gd , bd 数据结构赋值初始化2、各种外设初始化:初始化NORFLASH, NANDFLASH,初始化ONENAND FLASH初始化环境变量初始化PCI设置IP地址初始化各类外设:IIC、LCD、键盘、USB初始化控制台建立IRQ中断堆栈初始化以太网初始化跳转表(定义了U-Boot中基本的常用函数库)。
uboot分析和笔记
uboot一、uboot是ppcboot和armboot合并而成,现在主流的bootloader为uboot和redboot二、bootm addr_kernel addr_initrd三、移植uboot时最好(一定)要找到一个自己板子的原形(即自己的板子是在这个板子上做一些修改而来的)的版本,这样就可以事半功倍。
这样要修改的地方就比较少,也比较容易了。
uboot支持很多平台,与一个具体平台相关的主要有三个地方:1、./include/configs/xxxxx.h, 主要定义了flash、sdram的起始地址等信息,一般要修改flash的起始地址、大小,有时候会有位宽等。
2、./board/xxxxx/*,这个目录下主要有两三个.c文件,主要为该平台的初始化和flash操作的函数。
有时候flash的操作需要修改,不过一般都是找一个现有的支持该flash的驱动,一般情况在uboot 别的./board/平台下就会有现成的,拷贝过了就可以了。
3、./cpu/xxxxxx/arch_xxx/xxxxxx/*, 一般是此cpu的初始等函数。
四、具体移植的时候最多涉及到的会是./include/configs/xxxx.h,如果有现成的平台(uboot现在支持绝大部分我们常用的平台),可能只需要对着原来的xxxx.h文件,修改几个我们在硬件上修改了的地方,一般会是flash的起始地址、大小;内存大小(内存的起始地址应该都是0);uboot设置信息保存的地址和长度;console 口和它的波特率;默认的设置;uboot的入口地址等(具体情况可能会有一些变化),如果不是从相同的平台移植,可能会比较麻烦,因为这时候要修改一些和此cpu相关的一些寄存器、频率和内存等硬件方面的东西了(也在这个xxxx.h中),虽然这时改动的地方也不多,但是会很痛苦,因为经常不知道要改哪里或者改为多少。
所以可能需要参考cpu的datasheet和到网上找一些资料了并且慢慢试了。
exynos4412-uboot移植笔记
Exynos4412 uboot移植笔记一、准备原料三星原厂提供的UBOOT代码-u-boot-samsung-dev.二、在4212平台代码基础上修改成自己的平台YYGY44121.用户目录下新建文件夹yygy4412-uboot cd, mkdir yygy4412-uboot2.进入yygy4412-uboot文件夹,将三星平台代码压缩文件拷贝至此。
解压,重命名为:yygy4412-uboot tar -vxf u-boot-samsung-dev.tar.gz mv u-boot-samsung-dev yygy4412-uboot3.拷贝迅为的CodeSign4SecureBoot文件夹到当前目录。
至此当前目录结构为:4.进入文件夹yygy4412-uboot cd yygy4412-uboot 进入三星平台cd board/samsungcp -rf smdk4212 yygy4412 cd yygy4412Mv clock_init_smdk4212.S clock_init_yygy4412.SMv mem_init_smdk4212.S mem_init_yygy4412.SMv smdk4212.c yygy4412.cMv smdk4212_val.h yygy4212_val.hMv smdk4412_val.h yygy4412_val.hVi lowlevel_init.S#ifdef CONFIG_EXYNOS4412#include "smdk4412_val.h" //改为#include "yygy4412_val.h"#else#include "smdk4212_val.h" //改为#include "yygy4212_val.h"#endifVi clock_init_yygy4412.S#ifdef CONFIG_EXYNOS4412#include "smdk4412_val.h" //改为#include "yygy4412_val.h"#else#include "smdk4212_val.h" //改为#include "yygy4212_val.h"#endifVi Makefile33行:COBJS-y := smdk4212.o //改为:COBJS-y := yygy4412.o37行;SOBJS += mem_init_smdk4212.o //改为:SOBJS += mem_init_yygy4412.o38 ;SOBJS += clock_init_smdk4212.o //改为:SOBJS += clock_init_yygy4412.oCd , cd yygy4412-uboot/yygy4412-uboot修改boards.cfg 添加yygy4412 arm armv7 yygy4412 samsung exynos Cp -av include/configs/smdk4412.h include/configs/yygy4412.hVi include/configs/yygy4412.h265: #define CONFIG_SYS_PROMPT "SMDK4412 # "改为:#define CONFIG_SYS_PROMPT "YYGY4412 # "319:#define CONFIG_IDENT_STRING " for SMDK4412"改为;#define CONFIG_IDENT_STRING " for YYGY4412"Vi u-boot.ldsboard/samsung/smdk4212/libsmdk4212.o (.text)修改为:board/samsung/yygy4412/libyygy4412.o (.text)5.编译make yygy4412_config make6.制作UBOOT因CPU exynos_4412的启动过程是BL0 //BL0固化在iram中的程序(关闭看门狗,关闭中断及MMU,时钟设置,检测om决定启动方式,拷贝bl1到iram中BL1 <8k /*BL1 初始化化环境(中断初始化,设置堆栈等),搬移bl2代码到RAM中,并允许它,BL1是三星提供的,无源码,见CodeSign4SecureBoot/E4412_N.bl1.SCP2G.bin| 如果想看源码,可以反汇编分析,如arm-none-linux-gnueabi-objdump -D -b binary -m arm E4412_N.bl1.SCP2G.bin > b1.asmBL2 <14k //bl2 完成基本硬件初始化(Low_init.s 时钟串口内存flash等)u-boot.bin所以我们单独运行u-boot是不行的,需使用三星提供的BL1 BL2进行打包加密校验cp -rf sdfuse_q ./ //sdfuse_q 三星提供的加密处理(checksum)Cp mkuboot ./ //拷贝SD卡制作UBOOT脚本。
10分钟掌握u-boot移植
一、U-BOOT的目录结构u-boot目录下有18个子目录,分别存放管理不同的源程序。
这些目录中所要存放的文件有其规则,可以分成三类。
第一类目录与处理器体系结构或者开发板硬件直接相关;第二类目录是一些通用的函数或者驱动程序;第三类目录是u-boot的应用程序、工具或者文档。
Board:和一些已有开发板相关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关,主要包含SDRAM、FLASH驱动。
Common:与体系结构无关的文件,实现各种命令的C文件。
CPU:CPU相关文件,其中的子目录都是以u-boot所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c 和start.S。
其中cpu.c初始化cpu、设置指令cache和数据cache等;interrupt.c设置系统的各种终端和异常,比如快速中断,开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是u-boot启动时执行的第一个文件,他主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
Disk:disk驱动的分区处理代码、Doc:文档。
Drivers:通用设备驱动程序,比如各种网卡、支持CFI的flash、串口和USB总线等。
Dtt:数字温度测量器或者传感器的驱动Examples:一些独立运行的应用程序的例子。
Fs:支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2、yaffs和registerfs。
Include:头文件,还有对各种硬件平台支持的会变文件,系统的配置文件和对文件系统支持的文件,其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件。
Net:与网络有关的代码,BOOTP协议、TFTP协议RARP协议和NFS文件系统的实现。
Lib_ppc:存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数,与PowerPC体系结构相关的代码。
uboot移植(深入浅出)
移植U-Boot.1.3.1到S3C244和S3C2410首先,U-Boot1.3.1还没有支持s3c2440,移植仍是用2410的文件稍作修改而成的。
2440和2410的区别在我移植1.2.0的文章中已经写了,这里不再赘述。
对于1.3.1和1.2.0的差别,我初看了一下,(对于ARM920T内核)应该是增加了对A TMEL 公司的A T91RM9200系列处理器的支持。
至于S3C24X0系列的芯片,原理上并没有什么大的变化。
一、在U-Boot中建立自己的开发板类型,并测试编译。
我为开发板取名叫: tekkaman24400 在工作目录下解压U-Boot。
[tekkamanninja@ARM9-Host working]$ tar -xjvf u-boot-1.3.1.tar.bz21 进入U-Boot目录,修改Makefile(我在fedora 8 下,比较喜欢使用KWrite)[tekkamanninja@ARM9-Host working]$ cd u-boot-1.3.1[tekkamanninja@ARM9-Host u-boot-1.3.1]$ kwrite Makefile#为tekkaman2440建立编译项sbc2410x_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0tekkaman2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman s3c24x0LSD1808_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm926ejs lsd1808 NULL am1808各项的意思如下:arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
uboot修改移植开发知识梳理
u-boot修改移植开发知识梳理/*************************************************************************** ************************* u-boot裁剪**/board -------->只留与扳机相关的文件夹cpu -------->只留与扳机相关的文件夹include -------->与架构无关的目录删除include/configs -------->只留架构相关的一个文件include/asm -------->删除与架构无关的目录./ -------->主目录lib开头与架构无关的目录删除,注意报libfdt留下/*************************************************************************** ************************* makefile 关键说明**/make ming2440_config流程:make mini2440_config--> mini2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 risecomm s3c24x0--> mkconfigmini2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 risecomm s3c24x0// $(A:patternA=patternB)。
意思就是将A中patternA格式的字符用patternB来代替。
回归$(@:_config),// @代表输入的参数,即:mini2440_config,patternA是_config,patternB是空的。
uboot笔记
u-boot讲课笔记一、概述u-boot是bootloader程序的一种,包含丰富、应用广、源码公开。
主要功能引导操作系统、辅以下载程序等等功能。
源代码的网络资源:官方链接德国DENX 软件工程中心主页 http://www.denx.de/U-boot 官方主页(注意其中的邮件列表链接)http://www.denx.de/wiki/U-Boot/WebHomeU-boot 官方源码FTP 下载 ftp://ftp.denx.de/pub/u-boot/二、编译#make distclean#make mini2440_config#make all把产生的u-boot.bin利用nor flash中的下载程序烧写到nand flash地址为0的地方,方法:把开发板的开关拨向从Nor Flash启动,进入SuperViVi菜单界面,输入“v”,借助DNW,通过USB下载刚编译生成的u-boot.bin;把tools目录下的工具mkimage拷贝到系统环境变量支持的命令目录中如/bin或/usr/bin,或者toolchain的bin目录中。
Mkimage的目的是给内核image文件添加一个uboot需要识别的一个头,具体命令类似Mkimage –A arm –O linux –T kernel –C none –a 0x30008000 –e 0x30008040 –n “Linux Kernel Image”–d /linux-2.6.32.2/arch/arm/boot/zImage uImage参数说明–A 指image文件是用于什么cpu架构,-O 指image文件是什么操作系统,-T指image文件是什么类型,如kernel指的是内核,-C 指image文件的压缩格式,-a 指image文件的加载地址,-e指image文件的执行地址,-n 指image文件的名字,-d指具体的image文件,包括路径。
2410 uboot 移植笔记
2410 uboot 移植笔记主要参考了luofuchong 大侠/cgi-bin/topic.cgi?forum=3&topic=562&start=0&show=和bekars大侠/article/84/84538.shtmbekars大侠的很可能就是原创,有时间再研究一下。
过程:下载luofuchong 上面的链接里面的u-boot.是1.1.4的,打上他提供的补丁之后,在Makefile中指定ARCH=arm,和CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-make smdk2410_configmake出现了错误:/root/uboot/u-boot-1.1.4/include/asm/processor.h:52: parse error before `1'/root/uboot/u-boot-1.1.4/include/asm/processor.h:52: warning: no semicolon at end of struct or union/root/uboot/u-boot-1.1.4/include/asm/processor.h:54: parse error before `}'/root/uboot/u-boot-1.1.4/include/asm/processor.h:58: field `insn' has incomplete type google了一下,修改办法:以下是错误所指的文件的相关部分:(每行前面是行号)51: union debug_insn {52: u32 arm;53: u16 thumb;54: };56: struct debug_entry {57: u32 address;58: union debug_insn insn;59: };第一种:感谢tpu的关注,将52行的arm改为arm1就可以了,可能是引用这个union的文件中用的是arm1,所以造成不一致,出错,^_^,真不知道这样的错误是怎么出的?第二种:修改成: union debug_insn { u32 arm_mode; u16 thumb_mode; }把生成的u-boot.bin烧到板子上去U-Boot 1.1.4 (Jun 29 2006 - 10:44:44)U-Boot code: 33F80000 -> 33F9716C BSS: -> 33F9B2B8RAM Configuration:Bank #0: 30000000 64 MBFlash: 2 MB*** Warning - bad CRC, using default environmentIn: serialOut: serialErr: serialS3C2410 #hujun2410=> go 0x30008000## Starting application at 0x30008000 ...undefined instructionpc : [<33f0000c>] lr : [<33f8601c>]sp : 33f07cd8 ip : 0000107e fp : 33f07ce4r10: 33f07d0c r9 : 00000000 r8 : 33f4ffdcr7 : 33f07d10 r6 : 00000002 r5 : 00000000 r4 : 30008000r3 : fc000000 r2 : 30008000 r1 : 000000c1 r0 : 00000000Flags: Nzcv IRQs off FIQs off Mode SVC_32Resetting CPU ...hujun2410=>tftp出现很多ARP.... 忘了,反正网卡cs8900 id 没有读出来cs8900 id is 0x7ccc //我加入调试语句,出来的应该是0x630e分析:证明nand Flash 已经识别出来了,就是cs8900 的id 识别不正确,应该是0x63e,我的板子用的nGCS2作片选,vivi里面定义CS8900_BASE=0x1100 0300 ,我的vivi可以用tftp 下载,本来想在vivi 里面找点线索,无奈做板子的提供的这个vivi 有些源码没有公开,(鄙视之。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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命令,一段代码飘过生成了。