From a54ed0085b29f81946f3652bd412103292da7589 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 13 Jul 2009 04:46:52 +0000 Subject: Seperated out parts of the PrinterHost incomplete demo into a seperate Lib subdirectory. Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected. --- .../Incomplete/PrinterHost/Lib/PrinterCommands.c | 86 ++++++++++++++++++++ .../Incomplete/PrinterHost/Lib/PrinterCommands.h | 60 ++++++++++++++ Demos/Host/Incomplete/PrinterHost/PrinterHost.c | 87 +++++++-------------- Demos/Host/Incomplete/PrinterHost/PrinterHost.h | 18 +---- Demos/Host/Incomplete/PrinterHost/makefile | 1 + LUFA.pnproj | 2 +- LUFA/Drivers/USB/HighLevel/USBInterrupt.c | 4 +- LUFA/Drivers/USB/HighLevel/USBTask.c | 2 +- LUFA/Drivers/USB/LowLevel/HostChapter9.c | 16 ++-- LUFA/Drivers/USB/LowLevel/HostChapter9.h | 2 +- LUFA/ManPages/Author.jpg | Bin 20591 -> 28410 bytes LUFA/ManPages/ChangeLog.txt | 1 + LUFA/ManPages/ConfiguringApps.txt | 25 ++++-- LUFA/ManPages/FutureChanges.txt | 2 +- 14 files changed, 212 insertions(+), 94 deletions(-) create mode 100644 Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c create mode 100644 Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h diff --git a/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c new file mode 100644 index 000000000..031289193 --- /dev/null +++ b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c @@ -0,0 +1,86 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2009. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim 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 + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +#include "PrinterCommands.h" + +uint8_t Printer_GetDeviceID(Device_ID_String_t* DeviceIDString) +{ + uint8_t ErrorCode = HOST_SENDCONTROL_Successful; + + USB_ControlRequest = (USB_Request_Header_t) + { + bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), + bRequest: GET_DEVICE_ID, + wValue: 0, + wIndex: 0, + wLength: sizeof(DeviceIDString), + }; + + if ((ErrorCode == USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful) + return ErrorCode; + + DeviceIDString->Length = SwapEndian_16(DeviceIDString->Length); + + /* Protect against overflow for the null terminator if the string length is equal to or larger than the buffer */ + if (DeviceIDString->Length >= sizeof(DeviceIDString->String)) + DeviceIDString->Length = sizeof(DeviceIDString->String) - 1; + + DeviceIDString->String[DeviceIDString->Length] = 0x00; + + return HOST_SENDCONTROL_Successful; +} + +uint8_t Printer_GetPortStatus(uint8_t* PortStatus) +{ + USB_ControlRequest = (USB_Request_Header_t) + { + bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), + bRequest: GET_PORT_STATUS, + wValue: 0, + wIndex: 0, + wLength: sizeof(uint8_t), + }; + + return USB_Host_SendControlRequest(PortStatus); +} + +uint8_t Printer_SoftReset(void) +{ + USB_ControlRequest = (USB_Request_Header_t) + { + bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), + bRequest: SOFT_RESET, + wValue: 0, + wIndex: 0, + wLength: 0, + }; + + return USB_Host_SendControlRequest(NULL); +} diff --git a/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h new file mode 100644 index 000000000..e9c1d9fb9 --- /dev/null +++ b/Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h @@ -0,0 +1,60 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2009. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, and distribute this software + and its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim 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 + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +#ifndef _PRINTER_COMMANDS_H_ +#define _PRINTER_COMMANDS_H_ + + /* Includes: */ + #include + + #include + + /* Macros: */ + #define PROTOCOL_UNIDIRECTIONAL 0x01 + #define PROTOCOL_BIDIRECTIONAL 0x02 + #define PROTOCOL_IEEE1284 0x03 + + #define GET_DEVICE_ID 0 + #define GET_PORT_STATUS 1 + #define SOFT_RESET 2 + + /* Type Defines: */ + typedef struct + { + uint16_t Length; + uint8_t String[128]; + } Device_ID_String_t; + + /* Function Prototypes: */ + uint8_t Printer_GetDeviceID(Device_ID_String_t* DeviceIDString); + uint8_t Printer_GetPortStatus(uint8_t* PortStatus); + uint8_t Printer_SoftReset(void); + +#endif diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c index b63f4fe22..df80789dd 100644 --- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c +++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c @@ -36,7 +36,6 @@ #include "PrinterHost.h" -/* Globals */ uint8_t PrinterProtocol; @@ -115,34 +114,10 @@ void USB_Printer_Host(void) switch (USB_HostState) { case HOST_STATE_Addressed: - /* Standard request to set the device configuration to configuration 1 */ - USB_ControlRequest = (USB_Request_Header_t) - { - bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), - bRequest: REQ_SetConfiguration, - wValue: 1, - wIndex: 0, - wLength: 0, - }; - - /* Send the request, display error and wait for device detatch if request fails */ - if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) - { - puts_P(PSTR("Control Error (Set Configuration).\r\n")); - printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode); - - /* Indicate error via status LEDs */ - LEDs_SetAllLEDs(LEDS_LED1); - - /* Wait until USB device disconnected */ - while (USB_IsConnected); - break; - } - - USB_HostState = HOST_STATE_Configured; - break; - case HOST_STATE_Configured: puts_P(PSTR("Getting Config Data.\r\n")); + + /* Select the control pipe for the request transfer */ + Pipe_SelectPipe(PIPE_CONTROLPIPE); /* Get and process the configuration descriptor data */ if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead) @@ -161,16 +136,38 @@ void USB_Printer_Host(void) while (USB_IsConnected); break; } + + /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */ + if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful) + { + puts_P(PSTR("Control Error (Set Configuration).\r\n")); + printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode); + + /* Indicate error via status LEDs */ + LEDs_SetAllLEDs(LEDS_LED1); + + /* Wait until USB device disconnected */ + while (USB_IsConnected); + break; + } + USB_HostState = HOST_STATE_Configured; + break; + case HOST_STATE_Configured: puts_P(PSTR("Printer Enumerated.\r\n")); - + USB_HostState = HOST_STATE_Ready; break; case HOST_STATE_Ready: /* Indicate device busy via the status LEDs */ LEDs_SetAllLEDs(LEDS_LED3 | LEDS_LED4); - if (!(GetDeviceID())) + printf_P(PSTR("Printer Protocol: %d\r\n"), PrinterProtocol); + + puts_P(PSTR("Retrieving Device ID...\r\n")); + + Device_ID_String_t DeviceIDString; + if (Printer_GetDeviceID(&DeviceIDString) != HOST_SENDCONTROL_Successful) { /* Indicate error via status LEDs */ LEDs_SetAllLEDs(LEDS_LED1); @@ -179,6 +176,8 @@ void USB_Printer_Host(void) while (USB_IsConnected); break; } + + printf_P(PSTR("Printer Device ID: %s\r\n"), DeviceIDString.String); /* Indicate device no longer busy */ LEDs_SetAllLEDs(LEDS_LED4); @@ -189,31 +188,3 @@ void USB_Printer_Host(void) break; } } - -bool GetDeviceID(void) -{ - Device_ID_String_t DeviceIDString; - - /* Request to retrieve the device ID string */ - USB_ControlRequest = (USB_Request_Header_t) - { - bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), - bRequest: GET_DEVICE_ID, - wValue: 0, - wIndex: 0, - wLength: sizeof(DeviceIDString), - }; - - printf("Error Code: %d", USB_Host_SendControlRequest(&DeviceIDString)); - - /* Send the request, display error and wait for device detatch if request fails */ - if (USB_Host_SendControlRequest(&DeviceIDString) != HOST_SENDCONTROL_Successful) - return false; - - /* Reverse the order of the string length as it is sent in big-endian format */ - DeviceIDString.Length = SwapEndian_16(DeviceIDString.Length); - - printf("%s", DeviceIDString.String); - - return true; -} diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.h b/Demos/Host/Incomplete/PrinterHost/PrinterHost.h index e1649563a..191cd7f12 100644 --- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.h +++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.h @@ -39,6 +39,7 @@ #include #include "ConfigDescriptor.h" + #include "Lib/PrinterCommands.h" #include #include @@ -58,20 +59,7 @@ /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3) - - #define PROTOCOL_UNIDIRECTIONAL 0x01 - #define PROTOCOL_BIDIRECTIONAL 0x02 - #define PROTOCOL_IEEE1284 0x03 - - #define GET_DEVICE_ID 0 - - /* Type Defines: */ - typedef struct - { - uint16_t Length; - uint8_t String[128]; - } Device_ID_String_t; - + /* External Variables: */ extern uint8_t PrinterProtocol; @@ -86,6 +74,4 @@ void USB_Printer_Host(void); - bool GetDeviceID(void); - #endif diff --git a/Demos/Host/Incomplete/PrinterHost/makefile b/Demos/Host/Incomplete/PrinterHost/makefile index 21743ec61..a56d9f2a8 100644 --- a/Demos/Host/Incomplete/PrinterHost/makefile +++ b/Demos/Host/Incomplete/PrinterHost/makefile @@ -132,6 +132,7 @@ LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ ConfigDescriptor.c \ + Lib/PrinterCommands.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \ diff --git a/LUFA.pnproj b/LUFA.pnproj index 39ec03372..585f74e49 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/Drivers/USB/HighLevel/USBInterrupt.c b/LUFA/Drivers/USB/HighLevel/USBInterrupt.c index 43bc53220..c240bef6e 100644 --- a/LUFA/Drivers/USB/HighLevel/USBInterrupt.c +++ b/LUFA/Drivers/USB/HighLevel/USBInterrupt.c @@ -243,8 +243,8 @@ ISR(USB_GEN_vect, ISR_BLOCK) { if (USB_CurrentMode == USB_MODE_HOST) EVENT_USB_DeviceUnattached(); - else - EVENT_USB_Disconnect(); + + EVENT_USB_Disconnect(); } EVENT_USB_UIDChange(); diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c index 46fcd5709..894171f24 100644 --- a/LUFA/Drivers/USB/HighLevel/USBTask.c +++ b/LUFA/Drivers/USB/HighLevel/USBTask.c @@ -39,7 +39,7 @@ volatile bool USB_IsInitialized; USB_Request_Header_t USB_ControlRequest; #if defined(USB_CAN_BE_HOST) -volatile uint8_t USB_HostState; +volatile uint8_t USB_HostState; #endif void USB_USBTask(void) diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.c b/LUFA/Drivers/USB/LowLevel/HostChapter9.c index 2bdab7c67..a271c06cb 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.c +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.c @@ -58,7 +58,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_ClearSETUP(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_SetupSent))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent))) goto End_Of_Control_Send; Pipe_Freeze(); @@ -76,7 +76,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) { Pipe_Unfreeze(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_InReceived))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived))) goto End_Of_Control_Send; if (!(Pipe_BytesInPipe())) @@ -96,12 +96,12 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_SetToken(PIPE_TOKEN_OUT); Pipe_Unfreeze(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; Pipe_ClearOUT(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; } else @@ -113,7 +113,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) while (DataLen) { - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize)) @@ -125,7 +125,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_ClearOUT(); } - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; Pipe_Freeze(); @@ -134,7 +134,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_SetToken(PIPE_TOKEN_IN); Pipe_Unfreeze(); - if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_InReceived))) + if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived))) goto End_Of_Control_Send; Pipe_ClearIN(); @@ -151,7 +151,7 @@ End_Of_Control_Send: return ReturnStatus; } -static uint8_t USB_Host_Wait_For_Setup_IOS(const uint8_t WaitType) +static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType) { #if (USB_HOST_TIMEOUT_MS < 0xFF) uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS; diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.h b/LUFA/Drivers/USB/LowLevel/HostChapter9.h index 3fa5277a3..7550bcd04 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.h +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.h @@ -90,7 +90,7 @@ /* Function Prototypes: */ #if defined(INCLUDE_FROM_HOSTCHAPTER9_C) - static uint8_t USB_Host_Wait_For_Setup_IOS(const uint8_t WaitType); + static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType); #endif #endif diff --git a/LUFA/ManPages/Author.jpg b/LUFA/ManPages/Author.jpg index 71e1a08fb..e8f5541a0 100644 Binary files a/LUFA/ManPages/Author.jpg and b/LUFA/ManPages/Author.jpg differ diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 3ad2097ab..0f582a657 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -49,6 +49,7 @@ * - Fixed MassStorage demo not clearing the reset flag when a Mass Storage Reset is issued while not processing a command * - Fixed USB_Host_SendControlRequest() not re-suspending the USB bus when initial device ready-wait fails * - Fixed USB Pad regulator not being disabled on some AVR models when the USB_OPT_REG_DISABLED option is used + * - Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected * * * \section Sec_ChangeLog090605 Version 090605 diff --git a/LUFA/ManPages/ConfiguringApps.txt b/LUFA/ManPages/ConfiguringApps.txt index bb6d185e4..fb9da7094 100644 --- a/LUFA/ManPages/ConfiguringApps.txt +++ b/LUFA/ManPages/ConfiguringApps.txt @@ -24,7 +24,9 @@ * - BOARD, the target board hardware * - F_CLOCK, the target raw master clock frequency, before any prescaling is performed * - F_CPU, the target AVR CPU master clock frequency, after any prescaling - * - CDEFS, the C preprocessor defines which configure the source code + * - CDEFS, the C preprocessor defines which configure options the source code + * - LUFA_PATH, the path to the LUFA library source code + * - LUFA_OPTS, the compile time LUFA options which configure the library features * * These values should be changed to reflect the build hardware. * @@ -63,12 +65,23 @@ * library components will occur. * * \section Sec_CDEFS The CDEFS Parameter + * Many applications have features which can be controlled by the defining of specially named preprocessor tokens at the point of compilation - for example, + * an application might use a compile time token to turn on or off optional or mutually exclusive portions of code. Preprocessor tokens can be + * defined here by listing each one with the -D command line switch, and each token can optionally be defined to a specific value. When defined in the + * project makefile, these behave as if they were defined in every source file via a normal preprocessor define statement. + * * Most applications will actually have multiple CDEF lines, which are concatenated together with the "+=" operator. This ensures that large * numbers of configuration options remain readable by splitting up groups of options into separate lines. * - * Normally, these options do not need to be altered to allow an application to compile and run correctly on a different board or AVR to the - * current configuration - if the options are incorrect, then the demo is most likely incompatible with the chosen USB AVR model and cannot be - * made to function through the altering of the makefile settings alone (or at all). Settings such as the USB mode (device, host or both), the USB - * interface speed (Low or Full speed) and other LUFA configuration options can be set here - refer to the library documentation for details on the - * configuration parameters. + * \section Sec_LUFA_PATH The LUFA_PATH Parameter + * As each LUFA program requires the LUFA library source code to compile correctly, the application must know where the LUFA library is located. This + * value specifies the path to the LUFA library base relative to the path of the project makefile. + * + * \section Sec_LUFA_OPTS The LUFA_OPTS Parameter + * This value is similar to the CDEFS parameter listed elsewhere -- indeed, it is simply a convenient place to group LUFA related tokens away from the + * application's compile time tokens. Normally, these options do not need to be altered to allow an application to compile and run correctly on a + * different board or AVR to the current configuration - if the options are incorrect, then the demo is most likely incompatible with the chosen USB AVR + * model and cannot be made to function through the altering of the makefile settings alone (or at all). Settings such as the USB mode (device, host or both), + * the USB interface speed (Low or Full speed) and other LUFA configuration options can be set here - see \ref Page_TokenSummary documentation for details + * on the available LUFA compile time configuration options. */ \ No newline at end of file diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt index 1a2b7a031..59a279072 100644 --- a/LUFA/ManPages/FutureChanges.txt +++ b/LUFA/ManPages/FutureChanges.txt @@ -21,11 +21,11 @@ * - Add standardized descriptor names to device and host class driver structures * - Remove USE_NONSTANDARD_DESCRIPTOR_NAMES, make all typedefs unions to allow either naming scheme to be used * - Add in INTERRUPT_CONTROL_PIPE to use HSOFI to trigger calls to the host state machine - * - Remove FAST_STREAM_TRANSFERS as they have little effect * - Make Suspend host state suspend USB bus frames * - Add in Stream functions for PROGMEM, EEPROM -- move to templated system * - Debug mode for pipe/endpoint calls * - Test and document new FAST_STREAM_TRANSFERS compile time option + * - Demo hardware compatibility table/list * * Targeted for Future Releases: * - Remake AVRStudio project files -- cgit v1.2.3