platform_get_resource
这个函数跟设备树没什么关系,但是设备树中的节点被转换为platform_device后,设备树中的reg属性、interrupts属性也会被转换为“resource”。这时,你可以使用这个函数取出这些资源。一 个 节 点 能 被 转 换 为 platform_device , 如 果 它 的 设 备 树 里 指 定 了 中 断 属 性 , 那 么 可 以 从platform_device 中获得“中断资源”,函数如下,可以使用下列函数获得 IORESOURCE_IRQ 资源,即中断号:
函数原型为:
/**
* platform_get_resource - get a resource for a device
* @dev: platform device
* @type: resource type // 取哪类资源?IORESOURCE_MEM、IORESOURCE_REG
* // IORESOURCE_IRQ等
* @num: resource index // 这类资源中的哪一个?
*/
struct resource *platform_get_resource(struct platform_device *dev,
unsigned int type, unsigned int num);
对于设备树节点中的reg属性,它对应IORESOURCE_MEM类型的资源;
对于设备树节点中的interrupts属性,它对应IORESOURCE_IRQ类型的资源。
例如:
static int gpio_key_probe(struct platform_device *pdev)
{
struct resource *res;
int err;
if (!pdev->dev.of_node)
{
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (res == NULL)
{
printk("gpio_key_probe platform_get_resource err\n");
return -EINVAL;
}
irq = res->start;
}
else
{
irq = of_irq_get(pdev->dev.of_node, 0);
}
printk("get irq = %d\n", irq);
err = request_irq(irq, gpio_key_isr, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "100ask_gpio_key", NULL);
return err;
}