0

关于投票
ecos(redboot)移植剖析

不同平台之间的移植(CPU相同,硬件平台不同) mypath是ecos的安装目录 mypath/ecos/package/ecos.db记录了现有的包(package)和目标板(target)描述.

一个target包含若干的package,target的描述会出现在configtool的templete的选项里。Target里同时指定了包含的package。照猫画虎的添加上自己的package和target后就可以在configtool的templete里看到。

Ecos的软件分了若干的模块,移植工作主要在他的hal层进行(包含在package/hal路径下),所谓hal(硬件抽象层)就是把和硬件相关的软件凑到一起,因为其他大部分代码使用C和C++,和硬件都是无关的,所以主要研究这一部分代码就可以进行移植,实际工作更加简单,因为ecos的HAL还分了几层,Common HAL, Architecture HAL,Variant HAL,Platform HAL,这几个层次同样可以在软件结构上找到对应关系,以三星的snds平台为例,首先在hal路径下可以看到common目录,/hal/arm/arch/目录,以及/hal/arm/snds/目录。这和上面的几层基本是对应的,当然这里这里面可以认为Variant HAL,Platform HAL合并了, 值得注意的是以上每个目录下的cdl目录下的cdl文件,打开configtool,在build->templete中选择samsung snds平台和redboot包后,可以看到出现相应的选项,其中有一个eCOSHal选项,该选项展开以后有ARMarchitecture,再展开以后还有SamsungSNDS evaluation board 选项,展开后同样有诸多选项,分别打开以上目录中的cdl文件,和这些选项对照,发现每一层的选项和每一层的CDL文件中的描述一一对应(虽然不知道CDL文件的语法,但对应关系还是很清晰)。可以说每一层之间相同的软件模块都有很大的借鉴,(一般可以直接COPY,然后根据不同之处作相应的改动即可)。对于现代的CPU,因为是ARM体系的,所以位置和arm下其他cpu模块是并列的,同时可以大量借鉴。

另一个问题是configtool中的选项如何在代码中实现,其实研究一下可以发现大部分选项对应一个宏定义,而选项的值将被用作代替这个宏,当然选项中还有对一些文件的选择,将在编译链接的时候用到。

通过配置文件配置完毕后,会被要求保存ecc文件,同时会在该目录下生成一个build目录和install目录,build目录存放最终需要编译的代码,这时再看hal目录,发现每一层只剩下和自己平台相关的文件了。

Install目录下存放了生成的各种格式的可执行的文件和编译链接所需要的库文件和头文件。

对于需要修改和研究的文件,在ecos的文档中有一个相应的列表,因为现代CPU是ARM核,所以对以下文件研究即可。

Variant HAL
Some variant HALs may add extra files for variant specific serial drivers, or for handling interrupts/exceptions if it makes sense.

Note that these files may be mostly empty if the CPU variant can be controlled by the generic architecture macros. The definitions present are only conditionally defined - if the equivalent platform headers provide the definitions, those override the variant definitions.

File Description
include/var_arch.h Saved register frame format, various thread, register and stack related macros.
include/var_cache.h Cache related macros.
include/var_intr.h Interrupt related macros.
include/var_regs.h Extra register definitions for the CPU variant. include/variant.inc Various assembly macros used during system initialization.
src/var_intr.c Interrupt functions if necessary.
src/var_misc.c hal_variant_init function and any necessary extra functions.
src/variant.S Interrupt handler table definition.
src/_.ld Linker macros.

Platform HAL
Extras files may be added for platform specific serial drivers. Extra files for handling interrupts and exceptions will be present if it makes sense.

File Description

include/hal_diag.h Defines functions used for HAL diagnostics output. This would normally be the ROM calling interface wrappers, but may also be the low-level IO functions themselves, saving a little overhead.
include/platform.inc Platform initialization code. This includes memory controller, vectors, and monitor initialization. Depending on the architecture, other things may need defining here as well: interrupt decoding, status register initialization value, etc.
include/plf_cache.h Platform specific cache handling.
include/plf_intr.h Platform specific interrupt handling.
include/plf_io.h PCI IO definitions and macros. May also be used to override generic HAL IO macros if the platform endianness differs from that of the CPU.
include/plf_stub.h Defines stub initializer and board reset details. src/hal_diag.c May contain the low-level device drivers. But these may also reside in plf_stub.c
src/platform.S Memory controller setup macro, and if necessary interrupt springboard code.
src/plf_misc.c Platform initialization code.
src/plf_mk_defs.c Used to export definitions from C header files to assembler header files.
src/plf_stub.c Platform specific stub initialization and possibly the low-level device driver.

