文档库

最新最全的文档下载
当前位置:文档库 > 对于platform_get_resource函数的深度分析

对于platform_get_resource函数的深度分析

对于platform_get_resource函数的深度分析

platform_get_resource这个函数在每一个硬件设备初始化时都会用到,前边已经在LCD的驱动中分析了一下,但是还是有一些朦胧。正好在DM9000驱动中再次出现,这次使用printk函数彻底的分析了一下。

这次分析主要的疑惑是platform_get_resource函数中num这个输入变量的作用,还是一个就是if语句中”&&”的执行顺序。这个可能算是C语言记住了,但是我也是在这次才真正注意了一下。

在位于drivers/net/dm9000.c中的dm9000_probe函数内添加了提示性打印语句。

/* sol_add */

printk("\n!!!!!!!!!!!!!!!!!!!!!!!!!\n");

db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);

db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

/* sol_add */

printk("!!!!!!!!!!!!!!!!!!!!!!!!!\n");

在位于drivers/base/platform.c中的platform_get_resource添加打印语句。

struct resource *platform_get_resource(struct platform_device *dev,

unsigned int type, unsigned int num)

{

int i;

/* sol_add */

printk("@@@@@@@@@@@@@@@@@@@@@@@@@@\n");

printk("num is %d\n", num);

printk("dev->num_resources is %d\n", dev->num_resources);

for (i = 0; i < dev->num_resources; i++) {

struct resource *r = &dev->resource[i];

/* sol_add */

printk("num is %d\n", num);

if (type == resource_type(r) && num-- == 0) {

/* sol_add */

printk("num-- is %d\n", num);

printk("resource_type(r) is %x\n", resource_type(r));

return r;

}

}

return NULL;

}

下面的是位于arch/arm/mach-s3c2440/mach-sol2440.c中定义的有关DM9000芯片的一些硬件信息。

static struct resource sol2440_dm9000_resource [] = {

[0] = {

.start = S3C2410_CS4,

.end = S3C2410_CS4 + 3,

.flags = IORESOURCE_MEM

},

[1] = {

.start = S3C2410_CS4 + 4,

.end = S3C2410_CS4 + 7,

.flags = IORESOURCE_MEM

},

[2] = {

.start = IRQ_EINT(7),

.end = IRQ_EINT(7),

.flags = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH , }

};

这个是编译后下载到开发板后打印出的结果。

对于platform_get_resource函数的深度分析

从上图的打印结果分析前文提出的两点疑问。

1. num的作用

这个输入变量的真实作用是当sol2440_dm9000_resource结构体中定义了两组拥有相同flags的子结构体时,用于区分这两组子结构体使用的。从打印信息可以看出:当执行读取[0]的数据时,for循环只执行了一次,打印了一次num的数值。因为for循环内嵌的if函数两个条件都满足了;但是当执行读取[1]的数据时,for循环执行了两次,这是因为本次执行时传入的num参数是1,当if语句的”&&”之前的条件满足时,num就发挥作用了。在执行了一次num--后才是本次取值操作需要的[1]的参数。所以num的作用是区分有两组flags相同的数据。

2. if语句中”&&”的执行顺序

我在打印语句中设置了一个num--,放置在if判断内。从[2]的取值可以明显看出,因为在sol2440_dm9000_resource结构体中定义了3个子结构体,所以for 循环执行了三次,前两次的取值是取得第[0]和[1]个参数,这两参数的flags和type 的不一致,所以不满足条件。但这里要注意的是,当if判断的”&&”之前的条件不满足时,”&&”后面的语句不执行,所以num打印了三次都是0,但是当满足条件的第三次取值结束后,进入了if判断内部的语句时,num—就执行了。所以内部打印的num—就是-1。

3.还想说一点

db->irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0)语句最后的参数为什么是0,而不是2.我想也就明白了。因为IORESOURCE_IRQ类型的子结构体在sol2440_dm9000_resource结构体中只定义了一个,所以只需要判断type类型是否一致就可以了。个数完全不用管。