?? usbtcdisp1582initexit.c
字號:
/* usbTcdIsp1582InitExit.c - Initialization/uninitialization for ISP 1582 TCD *//* Copyright 2004 Wind River Systems, Inc. *//*Modification history--------------------01f,17sep04,ami WindView Instrumentation Changes01e,02aug04,mta Modification History Changes01d,19jul04,ami Coding Convention Changes01c,16jul04,pdg Removed usbPciIntEnable and usbPciIntDisable01b,21jun04,ami Warm Reboot changes01a,21apr04,ami First.*//*DESCRIPTIONThis file implements the initialization and uninitialization modules of TCD(Target Controller Driver) for the Philips ISP 1582.This module exports a single entry point, usbTcdIsp1582EvalExec(). This isthe USB_TCD_EXEC_FUNC for this TCD. The caller passes requests to the TCD byconstructing TRBs, or Target Request Blocks, and passing them to this entrypoint.TCDs are initialized by invoking the TCD_FNC_ATTACH function. In response tothis function, the TCD returns information about the target controller,including its USB speed, the number of endpoints it supports etc.INCLUDE FILES: usb/usbPlatform.h, usb/ossLib.h, usb/usbPciLib.h, usb/target/usbHalCommon.h, usb/target/usbTcd.h drv/usb/target/usbIsp1582Eval.h, drv/usb/target/usbTcdIsp1582EvalLib.h, drv/usb/target/usbIsp1582Tcd.h, drv/usb/target/usbIsp1582Debug.h, rebootLib.h usb/target/usbPeriphInstr.h *//* includes */#include "usb/usbPlatform.h" #include "usb/ossLib.h" #include "usb/usbPciLib.h" #include "usb/target/usbHalCommon.h" #include "usb/target/usbTcd.h" #include "drv/usb/target/usbIsp1582.h" #include "drv/usb/target/usbIsp1582Eval.h" #include "drv/usb/target/usbTcdIsp1582EvalLib.h" #include "drv/usb/target/usbIsp1582Tcd.h" #include "drv/usb/target/usbIsp1582Debug.h" #include "rebootLib.h" #include "usb/target/usbPeriphInstr.h" #include "usbTcdIsp1582Util.c" #include "usbTcdIsp1582DeviceControl.c" #include "usbTcdIsp1582Endpoint.c" #include "usbTcdIsp1582Interrupt.c" /* defines */#define MAX_TARGET_CONTROLLER 5 /* maximum target controllers *//* globals */UINT32 usbIsp1582Debug = 0; /* for debugging */long ioBase [MAX_TARGET_CONTROLLER]; /* to hold base addresses */#ifdef ISP1582_POLLING/* forward declaration */LOCAL VOID usbTcdIsp1582PollingIsr (pVOID param);#endif/* functions *//******************************************************************************** usbIsp1582Exit - function to be called on a reboot** This function clears the Soft-Connect bit on a reboot.** RETURNS: None.** ERRNO:* None.** \NOMANUAL*/LOCAL VOID usbIsp1582Exit ( int startType ) { UINT8 i = 0; /* For all ISP 1582 target controllers attached, reset the mode register */ for (i = 0 ; i < MAX_TARGET_CONTROLLER ; i++) { if (ioBase [i] != 0) { USB_PCI_WORD_OUT (ioBase [i] + ISP1582EVAL_ADDRESS_PORT , ISP1582_MODE_REG); USB_PCI_WORD_OUT (ioBase [i] + ISP1582EVAL_DATA_PORT , 0); ioBase [i] = 0; } } }/******************************************************************************** usbTcdIsp1582Attach - function implementing function code TCD_FNC_ATTACH** The purpose of this function is to initialize the Target Controller* for USB operation.** RETURNS: OK or ERROR if failed to initialize the Target Controller.** ERRNO:* \is* \i S_usbTcdLib_BAD_PARAM* Bad parameter is passed.* * \i S_usbTcdLib_OUT_OF_MEMORY* No more memory to allocate variables.** \i S_usbTcdLib_HW_NOT_READY* Hardware is not ready.** \i S_usbTcdLib_GENERAL_FAULT* Fault occured in upper software layers.* \ie** \NOMANUAL*/LOCAL STATUS usbTcdIsp1582FncAttach ( pTRB_ATTACH pTrb /* TRB to be executed */ ) { pTRB_HEADER pHeader = (pTRB_HEADER) pTrb; /* TRB_HEADER */ pUSB_TCD_ISP1582_TARGET pTarget = NULL; /* USB_TCD_ISP1582_TARGET */ pUSB_TCD_ISP1582_PARAMS pParams = NULL; /* USB_TCD_ISP1582_PARAMS */ UINT8 data8 = 0; UINT16 data16 = 0; UINT32 data32 = 0; UINT8 i = 0; /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach entered...", USB_TCD_ISP582_WV_FILTER); USBISP1582_DEBUG ("usbTcdIsp1582FncAttach : Entered...\n",0,0,0,0,0,0); /* Validate Parameters */ if (pHeader == NULL || pHeader->trbLength < sizeof (TRB_HEADER)) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting: Bad Parameter Received...", USB_TCD_ISP582_WV_FILTER); USBISP1582_ERROR ("usbTcdIsp1582FncAttach : Bad Parameters...\n", 0,0,0,0,0,0); return ossStatus (S_usbTcdLib_BAD_PARAM); } if ( (pTrb->tcdParam == NULL ) || (pTrb->usbHalIsr == NULL ) || (pTrb->pHalDeviceInfo == NULL) || (pTrb->pDeviceInfo == NULL) ) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting: Bad Parameter Received...", USB_TCD_ISP582_WV_FILTER); USBISP1582_ERROR ("usbTcdIsp1582FncAttach : Bad Parameters...\n", 0,0,0,0,0,0); return ossStatus (S_usbTcdLib_BAD_PARAM); } pParams = (pUSB_TCD_ISP1582_PARAMS)pTrb->tcdParam; /* Create a USB_TCD_ISP1582_TARGET structure to manage controller. */ if ((pTarget = OSS_CALLOC (sizeof (*pTarget))) == NULL ) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting: Memory Allocation Error...", USB_TCD_ISP582_WV_FILTER); USBISP1582_ERROR ("usbTcdIsp1582FncAttach : Memory Allocation Error \ ...\n",0,0,0,0,0,0); return ossStatus (S_usbTcdLib_OUT_OF_MEMORY); } /* Store the user supplied parameters */ pTarget->ioBase = pParams->ioBase; pTarget->irq = pParams->irq; pTarget->dma = pParams->dma; /* * Store the ioBase address into the global ioBase which is to be used * during warm reboot */ for ( i = 0 ; i < MAX_TARGET_CONTROLLER ; i++) { if (ioBase [i] == 0) { ioBase [i] = pParams->ioBase; break; } } /* Read the Chip ID and confirm that its ISP 1582 */ data32 = (isp1582Read32 (pTarget , ISP1582_CHIP_ID_REG) & ISP1582_CHIP_ID_MASK); if (data32 != ISP1582_CHIP_ID) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting: Wrong Chip Id...", USB_TCD_ISP582_WV_FILTER); USBISP1582_ERROR ("usbTcdIsp1582FncAttach : Chip ID Mismatch... \n", 0,0,0,0,0,0); /* Free the memory allocated */ OSS_FREE (pTarget); return ossStatus (S_usbTcdLib_HW_NOT_READY); } /* Hook the function which needs to be called on a reboot */ if(ERROR == rebootHookAdd((FUNCPTR)usbIsp1582Exit)) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting: Enable to hook function for reboot...", USB_TCD_ISP582_WV_FILTER); USBISP1582_ERROR ( " usbTcdIsp1582FncAttach: Not able \ to hook a function on reboot ", 0,0,0,0,0,0); OSS_FREE (pTarget); return ERROR; } /* Unlock the registers */ isp1582Write16 (pTarget, ISP1582_UNLOCK_DEV_REG, ISP1582_UNLOCK_DEV_REG_CODE); /* perform a soft reset */ data16 = isp1582Read16 (pTarget , ISP1582_MODE_REG); data16 |=ISP1582_MODE_REG_SFRESET; isp1582Write16 (pTarget, ISP1582_MODE_REG , data16 & ISP1582_MODE_REG_MASK); /* Give a delay of 1 micro sec */ OSS_THREAD_SLEEP (1); data16 &=~(ISP1582_MODE_REG_SFRESET); isp1582Write16 (pTarget, ISP1582_MODE_REG , data16 & ISP1582_MODE_REG_MASK); /* Give a delay of 1 micro sec */ OSS_THREAD_SLEEP (1); /* * a soft reset does not clear the soft connect bit * clear the soft connect bit */ data16 = isp1582Read16 (pTarget , ISP1582_MODE_REG); data16 &= ~(ISP1582_MODE_REG_SOFTCT ); isp1582Write16 (pTarget, ISP1582_MODE_REG , data16 & ISP1582_MODE_REG_MASK); /* Set bit 7 in Control Port to 0 */ USB_PCI_WORD_OUT(pTarget->ioBase + ISP1582EVAL_CNTL_PORT , ~(0x80)); /* Clear the interrupt status register */ isp1582Write32 (pTarget , ISP1582_INT_REG , ISP1582_INT_REG_CLEAR); /* * Clear the interrupt enable register to disable interrupts on all the * endpoints */ isp1582Write32 (pTarget , ISP_1582_INT_ENABLE_REG , 0); /* write 0 to OTG register */ isp1582Write8(pTarget,ISP_1582_OTG_REG, 0); /* write wake up on chip select */ data16 = isp1582Read16 (pTarget , ISP1582_MODE_REG); data16 |= ISP1582_MODE_REG_WKUPCS; isp1582Write16 (pTarget, ISP1582_MODE_REG , data16 & ISP1582_MODE_REG_MASK); /* install the ISR */ /* Store HAL parameters */ pTarget->usbHalIsr = pTrb->usbHalIsr; pTarget->usbHalIsrParam = pTrb->usbHalIsrParam;#ifndef ISP1582_POLLING /* Set bit 7 in Control Port to 0 */ USB_PCI_WORD_OUT((pTarget->ioBase + ISP1582EVAL_CNTL_PORT) , ~(0x80)); /* Hook the ISR */ if (usbPciIntConnect ((INT_HANDLER_PROTOTYPE)usbTcdIsp1582Isr, (pVOID)pTarget, pTarget->irq)!= OK) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting: Error Hooking the ISR...", USB_TCD_ISP582_WV_FILTER); OSS_FREE (pTarget); USBISP1582_ERROR ("usbTcdIsp1582FncAttach :Error Hooking the ISR...\n", 0,0,0,0,0,0); return ERROR; } /* Set bit 7 in Control Port to 1 */ USB_PCI_WORD_OUT((pTarget->ioBase + ISP1582EVAL_CNTL_PORT) , (0x80));#else /* Set bit 7 in Control Port to 1 */ USB_PCI_WORD_OUT(pTarget->ioBase + ISP1582EVAL_CNTL_PORT , (0x80)); /* Create a thread for handling the interrupts */ if (OSS_THREAD_CREATE((THREAD_PROTOTYPE)usbTcdIsp1582PollingIsr, pTarget, 100, "isp1582Thread", &pTarget->threadId) != OK) { /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting: Error in spawning of polling Thread...", USB_TCD_ISP582_WV_FILTER); USBISP1582_ERROR ( "usbTcdIsp1582FncAttach : Spawning of polling \ ISR Failed... " ,0,0,0,0,0,0); OSS_FREE (pTarget); return ERROR; }#endif /* Decode the address to 0 */ isp1582Write8 (pTarget ,ISP1582_ADDRESS_REG , ISP1582_ADRS_REG_ENABLE); /* Set Mode Register by setting bits GLINTENA , DMACLKON, CLKON */ data16 = isp1582Read16 (pTarget , ISP1582_MODE_REG); data16 |= ISP1582_MODE_REG_GLINTENA; data16 |= ISP1582_MODE_REG_DMACLKON; data16 |= ISP1582_MODE_REG_CLKAON; data16 |= ISP1582_MODE_REG_POWRON; isp1582Write16 (pTarget , ISP1582_MODE_REG , data16 & ISP1582_MODE_REG_MASK); /* Form the byte to write into Interrupt Configration Register */ data8 = ((ISP1582_INT_CONF_REG_CDBGMOD_SHIFT( ISP1582_INT_CONF_REG_CDBGMOD_ACK_ONLY)) | (ISP1582_INT_CONF_REG_DDBGMODIN_SHIFT( ISP1582_INT_CONF_REG_DDBGMODIN_ACK_ONLY)) | (ISP1582_INT_CONF_REG_DDBGMODOUT_SHIFT( ISP1582_INT_CONF_REG_DDBGMODOUT_ACK_NYET))); /* * Set the Interrupt Configuration Register to generate interrupts only * on ACKS */ isp1582Write8 (pTarget , ISP1582_INT_CONFIG_REG , data8); /* Initialize Interrupt Enable Register */ isp1582Write32 (pTarget , ISP_1582_INT_ENABLE_REG , (ISP1582_INT_ENABLE_REG_IEBRST | ISP1582_INT_ENABLE_REG_IESUSP | ISP1582_INT_ENABLE_REG_IERESM | ISP1582_INT_ENABLE_REG_IEHS_STA)); /* Initialize the DMA Hardware Register */ data8 = ISP1582_DMA_HARDWARE_REG_EOT_POL | ISP1582_DMA_HARDWARE_REG_DREQ_POL; isp1582Write8 (pTarget, ISP1582_DMA_HARDWARE_REG , data8 ); /* Initialize the DMA COnfiguration Register */ isp1582Write16 (pTarget , ISP1582_DMA_CONFIG_REG , ISP1582_DMA_CONFIG_REG_MODE_SET(ISP1582_DMA_CONFIG_REG_MODE_00) | ISP1582_DMA_CONFIG_REG_WIDTH_8); /* Return target information to caller */ pTrb->pHalDeviceInfo->uNumberEndpoints = ISP1582_NUM_ENDPOINTS; /* supports remote wake up, test mode feature and is USB2 compliant */ pTrb->pDeviceInfo->uDeviceFeature = USB_FEATURE_DEVICE_REMOTE_WAKEUP | USB_FEATURE_TEST_MODE | USB_FEATURE_USB20; /* * Set the bit maps for usEndpointNumbr Bitmap * Setting bits 0 to 7 indicates that ISP 1582 support 8 Out endpoints, * Setting bits 16 to 21 indicates that ISP 1582 support 8 In endpoints */ pTrb->pDeviceInfo->uEndpointNumberBitmap = USB_ISP1582_TCD_OUT_ENDPOINT | USB_ISP1582_TCD_IN_ENDPOINT ; /* update handle */ pHeader->handle = pTarget; /* WindView Instrumentation */ USB_TCD_LOG_EVENT(USB_TCD_ISP1582_INIT_EXIT, "usbTcdIsp1582FncAttach exiting...", USB_TCD_ISP582_WV_FILTER); USBISP1582_DEBUG ("usbTcdIsp1582FncAttach : Exiting...\n",0,0,0,0,0,0); return OK; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -