linux驱动移植的数据结构
内核配置时生成的; “MACH_TYPE_xxx”
是系统平台号的定义; “number”是系统平台的值。 __mach_desc_S3C2440结构体中的函数将在内核启动过程中,完成系统平台的初始化工作
(2)linux设计了一个通用的数据结构resource来描述各种I/O资源(比如,IO端口,DMA,中断等)
include/linux/ioport.h
struct resource
{
};
flags:资源标记,用于标识各种资源,例如IORESOURCE_MEM表示内存资源,IORESOURCE_IRQ表示中断资源
对于内存资源,start表示内存起始物理地址,end:表示内存末尾物理地址
对于中断资源,start表示起始中断号,end表示最后一个中断号
常用资源数组来表示一个设备所拥有的各类资源,比如s3c2440的片内LCD控制器拥有的资源如下
static struct resource s3c_lcd_resource[]=
{
[0]={
}
[1]={
};
其中S3C24XX_PA_LCD被定义为0x4D000000,S3C24XX_SZ_LCD被定义为1M。所以,在这里给LCD控制器分配的物理地址空间范围为0x4D000000~0x4D0FFFFF,这些是LCD控制器各寄存器使用的地址,但实际上LCD控制器的寄存器地址的范围为0x4D000000~0x4D000060,使用0x4D000000和0x4D000060给他们赋值也应该是可以的。IRQ_LCD算得是32,它会将GPG4引脚设为LCD_PWREN功能,因为GPG4为LCD_PWREN/EINT12复用。
(3)在内核文件include/linux/platform_device.h中,定义了两个数据结构来表示设备和驱动程序:platform_device结构用来描述设备的名称、ID、所占用的资源(比如内存地址/大小、中断号)等;platform_driver结构用来描述各种操作函数,比如枚举函数、移除设备函数、驱动名称等。
//平台设备
struct platform_device
{
};
//平台驱动
struct platform_driver
{
};
内核启动后,首先构造链表将描述设备的platform_device构造组织起来,得到一个设备的列表;当加载某个驱动程序的platform_driver结构时,使用一些匹配函数来检查驱动程序能否支持这些设备,常用的检查方法很简单:比较驱动程序和设备的名称。
以S3C2440开发板为例,在arch/arm/mach-s3c2440/mach-smdk2440.c中定义了如下设备:
static struct platform_device *smdk2440_devices[] __initdata =
{
};
在arch/arm/plat-s3c24xx/common-smdk.c中定义了如下设备:
static struct platform_device __initdata *smdk_devs[] =
{
};
linux驱动移植数据结 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)