我的源代码irq_probe.c本来是用来做irq probing的,但怎样都测试不到usb device controller(下面简称USBD)的IRQ.
现在都改得面目全非了,只有输出SRCPND, INTMSK中USBD对应的位。
再者,我在host上实现了一个驱动,经过测试,能够向s3c2440a 的USBD的EP3传送字符串
irq_probe.c的源代码如下:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/spinlock.h>
#include <linux/ioport.h>
#include <asm/delay.h>
#include <asm/io.h>
#include "../utils/pic_utils.h"
MODULE_LICENSE("GPL");
int irq = 0;
int *probe_id;
int result[NR_IRQS];
irqreturn_t irq_handler(int irq, void *id){
printk("key one");
return IRQ_HANDLED;
}
static void irq_cleanup(void){
}
static int irq_init(void){
void *srcpnd = NULL;
void *ep_int = NULL;
void *intmsk = NULL;
/* 自定义函数iomem_remap() -- 获取并重映射io memory region */
ep_int = iomem_remap(EP_INT_REG, USBD_LEN, "irq_probe");
if (!ep_int)
goto exit0;
srcpnd = iomem_remap(SRCPND_REG, INT_LEN, "irq_probe");
if (!srcpnd)
goto exit1;
intmsk = iomem_remap(INTMSK_REG, INT_LEN, "irq_probe");
if (!intmsk)
goto exit2;
printk(KERN_DEBUG "USBD source pending %i\n",\
(ioread32(srcpnd) >> 25) & 0x00000001);
printk(KERN_DEBUG "USBD interrupt mask %i\n", \
(ioread32(intmsk) >> 25) & 0x00000001);
printk(KERN_DEBUG "EP3 pending interrupt %i\n",\
(ioread8(ep_int) >> 3) & 0x01);
iowrite32(ioread32(intmsk) & ~(1 << 25), intmsk);
exit2:
iomem_unmap(INTMSK_REG, INT_LEN, intmsk);
exit1:
iomem_unmap(SRCPND_REG, INT_LEN, srcpnd);
exit0:
iomem_unmap(EP_INT_REG, USBD_LEN, ep_int);
return -EFAULT;
}
module_init(irq_init);
module_exit(irq_cleanup);
我所做的测试步骤是:
A.从host向USBD输入若干字符;/* 这样EP3就会发出中断, 提示EP3 的FIFO中有数据等待处理 */
B.在mini2440上挂载如上的irq_probe.ko模块;
/* 不论挂载多少次irq_probe.ko, 终端中始终显示为
USBD source pending 1
USBD interrupt mask 1
EP3 pending interrupt 1
但若忽略步骤A,那么显示如下
USBD source pending 0
USBD interrupt mask 0
EP3 pending interrupt 0
*/
从上面的结果,我得出USBD源是不断发出终端,而且是从EP3发出的,
但PIC(interrupt controller)把他mask掉了,以致终端不能到达cpu core.
开始的时候以为USBD对应的IRQ会被触发一次后,USBD源才被mask掉(避免cpu core不断被中断)。
但对被/proc/interrupts 和 /proc/stat后发现除了5、6个已被系统占用的IRQ,其他IRQ还是0
对s3c2440a还是不太熟悉,不知道我这样推测对不对。版主帮帮忙吧。
