显示标签为“bootloader-redboot”的博文。显示所有博文
显示标签为“bootloader-redboot”的博文。显示所有博文

2008年11月27日星期四

eCos HAL分析

HAL架构

HAL在eCos中是一个多层次的架构,层级封装了不同的功能,它包括:

  • the architecture HAL

    架构抽象包含基本的CPU架构,比如interrupt,上下文切换,CPU启动等

  • the variant HAL

    变体抽象层专注某一CPU的特性,比如caches,MMU和FPU等,他通常也处理内存和中断 控制器等外设。

  • the platform HAL

    平台抽象层专注于现任的平台特性,比如平台启动,定时器,I/O寄存器访问和中断控 制器等等。

HAL接口

这里讲究HAL实现了哪些接口。

architecture characterization

这里包含了CPU基础架构的定义。包括了CPU段文存储格式,上下文切换,bit twiddling, 断点,堆栈大小和地址转换。这些定义位于:

  1. cyg/hal/hal_arch.h (arch HAL)
  2. cyg/hal/var_arch.h (var HAL)
  3. cyg/hal/plf_arch.h (plf HAL)

以下为议题细节

  • register save format
  • thread context initialization
  • thread context switching
  • bit indexing
  • idle thread activity
  • reorder barrier
  • breakpoint support
  • GDB support
  • setjmp and longjmp support
  • stack sizes
  • address translation
  • global pointer

interrupt handling

这些接口定义了中断处理相关的定义,包括了异常和中断号,中断允许和屏蔽和实时时钟操 作。这些定义可以位于:

cyg/hal/hal_intr.h (arch HAL)

而变体和平台抽象层定义位于:

  1. cyg/hal/var_intr.h (var HAL)
  2. cyg/hal/plf_intr.h (plf HAL)
  3. cyg/hal/hal_platform_ints.h (?)

议题细节:

  • vector numbers
  • interrupt state control
  • ISR and VSR management
  • interrupt controller management
  • clock control
  • microsecond delay

HAL I/O

此接口定义了对设备控制寄存器的访问支持。

  1. cyg/hal/hal_io.h
  2. cyg/hal/var_io.h
  3. cyg/hal/plf_io.h

议题细节有:

  • register address
  • register read
  • register write

cache control

此接口定义了CPU caches的控制支持。

  1. cyg/hal/hal_cache.h
  2. cyg/hal/var_cache.h
  3. cyg/hal/plf_cache.h

详细议题:

  • cache dimensions
  • global cache control
  • cache line control

Linker scripts(连接器脚本,lds)

连接器脚本对于eCos程序来说是必须的,他定义了内存区域,地址和尺寸,代码段和数据段 的放置位置,还有分配不同的编译器声称的段。

一般lds位于install/lib/target.ld,它事实上是由其他两类文件声称,一个基本的lds和 ldi文件声称的。

基本lds由arch HAL或者var HAL提供,它由一组lds段组成。ldi由plf HAL提供哦你,它包 含目标平台的的内存布局信息,位于

pkgconf/mlt____.ldi

这些ldi文件都是由相应的mlt(memory layout tool)脚本生成的。

诊断支持

SMP支持


参考资料

  1. eCos component writer's guide
  2. eCos HAL porting guide
  3. 如何构建eCos嵌入式系统

2008年11月25日星期二

Cirrus EP9302: 从RedBoot到Linux

Cirrus EP9302

Cirrus Logic是美国德州的一家半导体制造商,早在1989年就进入NASDAQ,股票代码是CRUS。
EP93xx是基于ARM920T的主板系列,在官方上你可以看到详尽的EP9302资料。

http://www.cirrus.com/en/products/pro/detail/P1066.html

EP9302和EP9301最大的区别就在于,CPU核心加入了一个浮点运算部件MaverickCrunch。

我在开始的时候曾经说过,eCos支持非常多的架构,包括ARM, CalmRISC, FR-V, H8,
IA32, M68K, Matsushita AM3x, MIPS, NEC V8xx, PowerPC, SPARC, SuperH。这是eCos非
常值得骄傲的一点,也充分发挥了开源的长处。但是毕竟世界上的主板千千万,从汽车到蓝
牙,无线设备等等等等,eCos开发小组也无法支持所有的主板。如果厂商新推出一个主板,
那多半需要自己拓展eCos来支持自己的新板,我所使用的Cirrus Logic就是一个例子。

你可以在官方网站上找到这些工具:

搭建工作环境

