之前发过帖后来发现是usb口接错了,用的非复用口所以肯定不行了
2.6.24内核, 2440板
现在是可以进入中断,然后reset也可以调用,但是之后就没了,似乎ep0中断没有
调试过程如下:
# insmod s3c2410_udc.ko
s3c2410_udc: debugfs dir creation failed -19
s3c2440-usbgadget s3c2440-usbgadget: S3C2440: increasing FIFO to 128 bytes
smdk2410_udc:Pull-up disable
s3c2410_udc_p_disable
# insmod g_file_storage.ko file=/dev/mydev/mmc stall=0 removable=1
usb_gadget_register_driver() 'g_file_storage'
fsg_bind
g_file_storage gadget: File-backed Storage Gadget, version: 7 August 2007
g_file_storage gadget: Number of LUNs=1
g_file_storage gadget-lun0: ro=0, file: /usr/mydev/mmc
s3c2410_udc_enable called
smdk2410_udc:Pull-up enable
s3c2410_udc_p_enable
fsg_main_thread
//把把板子的usb口插入电脑后板子这边的信息,pc上提示无法识别的设备
# S3C2410_UDC_EP_INT_EN_REG=1f
usbs=04, usbds=00, pwr=08 ep0csr=00
USB reset csr 0 pwr 8
S3C2410_UDC_EP_INT_EN_REG=1f
usbs=00, usbds=00, pwr=08 ep0csr=00
irq: 41 s3c2410_udc_done.
S3C2410_UDC_EP_INT_EN_REG=1f
usbs=04, usbds=00, pwr=08 ep0csr=00
USB reset csr 0 pwr 8
S3C2410_UDC_EP_INT_EN_REG=1f
usbs=00, usbds=00, pwr=08 ep0csr=00
irq: 41 s3c2410_udc_done.
S3C2410_UDC_EP_INT_EN_REG=1f
usbs=04, usbds=00, pwr=08 ep0csr=00
USB reset csr 0 pwr 8
S3C2410_UDC_EP_INT_EN_REG=1f
usbs=00, usbds=00, pwr=08 ep0csr=00
irq: 41 s3c2410_udc_done.
S3C2410_UDC_EP_INT_EN_REG=1f
usbs=04, usbds=00, pwr=08 ep0csr=00
USB reset csr 0 pwr 8
S3C2410_UDC_EP_INT_EN_REG=1f
usbs=00, usbds=00, pwr=08 ep0csr=00
irq: 41 s3c2410_udc_done.
看看代码
reset之后不会进入resume和suspend(设置过了)
但是之后的ep部分也不行,这个不行吧,EP_INT_REG中ep0也是0,在觅开始要用ep0的,看数据手册上说的置位条件有IN_PKT_RDY,这个只要ep0 fifo有数据来就有了的吧?
我这个理解有没有错
如果没错为什么会ep0没反应了
* s3c2410_udc_irq - interrupt handler
*/
static irqreturn_t s3c2410_udc_irq(int irq, void *_dev)
{
struct s3c2410_udc *dev = _dev;
int usb_status;
int usbd_status, usbd_status2;
int pwr_reg;
int ep0csr,ep1csr;
int i;
u32 idx;
unsigned long flags;
//add
unsigned int en_int_ep=udc_read(S3C2410_UDC_EP_INT_EN_REG);
printk("S3C2410_UDC_EP_INT_EN_REG=%x\n",en_int_ep);
spin_lock_irqsave(&dev->lock, flags);
/* Driver connected ? */
if (!dev->driver) {
/* Clear interrupts */
udc_write(udc_read(S3C2410_UDC_USB_INT_REG),
S3C2410_UDC_USB_INT_REG);
udc_write(udc_read(S3C2410_UDC_EP_INT_REG),
S3C2410_UDC_EP_INT_REG);
}
/* Save index */
idx = udc_read(S3C2410_UDC_INDEX_REG);
/* Read status registers */
usb_status = udc_read(S3C2410_UDC_USB_INT_REG);
usbd_status = udc_read(S3C2410_UDC_EP_INT_REG);
pwr_reg = udc_read(S3C2410_UDC_PWR_REG);
udc_writeb(base_addr, S3C2410_UDC_INDEX_EP0, S3C2410_UDC_INDEX_REG);
ep0csr = udc_read(S3C2410_UDC_EP0_CSR_REG);
ep1csr = udc_read(S3C2410_UDC_IN_CSR1_REG);
// dprintk(DEBUG_NORMAL, "usbs=%02x, usbds=%02x, pwr=%02x ep0csr=%02x\n",
// usb_status, usbd_status, pwr_reg, ep0csr);
#ifdef C_TEST
printk("usbs=%02x, usbds=%02x, pwr=%02x ep0csr=%02x,ep1csr=%02x\n",
usb_status, usbd_status, pwr_reg, ep0csr,ep1csr);
#endif
/*
* Now, handle interrupts. There's two types :
* - Reset, Resume, Suspend coming -> usb_int_reg
* - EP -> ep_int_reg
*/
/* RESET */
if (usb_status & S3C2410_UDC_USBINT_RESET) {
/* two kind of reset :
* - reset start -> pwr reg = 8
* - reset end -> pwr reg = 0
**/
// dprintk(DEBUG_NORMAL, "USB reset csr %x pwr %x\n",
// ep0csr, pwr_reg);
#ifdef C_TEST
printk("USB reset csr %x pwr %x\n",
ep0csr, pwr_reg);
#endif
dev->gadget.speed = USB_SPEED_UNKNOWN;
udc_write(0x00, S3C2410_UDC_INDEX_REG);
udc_write((dev->ep[0].ep.maxpacket & 0x7ff) >> 3,
S3C2410_UDC_MAXP_REG);
dev->address = 0;
dev->ep0state = EP0_IDLE;
dev->gadget.speed = USB_SPEED_FULL;
/* clear interrupt */
udc_write(S3C2410_UDC_USBINT_RESET,
S3C2410_UDC_USB_INT_REG);
udc_write(idx, S3C2410_UDC_INDEX_REG);
spin_unlock_irqrestore(&dev->lock, flags);
return IRQ_HANDLED;
}
usbd_status2=udc_read(S3C2410_UDC_EP_INT_REG);
printk("usbd_status2=%02x\n", usbd_status2);
/* RESUME */
if (usb_status & S3C2410_UDC_USBINT_RESUME) {
// dprintk(DEBUG_NORMAL, "USB resume\n");
printk("USB resume\n");
/* clear interrupt */
udc_write(S3C2410_UDC_USBINT_RESUME,
S3C2410_UDC_USB_INT_REG);
if (dev->gadget.speed != USB_SPEED_UNKNOWN
&& dev->driver
&& dev->driver->resume)
dev->driver->resume(&dev->gadget);
}
/* SUSPEND */
if (usb_status & S3C2410_UDC_USBINT_SUSPEND) {
// dprintk(DEBUG_NORMAL, "USB suspend\n");
printk("USB suspend\n");
/* clear interrupt */
udc_write(S3C2410_UDC_USBINT_SUSPEND,
S3C2410_UDC_USB_INT_REG);
if (dev->gadget.speed != USB_SPEED_UNKNOWN
&& dev->driver
&& dev->driver->suspend)
dev->driver->suspend(&dev->gadget);
dev->ep0state = EP0_IDLE;
}
/* EP */
/* control traffic */
/* check on ep0csr != 0 is not a good idea as clearing in_pkt_ready
* generate an interrupt
*/
if (usbd_status & S3C2410_UDC_INT_EP0) {
// dprintk(DEBUG_VERBOSE, "USB ep0 irq\n");
#ifdef C_TEST
printk("USB ep0 irq\n");
#endif
/* Clear the interrupt bit by setting it to 1 */
udc_write(S3C2410_UDC_INT_EP0, S3C2410_UDC_EP_INT_REG);
s3c2410_udc_handle_ep0(dev);
}
/* endpoint data transfers */
for (i = 1; i < S3C2410_ENDPOINTS; i++) {
u32 tmp = 1 << i;
if (usbd_status & tmp) {
// dprintk(DEBUG_VERBOSE, "USB ep%d irq\n", i);
printk("USB ep%d irq\n", i);
/* Clear the interrupt bit by setting it to 1 */
udc_write(tmp, S3C2410_UDC_EP_INT_REG);
s3c2410_udc_handle_ep(&dev->ep
);
}
}
// dprintk(DEBUG_VERBOSE, "irq: %d s3c2410_udc_done.\n", irq);
printk("irq: %d s3c2410_udc_done.\n", irq);
/* Restore old index */
udc_write(idx, S3C2410_UDC_INDEX_REG);
spin_unlock_irqrestore(&dev->lock, flags);
return IRQ_HANDLED;
}[ 此帖被kasim在2010-03-22 15:43重新编辑 ]