blob: a632802b51f6d5c69a21f13a116b49ec225e0e0b [file] [log] [blame]
#include <usb/global.h>
#include <usb/config.h>
extern WORD32 USB_CDC_Enum(WORD32 USB_ADDR);
//extern void USB_Pll_Clk_Rst_InitEnv(void);
void USB_TstDev_InitEnv(void);
#if 0
void tsp_usb_init(WORD32 USB_ADDR)
{
WORD32 dwConnect;
/*ÅäÖÃÍâΧ»·¾³*/
USB_Pll_Clk_Rst_InitEnv();
dwConnect=USB_CDC_Enum(USB_ADDR);
if(0==dwConnect)
{
printk("NOLINK\n");
return ;
}
printk("FAILED\n");
}
#endif
int tsp_usb_init(void)
{
WORD32 retVal = 0;
WORD32 usb_addr = 0;
// BYTE boot_mode = get_boot_mode();
BYTE boot_mode = 1;
data_init();
/*add by sunyunchen*/
if(2 == boot_mode)
//if(0)
{
printf("hsic\n");
global.g_USB_MODE = 1;
usb_addr = SYS_USB_HSIC_BASE;
}
else
{
printf("usb\n");
global.g_USB_MODE = 0;
usb_addr = SYS_USB_BASE;
}
if((REG32(usb_addr+DWC_DEV_GLOBAL_REG_OFFSET)&0x7f0)!=0)//dcfg register
{
//printf("usb_g_enum!\n");
global.g_enum =DONOT_NEED_ENUM;
//global.g_enum =NEED_ENUM;
}
if(NEED_ENUM == global.g_enum)
{
//printf("need enum\n");
USB_TstDev_InitEnv();
}
else
{
//printf("global.g_dwc\n");
global.g_dwc_otg_pcd_tp.ep0state = EP0_IDLE;
global.dwRxQuit = 1;
global.dwTxQuit = 1;
global.g_dwc_otg_pcd_tp.request_config = 1;
}
retVal = USB_CDC_Enum(usb_addr);
return retVal;
}
void USB_TstDev_InitEnv(void)
{
#if USE_ASIC
WORD32 i;
if(0 == global.g_USB_MODE)
{
//ÊÍ·ÅUSB¸ôÀë8bit for usb ctrl
REG32(POWER_DOMAIN_ISO) |= (1<<8);
usdelay(10);
REG32(POWER_DOMAIN_RST) |= (1<<8);
usdelay(10);
REG32(POWER_DOMAIN_POWERON) &= ~(1<<8);
usdelay(10);
REG32(POWER_DOMAIN_POWERON) |= (1<<8);
usdelay(10);
REG32(POWER_DOMAIN_RST) &= ~(1<<8);
usdelay(10);
REG32(POWER_DOMAIN_ISO) &= ~(1<<8);
usdelay(10);
//usb ahb clock enable
REG32(SOC_MOD_CLKEN0)&=~(1<<4);
usdelay(20);
REG32(SOC_MOD_CLKEN0)|=(1<<4);
//usb phy clock enable
REG32(SOC_MOD_CLKEN1)&=~(1<<3);
usdelay(20);
REG32(SOC_MOD_CLKEN1)|=(1<<3);
// usb ahb reset ÏÈ×ÜÏߺó¹¤×÷
REG32(SOC_MOD_RSTEN)&=~(1<<5);
usdelay(100);
REG32(SOC_MOD_RSTEN)|=(1<<5);
usdelay(100);
// usb work reset
REG32(SOC_MOD_RSTEN)&=~(1<<4);
usdelay(100);
REG32(SOC_MOD_RSTEN)|=(1<<4);
usdelay(100);
//release usb phy reset
REG32(SOC_MOD_RSTEN)&=~(1<<3);
usdelay(100);
REG32(SOC_MOD_RSTEN) |= 1<<3;
usdelay(100);
i = 0;
while((REG32(SOC_MOD_USBSTATECTRL)&0x2) == 0)
{
i++;
usdelay(20);
if(i>50000) break;
}
}
else
{
//ÊÍ·ÅUSB_HSIC¸ôÀë9bit for hsic
REG32(POWER_DOMAIN_ISO) |= (1<<9);
usdelay(10);
REG32(POWER_DOMAIN_RST) |= (1<<9);
usdelay(10);
REG32(POWER_DOMAIN_POWERON) &= ~(1<<9);
usdelay(10);
REG32(POWER_DOMAIN_POWERON) |= (1<<9);
usdelay(10);
REG32(POWER_DOMAIN_RST) &= ~(1<<9);
usdelay(10);
REG32(POWER_DOMAIN_ISO) &= ~(1<<9);
usdelay(10);
//usb hsic ahb clock enable
REG32(SOC_MOD_CLKEN0)&=~(1<<2);
usdelay(20);
REG32(SOC_MOD_CLKEN0)|=(1<<2);
//usb hsic phy clock enable
REG32(SOC_MOD_CLKEN0)&=~(1<<1);
usdelay(20);
REG32(SOC_MOD_CLKEN0)|=(1<<1);
//usb hsic 480M clock enable
REG32(SOC_MOD_CLKEN0)&=~(1<<0);
usdelay(20);
REG32(SOC_MOD_CLKEN0)|=(1<<0);
// usb hsic ahb reset
REG32(SOC_MOD_RSTEN)&=~(1<<2);
usdelay(20);
REG32(SOC_MOD_RSTEN)|=(1<<2);
usdelay(10);
// usb hsic work reset
REG32(SOC_MOD_RSTEN)&=~(1<<1);
usdelay(20);
REG32(SOC_MOD_RSTEN)|=(1<<1);
//release usb hsic phy reset
REG32(SOC_MOD_RSTEN)&=~(1<<0);
usdelay(20);
REG32(SOC_MOD_RSTEN)|=(1<<0);
usdelay(100);
i = 0;
while((REG32(SOC_MOD_USBSTATECTRL)&0x1) == 0)
{
i++;
usdelay(20);
if(i>50000) break;
}
#if SYNC_USB_HSIC
usdelay(20);
REG32(REG_GPIO_OUT)=1;
while(REG32(REG_GPIO_IN)!=0xFF);
usdelay(1);
REG32(REG_GPIO_OUT)=0;
#endif
}
#endif
#if !USE_ASIC
#if 1
//usb power on
REG32(POWER_DOMAIN_POWERON) |= 0x300;
usdelay(10);
//usb disable reset
REG32(POWER_DOMAIN_RST) &= 0xfffffcff; //
usdelay(10);
//usb disable iso
REG32(POWER_DOMAIN_ISO) &= 0xfffffcff;
usdelay(10);
//open usb0 and usb1
//usb ahb clock enable
REG32(SOC_MOD_CLKEN0)&=0xeffffffb;
usdelay(20);
REG32(SOC_MOD_CLKEN0)|=0x10000004;
//usb phy clock enable
REG32(SOC_MOD_CLKEN1)&=~(3<<16);
usdelay(20);
REG32(SOC_MOD_CLKEN1)|=(3<<16);
// usb ctr reset
REG32(SOC_MOD_RSTEN)&=0xeffffff7;
usdelay(20);
REG32(SOC_MOD_RSTEN)|=0x10000008;
// usb ahb reset
REG32(SOC_MOD_RSTEN)&=0xf7fffffb;
usdelay(20);
REG32(SOC_MOD_RSTEN)|=0x8000004;
#endif
/*
usb ctr and ahb reset release ,delay 60us, check usb reset state,
if the reset state is 0, reset ,if 1,reset release.
*/
#endif
}