linux采用struct resource结构体来描述一个挂接在cpu总线上的设备资源(32位cpu的总线地址范围是0~4G
/usr/src/linux-2.6.21.5/include/linux/ioport.h
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};
start: 资源的起始地址;
end: 资源的结束地址;
name:资源的名称;
flag: 资源标的志位,描述资源的类型。
/usr/src/linux-2.6.21.5/include/linux/ioport.h
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};
start: 资源的起始地址;
end: 资源的结束地址;
name:资源的名称;
flag: 资源标的志位,描述资源的类型。
可以为IORESOURCE_IO、IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA等
linux需要管理4G物理总线的所有空间,所以需要把挂接到总线上的各种设备链在一起,因此resource结构体提供了另外3个成员:指针parent、sibling和child:分别为指向父亲、兄弟和子资源的指针。以root source为例,root->child(*pchild)指向root所有孩子中地址空间最小的一个;pchild->sibling是兄弟链表的开头,指向比自己地址空间大的兄弟。
linux会避免将一个已经被设备使用的总线物理地址区间段再分配给另一个设备,进而避免设备之间出现对同一总线物理地址段的重复引用,而造成对唯一物理地址的设备实体二义性.
linux需要管理4G物理总线的所有空间,所以需要把挂接到总线上的各种设备链在一起,因此resource结构体提供了另外3个成员:指针parent、sibling和child:分别为指向父亲、兄弟和子资源的指针。以root source为例,root->child(*pchild)指向root所有孩子中地址空间最小的一个;pchild->sibling是兄弟链表的开头,指向比自己地址空间大的兄弟。
linux会避免将一个已经被设备使用的总线物理地址区间段再分配给另一个设备,进而避免设备之间出现对同一总线物理地址段的重复引用,而造成对唯一物理地址的设备实体二义性.
struct platform_device {
const char *name;
int id;
bool id_auto;
struct device dev;
u32 num_resources;
struct resource *resource;
const char *name;
int id;
bool id_auto;
struct device dev;
u32 num_resources;
struct resource *resource;
const struct platform_device_id *id_entry;
struct mfd_cell *mfd_cell;
struct pdev_archdata archdata;
};
struct mfd_cell *mfd_cell;
struct pdev_archdata archdata;
};
num_resources用于指定资源数,resource是指向资源数组的指针。
platform_device使用函数platform_get_resource来获取resource,该函数定义如下:
struct resource *platform_get_resource(struct platform_device *,unsigned int, unsigned int);
用法如下:
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
在较老的内核版本中,通常在kernel\linux-3.10.y\arch\arm\mach-xxx目录下的devices.c定义platform_device 实体变量和resource变量。
在3.x版本内核中platform_device不再静态定义,而是通过device tree来动态生成。