(此工作环境是在Red Hat Linux 9.0下配置完成,嵌入式开发普遍需要串口支持。)

  1. 解压arm-elf-gcc-3.2.1-full.tar.bz2得到两个目录,按照目录指引放置文件
  2. 在/etc/profile或者~/.bashrc中添加系统环境变量。比如 /etc/profile
    if [ `id -u` = 0]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
    #newly added for arm-3.4
    pathmunge /usr/local/arm/3.4/bin
    fi

配置安装redboot

这步会非常简单。Cirrus几乎把一切工作都做好了,解压cirrus-arm-linux-2.0.8.tar.bz2
进入目录 cirrus-arm-linux-2.0.8/edb9302,直接编译

cd /path/to/cirrus-arm-linux-2.0.8/edb9302
make redboot

然后得到cirrus-arm-linux-2.0.8/edb9302/images/redboot.bin,这就是一个redboot内核,
他使用了ecos的redboot模板,创建针对EP9302主板的ecos内核。安装也是比较方便,这使
用到了cirrus给的download工具(如果没有,你还需要编译):

../download/download -p 1 images/redboot.bin

通常情况下,我们的主板都是不允许FLASH被任意擦写的,这个规定在硬件上被强制实现:
用短路块连接EP9302的JP14的2、3脚。相反接到1、2脚,这个时候Flash会根据写入的协议
向外发布数据,待download侦测到数据时候会进行握手和数据传递。

然后关闭主板,进入EP9302,则可以进入Redboot命令行。

编译烧录linux

# busybox config
cd /path/to/cirrus-arm-linux-2.0.8
tar jxf tarballs/busybox-1.1.3.tar.bz2
cd busybox
make menuconfig

# compile ramdisk.gz
cd /path/to/cirrus-arm-linux-2.0.8/edb9302
make ramdisk

# compile linux zImage
make linuxconfig
make linux
这样就在/path/to/cirrus-arm-linux-2.0.8/edb9302/images中生成两个文件:
ramdisk.gz和zImage。

其中busybox和linux都需要对自己需求的理解来进行配置,在这里不再赘述。这里将一下
linux拷贝方法。将Linux内核传递给EP9302,是使用到了tftp(Trival FTP),首先需要配置
Red Hat 9.0主机的tftp客户端(/etc/xinetd.d/tftp),tftp常常用于无盘工作站。在这
里作为RH和EP9302的通讯协议。

然后进入EP9302 redboot配置主板(主要是网络)。

# ---- 主板配置部分 ----
# Local IP address是EP9302 IP地址
# Default server IP address是RH9 IP地址
RedBoot> fcon -i
Initialize non-volatile configuration - continue(y/n)
Run script at boot: true
Boot script:
Enter script, terminate with empty line
>> fis load ramdisk
>> fis load zImage
>> exec -r 0x800000 -s 0x800000
>>
Boot script(1000ms resolution): 1
Use BOOTP for network configuration: false
Gateway IP address: 192.168.16.1
Local IP address: 192.168.16.93
Local IP address mask: 255.255.255.0
Default server IP address: 192.168.16.91
DNS server IP address:
Network hardware address[MAC]:0x78:0x56:0x34:0x12:0x64:0x30
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue(y/n)? y

# ---- 拷贝文件部分 ----
RedBoot> fis init -f
RedBoot> load -v -r -b 0x800000 ramdisk.gz -h 192.168.16.91
RedBoot> fis create -b 0x800000 -l 0x800000 ramdisk
RedBoot> load -v -r -b 0x80000 zImage -h 192.168.16.91
RedBoot> fis create -b 0x80000 -l 0x120000 zImage

# ---- 重启 ----
RedBoot> re

重启EP9302之后,主板开机加载RedBoot,然后执行默认的启动脚本,加载ramdisk和zImage。
就这样我们进入Linux,第一次进入嵌入式Linux的感觉,是不是很奇妙?

2008年11月22日星期六

eCos,高度自制性的嵌入式操作系统

eCos, embedded configuratable os. 这个名字很好的说明了这个操作系统的特性,高度可 配置的嵌入式操作系统。他现在是非常流行的嵌入式操作系统,支持很多嵌入式平台(远远 不只是ARM平台),而且配置简单。他原先是由Cygnus开发,后来归于Red Hat旗下。

安装

你可以按照官方的方来安装eCos,使用脚本来完成整个下载和安装过程很方便,这个过程安 全但是不可靠。其实本质上需要的就是下载两个包,和一套安装方法。

