//*****************************************************************************
//
//! Initializes HID customhid device operation for a given USB controller.
//!
//! \param ui32Index is the index of the USB controller which is to be
//! initialized for HID customhid device operation.
//! \param psCustomHidDevice points to a structure containing parameters
//! customizing the operation of the HID customhid device.
//!
//! An application wishing to offer a USB HID customhid interface to a USB host
//! must call this function to initialize the USB controller and attach the
//! customhid device to the USB bus.  This function performs all required USB
//! initialization.
//!
//! On successful completion, this function will return the \e psCustomHidDevice
//! pointer passed to it.  This must be passed on all future calls to the HID
//! customhid device driver.
//!
//! When a host connects and configures the device, the application callback
//! will receive \b USB_EVENT_CONNECTED after which calls can be made to
//! USBDHIDCustomHidStateChange() to report pointer movement and button presses
//! to the host.
//!
//! \note The application must not make any calls to the lower level USB device
//! interfaces if interacting with USB via the USB HID customhid device API.
//! Doing so will cause unpredictable (though almost certainly unpleasant)
//! behavior.
//!
//! \return Returns NULL on failure or the psCustomHidDevice pointer on success.
//
//*****************************************************************************
void *
USBDHIDCustomHidInit(uint32_t ui32Index, tUSBDHIDCustomHidDevice *psCustomHidDevice)
{
    void *pvRetcode;
    tUSBDHIDDevice *psHIDDevice;
    tConfigDescriptor *pConfigDesc;

    //
    // Check parameter validity.
    //
    ASSERT(psCustomHidDevice);
    ASSERT(psCustomHidDevice->ppui8StringDescriptors);
    ASSERT(psCustomHidDevice->pfnCallback);

    //
    // Get a pointer to the HID device data.
    //
    psHIDDevice = &psCustomHidDevice->sPrivateData.sHIDDevice;

    pConfigDesc = (tConfigDescriptor *)g_pui8CustomHidDescriptor;
    pConfigDesc->bmAttributes = psCustomHidDevice->ui8PwrAttributes;
    pConfigDesc->bMaxPower =  (uint8_t)(psCustomHidDevice->ui16MaxPowermA / 2);

    //
    // Call the common initialization routine.
    //
    pvRetcode = USBDHIDCustomHidCompositeInit(ui32Index, psCustomHidDevice, 0);

    //
    // If we initialized the HID layer successfully, pass our device pointer
    // back as the return code, otherwise return NULL to indicate an error.
    //
    if(pvRetcode)
    {
        //
        // Initialize the lower layer HID driver and pass it the various
        // structures and descriptors necessary to declare that we are a
        // keyboard.
        //
        pvRetcode = USBDHIDInit(ui32Index, psHIDDevice);

        return((void *)psCustomHidDevice);
    }
    else
    {
        return((void *)0);
    }
}
//*****************************************************************************
//
//! Initializes HID customhid device operation for a given USB controller.
//!
//! \param ulIndex is the index of the USB controller which is to be
//! initialized for HID customhid device operation.
//! \param psDevice points to a structure containing parameters customizing
//! the operation of the HID customhid device.
//!
//! An application wishing to offer a USB HID customhid interface to a USB host
//! must call this function to initialize the USB controller and attach the
//! customhid device to the USB bus.  This function performs all required USB
//! initialization.
//!
//! On successful completion, this function will return the \e psDevice pointer
//! passed to it.  This must be passed on all future calls to the HID customhid
//! device driver.
//!
//! When a host connects and configures the device, the application callback
//! will receive \b USB_EVENT_CONNECTED after which calls can be made to
//! USBDHIDCustomHidStateChange() to report pointer movement and button presses
//! to the host.
//!
//! \note The application must not make any calls to the lower level USB device
//! interfaces if interacting with USB via the USB HID customhid device API.
//! Doing so will cause unpredictable (though almost certainly unpleasant)
//! behavior.
//!
//! \return Returns NULL on failure or the psDevice pointer on success.
//
//*****************************************************************************
void *
USBDHIDCustomHidInit(unsigned long ulIndex, const tUSBDHIDCustomHidDevice *psDevice)
{
    void *pvRetcode;
    tUSBDHIDDevice *psHIDDevice;

    //
    // Check parameter validity.
    //
    ASSERT(psDevice);
    ASSERT(psDevice->ppStringDescriptors);
    ASSERT(psDevice->psPrivateHIDCustomHidData);
    ASSERT(psDevice->pfnCallback);

    //
    // Get a pointer to the HID device data.
    //
    psHIDDevice = &psDevice->psPrivateHIDCustomHidData->sHIDDevice;

    //
    // Call the common initialization routine.
    //
    pvRetcode = USBDHIDCustomHidCompositeInit(ulIndex, psDevice);

    //
    // If we initialized the HID layer successfully, pass our device pointer
    // back as the return code, otherwise return NULL to indicate an error.
    //
    if(pvRetcode)
    {
        //
        // Initialize the lower layer HID driver and pass it the various
        // structures and descriptors necessary to declare that we are a
        // keyboard.
        //
        pvRetcode = USBDHIDInit(ulIndex, psHIDDevice);

        return((void *)psDevice);
    }
    else
    {
        return((void *)0);
    }
}