【发布时间】:2016-10-13 03:25:49
【问题描述】:
我目前正在为 Linux 编写用于 PowerPC 的设备驱动程序。
设备树入口如下:
// PPS Interrupt client
pps_hwirq {
compatible = "pps-hwirq";
interrupts = <17 0x02>; // IPIC 17 = IRQ1, 0x02 = falling edge
interrupt-parent = < &ipic >;
};
0x02 标志非常重要 - PPS 与下降沿对齐,但这在 GPS 接收器上并不通用,因此应该是可配置的。
在驱动的probe()函数中,获取IRQ号很简单:
hwirq = irq_of_parse_and_map(np, 0);
if (hwirq == NO_IRQ) {
dev_err(&pdev->dev, "No interrupt found in the device tree\n");
return -EINVAL;
}
但是如何将设备树中的 IRQ 标志映射到驱动程序呢?
/* ****TODO****: Get the interrupt flags from the device tree
* For now, hard code to suit my problem, but since this differs
* by GPS receiver, it should be configurable.
*/
flags = IRQF_TRIGGER_FALLING;
/* register IRQ interrupt handler */
ret = devm_request_irq(&pdev->dev, data->irq, pps_hwint_irq_handler,
flags, data->info.name, data);
不幸的是,树中几乎没有(如果有的话)实际执行此工作的示例 - 大多数将此标志保留为 0(保持原样) - 这是当 grep 为 @987654327 时的结果的 sn-p @,注意标志的值:
./drivers/crypto/mxs-dcp.c: ret = devm_request_irq(dev, dcp_vmi_irq, mxs_dcp_irq, 0,
./drivers/crypto/mxs-dcp.c: ret = devm_request_irq(dev, dcp_irq, mxs_dcp_irq, 0,
./drivers/crypto/omap-sham.c: err = devm_request_irq(dev, dd->irq, dd->pdata->intr_hdlr,
./drivers/crypto/omap-aes.c: err = devm_request_irq(dev, irq, omap_aes_irq, 0,
./drivers/crypto/picoxcell_crypto.c: if (devm_request_irq(&pdev->dev, irq->start, spacc_spacc_irq, 0,
或将其硬编码为硬件实际断言的内容:
./drivers/crypto/tegra-aes.c: err = devm_request_irq(dev, dd->irq, aes_irq, IRQF_TRIGGER_HIGH |
那么如何将设备树中的这个属性与实际的驱动程序清晰地关联起来呢?
【问题讨论】:
-
您要编写的驱动程序类型是什么?也就是说,你注册驱动的函数是什么?
-
驱动程序的实际类型与问题无关 - 我让它使用硬编码为 IRQF_TRIGGER_FALLING 的标志,这基本上是其他驱动程序所做的(或将其设置为零以保持不变) .我想要做的是从设备树中填充这个值并给它devm_request_irq。
标签: linux-kernel linux-device-driver device-tree