解压后的目录可以放置在任意位置(例如/opt/redboot),然后在此目录下创建以下脚本— (记住设置系统环境变量ECOS_REPOSITORY)

#!/bin/sh
export ECOS_DEST=/opt/redboot
export ECOS_REPOSITORY=$ECOS_DEST/ecos-2.0/packages/
export PATH=$PATH:$ECOS_DEST/gnutools/i386-elf/bin/:$ECOS_DEST/ecos-2.0/tools/bin


rm build -rf
mkdir build
cd build
# ecosconfig new TARGET [template [version]]
# -- create a configuration file: ecos-2.0/packages/ecos.ecc
ecosconfig new pc redboot

# ecosconfig import
# -- import additional config info
ecosconfig import ${ECOS_DEST}/ecos-2.0/packages/hal/i386/pc/v2_0/misc/redboot_FLOPPY.ecm

# ecosconfig tree
# -- create a build tree
ecosconfig tree
make
这样就得到一个裸露的内核redboot.bin,可以制作一个启动软盘,来在虚拟机里测试它。

ecos术语

package

parcket关键字对应一组完成独立功能的代码包,他可以内嵌cdl脚本,来容纳更小的单位, 如cdl_option和cdl_component。 option和component是更小的代码元素,在解析之后将会成为C语言的宏。比如:

cdl_option CYGSEM_REDBOOT_DEFAULT_NO_BOOTP {
user_value 1
};

生成在.h文件,就是 CYGSEM_REDBOOT_DEFAULT_NO_BOOTP 1

target

target指定某种目标架构,关键字下将会定义很多的packet,来设置需要的组建和代码包。

target edb9302 {
alias { "Cirrus Logic EDB9302 evaluation board" ep9302 }
packages { CYGPKG_HAL_ARM
CYGPKG_HAL_ARM_ARM9
CYGPKG_HAL_ARM_ARM9_EP93XX
CYGPKG_DEVS_FLASH_STRATA
CYGPKG_DEVS_FLASH_EDB9301
CYGPKG_DEVS_ETH_ARM_EP93XX
}
description "
The EDB9302 target provides the packages needed to run eCos on the Cirrus Logic
EP9302 based development boards."

set_value CYGHWR_HAL_ARM_EDB93XX_VARIANT "EP9302"
}

此target旨在建立edb9302,他会包含packets中指明的packet,并且设置宏 CYGHWR_HAL_ARM_EDB93XX_VARIANT "EP9302"

template

template是指为某种目的build而建立的相应模板配置,比如选取一些包,配置一些选项等 等。在目录 ecos-2.0/package/templates 下面有一些模板的目录。

文件 ecos.db

ecos-2.0/packages/ecos.db是ecos的选项总表,是维系整个ecos代码的数据库。他定义了 全部的target和target所需要packets。ecosconfig将从中获取信息,构建ecos.ecc,从而 完成代码树的构建。

文件 ecos.ecc

由ecosconfig声称的目标代码的设置文件,他包括了生成目标代码所需的所有选项配置,包 括了template, option,component等等等等。ecos.ecc有可能包含有冲突的部分,你需要 解决这些冲突,然后ecosconfig tree 声称代码树。

解释刚才的redboot.sh脚本

ecosconfig new pc redboot

此命令来创建一个针对target pc的ecc脚本,他将选取redboot作为模板。根据模板和 ecos.db,ecosconfig会向ecos.ecc脚本放置所有可能的组建,选项和包集合。

ecosconfig import ${ECOS_DEST}/ecos-2.0/packages/hal/i386/pc/v2_0/misc/redboot_FLOPPY.ecm

引入ecm设置,表明我们选择的启动媒体是软盘,你也可以选择其他介质。

ecosconfig tree

根据ecos.ecc来生成代码集合,之后make,完成编译安装。

eCos架构

这是一个ecos的系统框图,框图重点突出了Hardware Abstraction Layer在eCos中的重要作 用。如果要领悟这些,还需要参看eCos代码。


这里重点表述了redboot模板的eCos系统架构,redboot相当于是一个bootloader,但是他的 作用远远不只是启动内核那么简单。除了提供网络功能,他还包括了硬件初始化,调试,文 件系统等等功用。是嵌入式中应用非常广泛的bootloader。

有空下次聊聊eCos的源代码架构。

http://en.wikipedia.org/wiki/ecos
http://ecos.sourceware.org/

http://www.ecoscentric.com/ecos/ecospro.shtml