您的位置:首页 > 其它

神奇的platform_get_resource函数

2012-12-21 15:21 1046 查看
阅读platformdriver的代码时,发现在probe函数直接调用platform_get_resource从pdev中获取io内存,但却没有判断传给probe的pdev是否属于这个驱动 !

后来发现原来在arch目录下的对应目录里面有个devs.c文件(这个文件可能因不同的架构而不一样),这个文件里面声明了一个platform设备的资源数组foo_devices,原型如下:

static struct platform_device* foo_devices[] __initdata;

这个数组里面包含了所有platform设备的资源信息。例如:一个设备的资源声明如下:

static struct resource foo_resource[] =

{

[0] =

{

.start = (FOO_BASE_PA),

.end = (FOO_BASE_PA) + (0x0008000),

.flags = IORESOURCE_MEM,

},

[1] =

{

.start = (IRQ_FOO),

.end = (IRQ_FOO),

.flags = IORESOURCE_IRQ,

},

};

static struct platform_device device_foo =

{

.name = "device_foo",

.id = 0,

.resource = foo_resource,

.num_resources = ARRAY_SIZE(foo_resource),

.dev =

{

//根据源代码,这两个成员置成0表示不起作用

.dma_mask = 0x0,

.coherent_dma_mask = 0x0,

},

};

那么将这个device_foo加入foo_devices数组,就能直接在probe函数中用platform_get_resource获取资源了,但是要注意驱动的name成员必须和platform_device结构中的name成员完全相同。

那为什么加入foo_devices数组后就能直接访问了呢?

在 相关体系的machine_desc结构体中(对于每个特定平台都有一个MACHINE_START宏用来定义machine_desc结构体),有一个 接口init_machine,这个接口中会调用platform_add_devices添加foo_devices。例如:

platform_add_devices(foo_devices);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: