微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 移植标准Linux到S3C2410

移植标准Linux到S3C2410

时间:05-18 来源:互联网 点击:

1 引言

目前 , 在嵌入式系统里基于ARM核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用 , 建立面向ARM构架的嵌入式操作系统也就成为当前研究的热点。S3C2410是SAMSUNG公司基于ARM920T处理器内核开发的一款16/32位嵌入式处理器,运行频率高达200多M,具有MMU和高速缓存等丰富片上资源,是目前基于ARM920T内核的出货量最大的一款芯片。目前嵌入式操作系统也较多,如 Tor2nado 的VxWork、微软的 Windows CE等等。大量开发人员选择的却都是Linux,这是因为它源代码开放,可以轻松修改移植到自己的目标平台系统里使用。并且事实证明,效果令人满意。两者的结合必将在嵌入式系统的世界里打出一片天地。

2 Linux 操作系统的移植

2.1移植的含义

要使得标准Linux能在ARM嵌入式处理器上运作,势必要经过移植 (porting) 的过程。所谓移植,就是让一套软件可以在一套选定硬件平台上正常运作,也就是要将平台相依 (platform dependent) 的部分做适当的修改。内核源码arch子目录包括了所有和平台体系结构相关的核心代码,它的每一个子目录都代表所支持的一种体系结构,arm就是关于我们所选处理器体系结构的子目录。我们的移植工作主要集中于此目录下。

2.2移植的具体实现

如果我们已经搭建起完整的交叉编译平台,移植工作便可开始了(以当前使用最广的linux-2.4为例,放于/usr/src/ linux-2.4.18之下)。

/ Makefile文件

一个工程往往包含很多的文件,按照一定的规则放在多个目录中。Makefile文件用来指定编译规则,例如哪些需要编译,哪些要先编译。在此处要做的是:

指定目标平台ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)

设置为ARCH :=arm

指定交叉编译器CROSS_COMPILE =

设置为CROSS_COMPILE =arm-linux-

/arch/arm/Makefile

启动代码的产生要通过此一文件,由于2.4内核还没有对S3C2410的支持,自行加入如下代码

ifeq ((CONFIG_ARCH_ S3C2410),y)

TEXTADDR = xxx

MACHINE = s3c2410

Endif

TEXTADDR是内核的虚拟起始地址[6],也是内核最终运行地址,通常设为PAGE_OFFSET +0x8000,须根据实际情况相结合[2]。

/arch/arm/config.in

config.in是配置文件,决定了我们在配置菜单中看到的内容。自行加入$CONFIG_ARCH_S3C2410子选项[5]。

if [ $CONFIG_ARCH_S3C2410 = y ]; then

comment'Archimedes/A5000 Implementations'

dep_bool 'SMDK (MERI TECH BOARD) '

CONFIG _S3C2410_SMDK//

$CONFIG_ARCH_S3C2410

//其他

fi

在if [ $CONFIG_FOOTBRIDGE_HOST = y -o

……

$CONFIG_ARCH_SA1100 = y ]; then

define_bool CONFIG_ISA y

else

define_bool CONFIG_ISA n

fi

中依样加入$CONFIG_ARCH_s3c2410 = y-o。

/arch/arm/boot/Makefile

ZTEXTADDR 是解压前image.rom的位置,ZRELADDR是内核解压并最终执行的位置。ZRELADDR与TEXTADDR之间符合如下映射关系:__virt_to_phys(TEXTADDR) == ZRELADDR[6]。

ifeq ((CONFIG_ARCH_s3c2410),y)

ZTEXTADDR = xxx

ZRELADDR = xxx

Endif

/arch/arm/boot/compressed/ Makefile

依样加入 ifeq ($(CONFIG_ARCH_S3C2410),y)

OBJS +=head-s3c2410.o

endif

/arch/arm/boot/compressed/head-s3c2410.s

此处需要自行加入内核解压前处理器初始化文件head-s3c2410.s,示例代码:

.section .start, ax

__S3C2410_start:

bic r2, pc, #0x1f @清除pc相关位,放于r2

add r3, r2, #0x4000

1: ldr r0, [r2], #32

teq r2, r3

bne 1b

mcr p15, 0, r0, c7, c10, 4 @ 写回 Write Buffer

mcr p15, 0, r0, c7, c7, 0 @ 刷新 I D caches

#if 0

@ 禁用MMU ,caches

……

#endif

mov r0, #0x00200000

1: subs r0, r0, #1

bne 1b

/arch/arm/kernel/ Makefile

依样将$(CONFIG_ARCH_2400) $(CONFIG_ARCH_2410) 加入

no-irq-arch :=$(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X)

……

$(CONFIG_ARCH_AT91RM9200

并添加 obj-$(CONFIG_MIZI) += ecard.o

obj-$(CONFIG_ARCH_APM) +=apm2.o

/arch/arm/kernel/entry-armv.S

此文件主要定义CPU初始化时中断处理部分[6],可参考处理器使用手册,按处理器使用要求设置。

/arch/arm/kernel/debug-armv.S

此文件用于最基本的串口调试功能[6],包括调试串口的地址初始化、发送、等待、忙状态定义等。使用此文件可以在启动过程中打印出相关信息。

/arch/arm/kernel/setup.c

在此文件中要根据使用的板子设置几个变量[5]。nr_banks指定了内存块的数量,bank指定了每块内存块的范围,PAGE_OFFSET是内存起始地

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top