2

我遇到了 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 配置 iterrupts。

如果发布很重要,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。

4

2 回答 2

2

关于这个问题有很多问题(和ARM irq OR interrupt)。请看看他们。

通过查看最近的Linux 3.0 gpio.c 更改日志与2.6.34 日志当前版本,我们可以看到许多更改。您应该能够获得当前的Linux 稳定树并提取这些补丁并将它们反向移植到您的内核。例如,有一个端口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,但值得一看,因为它基本上是您的控制器的中断实现。在大约linux-3.0之后,您的 SOC 的 GPIO 控制器被移动到drivers/gpio/gpio-ep93xx.c。您可能希望查看这些更改,但似乎都与您的问题无关。您应该了解Linux的结构变化。即,中断处理和/或通用GPIO 基础设施的整体变化。一个很好的猜测是Thomas GleixnerRussell King会做出这些改变。

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

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

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

于 2013-06-02T16:53:26.540 回答
2

我有同样的警告:

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

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

它为我解决了这个问题。

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

于 2014-04-20T23:45:29.377 回答