Linux 是一种合适于嵌入式体系的开源操作体系,能够高效地处理各种杂乱的使命。从依据TI DM320的PMP 解决计划下手,以TI DM320 渠道为例,提出一种在PMP 体系上运用嵌入式Linux 的办法,讨论了Bootloader 发动程序和嵌入式Linux 内核的移植进程。
1 导言
PMP (Portable MulTImedia Player,便携式多媒体播放器),也便是一般人们所说的MP4,现在是消费类电子产品的一个新热门[1].而TI 的解决计划是依据该公司的DM320 DSP,其处理器为DSP+ARM 双核处理器架构,运用DSP 进行音视频编解码和图画编解码等多媒体处理,ARM 处理器担任体系管理及供给外围设备接口。该计划在多媒体性能与归纳本钱方面极具竞争力。可是软件编程相对杂乱以及产品开发周期较长。
2 PMP软件体系结构
PMP 软件最底层是操作体系层,该层首要包含Bootloader 引导程序和嵌入式Linux 操作体系。
Bootloader 首要完结体系从Flash 的发动、硬件各部分的初始化、LOGO 的显现以及OS 的引导;嵌入式Linux 首要包含通过定制的合适在DM320 上运转的Linux 操作体系。
3 Bootloader引导程序的定制
3.1 DM320 下的Bootloader 的发动进程
Bootloader是指体系发动后,在操作体系内核运转之前运转的一段小程序。不同的Bootloader 的装置介质Flash,体系的发动进程是不一样的。
1) 当装置介质为NOR Flash 时,Bootloader 就能够直接在 Flash 闪存内运转,不用把代码复制到体系RAM 中。发动方法设置成外部Memory,这样ARM的开端地址就从0xFFFF:0000 开端。然后在Bootloader 的程序中, 把进口地址设置成0xFFFF:0000 即可。
2) 当装置介质为NAND Flash 时,体系上电今后,运转ROM 里边的发动代码,挑选发动方法为:
AIM(Arm Internal Memory)ROM,ARM 的开端地址为0x0000:0000.然后ROM 里的程序会复制NANDFlash 里的User Bootloader 到处理器内部的RAM.
再次,履行User Bootloader 程序,完结初始化SDRAM 和驱动NAND Flash 的读才能等少数作业。
终究初始化体系,将NAND Flash 中的主Bootloader复制到SDRAM 中履行,复制完结后,要把寄存主Bootloader 的内存地址, 赋值给pc(ProgramCounter)指针。
3.2 DM320 下Bootloader 发动程序的定制
本PMP 运用的Bootloader 为U-Boot.从Internet 上得到开源的U-Boot 程序,然后对DM320特有硬件环境进行初始化作业。
1) 修正Makefile 和Kconfig,意图是生成合适DM320 渠道的装备选项以及方针文件。在。/Makefile(当时目录均为U-Boot 源码树根目录)下参加如下句子:
dm320_config : unconfig
@./mkconfig $(@:_config=) arm arm926ejsdm320
其间mkconfig 为一个脚本文件, 参数为(Target,Architecture,CPU ,Board)别离对应上面的四个参数($(@:_config=) arm arm926ejsdm320)。
2) 在U-Boot 源码树下创立文件夹。/board/dm320.寄存与DM320 渠道有关的文件。
3) 在。/board/dm320/platform.S 中参加对DM320 寄存器初始化赋值句子, 在。/cpu/arm926ejs 中对cpu.c 和start.S 修正,前者供给有关cpu操作的函数,后者为cpu 履行时的初始化代码。
4) ./lib_arm/board.c 是完结初始化操作的首要文件。在文件中界说了一个初始化序列:
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up excepTIons */
env_init, /* initialize environment */
init_baudrate, /* initialize baudrate settings */
serial_init,/* serial communications setup */
console_init_f, /*init console */
display_banner, /* say that we are here */
dram_init,/*configure available RAM banks */
display_dram_config,
#if defined(CONFIG_VCMA9)
checkboard,
#endif
NULL,
};
上述数组中函数序列顺次履行。在完结初始化序列后,将是一些特定的操作。
4 Linux内核的定制
本体系中选用的Linux 内核版别号为2.6.5.要定制Linux 内核,不只要修正内核源码树,并且要编写相关外围设备的驱动程序, 使之成为一个合适DM320 运转的OS 环境。
4.1 Kconfig 文件的修正
Kconfig 文件是用来对所要加载内核内容进行装备的文件,其脚本语言描绘参阅。\Documentation\kbuild.
首要,在内核目录下。/arch/arm/Kconfig 中参加DM320 的装备选项,将DM320 结构参加内核,这样才能在履行make menuconfig 装备内核时看到DM320 结构。修正内容如下:
choice
prompt “ARM system type”
default ARCH_DM320_20
表明:在装备ARM 架构的体系时:默许的便是DM320 结构。
source“arch/arm/mach-dm320-20/Kconfig”
表明:把DM320 结构下的装备选项也引进,一起把其他CPU 结构去掉,这样便利挑选。比方:
#source “arch/arm/mach-clps711x/Kconfig”
#source“arch/arm/mach-integrator/Kconfig”(“#”表明注释掉相关的内容)
终究把内核装备选项中对DM320 开发有用的选进来。比方:
source “drivers/char/Kconfig”
if (!ARCH_DM320_20)
source “sound/Kconfig”
endif
表明:需求开发字符设备的驱动,而不需求声响的支撑。
由于要把CODEC 编入内核,所以还要参加对CODEC 支撑的装备选向。
source “codecs/modules/Kconfig”
假如要参加一个新的外围设备,也需求在Kconfig文件中参加相应的内容。比方说要参加一个三星的4寸TFT-LCD 的驱动,就需求修正。/drivers/char/Kconfig 文件,并参加以下内容:
config DM320_SAMSUNG_4_LCD
tristate “DM320 SAMSUNG 4.0 inch 16:9TFT LCD”
depends on ARCH_DM320_20 &&BOARD_400H
default y
help
This driver provides support for SAMSUNG4.0‘ 16:9 TFT-LCD
for DM320 Platform.
config DM320_SAMSUNG_4_LCD:表明添加
新的装备进口。一旦这个装备选项被选中就会在。/include/linux/autoconf.h 中有: #defineCONFIG_DM320_SAMSUNG_4_LCD 1
这样整个内核源码中都能够运用CONFIG_DM320_SAMSUNG_4_LCD 进行特定挑选。
tristate “DM320 SAMSUNG 4.0 inch 16:9TFT-LCD”:在引号里的内容是在装备选项中的提示文字。tristate 表明除了能够挑选[*],[ ]外,还能够挑选[M],表明把当时内容当成模块编译。
depends on ARCH_DM320_20 && BOARD_400H: 假如装备渠道结构时挑选了ARCH_DM320_20,在挑选类型时挑选BOARD_400H,就能看到三星4 寸TFT-LCD 装备选项。
default y:表明默许把此驱动编入内核。
help:help 的内容为对内核进行装备时,选中协助选项所看到的内容。
4.2 Makefile 文件的修正
Makefile 依据装备文件。config 构成编译源文件列表,GNU 编译东西对源文件进行编译,把方针代码链接在一起,构成Linux 内核二进制文件。Makefile散布在各源代码目录中。
在作者所进行的PMP 设备开发中,首要是对主Makefile 的修正,比方:
ARCH:= arm
CROSS_COMPILE:=arm-linux-(对编译器的选项修正为ARM 渠道)
EXTRAVERSION = -our0
EXTRAVERSION 变量值被附加在内核版别编号之后,成为内核树立后的终究版别。项目中运用的内核版别号为2.6.5,加上EXTRAVERSION 变量后,终究的版别便是2.6.5-our0,表明开发进程中零号内核版别。
对其他子目录的Makefile 文件的修正则相对简单。以参加三星4 寸TFT-LCD 驱动为例阐明,当需求把此驱动模块参加相应的内核源码树时, 要在。/drivers/char/Makefile 文件中参加如下内容:
obj-$(CONFIG_DM320_SAMSUNG_4_LCD) +=dm320_lcd_samsung4.o
5 总结
本文讨论了嵌入式Linux在PMP消费类电子产品上的运用,并完成了发动程序Bootloader 和Linux内核的移植和定制。现在一些项目产品已通过严厉测验,成功推向市场。