📄 uhc_ahb.c.svn-base
字号:
/*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 + -