⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uhc_ahb.c.svn-base

📁 Spearhead2000 的 USB驱动程序
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
                                                                                                                                             /*Wait for port enable: bit 3 high when high speed reset ends*/                while (!((UHOSTCntl->ehci_PORTSC_0 & 0x00000004) == 0x00000004));}static void set_port_suspend(){	unsigned int temp;	//suspend port 0	temp = UHOSTCntl->ehci_PORTSC_0;	//if port is not enable or controlled by companion controller then return	if (!(temp & EHCI_PS_PE) || (temp & EHCI_PS_PO)) 		return;	temp |= EHCI_PS_SUSP;	UHOSTCntl->ehci_PORTSC_0 = temp;}static void set_port_resume(){	unsigned int temp;        //suspemd port 0        temp = UHOSTCntl->ehci_PORTSC_0;        //if port is not enable or controlled by companion controller then return        if (!(temp & EHCI_PS_PE) || !(temp & EHCI_PS_SUSP))                return;        temp |= EHCI_PS_FPR;        UHOSTCntl->ehci_PORTSC_0 = temp;	/* unblock posted writes */	temp = UHOSTCntl->ehci_USBCMD;        /* Wait some 30mSec using Timer 1*/        gptSetTimer(TIMER1, GPT_ENAB | GPT_SINGLE_SHOT |  GPT_FREQ_259_766Khz, 260*30);        while (!(gptGetTimerVal(1) == 260*30));	/*force port to resume in HS mode*/	temp = UHOSTCntl->ehci_PORTSC_0;        temp &= ~EHCI_PS_FPR;        UHOSTCntl->ehci_PORTSC_0 = temp;	while( UHOSTCntl->ehci_PORTSC_0 & EHCI_PS_FPR);	/* unblock posted writes */	temp = UHOSTCntl->ehci_USBCMD;}static void set_ehci_owner(){	//set ehci as defalut owner	UHOSTCntl->ehci_CONFIGFLAG = EHCI_CONF_CF;	//set port 0's owner as EHCI	UHOSTCntl->ehci_PORTSC_0 &= ~ EHCI_PS_PO;}static ehci_halt(){	unsigned int temp;	temp &= ~EHCI_CMD_RS;        UHOSTCntl->ehci_USBCMD = temp;        while(!(UHOSTCntl->ehci_USBSTS & EHCI_STS_HCH));}void ehci_reset(){	unsigned int temp;	temp =  UHOSTCntl->ehci_USBCMD;	if(!(UHOSTCntl->ehci_USBSTS & EHCI_STS_HCH))	{		//halt ehci		ehci_halt();	}	//reset ehci	temp |= EHCI_CMD_HCRESET; 	UHOSTCntl->ehci_USBCMD = temp;	while(UHOSTCntl->ehci_USBCMD & EHCI_CMD_HCRESET);}static void set_test_mode(enum hc_test_mode mode){	unsigned int temp;	//disble async enable	UHOSTCntl->ehci_USBCMD &= ~EHCI_CMD_ASE;	//disble periodic  enable	UHOSTCntl->ehci_USBCMD &= ~EHCI_CMD_PSE;	set_port_suspend();	ehci_halt();	//set desired test mode	temp = UHOSTCntl->ehci_PORTSC_0;	temp |= (unsigned int)(mode<<16);	UHOSTCntl->ehci_PORTSC_0 = temp;	if(mode == TEST_FORCE_ENABLE)        	UHOSTCntl->ehci_USBCMD != EHCI_CMD_RS;}static void init_ehci(){	//reset ehci	ehci_reset();        /* host controller run */        UHOSTCntl->ehci_USBCMD = EHCI_CMD_RS;        /***********************/        /* host controller initialization */        UHOSTCntl->ehci_USBINTR = EHCI_INTR_PCIE;        UHOSTCntl->ehci_CONFIGFLAG = EHCI_CONF_CF;	/**********************************/	//calling interrupt handler for USB host	if ((unsigned int)UHOSTCntl == EHCI_Base0)		intctlIntRegister(ITC_USBH1_int,usbh_int_handler,1);	else		intctlIntRegister(ITC_USBH2_int,usbh_int_handler,1);        /**********************************/        /* host controller port0 power */        UHOSTCntl->ehci_PORTSC_0 |= EHCI_PS_PP;        /******************************/}void usb_device_detect_test(){	init_ehci();}void usb_electrical_test(){        static char schedule;        static char select;        static char enter;                                                                                                                                     schedule = 0;	while(schedule != 's')        {                                                                                                             UART_tx_vec("Select Electrical test for USB PHY  (s to stop)",strlen("Select  Electrical test for USB PHY (s to stop)"));        	UART_tx_vec("1. Downstream High Speed Signal Quality",strlen("1. Downstream High Speed Signal Quality"));	UART_tx_vec("2. Host Controller Packet Parameter",strlen("2. Host Controller Packet Parameter"));	UART_tx_vec("3. Host Disconnect Detect",strlen("3. Host Disconnect Detect"));	UART_tx_vec("4. Host CHIRP Timming",strlen("4. Host CHIRP Timming"));	UART_tx_vec("5. Host Suspend/Resume Timming",strlen("5. Host Suspend/Resume Timming"));	UART_tx_vec("6. Host Test J/K, SEO_NAK",strlen("6. Host Test J/K, SEO_NAK"));	UART_tx_vec("7. Downstream Full Speed Signal Quality",strlen("7. Downstream Full Speed Signal Quality"));	UART_tx_vec("8. Downstream Low Speed Signal Quality",strlen("8. Downstream Low Speed Signal Quality"));	UART_tx_vec("9. Drop Test",strlen("1. Drop Test"));	while (!(UART_putc(13)));	while (!(UART_putc(10)));	while (!(UART_getc(&select)));        switch(select)        {                case '1':			UART_tx_vec("Downstream High Speed Signal Quality Test Selected",strlen("Downstream High Speed Signal Quality Test Selected"));			set_ehci_owner();			set_test_mode(TEST_PACKET);			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;                case '2':			UART_tx_vec("Host Controller Packet Parameter Test Selected",strlen("Host Controller Packet ParameterTest Selected"));			USB_Connected = 0;			init_ehci();			while(!USB_Connected);			send_get_descriptor();			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;                case '3':			UART_tx_vec("Host Disconnect Detect Test Selected",strlen("Host Disconnect Detect Test Selected"));			set_ehci_owner();			set_test_mode(TEST_FORCE_ENABLE);			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;                case '4':				UART_tx_vec("Host CHIRP Timming Selected",strlen("Host CHIRP Timming Selected"));			USB_Connected = 0;                        UART_tx_vec("Connect your device to test chirp",strlen("Connect your device to test chirp"));			init_ehci();			while(!USB_Connected);			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;		case '5':			UART_tx_vec("Host Suspend/Resume Timming Test Selected",strlen("Host Suspend/Resume Timming Test Selected"));			//attache and enumerate the device			USB_Connected = 0;			init_ehci();			while(!USB_Connected);			enumerate_device();			//suspend port			set_port_suspend();			UART_tx_vec("verify that device reverts to full speed terminations,and press enter",strlen("verify that device reverts to full speed terminations,and press enter"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));	                	/* Wait some mSec using Timer 1*/                	//gptSetTimer(TIMER1, GPT_ENAB | GPT_SINGLE_SHOT |  GPT_FREQ_259_766Khz, 260*100);	                //while (!(gptGetTimerVal(1) == 260*100));			set_port_resume();			UART_tx_vec("verify that device has HS terminations ON for first SOF ,& then press enter",strlen("verify that device has HS terminations ON for first SOF and then press enter"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));                	/* Wait some mSec using Timer 1*/                	//gptSetTimer(TIMER1, GPT_ENAB | GPT_SINGLE_SHOT |  GPT_FREQ_259_766Khz, 260*100);	                //while (!(gptGetTimerVal(1) == 260*100));				set_port_suspend();			//drive reset from port			/* send SE0 to Device */			UHOSTCntl->ehci_PORTSC_0 |= EHCI_PS_PR;				UART_tx_vec("verify time from begininng of reset to device chirp K ,& press enter",strlen("verify time from begininng of reset to device chirp K ,& press enter"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			/* Wait some mSec using Timer 1*/			//gptSetTimer(TIMER1, GPT_ENAB | GPT_SINGLE_SHOT |  GPT_FREQ_259_766Khz, 1000);			//while (!(gptGetTimerVal(1) == 1000));			break;				case '6':			UART_tx_vec("Host Test J/K, SEO_NAK Test Selected",strlen("Host Test J/K, SEO_NAK Test Selected"));			set_ehci_owner();			set_test_mode(TEST_J);                        UART_tx_vec("Test_J Ongoing. Press Enter to start Test_K",strlen("Test_J Ongoing. Press Enter to start Test_K"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			ehci_reset();			set_ehci_owner();			set_test_mode(TEST_K);                        UART_tx_vec("Test_K Ongoing. Press Enter to start Test_SE0_NAK",strlen("Test_K Ongoing. Press Enter to start Test_SE0_NAK"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			ehci_reset();			set_ehci_owner();			set_test_mode(TEST_SE0_NAK);			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;		case '7':			UART_tx_vec("Downstream Full Speed Signal Quality Test Selected",strlen("Downstream Full Speed Signal Quality Test Selected"));			set_ehci_owner();			set_test_mode(TEST_PACKET);			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;		case '8':			UART_tx_vec("Downstream Low Speed Signal Quality Test Selected",strlen("Downstream Low Speed Signal Quality Test Selected"));			set_ehci_owner();			set_test_mode(TEST_PACKET);			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;		case '9':			UART_tx_vec("9. Drop Test Selected",strlen("1. Drop Test Selected"));        		/* host controller port power */		        UHOSTCntl->ehci_PORTSC_0 |= EHCI_PS_PP;			UART_tx_vec("Press Enter when test is complete",strlen("Press Enter when test is complete"));			while (!(UART_putc(13)));	                while (!(UART_putc(10)));                	while (!(UART_getc(&enter)));			break;                default:                        UART_tx_vec("No Test selected",strlen("No Test selected"));                break;        }		while (!(UART_putc(13)));                while (!(UART_putc(10)));		ehci_reset();                UART_tx_vec("press s to stop r to run again",strlen("press s to stop r to run again"));                while (!(UART_getc(&schedule)));                while (!(UART_putc(13)));                while (!(UART_putc(10)));                                                                                                                                     }}/*******************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -