BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #496同步于 2008/5/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

[合集] 2.6.23内核中申请gpio中断的函数是什么?

Winters101
2008/5/31镜像同步0 回复
☆─────────────────────────────────────☆ lester98 (奶瓶) 于 (Wed May 28 11:45:38 2008) 提到: 原来2.4是set_GPIO_IRQ_type(11|FALLING_EDGE)使用起来非常方便,到了2.6.23反而找不到了 ☆─────────────────────────────────────☆ jklbupt (jklbupt) 于 (Wed May 28 16:59:38 2008) 提到: 我觉的这也和你要用的相关硬件CPU相关吧,做芯片级移植的时候可能就定了是那个函数了.比如XScale系列用的 pxa_gpio_mode(); set_irq_type(); 然后再用request_irq()即可 .我个看法,欢迎讨论. 【 在 lester98 的大作中提到: 】 : 原来2.4是set_GPIO_IRQ_type(11|FALLING_EDGE)使用起来非常方便,到了2.6.23反而找不到了 ☆─────────────────────────────────────☆ lester98 (奶瓶) 于 (Wed May 28 17:18:13 2008) 提到: sorry.忘了说了,pxa270(arm/xscale) 我开始以为是static int pxa_gpio_irq_type(unsigned int irq, unsigned int type) 经过试验发现根本不行 这个也不对头,这个不是对gpio的,对gpio至少也得方向设为in,对GFER或GRER进行设置 我拿2.4的函数改一个试试吧 ☆─────────────────────────────────────☆ jklbupt (jklbupt) 于 (Wed May 28 17:48:02 2008) 提到: 我这边的板子上用pxa_gpio_mode(); 设置管脚方向,set_irq_type(); 设置中断沿的类型.也许内核版本不一样,函数改的不同了,如果有源代码且你不是做芯片,板级移植的话,可以借鉴下代码中其他外围芯片GPIO中断是如何用的. 【 在 jklbupt 的大作中提到: 】 : 我觉的这也和你要用的相关硬件CPU相关吧,做芯片级移植的时候可能就定了是那个函数了.比如XScale系列用的 pxa_gpio_mode(); set_irq_type(); 然后再用request_irq()即可 .我个看法,欢迎讨论. ☆─────────────────────────────────────☆ lester98 (奶瓶) 于 (Wed May 28 18:02:39 2008) 提到: 经过实践只用这个函数就行了,连gpio_mode都不用设了,明天来了我看看代码,把gpio设置成各种初始状态再调用这个函数试试,不知道这个是不是巧合 ☆─────────────────────────────────────☆ jklbupt (jklbupt) 于 (Wed May 28 18:24:58 2008) 提到: 这个最好分析下,我记的Xscale系列GPIO默认上电管脚是输入,所以不用设置. ☆─────────────────────────────────────☆ fzylijun886 (北邮人) 于 (Thu May 29 00:37:44 2008) 提到: ~~看kernel代码找相应函数就好了,实在不行自己写一个也可以:) ☆─────────────────────────────────────☆ lester98 (奶瓶) 于 (Thu May 29 10:14:10 2008) 提到: 原来调用chip.c中的set_irq_type()后会调用arch/arm/mach-pxa中的pxa_gpio_irq_type 就是很疑惑单独调用后者为什么不行,而且irq_desc是在前者中定义的,并未见初始化,怎么就能找到static struct irq_chip pxa_low_gpio_chip了呢?算了,这个就不研究了,暂时没有这个必要,能用就行了 2.6现在给封装的是更加易用了,不过也得你先适应 ☆─────────────────────────────────────☆ lester98 (奶瓶) 于 (Thu May 29 10:27:41 2008) 提到: 我贴出来,有达人帮助琢磨一下吧 //#kernel/irq/chip.c int set_irq_type(unsigned int irq, unsigned int type) { struct irq_desc *desc; unsigned long flags; int ret = -ENXIO; if (irq >= NR_IRQS) { printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq); return -ENODEV; } desc = irq_desc + irq; if (desc->chip->set_type) { spin_lock_irqsave(&desc->lock, flags); ret = desc->chip->set_type(irq, type); 这句话就调用了下面深绿色的pxa_low_gpio_chip中的pxa_gpio_irq_type,怎么能调的到呢?很费解,是desc = irq_desc + irq起的作用吗?但desc只是个临时定义的局部变量啊,又不是全局的 spin_unlock_irqrestore(&desc->lock, flags); } return ret; } //#arch/arm/mach-pxa/irq.c static struct irq_chip pxa_low_gpio_chip = { .name = "GPIO-l", .ack = pxa_ack_low_gpio, .mask = pxa_mask_low_irq, .unmask = pxa_unmask_low_irq, .set_type = pxa_gpio_irq_type, .set_wake = pxa_set_gpio_wake, }; ☆─────────────────────────────────────☆ DusTin (老了) 于 (Thu May 29 12:52:57 2008) 提到: 个人理解: 成员都是函数指针,赋值的时候直接把函数指针地址赋给成员,调用的时候直接去那个地址运行,相当于回调函数 【 在 lester98 的大作中提到: 】 : 我贴出来,有达人帮助琢磨一下吧 : //#kernel/irq/chip.c : [color=#228B22]int set_irq_type(unsigned int irq, unsigned int type) : ................... ☆─────────────────────────────────────☆ DusTin (老了) 于 (Thu May 29 13:01:51 2008) 提到: irq_desc是个全局变量,加上irq的偏移就可以定位到对应的pxa_low_gpio_chip 在void __init pxa_init_irq(void)调用set_irq_chip(irq, &pxa_low_gpio_chip);将以irq为偏移的irq_chip结构体放到irq_desc全剧变量中 ☆─────────────────────────────────────☆ fzylijun886 (北邮人) 于 (Thu May 29 13:04:02 2008) 提到: irq_desc + irq 记得是真正的irq地址 ☆─────────────────────────────────────☆ DusTin (老了) 于 (Thu May 29 13:13:52 2008) 提到: struct irqdesc irq_desc[NR_IRQS];全剧变量 然后在 int set_irq_chip(unsigned int irq, struct irq_chip *chip) { struct irq_desc *desc; unsigned long flags; if (irq >= NR_IRQS) { printk(KERN_ERR "Trying to install chip for IRQ%d\n", irq); WARN_ON(1); return -EINVAL; } if (!chip) chip = &no_irq_chip; desc = irq_desc + irq; spin_lock_irqsave(&desc->lock, flags); irq_chip_set_defaults(chip); desc->chip = chip; spin_unlock_irqrestore(&desc->lock, flags); return 0; } 把chip放进去 int set_irq_type(unsigned int irq, unsigned int type) { struct irq_desc *desc; unsigned long flags; int ret = -ENXIO; if (irq >= NR_IRQS) { printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq); return -ENODEV; } desc = irq_desc + irq; if (desc->chip->set_type) { spin_lock_irqsave(&desc->lock, flags); ret = desc->chip->set_type(irq, type); spin_unlock_irqrestore(&desc->lock, flags); } return ret; } 直接调用相应的set_type 【 在 fzylijun886 的大作中提到: 】 : irq_desc + irq : 记得是真正的irq地址 ☆─────────────────────────────────────☆ jklbupt (jklbupt) 于 (Thu May 29 13:32:58 2008) 提到: 上边大家说的很详细了.我补充点吧,即中断的初始化过程. init/main.c start_kernel() | arch/arm/kernel/irq.c init_irq() | init_arch_irq()即mainstone_init_irq() 在文件arch/arm/mach-pxa/mainstone.c | arch/arm/mach-pxa/irq.c pxa_init_irq() | set_irq_chip() 另外函数指针的作用(赋值后)可以调用其他文件中的函数,包括用static声明的函数 ☆─────────────────────────────────────☆ jklbupt (jklbupt) 于 (Thu May 29 13:38:34 2008) 提到: 忘了说一下,这个是针对Xscale平台即mainstone系列的开发板,其他的平台(CPU)也是这个顺序。 【 在 jklbupt 的大作中提到: 】 : 上边大家说的很详细了.我补充点吧,即中断的初始化过程. : init/main.c start_kernel() : | : ................... ☆─────────────────────────────────────☆ lester98 (奶瓶) 于 (Thu May 29 14:48:10 2008) 提到: 哦,我的这个眼睛啊 desc = irq_desc + irq 前者是这里定义的变量,irq_desc就是全局的嘛,真晕,谢谢楼上几位! ☆─────────────────────────────────────☆ DusTin (老了) 于 (Thu May 29 14:51:09 2008) 提到: 这个结构体和那个全局变量用了相同的名字 struct irqdesc irq_desc[NR_IRQS]; struct irq_desc { irq_flow_handler_t handle_irq; struct irq_chip *chip; void *handler_data; void *chip_data; struct irqaction *action; /* IRQ action list */ unsigned int status; /* IRQ status */ unsigned int depth; /* nested irq disables */ unsigned int wake_depth; /* nested wake enables */ unsigned int irq_count; /* For detecting broken IRQs */ unsigned int irqs_unhandled; spinlock_t lock; #ifdef CONFIG_SMP cpumask_t affinity; unsigned int cpu; #endif #if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) cpumask_t pending_mask; #endif #ifdef CONFIG_PROC_FS struct proc_dir_entry *dir; #endif const char *name; } ____cacheline_aligned; 【 在 lester98 的大作中提到: 】 : 哦,我的这个眼睛啊 : desc = irq_desc + irq : 前者是这里定义的变量,irq_desc就是全局的嘛,真晕,谢谢楼上几位! ☆─────────────────────────────────────☆ DusTin (老了) 于 (Thu May 29 14:51:51 2008) 提到: 呵呵,我一开始看了一眼也觉得奇怪 【 在 lester98 的大作中提到: 】 : 哦,我的这个眼睛啊 : desc = irq_desc + irq : 前者是这里定义的变量,irq_desc就是全局的嘛,真晕,谢谢楼上几位! ☆─────────────────────────────────────☆ lester98 (奶瓶) 于 (Thu May 29 14:53:00 2008) 提到: 【 在 DusTin 的大作中提到: 】 : 这个结构体和那个全局变量用了相同的名字 : ................... 所以给看差了,本来很好理解的东西,我的眼睛就象筛子一样,把有用的信息给漏掉,主要我用了sourceInsight,一般的全局都是紫色的,这里我只从内核里挑了一部分代码看,估计没有那个全局变量的定义,所以sourceInsight把它当成原型了,就是绿色的了 ☆─────────────────────────────────────☆ Jorden (Mickey Mouse) 于 (Thu May 29 19:14:25 2008) 提到: 拜读
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。