注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火车的家

Put first thing first

 
 
 

日志

 
 

神奇的platform_get_resource函数  

2010-02-26 18:42:00|  分类: linux kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

阅读platformdriver的代码时,发现在probe函数直接调用platform_get_resourcepdev中获取io内存,但却没有判断传给probepdev是否属于这个驱动 !

后来发现原来在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);

 

  评论这张
 
阅读(1650)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017