X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/43b9d552bb0a32c5cd5f9fa72a8cb3c871ad5ef3..c757acf1f7f3f45522024af7adf8df71a42a1dc1:/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c diff --git a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c index 643374db0..35a98eb23 100644 --- a/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c +++ b/Demos/Host/ClassDriver/StillImageHost/StillImageHost.c @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2011. + Copyright (C) Dean Camera, 2013. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2013 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -18,7 +18,7 @@ advertising or publicity pertaining to distribution of the software without specific, written prior permission. - The author disclaim all warranties with regard to this + The author disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages @@ -44,17 +44,25 @@ USB_ClassInfo_SI_Host_t DigitalCamera_SI_Interface = { .Config = { - .DataINPipeNumber = 1, - .DataINPipeDoubleBank = false, - - .DataOUTPipeNumber = 2, - .DataOUTPipeDoubleBank = false, - - .EventsPipeNumber = 3, - .EventsPipeDoubleBank = false, + .DataINPipe = + { + .Address = (PIPE_DIR_IN | 1), + .Banks = 1, + }, + .DataOUTPipe = + { + .Address = (PIPE_DIR_OUT | 2), + .Banks = 1, + }, + .EventsPipe = + { + .Address = (PIPE_DIR_IN | 3), + .Banks = 1, + }, }, }; + /** Main program entry point. This routine configures the hardware required by the application, then * enters a loop to run the application tasks in sequence. */ @@ -65,83 +73,11 @@ int main(void) puts_P(PSTR(ESC_FG_CYAN "Still Image Host Demo running.\r\n" ESC_FG_WHITE)); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); - sei(); + GlobalInterruptEnable(); for (;;) { - switch (USB_HostState) - { - case HOST_STATE_Addressed: - LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); - - uint16_t ConfigDescriptorSize; - uint8_t ConfigDescriptorData[512]; - - if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, - sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) - { - puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (SI_Host_ConfigurePipes(&DigitalCamera_SI_Interface, - ConfigDescriptorSize, ConfigDescriptorData) != SI_ENUMERROR_NoError) - { - puts_P(PSTR("Attached Device Not a Valid Still Image Class Device.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) - { - puts_P(PSTR("Error Setting Device Configuration.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - puts_P(PSTR("Still Image Device Enumerated.\r\n")); - LEDs_SetAllLEDs(LEDMASK_USB_READY); - USB_HostState = HOST_STATE_Configured; - break; - case HOST_STATE_Configured: - puts_P(PSTR("Opening Session...\r\n")); - - if (SI_Host_OpenSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError) - { - puts_P(PSTR("Could not open PIMA session.\r\n")); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - puts_P(PSTR("Turning off Device...\r\n")); - - SI_Host_SendCommand(&DigitalCamera_SI_Interface, 0x1013, 0, NULL); - if (SI_Host_ReceiveResponse(&DigitalCamera_SI_Interface)) - { - puts_P(PSTR("Could not turn off device.\r\n")); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - puts_P(PSTR("Device Off.\r\n")); - - puts_P(PSTR("Closing Session...\r\n")); - - if (SI_Host_CloseSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError) - { - puts_P(PSTR("Could not close PIMA session.\r\n")); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } - - LEDs_SetAllLEDs(LEDMASK_USB_READY); - USB_HostState = HOST_STATE_WaitForDeviceRemoval; - break; - } + StillImageHost_Task(); SI_Host_USBTask(&DigitalCamera_SI_Interface); USB_USBTask(); @@ -167,6 +103,48 @@ void SetupHardware(void) Serial_CreateStream(NULL); } +/** Task to manage an enumerated USB Still Image device once connected, to manage a + * new PIMA session in order to send commands to the attached device. + */ +void StillImageHost_Task(void) +{ + if (USB_HostState != HOST_STATE_Configured) + return; + + puts_P(PSTR("Opening Session...\r\n")); + + if (SI_Host_OpenSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError) + { + puts_P(PSTR("Could not open PIMA session.\r\n")); + USB_Host_SetDeviceConfiguration(0); + return; + } + + puts_P(PSTR("Turning off Device...\r\n")); + + SI_Host_SendCommand(&DigitalCamera_SI_Interface, 0x1013, 0, NULL); + if (SI_Host_ReceiveResponse(&DigitalCamera_SI_Interface)) + { + puts_P(PSTR("Could not turn off device.\r\n")); + USB_Host_SetDeviceConfiguration(0); + return; + } + + puts_P(PSTR("Device Off.\r\n")); + + puts_P(PSTR("Closing Session...\r\n")); + + if (SI_Host_CloseSession(&DigitalCamera_SI_Interface) != PIPE_RWSTREAM_NoError) + { + puts_P(PSTR("Could not close PIMA session.\r\n")); + USB_Host_SetDeviceConfiguration(0); + return; + } + + LEDs_SetAllLEDs(LEDMASK_USB_READY); + USB_Host_SetDeviceConfiguration(0); +} + /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and * starts the library USB task to begin the enumeration and USB management process. */ @@ -190,6 +168,35 @@ void EVENT_USB_Host_DeviceUnattached(void) */ void EVENT_USB_Host_DeviceEnumerationComplete(void) { + LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + + uint16_t ConfigDescriptorSize; + uint8_t ConfigDescriptorData[512]; + + if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, + sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) + { + puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (SI_Host_ConfigurePipes(&DigitalCamera_SI_Interface, + ConfigDescriptorSize, ConfigDescriptorData) != SI_ENUMERROR_NoError) + { + puts_P(PSTR("Attached Device Not a Valid Still Image Class Device.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) + { + puts_P(PSTR("Error Setting Device Configuration.\r\n")); + LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + return; + } + + puts_P(PSTR("Still Image Device Enumerated.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_READY); }