//***************************************************************************** // //! Initializes bulk device operation for a given USB controller. //! //! \param ui32Index is the index of the USB controller which is to be //! initialized for bulk device operation. //! \param psBulkDevice points to a structure containing parameters customizing //! the operation of the bulk device. //! \param psCompEntry is the composite device entry to initialize when //! creating a composite device. //! //! This call is very similar to USBDBulkInit() except that it is used for //! initializing an instance of the bulk device for use in a composite device. //! When this bulk device is part of a composite device, then the //! \e psCompEntry should point to the composite device entry to initialize. //! This is part of the array that is passed to the USBDCompositeInit() //! function. //! //! \return Returns zero on failure or a non-zero value that should be //! used with the remaining USB Bulk APIs. // //***************************************************************************** void * USBDBulkCompositeInit(uint32_t ui32Index, tUSBDBulkDevice *psBulkDevice, tCompositeEntry *psCompEntry) { tBulkInstance *psInst; // // Check parameter validity. // ASSERT(ui32Index == 0); ASSERT(psBulkDevice); ASSERT(psBulkDevice->ppui8StringDescriptors); ASSERT(psBulkDevice->pfnRxCallback); ASSERT(psBulkDevice->pfnTxCallback); // // Initialize the workspace in the passed instance structure. // psInst = &psBulkDevice->sPrivateData; // // Initialize the composite entry that is used by the composite device // class. // if(psCompEntry != 0) { psCompEntry->psDevInfo = &psInst->sDevInfo; psCompEntry->pvInstance = (void *)psBulkDevice; } // // Initialize the device information structure. // psInst->sDevInfo.psCallbacks = &g_sBulkHandlers; psInst->sDevInfo.pui8DeviceDescriptor = g_pui8BulkDeviceDescriptor; psInst->sDevInfo.ppsConfigDescriptors = g_ppBulkConfigDescriptors; psInst->sDevInfo.ppui8StringDescriptors = 0; psInst->sDevInfo.ui32NumStringDescriptors = 0; // // Set the basic state information for the class. // psInst->ui32USBBase = USB0_BASE; psInst->iBulkRxState = eBulkStateUnconfigured; psInst->iBulkTxState = eBulkStateUnconfigured; psInst->ui16DeferredOpFlags = 0; psInst->bConnected = false; // // Initialize the device info structure for the Bulk device. // USBDCDDeviceInfoInit(0, &psInst->sDevInfo); // // Set the default endpoint and interface assignments. // psInst->ui8INEndpoint = DATA_IN_ENDPOINT; psInst->ui8OUTEndpoint = DATA_OUT_ENDPOINT; psInst->ui8Interface = 0; // // Plug in the client's string stable to the device information // structure. // psInst->sDevInfo.ppui8StringDescriptors = psBulkDevice->ppui8StringDescriptors; psInst->sDevInfo.ui32NumStringDescriptors = psBulkDevice->ui32NumStringDescriptors; // // Initialize the USB tick module, this will prevent it from being // initialized later in the call to USBDCDInit(); // InternalUSBTickInit(); // // Register our tick handler (this must be done after USBDCDInit). // InternalUSBRegisterTickHandler(BulkTickHandler, (void *)psBulkDevice); // // Return the pointer to the instance indicating that everything went well. // return((void *)psBulkDevice); }
//***************************************************************************** // //! This function should be called once for the audio class device to //! initialized basic operation and prepare for enumeration. //! //! \param ui32Index is the index of the USB controller to initialize for //! audio class device operation. //! \param psAudioDevice points to a structure containing parameters //! customizing the operation of the audio device. //! \param psCompEntry is the composite device entry to initialize when //! creating a composite device. //! //! In order for an application to initialize the USB audio device class, it //! must first call this function with the a valid audio device class structure //! in the \e psAudioDevice parameter. This allows this function to initialize //! the USB controller and device code to be prepared to enumerate and function //! as a USB audio device. When this audio device is part of a composite //! device, then the \e psCompEntry should point to the composite device entry //! to initialize. This is part of the array that is passed to the //! USBDCompositeInit() function. //! //! This function returns a void pointer that must be passed in to all other //! APIs used by the audio class. //! //! See the documentation on the tUSBDAudioDevice structure for more //! information on how to properly fill the structure members. //! //! \return Returns zero on failure or a non-zero instance value that should be //! used with the remaining USB audio APIs. // //***************************************************************************** void * USBDAudioCompositeInit(uint32_t ui32Index, tUSBDAudioDevice *psAudioDevice, tCompositeEntry *psCompEntry) { tAudioInstance *psInst; // // Check parameter validity. // ASSERT(ui32Index == 0); ASSERT(psAudioDevice); ASSERT(psAudioDevice->ppui8StringDescriptors); // // Initialize the workspace in the passed instance structure. // psInst = &psAudioDevice->sPrivateData; psInst->ui32USBBase = USB0_BASE; // // Initialize the composite entry that is used by the composite device // class. // if(psCompEntry != 0) { psCompEntry->psDevInfo = &psInst->sDevInfo; psCompEntry->pvInstance = (void *)psAudioDevice; } // // Initialize the device information structure. // psInst->sDevInfo.psCallbacks = &g_sAudioHandlers; psInst->sDevInfo.pui8DeviceDescriptor = g_pui8AudioDeviceDescriptor; psInst->sDevInfo.ppsConfigDescriptors = g_ppAudioConfigDescriptors; psInst->sDevInfo.ppui8StringDescriptors = 0; psInst->sDevInfo.ui32NumStringDescriptors = 0; // // Initialize the device info structure for the HID device. // USBDCDDeviceInfoInit(0, &psInst->sDevInfo); // // The Control interface is at index 0. // psInst->ui8InterfaceControl = AUDIO_INTERFACE_CONTROL; // // The Audio interface is at index 1. // psInst->ui8InterfaceAudio = AUDIO_INTERFACE_OUTPUT; // // Set the default Isochronous OUT endpoint. // psInst->ui8OUTEndpoint = ISOC_OUT_ENDPOINT; psInst->ui8OUTDMA = 0; // // Set the initial buffer to null. // psInst->sBuffer.pvData = 0; // // Save the volume settings. // psInst->i16VolumeMax = psAudioDevice->i16VolumeMax; psInst->i16VolumeMin = psAudioDevice->i16VolumeMin; psInst->i16VolumeStep = psAudioDevice->i16VolumeStep; // // No update pending to any command. // psInst->ui16Update = 0; // // Plug in the client's string stable to the device information // structure. // psInst->sDevInfo.ppui8StringDescriptors = psAudioDevice->ppui8StringDescriptors; psInst->sDevInfo.ui32NumStringDescriptors = psAudioDevice->ui32NumStringDescriptors; // // Get the DMA instance pointer. // psInst->psDMAInstance = USBLibDMAInit(0); // // Return the pointer to the instance indicating that everything went well. // return((void *)psAudioDevice); }