【问题标题】:Port B GPIO ep93xx/gpio.c interrupt issue端口 B GPIO ep93xx/gpio.c 中断问题
【发布时间】:2013-06-02 10:51:18
【问题描述】:

我遇到了 gpio 中断问题。 根据 ep93xx 端口 A、B、F 的文档,可以配置为生成中断。 引用:

19 条 GPIO 线中的任何一条都可以配置为生成中断

然而,arch/arm/march-ep93xx/gpio.c 只处理来自端口 A 的中断。并且不对端口 B 和 F 做出反应。

static void ep93xx_gpio_ab_irq_handler(unsigned int irq, struct irq_desc *desc)
{
    unsigned char status;
    int i;
    printk(KERN_INFO "ep93xx_gpio_ab_irq_handler: irq=%u", irq);

我知道 printk 在 irq_handlers 中很糟糕。

我正在通过 sysfs 配置中断。

如果很重要,GPIO 0,8 与端口 F 连接。 此外,在未配置端口 A 的情况下启用端口 B 上的中断时,我会收到以下警告:

------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:103 gpio_ensure_requested+0x54/0x118()
autorequest GPIO-1
Modules linked in:
[<c002696c>] (unwind_backtrace+0x0/0xf0) from [<c00399d4>] (warn_slowpath_fmt+0x54/0x78)
[<c00399d4>] (warn_slowpath_fmt+0x54/0x78) from [<c019dd90>] (gpio_ensure_requested+0x54/0x118)
[<c019dd90>] (gpio_ensure_requested+0x54/0x118) from [<c019e05c>] (gpio_direction_input+0xb0/0x150)
[<c019e05c>] (gpio_direction_input+0xb0/0x150) from [<c002c9a8>] (ep93xx_gpio_irq_type+0x3c/0x1d8)
[<c002c9a8>] (ep93xx_gpio_irq_type+0x3c/0x1d8) from [<c0066ad8>] (__irq_set_trigger+0x38/0x9c)
[<c0066ad8>] (__irq_set_trigger+0x38/0x9c) from [<c0066e14>] (__setup_irq+0x2d8/0x354)
[<c0066e14>] (__setup_irq+0x2d8/0x354) from [<c0066f38>] (request_threaded_irq+0xa8/0x140)
[<c0066f38>] (request_threaded_irq+0xa8/0x140) from [<c019e784>] (gpio_setup_irq+0x14c/0x260)
[<c019e784>] (gpio_setup_irq+0x14c/0x260) from [<c019ec1c>] (gpio_edge_store+0x90/0xac)
[<c019ec1c>] (gpio_edge_store+0x90/0xac) from [<c01be8fc>] (dev_attr_store+0x1c/0x28)
[<c01be8fc>] (dev_attr_store+0x1c/0x28) from [<c00e8b2c>] (sysfs_write_file+0x168/0x19c)
[<c00e8b2c>] (sysfs_write_file+0x168/0x19c) from [<c009a3d4>] (vfs_write+0xa4/0x160)
[<c009a3d4>] (vfs_write+0xa4/0x160) from [<c009a6a4>] (sys_write+0x3c/0x7c)
[<c009a6a4>] (sys_write+0x3c/0x7c) from [<c0020e40>] (ret_fast_syscall+0x0/0x2c)
---[ end trace ff56c09a294dbe68 ]---

我正在使用带有 linux-2.6.34-ts7200_matt-6.tar.gz 补丁的内核版本 2.6.34.14(但是它似乎不包含 gpio.c 或 gpiolib.c 的补丁) 跨版本:

binutils-2.23.1
gcc-4.7.3
glibc-2.17

我还浏览了 gpio.c 和 gpiolib.c 的更改历史记录,但没有找到与此问题相关的任何内容。

有人可以就这个问题给我和建议吗?我想要所有端口(A、B、F)上的中断,而不仅仅是 A。

【问题讨论】:

    标签: linux-kernel arm gpio


    【解决方案1】:

    this issue(和ARM irq OR interrupt)有很多问题。请看他们。

    通过查看更新的Linux 3.0 gpio.c change 日志与2.6.34 logsthe current version 相比,我们可以看到许多变化。您应该能够获取当前的Linux stable 树并提取这些补丁并将它们向后移植 到您的内核。例如,有一个 bug,其中 port CF 互换了;我不知道这是否在您的 ts7200_matt 变体中。

    需要查看的一些重要更改集,

    1. arm:折叠 irq_set_chip/irq_set_handler
    2. arm:清理 irq 命名空间
    3. arm: ep93xx: 使用正确的 irq 访问函数
    4. arm: ep93xx:添加基本中断信息
    5. ARM: ep93xx: irq_data 转换。
    6. ARM: 5954/1: ep93xx: 将 gpio 中断支持移至 gpio.c
    7. [ARM] 5243/1:ep93xx:错误修复,GPIO 端口 C 和 F 交换

    您可能有 #6,但值得一看,因为它基本上是控制器的 interrupt 实现。在大约 linux-3.0 之后,您的 SOC 的 GPIO 控制器被移动到 drivers/gpio/gpio-ep93xx.c。您可能希望查看这些更改,但似乎都与您的问题无关。您应该了解 Linux 的结构变化。即,对中断处理和/或通用GPIO基础设施的整体更改。一个很好的猜测是 Thomas GleixnerRussell King 会做出这些改变。

    可以使用git format-patch b685004.. b0ec5cf1 gpio.c 从特定的Linux stable 树中提取补丁。这将创建几个补丁文件。将它们移动到您的树上并使用git ampatch -p1 申请。您可能需要修改这些文件以使它们干净地应用于您的树;如果你把它们全部拿走,即使它们与中断处理无关,你也会有更好的运气自动执行此操作。您还可以查看补丁集并尝试使用文本编辑器手动修补文件。

    这些都不能解决您的具体问题。但是,它提供了一条合并来自最新 Linux 版本的更改的路径。此外,前面的堆栈溢出问题详细介绍了GPIO interrupt handling 的结构。结合您的数据表、Linux GPIO document 和给定的更改集,您应该能够解决自己的问题。否则,您需要熟悉 EP93xx 的人,而且问题已经相当本地化了。

    注意: 堆栈跟踪表明正在使用 GPIO,但没有对应的 gpio_request() .这是机器文件EP93xx GPIO中断处理代码中的错误。

    【讨论】:

    • This question 可能会有所帮助。您不需要搜索 gpiolib.cgpio.c 文件,但需要搜索中断控制器基础结构。代码由gpio_to_irqirq_to_gpio 宏链接。
    • 谢谢,无论如何我都不能得到确切的答案。
    【解决方案2】:

    我也有同样的警告:

    ------------[ cut here ]------------
    WARNING: at drivers/gpio/gpiolib.c:103 gpio_ensure_requested
    

    根据我的研究,我们必须在 gpio_direction_input 之前调用 gpio_request_one / gpio_request

    它为我解决了问题。

    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=99789

    http://e2e.ti.com/support/embedded/linux/f/354/p/119946/427889.aspx

    【讨论】:

    • 这是堆栈跟踪的正确解决方案。然而,最初的问题是关于中断的。我认为 OP 提到了 stack trace 以提供更多信息;通常,这不是问题,它只会导致诊断。不过,这很好修复(并且在我的答案的 note 部分中)。
    猜你喜欢
    • 2020-04-20
    • 2020-08-23
    • 2016-07-10
    • 2012-09-09
    • 1970-01-01
    • 2020-04-06
    • 2016-05-22
    • 2019-11-15
    • 2022-11-03
    相关资源
    最近更新 更多