参考原文: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