以上20多个文件有一些也是不需要的,反正基本结构了解了以后,心理就能踏实一点了,呵呵

另外,看文档的过程中顺便看了看ecos的特性,应该说还是很不错,文件系统,协议栈都很全,还支持SMP,同样是实时,并且源代码开放,免费。比起那个ucos是强大多了,唯一缺陷是移植和使用复杂一点(但可移植性绝对强),而且国内介绍的书籍也不多,实在是可惜。希望借着这次机会能有所推广。

前面只是基本的剖析,有兴趣的还是应该多看文档,多分析,后面会把看代码中的心得贴出大家共同学习。 有一个错误纠正一下,build目录下存放的是编译的目标文件,不是源文件。 redboot和自己的bootloader可以并行,实际上hal_platform_setup.h中实现了平台的基本初始化,是通过PLATFORM_SETUP1这个宏实现的。

如果没有硬件板子,可以先简单做一个软件仿真,应用ADW调试工具,在option选项中选择configure----ARMulate-----configure,在其中设置必要的微处理器内核,和一些其他选项,[适应你的cpu] 就可以仿真了。[我的程序是在SDT环境下做的]

ARMulate,是arm公司提供的软件仿真调试代理。在清华那本《ARM体系结构与编程中有介绍〉。

再说一下Redboot,虽然现代可能已经移植好了,但是我们的目的是学习嘛,所以我就把我针对s344b0x01移植时的相关代码和步骤说一下,让大家批评指正。

首先:改动ecos.db增加我的packages和target
package CYGPKG_HAL_ARM_HLAS {
alias { "Dongsin HLAS" hal_arm_hlas arm_hlas_hal}
directory hal/arm/hlas
script hal_arm_hlas.cdl
hardware description " The HLAS HAL package provides the support needed to un eCos on a Dongsin HLAS eval board" }
target hlas {
alias { "Dongsin HLAS" HLAS hlas hlas100}
packages { CYGPKG_HAL_ARM CYGPKG_HAL_ARM_HLAS }
enable { CYGHWR_HAL_ARM_LITTLEENDIAN}
description " The hlas target provides the packages needed to run eCos on a Dongsin HLAS eval board." }
然后,修改我的packages CYGPKG_HAL_ARM_HLAS.CDL 大部分可以参考模板

三、 定义I/O moacos 在做这部分工作时一定要有耐性,定义要按照模板进行 这块做的好会给以后的编程带来方便。

四、 编写基本的串口驱动了,

一直推荐研究这个bootloader是因为ecos的可移植性方面的工作和提供的工具是其他开发源码bootloader无法相比的,希望能总结出新平台的移植细节,从而是大家在其他平台上也可以迅速移植并使用。虽然源代码有了,有些东西还是应该分析清楚,以配合硬件组连调。

作者:知秋一叶

bootloader文章

 

系统分类: 嵌入式
用户分类: U-boot
标签: ecos redboot botloader 移植
来源: 转贴
发表评论 阅读全文(853) | 回复(0)

0

关于投票
用U-Boot构建嵌入式系统的引导装载程序

BootLoader(引导装载程序)是嵌入式系统软件开发的第一个环节,它把操作系统和硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要,在整个开发中也占有相当大的比例。U-BOOT是当前比较流行、功能强大的BootLoader,可以支持多种体系结构。LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片,本文详细介绍U-BOOT的功能、特点以及在LH7A400处理器上的移植过程。

下载地址

系统分类: 嵌入式
用户分类: U-boot
标签: BootLoader uboot 嵌入式
来源: 转贴
发表评论 阅读全文(1127) | 回复(0)

0

关于投票
一个嵌入式系统的启动分析

