/***************************************************************************** ** FILE NAME : ifxusb_cif.c ** PROJECT : IFX USB sub-system V3 ** MODULES : IFX USB sub-system Host and Device driver ** SRC VERSION : 1.0 ** DATE : 1/Jan/2009 ** AUTHOR : Chen, Howard ** DESCRIPTION : The Core Interface provides basic services for accessing and ** managing the IFX USB hardware. These services are used by both the ** Host Controller Driver and the Peripheral Controller Driver. *****************************************************************************/ /*! \file ifxusb_cif.c \ingroup IFXUSB_DRIVER_V3 \brief This file contains the interface to the IFX USB Core. */ #include #include "ifxusb_version.h" #include #include #include #include #include #include #if defined(__UEIP__) // #include #include #endif #include "ifxusb_plat.h" #include "ifxusb_regs.h" #include "ifxusb_cif.h" #ifdef __IS_DEVICE__ #include "ifxpcd.h" #endif #ifdef __IS_HOST__ #include "ifxhcd.h" #endif #include #include #if defined(__UEIP__) // #include #include #endif //#include #include #if defined(__UEIP__) // #include #include #endif #if defined(__UEIP__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) #ifndef USB_CTRL_PMU_SETUP #define USB_CTRL_PMU_SETUP(__x) USB0_CTRL_PMU_SETUP(__x) #endif #ifndef USB_PHY_PMU_SETUP #define USB_PHY_PMU_SETUP(__x) USB0_PHY_PMU_SETUP(__x) #endif #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) #endif // defined(__UEIP__) /*! \brief This function is called to allocate buffer of specified size. The allocated buffer is mapped into DMA accessable address. \param size Size in BYTE to be allocated \param clear 0: don't do clear after buffer allocated, other: do clear to zero \return 0/NULL: Fail; uncached pointer of allocated buffer */ void *ifxusb_alloc_buf(size_t size, int clear) { uint32_t *cached,*uncached; uint32_t totalsize,page; if(!size) return 0; size=(size+3)&0xFFFFFFFC; totalsize=size + 12; page=get_order(totalsize); cached = (void *) __get_free_pages(( GFP_ATOMIC | GFP_DMA), page); if(!cached) { IFX_PRINT("%s Allocation Failed size:%d\n",__func__,size); return NULL; } uncached = (uint32_t *)(KSEG1ADDR(cached)); if(clear) memset(uncached, 0, totalsize); *(uncached+0)=totalsize; *(uncached+1)=page; *(uncached+2)=(uint32_t)cached; return (void *)(uncached+3); } /*! \brief This function is called to free allocated buffer. \param vaddr the uncached pointer of the buffer */ void ifxusb_free_buf(void *vaddr) { uint32_t totalsize,page; uint32_t *cached,*uncached; if(vaddr != NULL) { uncached=vaddr; uncached-=3; totalsize=*(uncached+0); page=*(uncached+1); cached=(uint32_t *)(*(uncached+2)); if(totalsize && page==get_order(totalsize) && cached==(uint32_t *)(KSEG0ADDR(uncached))) { free_pages((unsigned long)cached, page); return; } // the memory is not allocated by ifxusb_alloc_buf. Allowed but must be careful. return; } } /*! \brief This function is called to initialize the IFXUSB CSR data structures. The register addresses in the device and host structures are initialized from the base address supplied by the caller. The calling function must make the OS calls to get the base address of the IFXUSB controller registers. \param _core_if Pointer of core_if structure \param _irq irq number \param _reg_base_addr Base address of IFXUSB core registers \param _fifo_base_addr Fifo base address \param _fifo_dbg_addr Fifo debug address \return 0: success; */ int ifxusb_core_if_init(ifxusb_core_if_t *_core_if, int _irq, uint32_t _reg_base_addr, uint32_t _fifo_base_addr, uint32_t _fifo_dbg_addr) { int retval = 0; uint32_t *reg_base =NULL; uint32_t *fifo_base =NULL; uint32_t *fifo_dbg =NULL; int i; IFX_DEBUGPL(DBG_CILV, "%s(%p,%d,0x%08X,0x%08X,0x%08X)\n", __func__, _core_if, _irq, _reg_base_addr, _fifo_base_addr, _fifo_dbg_addr); if( _core_if == NULL) { IFX_ERROR("%s() invalid _core_if\n", __func__); retval = -ENOMEM; goto fail; } //memset(_core_if, 0, sizeof(ifxusb_core_if_t)); _core_if->irq=_irq; reg_base =ioremap_nocache(_reg_base_addr , IFXUSB_IOMEM_SIZE ); fifo_base =ioremap_nocache(_fifo_base_addr, IFXUSB_FIFOMEM_SIZE); fifo_dbg =ioremap_nocache(_fifo_dbg_addr , IFXUSB_FIFODBG_SIZE); if( reg_base == NULL || fifo_base == NULL || fifo_dbg == NULL) { IFX_ERROR("%s() usb ioremap() failed\n", __func__); retval = -ENOMEM; goto fail; } _core_if->core_global_regs = (ifxusb_core_global_regs_t *)reg_base; /* * Attempt to ensure this device is really a IFXUSB Controller. * Read and verify the SNPSID register contents. The value should be * 0x45F42XXX */ { int32_t snpsid; snpsid = ifxusb_rreg(&_core_if->core_global_regs->gsnpsid); if ((snpsid & 0xFFFFF000) != 0x4F542000) { IFX_ERROR("%s() snpsid error(0x%08x) failed\n", __func__,snpsid); retval = -EINVAL; goto fail; } _core_if->snpsid=snpsid; } #ifdef __IS_HOST__ _core_if->host_global_regs = (ifxusb_host_global_regs_t *) ((uint32_t)reg_base + IFXUSB_HOST_GLOBAL_REG_OFFSET); _core_if->hprt0 = (uint32_t*)((uint32_t)reg_base + IFXUSB_HOST_PORT_REGS_OFFSET); for (i=0; ihc_regs[i] = (ifxusb_hc_regs_t *) ((uint32_t)reg_base + IFXUSB_HOST_CHAN_REGS_OFFSET + (i * IFXUSB_CHAN_REGS_OFFSET)); IFX_DEBUGPL(DBG_CILV, "hc_reg[%d]->hcchar=%p\n", i, &_core_if->hc_regs[i]->hcchar); } #endif //__IS_HOST__ #ifdef __IS_DEVICE__ _core_if->dev_global_regs = (ifxusb_device_global_regs_t *)((uint32_t)reg_base + IFXUSB_DEV_GLOBAL_REG_OFFSET); for (i=0; iin_ep_regs[i] = (ifxusb_dev_in_ep_regs_t *) ((uint32_t)reg_base + IFXUSB_DEV_IN_EP_REG_OFFSET + (i * IFXUSB_EP_REG_OFFSET)); _core_if->out_ep_regs[i] = (ifxusb_dev_out_ep_regs_t *) ((uint32_t)reg_base + IFXUSB_DEV_OUT_EP_REG_OFFSET + (i * IFXUSB_EP_REG_OFFSET)); IFX_DEBUGPL(DBG_CILV, "in_ep_regs[%d]->diepctl=%p/%p %p/0x%08X/0x%08X\n", i, &_core_if->in_ep_regs[i]->diepctl, _core_if->in_ep_regs[i], reg_base,IFXUSB_DEV_IN_EP_REG_OFFSET,(i * IFXUSB_EP_REG_OFFSET) ); IFX_DEBUGPL(DBG_CILV, "out_ep_regs[%d]->doepctl=%p/%p %p/0x%08X/0x%08X\n", i, &_core_if->out_ep_regs[i]->doepctl, _core_if->out_ep_regs[i], reg_base,IFXUSB_DEV_OUT_EP_REG_OFFSET,(i * IFXUSB_EP_REG_OFFSET) ); } #endif //__IS_DEVICE__ /* Setting the FIFO and other Address. */ for (i=0; idata_fifo[i] = fifo_base + (i * IFXUSB_DATA_FIFO_SIZE); IFX_DEBUGPL(DBG_CILV, "data_fifo[%d]=0x%08x\n", i, (unsigned)_core_if->data_fifo[i]); } _core_if->data_fifo_dbg = fifo_dbg; _core_if->pcgcctl = (uint32_t*)(((uint32_t)reg_base) + IFXUSB_PCGCCTL_OFFSET); /* * Store the contents of the hardware configuration registers here for * easy access later. */ _core_if->hwcfg1.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg1); _core_if->hwcfg2.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg2); _core_if->hwcfg3.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg3); _core_if->hwcfg4.d32 = ifxusb_rreg(&_core_if->core_global_regs->ghwcfg4); IFX_DEBUGPL(DBG_CILV,"hwcfg1=%08x\n",_core_if->hwcfg1.d32); IFX_DEBUGPL(DBG_CILV,"hwcfg2=%08x\n",_core_if->hwcfg2.d32); IFX_DEBUGPL(DBG_CILV,"hwcfg3=%08x\n",_core_if->hwcfg3.d32); IFX_DEBUGPL(DBG_CILV,"hwcfg4=%08x\n",_core_if->hwcfg4.d32); #ifdef __DED_FIFO__ IFX_PRINT("Waiting for PHY Clock Lock!\n"); while(!( ifxusb_rreg(&_core_if->core_global_regs->grxfsiz) & (1<<9))) { } IFX_PRINT("PHY Clock Locked!\n"); //ifxusb_clean_spram(_core_if,128*1024/4); #endif /* Create new workqueue and init works */ #if 0 _core_if->wq_usb = create_singlethread_workqueue(_core_if->core_name); if(_core_if->wq_usb == 0) { IFX_DEBUGPL(DBG_CIL, "Creation of wq_usb failed\n"); retval = -EINVAL; goto fail; } #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change, core_if); INIT_WORK(&core_if->w_wkp, w_wakeup_detected, core_if); #else INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change); INIT_DELAYED_WORK(&core_if->w_wkp, w_wakeup_detected); #endif #endif return 0; fail: if( reg_base != NULL) iounmap(reg_base ); if( fifo_base != NULL) iounmap(fifo_base); if( fifo_dbg != NULL) iounmap(fifo_dbg ); return retval; } /*! \brief This function free the mapped address in the IFXUSB CSR data structures. \param _core_if Pointer of core_if structure */ void ifxusb_core_if_remove(ifxusb_core_if_t *_core_if) { /* Disable all interrupts */ if( _core_if->core_global_regs != NULL) { ifxusb_mreg( &_core_if->core_global_regs->gahbcfg, 1, 0); ifxusb_wreg( &_core_if->core_global_regs->gintmsk, 0); } if( _core_if->core_global_regs != NULL) iounmap(_core_if->core_global_regs ); if( _core_if->data_fifo[0] != NULL) iounmap(_core_if->data_fifo[0] ); if( _core_if->data_fifo_dbg != NULL) iounmap(_core_if->data_fifo_dbg ); #if 0 if (_core_if->wq_usb) destroy_workqueue(_core_if->wq_usb); #endif memset(_core_if, 0, sizeof(ifxusb_core_if_t)); } /*! \brief This function enbles the controller's Global Interrupt in the AHB Config register. \param _core_if Pointer of core_if structure */ void ifxusb_enable_global_interrupts( ifxusb_core_if_t *_core_if ) { gahbcfg_data_t ahbcfg ={ .d32 = 0}; ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ ifxusb_mreg(&_core_if->core_global_regs->gahbcfg, 0, ahbcfg.d32); } /*! \brief This function disables the controller's Global Interrupt in the AHB Config register. \param _core_if Pointer of core_if structure */ void ifxusb_disable_global_interrupts( ifxusb_core_if_t *_core_if ) { gahbcfg_data_t ahbcfg ={ .d32 = 0}; ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ ifxusb_mreg(&_core_if->core_global_regs->gahbcfg, ahbcfg.d32, 0); } /*! \brief Flush Tx and Rx FIFO. \param _core_if Pointer of core_if structure */ void ifxusb_flush_both_fifo( ifxusb_core_if_t *_core_if ) { ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs; volatile grstctl_t greset ={ .d32 = 0}; int count = 0; IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__); greset.b.rxfflsh = 1; greset.b.txfflsh = 1; greset.b.txfnum = 0x10; greset.b.intknqflsh=1; greset.b.hstfrm=1; ifxusb_wreg( &global_regs->grstctl, greset.d32 ); do { greset.d32 = ifxusb_rreg( &global_regs->grstctl); if (++count > 10000) { IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32); break; } } while (greset.b.rxfflsh == 1 || greset.b.txfflsh == 1); /* Wait for 3 PHY Clocks*/ UDELAY(1); } /*! \brief Flush a Tx FIFO. \param _core_if Pointer of core_if structure \param _num Tx FIFO to flush. ( 0x10 for ALL TX FIFO ) */ void ifxusb_flush_tx_fifo( ifxusb_core_if_t *_core_if, const int _num ) { ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs; volatile grstctl_t greset ={ .d32 = 0}; int count = 0; IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "Flush Tx FIFO %d\n", _num); greset.b.intknqflsh=1; greset.b.txfflsh = 1; greset.b.txfnum = _num; ifxusb_wreg( &global_regs->grstctl, greset.d32 ); do { greset.d32 = ifxusb_rreg( &global_regs->grstctl); if (++count > 10000&&(_num==0 ||_num==0x10)) { IFX_WARN("%s() HANG! GRSTCTL=%0x GNPTXSTS=0x%08x\n", __func__, greset.d32, ifxusb_rreg( &global_regs->gnptxsts)); break; } } while (greset.b.txfflsh == 1); /* Wait for 3 PHY Clocks*/ UDELAY(1); } /*! \brief Flush Rx FIFO. \param _core_if Pointer of core_if structure */ void ifxusb_flush_rx_fifo( ifxusb_core_if_t *_core_if ) { ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs; volatile grstctl_t greset ={ .d32 = 0}; int count = 0; IFX_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__); greset.b.rxfflsh = 1; ifxusb_wreg( &global_regs->grstctl, greset.d32 ); do { greset.d32 = ifxusb_rreg( &global_regs->grstctl); if (++count > 10000) { IFX_WARN("%s() HANG! GRSTCTL=%0x\n", __func__, greset.d32); break; } } while (greset.b.rxfflsh == 1); /* Wait for 3 PHY Clocks*/ UDELAY(1); } #define SOFT_RESET_DELAY 100 /*! \brief Do a soft reset of the core. Be careful with this because it resets all the internal state machines of the core. \param _core_if Pointer of core_if structure */ int ifxusb_core_soft_reset(ifxusb_core_if_t *_core_if) { ifxusb_core_global_regs_t *global_regs = _core_if->core_global_regs; volatile grstctl_t greset ={ .d32 = 0}; int count = 0; IFX_DEBUGPL(DBG_CILV, "%s\n", __func__); /* Wait for AHB master IDLE state. */ do { UDELAY(10); greset.d32 = ifxusb_rreg( &global_regs->grstctl); if (++count > 100000) { IFX_WARN("%s() HANG! AHB Idle GRSTCTL=%0x %x\n", __func__, greset.d32, greset.b.ahbidle); break; } } while (greset.b.ahbidle == 0); UDELAY(1); /* Core Soft Reset */ count = 0; greset.b.csftrst = 1; ifxusb_wreg( &global_regs->grstctl, greset.d32 ); #ifdef SOFT_RESET_DELAY MDELAY(SOFT_RESET_DELAY); #endif do { UDELAY(10); greset.d32 = ifxusb_rreg( &global_regs->grstctl); if (++count > 100000) { IFX_WARN("%s() HANG! Soft Reset GRSTCTL=%0x\n", __func__, greset.d32); return -1; } } while (greset.b.csftrst == 1); #ifdef SOFT_RESET_DELAY MDELAY(SOFT_RESET_DELAY); #endif #if defined(__IS_VR9__) if(_core_if->core_no==0) { set_bit (4, VR9_RCU_USBRESET2); MDELAY(50); clear_bit (4, VR9_RCU_USBRESET2); } else { set_bit (5, VR9_RCU_USBRESET2); MDELAY(50); clear_bit (5, VR9_RCU_USBRESET2); } MDELAY(50); #endif //defined(__IS_VR9__) IFX_PRINT("USB core #%d soft-reset\n",_core_if->core_no); return 0; } /*! \brief Turn on the USB Core Power \param _core_if Pointer of core_if structure */ void ifxusb_power_on (ifxusb_core_if_t *_core_if) { // set clock gating IFX_DEBUGPL(DBG_ENTRY, "%s() %d\n", __func__, __LINE__ ); #if defined(__UEIP__) #if defined(__IS_TWINPASS) || defined(__IS_DANUBE__) set_bit (4, (volatile unsigned long *)DANUBE_CGU_IFCCR); set_bit (5, (volatile unsigned long *)DANUBE_CGU_IFCCR); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) // clear_bit (4, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR); clear_bit (5, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) set_bit (0, (volatile unsigned long *)AR9_CGU_IFCCR); set_bit (1, (volatile unsigned long *)AR9_CGU_IFCCR); #endif //defined(__IS_AR9__) #if defined(__IS_VR9__) // set_bit (0, (volatile unsigned long *)VR9_CGU_IFCCR); // set_bit (1, (volatile unsigned long *)VR9_CGU_IFCCR); #endif //defined(__IS_VR9__) MDELAY(50); // set power #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) USB_CTRL_PMU_SETUP(IFX_PMU_ENABLE); //#if defined(__IS_TWINPASS__) // ifxusb_enable_afe_oc(); //#endif #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) || defined(__IS_VR9__) || defined(__IS_AR10__) if(_core_if->core_no==0) USB0_CTRL_PMU_SETUP(IFX_PMU_ENABLE); else USB1_CTRL_PMU_SETUP(IFX_PMU_ENABLE); #endif //defined(__IS_AR9__) || defined(__IS_VR9__) if(_core_if->core_global_regs) { // PHY configurations. #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) #if defined(__IS_VR9__) //ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_VR9__) } #else //defined(__UEIP__) #if defined(__IS_TWINPASS) || defined(__IS_DANUBE__) set_bit (4, (volatile unsigned long *)DANUBE_CGU_IFCCR); set_bit (5, (volatile unsigned long *)DANUBE_CGU_IFCCR); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) // clear_bit (4, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR); clear_bit (5, (volatile unsigned long *)AMAZON_SE_CGU_IFCCR); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) set_bit (0, (volatile unsigned long *)AMAZON_S_CGU_IFCCR); set_bit (1, (volatile unsigned long *)AMAZON_S_CGU_IFCCR); #endif //defined(__IS_AR9__) MDELAY(50); // set power #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) clear_bit (6, (volatile unsigned long *)DANUBE_PMU_PWDCR);//USB clear_bit (9, (volatile unsigned long *)DANUBE_PMU_PWDCR);//DSL clear_bit (15, (volatile unsigned long *)DANUBE_PMU_PWDCR);//AHB #if defined(__IS_TWINPASS__) ifxusb_enable_afe_oc(); #endif #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) clear_bit (6, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR); clear_bit (9, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR); clear_bit (15, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) clear_bit (6, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB else clear_bit (27, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB clear_bit (9, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//DSL clear_bit (15, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//AHB #endif //defined(__IS_AR9__) if(_core_if->core_global_regs) { // PHY configurations. #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) } #endif //defined(__UEIP__) } /*! \brief Turn off the USB Core Power \param _core_if Pointer of core_if structure */ void ifxusb_power_off (ifxusb_core_if_t *_core_if) { ifxusb_phy_power_off (_core_if); // set power #if defined(__UEIP__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) USB_CTRL_PMU_SETUP(IFX_PMU_DISABLE); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) || defined(__IS_VR9__) || defined(__IS_AR10__) if(_core_if->core_no==0) USB0_CTRL_PMU_SETUP(IFX_PMU_DISABLE); else USB1_CTRL_PMU_SETUP(IFX_PMU_DISABLE); #endif //defined(__IS_AR9__) || defined(__IS_VR9__) #else //defined(__UEIP__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) set_bit (6, (volatile unsigned long *)DANUBE_PMU_PWDCR);//USB #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) set_bit (6, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);//USB #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) set_bit (6, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB else set_bit (27, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//USB #endif //defined(__IS_AR9__) #endif //defined(__UEIP__) } /*! \brief Turn on the USB PHY Power \param _core_if Pointer of core_if structure */ void ifxusb_phy_power_on (ifxusb_core_if_t *_core_if) { #if defined(__UEIP__) if(_core_if->core_global_regs) { #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) #if defined(__IS_VR9_S__) if(_core_if->core_no==0) set_bit (0, VR9_RCU_USB_ANA_CFG1A); else set_bit (0, VR9_RCU_USB_ANA_CFG1B); #endif //defined(__IS_VR9__) } #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) USB_PHY_PMU_SETUP(IFX_PMU_ENABLE); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) || defined(__IS_VR9__) || defined(__IS_AR10__) if(_core_if->core_no==0) USB0_PHY_PMU_SETUP(IFX_PMU_ENABLE); else USB1_PHY_PMU_SETUP(IFX_PMU_ENABLE); #endif //defined(__IS_AR9__) || defined(__IS_VR9__) // PHY configurations. if(_core_if->core_global_regs) { #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) #if defined(__IS_VR9_S__) if(_core_if->core_no==0) set_bit (0, VR9_RCU_USB_ANA_CFG1A); else set_bit (0, VR9_RCU_USB_ANA_CFG1B); #endif //defined(__IS_VR9__) } #else //defined(__UEIP__) // PHY configurations. if(_core_if->core_global_regs) { #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) } #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) clear_bit (0, (volatile unsigned long *)DANUBE_PMU_PWDCR);//PHY #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) clear_bit (0, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) clear_bit (0, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY else clear_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY #endif //defined(__IS_AR9__) // PHY configurations. if(_core_if->core_global_regs) { #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) } #endif //defined(__UEIP__) } /*! \brief Turn off the USB PHY Power \param _core_if Pointer of core_if structure */ void ifxusb_phy_power_off (ifxusb_core_if_t *_core_if) { #if defined(__UEIP__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) USB_PHY_PMU_SETUP(IFX_PMU_DISABLE); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) || defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) || defined(__IS_VR9__) || defined(__IS_AR10__) if(_core_if->core_no==0) USB0_PHY_PMU_SETUP(IFX_PMU_DISABLE); else USB1_PHY_PMU_SETUP(IFX_PMU_DISABLE); #endif // defined(__IS_AR9__) || defined(__IS_VR9__) #else //defined(__UEIP__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) set_bit (0, (volatile unsigned long *)DANUBE_PMU_PWDCR);//PHY #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) set_bit (0, (volatile unsigned long *)AMAZON_SE_PMU_PWDCR);//PHY #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) set_bit (0, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY else set_bit (26, (volatile unsigned long *)AMAZON_S_PMU_PWDCR);//PHY #endif //defined(__IS_AR9__) #endif //defined(__UEIP__) } /*! \brief Reset on the USB Core RCU \param _core_if Pointer of core_if structure */ #if defined(__IS_VR9__) || defined (__IS_AR10__) int already_hard_reset=0; #endif void ifxusb_hard_reset(ifxusb_core_if_t *_core_if) { #if defined(__UEIP__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined (__IS_HOST__) clear_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); #elif defined (__IS_DEVICE__) set_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); #endif #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AMAZON_SE__) #if defined (__IS_HOST__) clear_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); #elif defined (__IS_DEVICE__) set_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); #endif #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) { #if defined (__IS_HOST__) clear_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG); #elif defined (__IS_DEVICE__) set_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG); #endif } else { #if defined (__IS_HOST__) clear_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG); #elif defined (__IS_DEVICE__) set_bit (AR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG); #endif } #endif //defined(__IS_AR9__) #if defined(__IS_VR9__) if(_core_if->core_no==0) { #if defined (__IS_HOST__) clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG); #elif defined (__IS_DEVICE__) set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG); #endif } else { #if defined (__IS_HOST__) clear_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG); #elif defined (__IS_DEVICE__) set_bit (VR9_USBCFG_HDSEL_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG); #endif } #endif //defined(__IS_VR9__) #if defined(__IS_AR10__) if(_core_if->core_no==0) { #if defined (__IS_HOST__) clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG); #elif defined (__IS_DEVICE__) set_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG); #endif } else { #if defined (__IS_HOST__) clear_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG); #elif defined (__IS_DEVICE__) set_bit (AR10_USBCFG_HDSEL_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG); #endif } #endif //defined(__IS_AR10__) // set the HC's byte-order to big-endian #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) set_bit (DANUBE_USBCFG_HOST_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); clear_bit (DANUBE_USBCFG_SLV_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) set_bit (AMAZON_SE_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); clear_bit (AMAZON_SE_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) { set_bit (AR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG); clear_bit (AR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR9_RCU_USB1CFG); } else { set_bit (AR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG); clear_bit (AR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR9_RCU_USB2CFG); } #endif //defined(__IS_AR9__) #if defined(__IS_VR9__) if(_core_if->core_no==0) { set_bit (VR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG); clear_bit (VR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)VR9_RCU_USB1CFG); } else { set_bit (VR9_USBCFG_HOST_END_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG); clear_bit (VR9_USBCFG_SLV_END_BIT, (volatile unsigned long *)VR9_RCU_USB2CFG); } #endif //defined(__IS_VR9__) #if defined(__IS_AR10__) if(_core_if->core_no==0) { set_bit (AR10_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG); clear_bit (AR10_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR10_RCU_USB1CFG); } else { set_bit (AR10_USBCFG_HOST_END_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG); clear_bit (AR10_USBCFG_SLV_END_BIT, (volatile unsigned long *)AR10_RCU_USB2CFG); } #endif //defined(__IS_AR10__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) set_bit (4, DANUBE_RCU_RESET); MDELAY(500); clear_bit (4, DANUBE_RCU_RESET); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) set_bit (4, AMAZON_SE_RCU_RESET); MDELAY(500); clear_bit (4, AMAZON_SE_RCU_RESET); MDELAY(500); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) { set_bit (4, AR9_RCU_USBRESET); MDELAY(500); clear_bit (4, AR9_RCU_USBRESET); } else { set_bit (28, AR9_RCU_USBRESET); MDELAY(500); clear_bit (28, AR9_RCU_USBRESET); } MDELAY(500); #endif //defined(__IS_AR9__) #if defined(__IS_VR9__) if(!already_hard_reset) { set_bit (4, VR9_RCU_USBRESET); MDELAY(500); clear_bit (4, VR9_RCU_USBRESET); MDELAY(500); already_hard_reset=1; } #endif //defined(__IS_VR9__) #if defined(__IS_AR10__) if(!already_hard_reset) { set_bit (4, AR10_RCU_USBRESET); MDELAY(500); clear_bit (4, AR10_RCU_USBRESET); MDELAY(500); already_hard_reset=1; } #endif //defined(__IS_AR10__) #if defined(__IS_TWINPASS__) ifxusb_enable_afe_oc(); #endif if(_core_if->core_global_regs) { // PHY configurations. #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) #if defined(__IS_VR9__) // ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_VR9__) } #else //defined(__UEIP__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined (__IS_HOST__) clear_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); #elif defined (__IS_DEVICE__) set_bit (DANUBE_USBCFG_HDSEL_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); #endif #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AMAZON_SE__) #if defined (__IS_HOST__) clear_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); #elif defined (__IS_DEVICE__) set_bit (AMAZON_SE_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); #endif #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) { #if defined (__IS_HOST__) clear_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG); #elif defined (__IS_DEVICE__) set_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG); #endif } else { #if defined (__IS_HOST__) clear_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG); #elif defined (__IS_DEVICE__) set_bit (AMAZON_S_USBCFG_HDSEL_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG); #endif } #endif //defined(__IS_AR9__) // set the HC's byte-order to big-endian #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) set_bit (DANUBE_USBCFG_HOST_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); clear_bit (DANUBE_USBCFG_SLV_END_BIT, (volatile unsigned long *)DANUBE_RCU_USBCFG); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) set_bit (AMAZON_SE_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); clear_bit (AMAZON_SE_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_SE_RCU_USBCFG); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) { set_bit (AMAZON_S_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG); clear_bit (AMAZON_S_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB1CFG); } else { set_bit (AMAZON_S_USBCFG_HOST_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG); clear_bit (AMAZON_S_USBCFG_SLV_END_BIT, (volatile unsigned long *)AMAZON_S_RCU_USB2CFG); } #endif //defined(__IS_AR9__) #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) set_bit (4, DANUBE_RCU_RESET); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) set_bit (4, AMAZON_SE_RCU_RESET); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) { set_bit (4, AMAZON_S_RCU_USBRESET); } else { set_bit (28, AMAZON_S_RCU_USBRESET); } #endif //defined(__IS_AR9__) MDELAY(500); #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) clear_bit (4, DANUBE_RCU_RESET); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) clear_bit (4, AMAZON_SE_RCU_RESET); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) if(_core_if->core_no==0) { clear_bit (4, AMAZON_S_RCU_USBRESET); } else { clear_bit (28, AMAZON_S_RCU_USBRESET); } #endif //defined(__IS_AR9__) MDELAY(500); #if defined(__IS_TWINPASS__) ifxusb_enable_afe_oc(); #endif if(_core_if->core_global_regs) { // PHY configurations. #if defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_TWINPASS__) || defined(__IS_DANUBE__) #if defined(__IS_AMAZON_SE__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AMAZON_SE__) #if defined(__IS_AR9__) ifxusb_wreg (&_core_if->core_global_regs->guid,0x14014); #endif //defined(__IS_AR9__) } #endif //defined(__UEIP__) } #if defined(__GADGET_LED__) || defined(__HOST_LED__) #if defined(__UEIP__) static void *g_usb_led_trigger = NULL; #endif void ifxusb_led_init(ifxusb_core_if_t *_core_if) { #if defined(__UEIP__) if ( !g_usb_led_trigger ) { ifx_led_trigger_register("usb_link", &g_usb_led_trigger); if ( g_usb_led_trigger != NULL ) { struct ifx_led_trigger_attrib attrib = {0}; attrib.delay_on = 250; attrib.delay_off = 250; attrib.timeout = 2000; attrib.def_value = 1; attrib.flags = IFX_LED_TRIGGER_ATTRIB_DELAY_ON | IFX_LED_TRIGGER_ATTRIB_DELAY_OFF | IFX_LED_TRIGGER_ATTRIB_TIMEOUT | IFX_LED_TRIGGER_ATTRIB_DEF_VALUE; IFX_DEBUGP("Reg USB LED!!\n"); ifx_led_trigger_set_attrib(g_usb_led_trigger, &attrib); } } #endif //defined(__UEIP__) } void ifxusb_led_free(ifxusb_core_if_t *_core_if) { #if defined(__UEIP__) if ( g_usb_led_trigger ) { ifx_led_trigger_deregister(g_usb_led_trigger); g_usb_led_trigger = NULL; } #endif //defined(__UEIP__) } /*! \brief Turn off the USB 5V VBus Power \param _core_if Pointer of core_if structure */ void ifxusb_led(ifxusb_core_if_t *_core_if) { #if defined(__UEIP__) if(g_usb_led_trigger) ifx_led_trigger_activate(g_usb_led_trigger); #else #endif //defined(__UEIP__) } #endif // defined(__GADGET_LED__) || defined(__HOST_LED__) #if defined(__IS_HOST__) && defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__) /*! \brief Turn on the OC Int */ void ifxusb_oc_int_on() { #if defined(__UEIP__) #else #if defined(__IS_TWINPASS__) irq_enable(DANUBE_USB_OC_INT); #endif #endif //defined(__UEIP__) } /*! \brief Turn off the OC Int */ void ifxusb_oc_int_off() { #if defined(__UEIP__) #else #if defined(__IS_TWINPASS__) irq_disable(DANUBE_USB_OC_INT); #endif #endif //defined(__UEIP__) } #endif //defined(__IS_HOST__) && defined(__DO_OC_INT__) && defined(__DO_OC_INT_ENABLE__) /* internal routines for debugging */ void ifxusb_dump_msg(const u8 *buf, unsigned int length) { #ifdef __DEBUG__ unsigned int start, num, i; char line[52], *p; if (length >= 512) return; start = 0; while (length > 0) { num = min(length, 16u); p = line; for (i = 0; i < num; ++i) { if (i == 8) *p++ = ' '; sprintf(p, " %02x", buf[i]); p += 3; } *p = 0; IFX_PRINT( "%6x: %s\n", start, line); buf += num; start += num; length -= num; } #endif } /* This functions reads the SPRAM and prints its content */ void ifxusb_dump_spram(ifxusb_core_if_t *_core_if) { #ifdef __ENABLE_DUMP__ volatile uint8_t *addr, *start_addr, *end_addr; uint32_t size; IFX_PRINT("SPRAM Data:\n"); start_addr = (void*)_core_if->core_global_regs; IFX_PRINT("Base Address: 0x%8X\n", (uint32_t)start_addr); start_addr = (void*)_core_if->data_fifo_dbg; IFX_PRINT("Starting Address: 0x%8X\n", (uint32_t)start_addr); size=_core_if->hwcfg3.b.dfifo_depth; size<<=2; size+=0x200; size&=0x0003FFFC; end_addr = (void*)_core_if->data_fifo_dbg; end_addr += size; for(addr = start_addr; addr < end_addr; addr+=16) { IFX_PRINT("0x%8X:\t%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", (uint32_t)addr, addr[ 0], addr[ 1], addr[ 2], addr[ 3], addr[ 4], addr[ 5], addr[ 6], addr[ 7], addr[ 8], addr[ 9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15] ); } return; #endif //__ENABLE_DUMP__ } /* This function reads the core global registers and prints them */ void ifxusb_dump_registers(ifxusb_core_if_t *_core_if) { #ifdef __ENABLE_DUMP__ int i; volatile uint32_t *addr; #ifdef __IS_DEVICE__ volatile uint32_t *addri,*addro; #endif IFX_PRINT("Core Global Registers\n"); addr=&_core_if->core_global_regs->gotgctl; IFX_PRINT("GOTGCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gotgint; IFX_PRINT("GOTGINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gahbcfg; IFX_PRINT("GAHBCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gusbcfg; IFX_PRINT("GUSBCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->grstctl; IFX_PRINT("GRSTCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gintsts; IFX_PRINT("GINTSTS @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gintmsk; IFX_PRINT("GINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gi2cctl; IFX_PRINT("GI2CCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gpvndctl; IFX_PRINT("GPVNDCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->ggpio; IFX_PRINT("GGPIO @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->guid; IFX_PRINT("GUID @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->gsnpsid; IFX_PRINT("GSNPSID @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->ghwcfg1; IFX_PRINT("GHWCFG1 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->ghwcfg2; IFX_PRINT("GHWCFG2 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->ghwcfg3; IFX_PRINT("GHWCFG3 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->ghwcfg4; IFX_PRINT("GHWCFG4 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=_core_if->pcgcctl; IFX_PRINT("PCGCCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->grxfsiz; IFX_PRINT("GRXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); #ifdef __IS_HOST__ addr=&_core_if->core_global_regs->gnptxfsiz; IFX_PRINT("GNPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->core_global_regs->hptxfsiz; IFX_PRINT("HPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); #endif //__IS_HOST__ #ifdef __IS_DEVICE__ #ifdef __DED_FIFO__ addr=&_core_if->core_global_regs->gnptxfsiz; IFX_PRINT("GNPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); for (i=0; i<= _core_if->hwcfg4.b.num_in_eps; i++) { addr=&_core_if->core_global_regs->dptxfsiz_dieptxf[i]; IFX_PRINT("DPTXFSIZ[%d] @0x%08X : 0x%08X\n",i,(uint32_t)addr,ifxusb_rreg(addr)); } #else addr=&_core_if->core_global_regs->gnptxfsiz; IFX_PRINT("TXFSIZ[00] @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); for (i=0; i< _core_if->hwcfg4.b.num_dev_perio_in_ep; i++) { addr=&_core_if->core_global_regs->dptxfsiz_dieptxf[i]; IFX_PRINT("TXFSIZ[%02d] @0x%08X : 0x%08X\n",i+1,(uint32_t)addr,ifxusb_rreg(addr)); } #endif #endif //__IS_DEVICE__ #ifdef __IS_HOST__ IFX_PRINT("Host Global Registers\n"); addr=&_core_if->host_global_regs->hcfg; IFX_PRINT("HCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->host_global_regs->hfir; IFX_PRINT("HFIR @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->host_global_regs->hfnum; IFX_PRINT("HFNUM @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->host_global_regs->hptxsts; IFX_PRINT("HPTXSTS @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->host_global_regs->haint; IFX_PRINT("HAINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->host_global_regs->haintmsk; IFX_PRINT("HAINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr= _core_if->hprt0; IFX_PRINT("HPRT0 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); for (i=0; ihc_regs[i]->hcchar; IFX_PRINT("HCCHAR @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->hc_regs[i]->hcsplt; IFX_PRINT("HCSPLT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->hc_regs[i]->hcint; IFX_PRINT("HCINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->hc_regs[i]->hcintmsk; IFX_PRINT("HCINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->hc_regs[i]->hctsiz; IFX_PRINT("HCTSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->hc_regs[i]->hcdma; IFX_PRINT("HCDMA @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); } #endif //__IS_HOST__ #ifdef __IS_DEVICE__ IFX_PRINT("Device Global Registers\n"); addr=&_core_if->dev_global_regs->dcfg; IFX_PRINT("DCFG @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->dctl; IFX_PRINT("DCTL @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->dsts; IFX_PRINT("DSTS @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->diepmsk; IFX_PRINT("DIEPMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->doepmsk; IFX_PRINT("DOEPMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->daintmsk; IFX_PRINT("DAINTMSK @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->daint; IFX_PRINT("DAINT @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->dvbusdis; IFX_PRINT("DVBUSID @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->dvbuspulse; IFX_PRINT("DVBUSPULSE @0x%08X : 0x%08X\n", (uint32_t)addr,ifxusb_rreg(addr)); addr=&_core_if->dev_global_regs->dtknqr1; IFX_PRINT("DTKNQR1 @0x%08X : 0x%08X\n",(uint32_t)addr,ifxusb_rreg(addr)); if (_core_if->hwcfg2.b.dev_token_q_depth > 6) { addr=&_core_if->dev_global_regs->dtknqr2; IFX_PRINT("DTKNQR2 @0x%08X : 0x%08X\n", (uint32_t)addr,ifxusb_rreg(addr)); } if (_core_if->hwcfg2.b.dev_token_q_depth > 14) { addr=&_core_if->dev_global_regs->dtknqr3_dthrctl; IFX_PRINT("DTKNQR3_DTHRCTL @0x%08X : 0x%08X\n", (uint32_t)addr, ifxusb_rreg(addr)); } if (_core_if->hwcfg2.b.dev_token_q_depth > 22) { addr=&_core_if->dev_global_regs->dtknqr4_fifoemptymsk; IFX_PRINT("DTKNQR4 @0x%08X : 0x%08X\n", (uint32_t)addr, ifxusb_rreg(addr)); } //for (i=0; i<= MAX_EPS_CHANNELS; i++) //for (i=0; i<= 10; i++) for (i=0; i<= 3; i++) { IFX_PRINT("Device EP %d Registers\n", i); addri=&_core_if->in_ep_regs[i]->diepctl;addro=&_core_if->out_ep_regs[i]->doepctl; IFX_PRINT("DEPCTL I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro)); addro=&_core_if->out_ep_regs[i]->doepfn; IFX_PRINT("DEPFN I: O: 0x%08X\n",ifxusb_rreg(addro)); addri=&_core_if->in_ep_regs[i]->diepint;addro=&_core_if->out_ep_regs[i]->doepint; IFX_PRINT("DEPINT I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro)); addri=&_core_if->in_ep_regs[i]->dieptsiz;addro=&_core_if->out_ep_regs[i]->doeptsiz; IFX_PRINT("DETSIZ I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro)); addri=&_core_if->in_ep_regs[i]->diepdma;addro=&_core_if->out_ep_regs[i]->doepdma; IFX_PRINT("DEPDMA I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro)); addri=&_core_if->in_ep_regs[i]->dtxfsts; IFX_PRINT("DTXFSTS I: 0x%08X\n",ifxusb_rreg(addri) ); addri=&_core_if->in_ep_regs[i]->diepdmab;addro=&_core_if->out_ep_regs[i]->doepdmab; IFX_PRINT("DEPDMAB I: 0x%08X O: 0x%08X\n",ifxusb_rreg(addri),ifxusb_rreg(addro)); } #endif //__IS_DEVICE__ #endif //__ENABLE_DUMP__ } void ifxusb_clean_spram(ifxusb_core_if_t *_core_if,uint32_t dwords) { volatile uint32_t *addr1,*addr2, *start_addr, *end_addr; if(!dwords) return; start_addr = (uint32_t *)_core_if->data_fifo_dbg; end_addr = (uint32_t *)_core_if->data_fifo_dbg; end_addr += dwords; IFX_PRINT("Clearning SPRAM: 0x%8X-0x%8X\n", (uint32_t)start_addr,(uint32_t)end_addr); for(addr1 = start_addr; addr1 < end_addr; addr1+=4) { for(addr2 = addr1; addr2 < addr1+4; addr2++) *addr2=0x00000000; } IFX_PRINT("Clearning SPRAM: 0x%8X-0x%8X Done\n", (uint32_t)start_addr,(uint32_t)end_addr); return; }