我遇到了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 ]---
我使用内核版本2.6.34.14和linux-2.6.34-ts7200_matt-6.tar.gz补丁(hovewer它似乎不包含gpio.c或gpiolib.c的补丁) 交叉版本:
binutils-2.23.1
gcc-4.7.3
glibc-2.17
此外,我还浏览了gpio.c和gpiolib.c的更改历史记录,但未找到任何与此问题相关的内容。
有人可以就此问题向我提出建议吗?我希望所有端口(A,B,F)上的中断不仅仅是A。
答案 0 :(得分:2)
this issue(和ARM irq OR interrupt)上有很多问题。请看一下。
我们可以通过查看更新的Linux 3.0 gpio.c change日志与2.6.34 logs和the current version来查看许多更改。您应该能够获取当前的 Linux stable 树并将这些补丁和后端口提取到内核中。例如,有一个错误,其中端口C 和 F 被交换;我不知道这是否在你的 ts7200_matt 变体中。
要查看一些重要的变更集,
您可能#6 ,但值得一看,因为它基本上是控制器的中断实现。在关于 linux-3.0 之后,您的SOC的GPIO控制器被移动到 drivers / gpio / gpio-ep93xx.c 。您可能希望查看这些更改,但似乎没有与您的问题相关。您应该了解Linux的结构更改。即,中断处理和/或通用 GPIO基础设施的整体更改。一个很好的猜测是 Thomas Gleixner 或 Russell King 会做出这些改变。
可以使用git format-patch b685004.. b0ec5cf1 gpio.c
从特定的 Linux stable 树中提取修补程序。这将创建几个补丁文件。将它们移到树上,然后使用git am
或patch -p1
进行申请。您可能需要按摩这些文件,以便将它们干净地应用到您的树上;如果你把它们全部拿走,即使它们与中断处理无关,你也会有更好的运气。您还可以查看补丁集并尝试使用文本编辑器手动修补文件。
这些都不能解决您的具体问题。但是,它提供了从最新Linux版本合并更改的路径。此外,先前的堆栈溢出问题提供了GPIO interrupt handling的结构的详细信息。结合您的数据表,Linux GPIO document和给定的更改集,您应该能够解决自己的问题。否则,您需要熟悉 EP93xx 的人,问题是相当本地化的。
注意:堆栈跟踪表示正在使用 GPIO 而没有相应的gpio_request()
。这可能是机器文件中的错误,也可能是 EP93xx GPIO中断处理代码中的错误。
答案 1 :(得分:2)
我有同样的警告:
------------[ cut here ]------------
WARNING: at drivers/gpio/gpiolib.c:103 gpio_ensure_requested
根据我的研究,我们必须在gpio_request_one
之前致电gpio_request
/ gpio_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