本文介绍了利用Atmel公司的9200芯片设计组成一个最小系统,主要分析硬件系统的详细启动过程,
 实际移植U-Boot的源代码成功启动硬件系统,为下一步嵌入式开发做好准备。

下载地址

系统分类: 嵌入式
用户分类: U-boot
标签: 嵌入式 uboot bootloader
来源: 无分类
发表评论 阅读全文(771) | 回复(0)

1

关于投票
uboot在ARMs3c2410上移植过程

本文讲述S3C2410U-Boot的移植过程,实现了网卡(DM9000)功能,实现了USB功能。并介绍了常用的U-Boot命令。

详情

系统分类: 嵌入式
用户分类: U-boot
标签: uboot ARM s3c2410 移植
来源: 转贴
发表评论 阅读全文(1194) | 回复(1)

2

关于投票
U-Boot的硬体初始化

U-Boot的entry的位置在u-boot-/cpu//start.S中, 一开始的动作便是要初始化processor, 因此在start.S中:
.globl _start
_start: b reset
这边直接branch到reset这个label的地方, 这个assembler的函式负责初始系统的硬件(主要是processor与memory), 然后会jump到start_armboot这个function (这个function存在于u-boot-/lib_/board.c中, 为你的processor的架构, 例如xscale就是lib_arm的目录, 进到start_armboot就大多是C语言而不是assembler, 感谢上帝&妈祖&众神明...), 让我们以ARM pxa为例来看看这段assembler程式码 (sorry, 其它的架构不是太熟)。一开始必需让ARM进入superviser mode, 因此必需设定Current Program Status Register(CPSR)如下:
mrs r0,cpsr /* set the cpu to SVC32 mode */
bic r0,r0,#0x1f /* (superviser mode, M="10011") */
orr r0,r0,#0x13
msr cpsr,r0
ARM的SVC mode必需设定CPSR为100112(请参考ARM的相关数据, 我自己是看SteveFurber的书『ARM system-on-chip architecture』第108页)。然后u-boot会branch去一段cpu init的routine, 这边在新版的U-Boot有一点不一样, 旧版的会直接branch过去,而新版的U-Boot(version 1.1.1)会以一个设定值CONFIG_INIT_CRITICAL来判断要不要执行这段routine, 这是因为新版的U-Boot可以支持bootloader debug的方式让你方便研发,但是这个我没试过, 因此有兴趣的人请自行试试。下面是cpu_init_crit这个routine的程式片断:
cpu_init_crit:
/* mask all IRQs */
ldr r0, IC_BASE
mov r1, #0x00
str r1, [r0, #ICMR]
#if defined(CFG_CPUSPEED)
/* set clock speed */
ldr r0, CC_BASE
ldr r1, cpuspeed
str r1, [r0, #CCCR]
mov r0, #2
mcr p14, 0, r0, c6, c0, 0
setspeed_done:
#endif
/*
* before relocating, we have to setup RAM timing because memory timing is
* board-dependend, you will find a memsetup.S in your board directory.
*/
mov ip, lr
bl memsetup
mov lr, ip
/* Memory interfaces are working. Disable MMU and enable I-cache. */
ldr r0, =0x2001 /* enable access to all coproc. */
mcr p15, 0, r0, c15, c1, 0
CPWAIT
mcr p15, 0, r0, c7, c10, 4 /* drain the write & fill buffers */
CPWAIT
mcr p15, 0, r0, c7, c7, 0 /* flush Icache, Dcache and BTB */
CPWAIT
mcr p15, 0, r0, c8, c7, 0 /* flush instuction and data TLBs */
CPWAIT
mov pc, lr
这段assembler程序代码主要就是透过ARM coprocessor interface来设定PerformanceMonitoring Unit(PMU)与Memory Management Unit(MMU), 也就是CP14与CP15这两个coprocessor, 这段assembler片段有详细的说明(感恩呀...), 因此可以很清楚的看到中间还有branch到u-boot-/board//memsetup.S里面的memsetup这个位置, 这个routine会设定GPIO相关设定以及memory controller, 因此在之前提过的硬件设定檔要加入相关的设定值, 以lubbock为例, 他设定GPIO与memory的部份如下:
#define CFG_GPSR0_VAL 0x00008000
#define CFG_GPSR1_VAL 0x00FC0382
#define CFG_GPSR2_VAL 0x0001FFFF
#define CFG_GPCR0_VAL 0x00000000
#define CFG_GPCR1_VAL 0x00000000
#define CFG_GPCR2_VAL 0x00000000
#define CFG_GPDR0_VAL 0x0060A800
#define CFG_GPDR1_VAL 0x00FF0382
#define CFG_GPDR2_VAL 0x0001C000
#define CFG_GAFR0_L_VAL 0x98400000
#define CFG_GAFR0_U_VAL 0x00002950
#define CFG_GAFR1_L_VAL 0x000A9558
#define CFG_GAFR1_U_VAL 0x0005AAAA
#define CFG_GAFR2_L_VAL 0xA0000000
#define CFG_GAFR2_U_VAL 0x00000002
#define CFG_PSSR_VAL 0x20
#define CFG_MSC0_VAL 0x23F223F2
#define CFG_MSC1_VAL 0x3FF1A441
#define CFG_MSC2_VAL 0x7FF97FF1
#define CFG_MDCNFG_VAL 0x00001AC9
#define CFG_MDREFR_VAL 0x00018018
#define CFG_MDMRS_VAL 0x00000000
这部份的设定也是要根据你的硬件配置与外围, 因此必需跟你的硬件人员研究一下, 当这些硬件初始的动作作玩后, 我们会回到之前branch到cpu_init_crit的下一个位置(透过把LR缓存器的值写进PC缓存器), 然后把U-Boot重新寻址到RAM上面, 如下:
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _armboot_end
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
最后再设定stack与清除BSS segment就可以跳到start_armboot的地方啦

下载地址

系统分类: 嵌入式
用户分类: U-boot
标签: uboot bootloader 硬件
来源: 转贴
发表评论 阅读全文(1134) | 回复(0)

0

关于投票
U-Boot在44B0X开发板上的移植以及代码分析

内容简介 :
介绍了移植0.4.0版本U-Boot到44B0X上的具体方法。简要介绍了U-Boot的历史,及U-Boot移植的框架;详细分析了start.S各个部分的功能及移植修改的方法,包括:定义入口、设置异常向量(Exception Vector)、初始化CPU相关的pll /clock/中断控制寄存器、初始化内存控制器、将rom中的程序复制到RAM中、初始化堆栈、转到RAM中执行;最后,介绍了系统初始化部分的移植工作,包括:串口部分、时钟部分、flash部分。给出了部分移植的源码。

目标CPU: 44B0X

下载地址

系统分类: 嵌入式
用户分类: U-boot
标签: uboot bootloader 44B0X 移植
来源: 转贴
发表评论 阅读全文(763) | 回复(0)

0

关于投票
U-boot移植日记(s3c44b0)

几经艰辛,终于基本完成了 u-boot 在 s3c44b0 的移植工作,在些记录一下在移植过程中所碰到的困难和解决方法(一些心得),作为日后参考之用,也希望能够帮到其它有需要的人 ^_^ 。
1. 来由:
在我搞完 ucos 后 ( 本来我是想学 uclinux 的,不过在对系统一无所知的情况下,还是先学一下 ucos 比较实际 ^_^ ,从中也可以对系统有个清晰的概 念 ) ,我意识到要搞系统的话一个功能强大的 bootloader 是必不可少的,而我的板上自带的是 armboot (其实我个人觉得应用在 ARM 上的话 armboot 已经足够了,毕竟 u-boot 也是从 armboot 中发展过来的,纯属个人意见),如果我的板上自带光盘有已经移植好的 armboot 源代 码供我参考的话,我想我也不会花这么多时间去搞 u-boot ,可恨的是我的光盘上只有 armboot.bin 这个二进制文件,而没有源文件,没办法,我下 定主意自己搞一个,考虑了一番后我选择了 u-boot ,毕竟参考资料相对比较多,再我学完 u-boot 后再回头看 armboot ,简直是一个炉里出的饼, 这是后话。

http://www.foxice.net/techinfo_uboots3c44b01.asp

系统分类: 嵌入式
用户分类: U-boot
标签: Uboot s3c44b0
来源: 整理
发表评论 阅读全文(1091) | 回复(1)
总共 , 当前 /