微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > linux驱动移植的数据结构

linux驱动移植的数据结构

时间:11-23 来源:互联网 点击:
对于嵌入式 Linux 系统来说,有各种体系结构的处理器和硬件平台,并且用户需要根据需求自己定制硬件板。只要是硬件平台有些变化,即使非常小,可能也需要做一些移植工作。内核移植是嵌入式Linux系统中最常见的一项工作。

内核移植工作主要是修改跟硬件平台相关的代码,一般不涉及 Linux 内核通用的程序。移植的难度也取决于两种硬件平台的差异。Linux 对于特定的硬件平台的软件就叫作 BSP(Board Support Package)。

由于 Linux 内核具备可移植性的特点,并且已经支持了各种体系结构的很多种目标板,我们很容易从中找到跟自己硬件类似的目标板。参考内核已经支持的目标板来移植 BSP,就如同使用模板开发程序。

因此,移植linux内核的过程大多数情况下就是移植BSP的过程。三星公司提供了smdk24xx开发板的BSP。对于mini2440开发板来说,移植linux内核,只要修改smdk24xx开发板的BSP使该linux支持mini2440开发板就可以了。

linux内核源代码的ARCH目录存放的是体系结构相关的代码,对于每个架构的CPU,arm目录下都有一个对应的目录,比如arch/arm、arch/i386。而arm架构的处理器种类又有很多,所以,在arch/arm目录下对于每种arm架构处理器也有一个对应的子目录,比如arch/arm/mach-s3c2440、arch/arm/mach-s3c2410等。在arch/arm目录下有一个plat-s3c24xx目录,根据目录名它应该是与s3c24xx系列处理器的平台设备相关的一个目录。注意,所谓的“平台设备”并不是与字符设备、块设备和网络设备并列的概念,而是linux系统描述设备的一个附加手段。在plat-s3c24xx目录下有一个common-smdk.c文件,根据文件名,它应该是三星公司的smdk24xx系列开发板都需要的一个文件。在移植驱动的时候经常需要修改arch/arm/plat-s3c24xx/common-smdk.c文件。对于arch/arm/mach-s3c2440目录,它是专门用来保存 S3C2410 系列处理器平台相关程序,其中 Kconfig 和 Makefile 是用于内核配置编译的。其他文件分为 2 类,一类是处理器通用的,例如:clock.c clock.h cpu.c cpu.h s3c2410.c s3c2410.h等;另一类是目标板相关的,例如:bast.h bast-irq.c mach-bast.c等。在这些文件中,实现了处理器和目标板相关的一些定义和初始化函数。还有些相关的定义包含在 include/asm-arm/arch-s3c2410/下的头文件中。

linux内核中对于每种支持的开发板都会使用宏MACHINE_START、MACHINE_END来定义一个machine_desc结构。MACHINE_START、MCHINE_END的定义如下:

(1)

#define MACHINE_START(_type,_name)

static const struct machine_desc __mach_desc_##_type

__used

__attribute__((__section__(".arch.info.init"))) = {

.nr = MACH_TYPE_##_type,

.name = _name,

#define MACHINE_END

};

在arch/arm/mach-s3c2410/mach-smdk2440.c中可以找到SMDK2440开发板的定义如下:

MACHINE_START(S3C2440, "SMDK2440")

.phys_io = S3C2410_PA_UART,

.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params = S3C2410_SDRAM_PA + 0x100,

.init_irq = s3c24xx_init_irq,

.map_io = smdk2440_map_io,

.init_machine = smdk2440_machine_init,

.timer = &s3c24xx_timer,

MACHINE_END

把MACHINE_START、MACHINE_END扩展开来就是定义了一个名为__mach_desc_S3C2440的结构体变量:

const struct machine_desc __mach_desc_S3C2440__used

__attribute__((__section__(".arch.info.init"))) =

{

.nr = MACH_TYPE_S3C2440, //开发板的机器类型ID

.name = "SMDK2440", //开发板名称

.phys_io = S3C2410_PA_UART, //起始IO物理地址

.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params = S3C2410_SDRAM_PA + 0x100, //内核启动参数的地址

.init_irq = s3c24xx_init_irq, //中断初始化函数

.map_io = smdk2440_map_io, //IO映射函数(在这里修改时钟频率)

.init_machine = smdk2440_machine_init,

.timer = &s3c24xx_timer,

};

MACH_TYPE_S3C2440可以看作是系统平台号,它包含在include/asm- arm/mach-types.h头文件中,不过这个头文件是在配置内核或编译内核时自动生成的,所以不能更改。。真正系统平台号

的定义位置在arch/arm/tools/mach-types文件中。

# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number

s3c2440 ARCH_S3C2440 S3C2440 362

arch/arm/tools/mach-types中每一行定义一个系统平台号。 “machine_is_xxx”是用来判断当前的平台号是否正确的函数; “CONFIG_xxxx”是在

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

网站地图

Top