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.
pull/1469/head
Dean Camera 16 years ago
parent 23f3c3deee
commit a54ed0085b

@ -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);
}

@ -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 <avr/io.h>
#include <LUFA/Drivers/USB/USB.h>
/* 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

@ -36,7 +36,6 @@
#include "PrinterHost.h" #include "PrinterHost.h"
/* Globals */
uint8_t PrinterProtocol; uint8_t PrinterProtocol;
@ -115,20 +114,19 @@ void USB_Printer_Host(void)
switch (USB_HostState) switch (USB_HostState)
{ {
case HOST_STATE_Addressed: case HOST_STATE_Addressed:
/* Standard request to set the device configuration to configuration 1 */ puts_P(PSTR("Getting Config Data.\r\n"));
USB_ControlRequest = (USB_Request_Header_t)
{ /* Select the control pipe for the request transfer */
bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), Pipe_SelectPipe(PIPE_CONTROLPIPE);
bRequest: REQ_SetConfiguration,
wValue: 1, /* Get and process the configuration descriptor data */
wIndex: 0, if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
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")); if (ErrorCode == ControlError)
puts_P(PSTR("Control Error (Get Configuration).\r\n"));
else
puts_P(PSTR("Invalid Device.\r\n"));
printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode); printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);
/* Indicate error via status LEDs */ /* Indicate error via status LEDs */
@ -139,19 +137,10 @@ void USB_Printer_Host(void)
break; break;
} }
USB_HostState = HOST_STATE_Configured; /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
break; if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
case HOST_STATE_Configured:
puts_P(PSTR("Getting Config Data.\r\n"));
/* Get and process the configuration descriptor data */
if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
{ {
if (ErrorCode == ControlError) puts_P(PSTR("Control Error (Set Configuration).\r\n"));
puts_P(PSTR("Control Error (Get Configuration).\r\n"));
else
puts_P(PSTR("Invalid Device.\r\n"));
printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode); printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);
/* Indicate error via status LEDs */ /* Indicate error via status LEDs */
@ -162,6 +151,9 @@ void USB_Printer_Host(void)
break; break;
} }
USB_HostState = HOST_STATE_Configured;
break;
case HOST_STATE_Configured:
puts_P(PSTR("Printer Enumerated.\r\n")); puts_P(PSTR("Printer Enumerated.\r\n"));
USB_HostState = HOST_STATE_Ready; USB_HostState = HOST_STATE_Ready;
@ -170,7 +162,12 @@ void USB_Printer_Host(void)
/* Indicate device busy via the status LEDs */ /* Indicate device busy via the status LEDs */
LEDs_SetAllLEDs(LEDS_LED3 | LEDS_LED4); 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 */ /* Indicate error via status LEDs */
LEDs_SetAllLEDs(LEDS_LED1); LEDs_SetAllLEDs(LEDS_LED1);
@ -180,6 +177,8 @@ void USB_Printer_Host(void)
break; break;
} }
printf_P(PSTR("Printer Device ID: %s\r\n"), DeviceIDString.String);
/* Indicate device no longer busy */ /* Indicate device no longer busy */
LEDs_SetAllLEDs(LEDS_LED4); LEDs_SetAllLEDs(LEDS_LED4);
@ -189,31 +188,3 @@ void USB_Printer_Host(void)
break; 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;
}

@ -39,6 +39,7 @@
#include <stdio.h> #include <stdio.h>
#include "ConfigDescriptor.h" #include "ConfigDescriptor.h"
#include "Lib/PrinterCommands.h"
#include <LUFA/Version.h> #include <LUFA/Version.h>
#include <LUFA/Drivers/Misc/TerminalCodes.h> #include <LUFA/Drivers/Misc/TerminalCodes.h>
@ -59,19 +60,6 @@
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ /** 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 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: */ /* External Variables: */
extern uint8_t PrinterProtocol; extern uint8_t PrinterProtocol;
@ -86,6 +74,4 @@
void USB_Printer_Host(void); void USB_Printer_Host(void);
bool GetDeviceID(void);
#endif #endif

