返回信息流☆─────────────────────────────────────☆
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) 提到:
拜读
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #496同步于 2008/5/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
[合集] 2.6.23内核中申请gpio中断的函数是什么?
Winters101
2008/5/31镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。