首页 > 系统相关 >linux不用设备树写中断,linux-kernel – 将设备树中断标志映射到devm_request_irq

linux不用设备树写中断,linux-kernel – 将设备树中断标志映射到devm_request_irq

时间:2022-12-07 08:44:47浏览次数:65  
标签:kernel 驱动程序 中断 IRQ linux request devm dev irq

我目前正在为

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 for devm_request_irq时的结果片段,注意标志的值:

./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 |

那么如何将这个属性从设备树干净地关联到实际的驱动程序呢?

此外,我将展示如何在一些常见情况下从设备树获取IRQ号和IRQ标志:

>在I2C驱动程序中

>在平台驱动程序中

>手动

在I2C驱动程序中

简而言之

如果您正在编写I2C驱动程序,则无需手动从DT读取IRQ参数.您可以依靠I2C内核为您填充IRQ参数:

>在您的probe()函数中,client-> irq将包含IRQ编号

> devm_request_irq()将自动使用DT的IRQ标志(只是不要将任何IRQ触发器标志传递给该函数).

细节

让我们看一下i2c_device_probe()函数(它是调用驱动程序的probe()函数的地方):

static int i2c_device_probe(struct device *dev)

{

...

if (dev->of_node) {

...

irq = of_irq_get(dev->of_node, 0);

}

...

client->irq = irq;

...

status = driver->probe(client, i2c_match_id(driver->id_table, client));

}

因此,client-> irq已经在驱动程序的探测函数中包含IRQ编号.

至于IRQ标志:of_irq_get()(在上面的代码中)最终调用irqd_set_trigger_type(),它在内部存储IRQ标志(从设备树读取)作为中断号.因此,当您调用devm_request_irq()时,它最终会在__setup_irq()中结束,然后执行下一步:

/*

* If the trigger type is not specified by the caller,

* then use the default for this interrupt.

*/

if (!(new->flags & IRQF_TRIGGER_MASK))

new->flags |= irqd_get_trigger_type(&desc->irq_data);

哪里:

> new-> flags包含您提供给devm_request_irq()的标志

> irqd_get_trigger_type()返回从DT获得的标志

换句话说,如果您没有将IRQ标志传递给devm_request_irq()(例如传递0),它将使用从设备树获得的IRQ标志.

有关详细信息,请参阅this question.

在平台驱动程序

您可以使用platform_get_irq()来获取IRQ编号.它还存储(内部)从DT获得的IRQ标志,因此如果将flags = 0传递给devm_request_irq(),将使用来自DT的标志.

手动

如果您的驱动程序不依赖于内核框架,则必须手动获取IRQ值:

> IRQ编号可以通过irq_of_parse_and_map()获得(如您所述);此函数不仅返回IRQ号,还存储IRQ号的IRQ标志(最终通过调用irqd_set_trigger_type());存储的IRQ标志将在devm_request_irq()中自动使用,如果您没有向其传递IRQ触发器类型(例如,您可以传递flags = 0)

> IRQ标志可以在irq_get_trigger_type()获得,但仅在执行irq_of_parse_and_map()之后

所以可能你只需要运行irq_of_parse_and_map()并让devm_request_irq()为你处理标志(只是确保你没有向它传递触发器标志).

 

【转】https://blog.csdn.net/weixin_28949355/article/details/116775031

标签:kernel,驱动程序,中断,IRQ,linux,request,devm,dev,irq
From: https://www.cnblogs.com/hshy/p/16962030.html

相关文章

  • mac上通过visualbox安装linux相关网络问题总结
    结合我自己遇到的一些问题来聊一下vbox上面的一些网络配置的问题1、主机一直连不上虚拟机2、电脑一断网就会出现连不上虚拟机3、虚拟机无法访问外网先看虚拟机的网络设......
  • Linux常用的网络配置和系统管理
    Linux常用的网络配置和系统管理菜鸟成长杂记 2022-09-2207:00 发表于黑龙江收录于合集#Linux学习18个   系统环境 CentOSLinuxrelease7.9.2009......
  • LINUX中防护墙放行端口--九五小庞
    1.查看开放的端口firewall-cmd--list-ports 2.防护墙放行3306端口firewall-cmd--zone=public--add-port=3306/tcp--permanent3.重启防火墙,使设置生效systemctlrel......
  • Linux 文件与目录管理
    Linux的目录结构为树状结构,最顶级的目录为根目录/。其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。在开始本教程前我们需要先知道什么是绝对路径与相对......
  • linux crontab 定时任务
    Linux内置cron进程,cron搭配shell脚本,可以完成非常复杂的指令;常用的crontab其实是crontable的简写,关于cron请自行百度,本文只记录crontab的用法。 cronta......
  • 解决linux下mysql-server在root账户下无需密码就能登陆的问题
    root用户无需密码即可登录使用root用户登录mysql切换到mysql数据库usemysql;使用下面的命令设置密码updateusersetauthentication_string=password('新......
  • Linux系统编译(yocto)
    1.Makefile编写makefile如下所示,编译生成静态库;$^:表示所有的.o文件$@:表示目标文件CROSS=CC=$(CROSS)arm-linux-gnueabi-gccCXX=$(C......
  • 密码正确无法登陆Linux系统
    密码正确无法登陆Linux系统用户名密码都正确却不能登录Linux服务器这,最可能有以下几种:1、磁盘空间满了无法登录Linux服务器。重启服务器试试或者删掉一些不必要的文件。2......
  • linux expect 自动交互命令
    如何从机器A上ssh到机器B上,然后执行机器B上的命令?如何使之自动化完成?看完下面的文章你就明白了一、安装expect是基于tcl演变而来的,所以很多语法和tcl类似sudoapt-get......
  • Linux系统安装Mysql
    环境和版本 Linux:CentOS8Mysql:8.0.20一、在linux系统的/usr/local目录下创建mysql文件夹切换目录:cd/usr/local创建文件夹:mkdirmysql二、下载安装包1、切换......