aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Host
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2009-07-13 04:46:52 +0000
committerDean Camera <dean@fourwalledcubicle.com>2009-07-13 04:46:52 +0000
commita54ed0085b29f81946f3652bd412103292da7589 (patch)
treeb7da8d52d572986e46bc913751e681dc70185f5c /Demos/Host
parent23f3c3deee8bd153d59f2ac4e659c71ee75915f7 (diff)
downloadlufa-a54ed0085b29f81946f3652bd412103292da7589.tar.gz
lufa-a54ed0085b29f81946f3652bd412103292da7589.tar.bz2
lufa-a54ed0085b29f81946f3652bd412103292da7589.zip
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.
Diffstat (limited to 'Demos/Host')
-rw-r--r--Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.c86
-rw-r--r--Demos/Host/Incomplete/PrinterHost/Lib/PrinterCommands.h60
-rw-r--r--Demos/Host/Incomplete/PrinterHost/PrinterHost.c87
-rw-r--r--Demos/Host/Incomplete/PrinterHost/PrinterHost.h18
-rw-r--r--Demos/Host/Incomplete/PrinterHost/makefile1
5 files changed, 178 insertions, 74 deletions
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 <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
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 <stdio.h>
#include "ConfigDescriptor.h"
+ #include "Lib/PrinterCommands.h"
#include <LUFA/Version.h>
#include <LUFA/Drivers/Misc/TerminalCodes.h>
@@ -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 \