参考原文:http://bbs.ednchina.com/BLOG_ARTICLE_3008325.HTM
platform_get_resource
函数源码如下:
1)新内核实现
2)旧内核实现:
函数分析:
这行代码使得不管你是想获取哪一份资源都从第一份资源开始搜索。
这行代码首先通过 type == resource_type(r)
判断当前这份资源的类型是否匹配,如果匹配则再通过 num-- == 0
判断是否是你要的,如果不匹配重新提取下一份资源而不会执行 num-- == 0
这一句代码。
通过以上两步就能定位到你要找的资源了,接着把资源返回即可。如果都不匹配就返回NULL
。
实例分析:
下面通过一个例子来看看它是如何拿到设备资源的。
设备资源如下:
驱动中通过下面代码拿到第一份资源:
函数进入 for
里面,i=0
,num_resources=7
,拿出 resource[0]
资源。resource_type(r)
提取出该份资源的资源类型并与函数传递下来的资源类型进行比较,匹配。Num=0
(这里先判断是否等于0
再自减1
) 符合要求,从而返回该资源。
获取剩下资源的代码如下:
分析如下:
For第一次循环:
在拿出第一份资源进行 resource_type(r)
判断资源类型时不符合(此时 num-- == 0
这句没有执行),进而拿出第二份资源,此时 i=1
,num_resources=7
,num
传递下来为0
,资源类型判断时候匹配,num
也等于 0
,从而确定资源并返回。
For第二次循环:
拿出第二份资源的时候 resource_type(r)
资源类型匹配,但是 num
传递下来时候为 1
,执行 num-- == 0
时不符合(但 num
开始自减 1
,这导致拿出第三份资源时 num==0
),只好拿出第三份资源。剩下的以此类推。
总结:
unsigned int type
决定资源的类型,unsigned int num
决定type
类型的第几份资源(从0
开始)。即使同类型资源在资源数组中不是连续排放也可以定位得到该资源。
比如第一份 IORESOURCE_IRQ
类型资源在 resource[2]
,而第二份在 resource[5]
,那
可以定位第一份IORESOURCE_IRQ
资源;
可以定位第二份 IORESOURCE_IRQ
资源。
之所以能定位到资源,在于函数实现中的这一行代码:
该行代码,如果没有匹配资源类型,num-- == 0
不会执行而重新提取下一份资源,只有资源匹配了才会寻找该类型的第几份资源,即使这些资源排放不连续。
num
代表的不是 resource
数组的数组号,而是具有相同资源类型的序号 (从0
开始的序号)。
同类函数:
platform_get_irq
platform_get_resource_byname
platform_get_irq_byname