@ -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.) # List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c \ SRC = $(TARGET).c \
ConfigDescriptor.c \ ConfigDescriptor.c \
Lib/PrinterCommands.c \
$(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \
$(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \ $(LUFA_PATH)/LUFA/Drivers/Peripheral/Serial.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \

File diff suppressed because one or more lines are too long

@ -243,8 +243,8 @@ ISR(USB_GEN_vect, ISR_BLOCK)
{ {
if (USB_CurrentMode == USB_MODE_HOST) if (USB_CurrentMode == USB_MODE_HOST)
EVENT_USB_DeviceUnattached(); EVENT_USB_DeviceUnattached();
else
EVENT_USB_Disconnect(); EVENT_USB_Disconnect();
} }
EVENT_USB_UIDChange(); EVENT_USB_UIDChange();

@ -39,7 +39,7 @@ volatile bool USB_IsInitialized;
USB_Request_Header_t USB_ControlRequest; USB_Request_Header_t USB_ControlRequest;
#if defined(USB_CAN_BE_HOST) #if defined(USB_CAN_BE_HOST)
volatile uint8_t USB_HostState; volatile uint8_t USB_HostState;
#endif #endif
void USB_USBTask(void) void USB_USBTask(void)

@ -58,7 +58,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
Pipe_ClearSETUP(); 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; goto End_Of_Control_Send;
Pipe_Freeze(); Pipe_Freeze();
@ -76,7 +76,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
{ {
Pipe_Unfreeze(); 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; goto End_Of_Control_Send;
if (!(Pipe_BytesInPipe())) if (!(Pipe_BytesInPipe()))
@ -96,12 +96,12 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
Pipe_SetToken(PIPE_TOKEN_OUT); Pipe_SetToken(PIPE_TOKEN_OUT);
Pipe_Unfreeze(); 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; goto End_Of_Control_Send;
Pipe_ClearOUT(); 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; goto End_Of_Control_Send;
} }
else else
@ -113,7 +113,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
while (DataLen) 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; goto End_Of_Control_Send;
while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize)) while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize))
@ -125,7 +125,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
Pipe_ClearOUT(); 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; goto End_Of_Control_Send;
Pipe_Freeze(); Pipe_Freeze();
@ -134,7 +134,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr)
Pipe_SetToken(PIPE_TOKEN_IN); Pipe_SetToken(PIPE_TOKEN_IN);
Pipe_Unfreeze(); 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; goto End_Of_Control_Send;
Pipe_ClearIN(); Pipe_ClearIN();
@ -151,7 +151,7 @@ End_Of_Control_Send:
return ReturnStatus; 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) #if (USB_HOST_TIMEOUT_MS < 0xFF)
uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS; uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS;

@ -90,7 +90,7 @@
/* Function Prototypes: */ /* Function Prototypes: */
#if defined(INCLUDE_FROM_HOSTCHAPTER9_C) #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
#endif #endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 28 KiB

@ -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 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_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 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 * \section Sec_ChangeLog090605 Version 090605

@ -24,7 +24,9 @@
* - <b>BOARD</b>, the target board hardware * - <b>BOARD</b>, the target board hardware
* - <b>F_CLOCK</b>, the target raw master clock frequency, before any prescaling is performed * - <b>F_CLOCK</b>, the target raw master clock frequency, before any prescaling is performed
* - <b>F_CPU</b>, the target AVR CPU master clock frequency, after any prescaling * - <b>F_CPU</b>, the target AVR CPU master clock frequency, after any prescaling
* - <b>CDEFS</b>, the C preprocessor defines which configure the source code * - <b>CDEFS</b>, the C preprocessor defines which configure options the source code
* - <b>LUFA_PATH</b>, the path to the LUFA library source code
* - <b>LUFA_OPTS</b>, the compile time LUFA options which configure the library features
* *
* These values should be changed to reflect the build hardware. * These values should be changed to reflect the build hardware.
* *
@ -63,12 +65,23 @@
* library components will occur. * library components will occur.
* *
* \section Sec_CDEFS The CDEFS Parameter * \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 * 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. * 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 * \section Sec_LUFA_PATH The LUFA_PATH Parameter
* current configuration - if the options are incorrect, then the demo is most likely incompatible with the chosen USB AVR model and cannot be * As each LUFA program requires the LUFA library source code to compile correctly, the application must know where the LUFA library is located. This
* 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 * value specifies the path to the LUFA library base relative to the path of the project makefile.
* 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_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.
*/ */

@ -21,11 +21,11 @@
* - Add standardized descriptor names to device and host class driver structures * - 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 * - 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 * - 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 * - Make Suspend host state suspend USB bus frames
* - Add in Stream functions for PROGMEM, EEPROM -- move to templated system * - Add in Stream functions for PROGMEM, EEPROM -- move to templated system
* - Debug mode for pipe/endpoint calls * - Debug mode for pipe/endpoint calls
* - Test and document new FAST_STREAM_TRANSFERS compile time option * - Test and document new FAST_STREAM_TRANSFERS compile time option
* - Demo hardware compatibility table/list
* *
* <b>Targeted for Future Releases:</b> * <b>Targeted for Future Releases:</b>
* - Remake AVRStudio project files * - Remake AVRStudio project files

Loading…
Cancel
Save