\r
#include "ConfigDescriptor.h"\r
\r
+uint8_t PrinterInterfaceNumber;\r
+uint8_t PrinterAltSetting;\r
+\r
+\r
uint8_t ProcessConfigurationDescriptor(void)\r
{\r
uint8_t* ConfigDescriptorData;\r
uint16_t ConfigDescriptorSize;\r
uint8_t ErrorCode;\r
uint8_t FoundEndpoints = 0;\r
- uint8_t FoundEndpointMask;\r
\r
/* Get Configuration Descriptor size from the device */\r
if (USB_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, NULL) != HOST_SENDCONTROL_Successful)\r
\r
/* Get the printer interface from the configuration descriptor */\r
if ((ErrorCode = USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
- NextPrinterInterface)))\r
+ NextBidirectionalPrinterInterface)))\r
{\r
/* Descriptor not found, error out */\r
return NoInterfaceFound;\r
}\r
-\r
- /* Get the printer's communication protocol */\r
- PrinterProtocol = DESCRIPTOR_CAST(ConfigDescriptorData, USB_Descriptor_Interface_t).Protocol;\r
\r
- /* Determine what endpoints to look for from the protocol */\r
- switch (PrinterProtocol)\r
- {\r
- case PROTOCOL_UNIDIRECTIONAL:\r
- FoundEndpointMask = (1 << PRINTER_DATA_OUT_PIPE);\r
- break;\r
- case PROTOCOL_BIDIRECTIONAL:\r
- case PROTOCOL_IEEE1284:\r
- FoundEndpointMask = ((1 << PRINTER_DATA_OUT_PIPE) | (1 << PRINTER_DATA_IN_PIPE));\r
- break;\r
- default:\r
- return NoInterfaceFound;\r
- }\r
+ PrinterInterfaceNumber = DESCRIPTOR_CAST(ConfigDescriptorData, USB_Descriptor_Interface_t).InterfaceNumber;\r
+ PrinterAltSetting = DESCRIPTOR_CAST(ConfigDescriptorData, USB_Descriptor_Interface_t).AlternateSetting;\r
\r
/* Get the IN and OUT data endpoints for the mass storage interface */\r
- while (FoundEndpoints != FoundEndpointMask)\r
+ while (FoundEndpoints != ((1 << PRINTER_DATA_OUT_PIPE) | (1 << PRINTER_DATA_IN_PIPE)))\r
{\r
/* Fetch the next bulk endpoint from the current printer interface */\r
if ((ErrorCode = USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,\r
return SuccessfulConfigRead;\r
}\r
\r
-uint8_t NextPrinterInterface(void* CurrentDescriptor)\r
+uint8_t NextBidirectionalPrinterInterface(void* CurrentDescriptor)\r
{\r
- /* PURPOSE: Find next mass storage class interface descriptor */\r
+ /* PURPOSE: Find next Bidirectional protocol printer class interface descriptor */\r
\r
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)\r
{\r
/* Check the descriptor class and protocol, break out if correct class/protocol interface found */\r
if ((DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Class == PRINTER_CLASS) &&\r
- (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == PRINTER_SUBCLASS))\r
+ (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == PRINTER_SUBCLASS) &&\r
+ (DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Protocol == PROTOCOL_BIDIRECTIONAL))\r
{\r
return DESCRIPTOR_SEARCH_Found;\r
}\r
\r
#include "PrinterHost.h"\r
\r
-uint8_t PrinterProtocol;\r
-\r
\r
int main(void)\r
{\r
USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
break;\r
}\r
-\r
+ \r
+ /* Some printers use alternate settings to determine the communication protocol used - if so, send a SetInterface\r
+ * request to switch to the interface alternate setting with the Bidirection protocol */\r
+ if (PrinterAltSetting)\r
+ {\r
+ USB_ControlRequest = (USB_Request_Header_t)\r
+ {\r
+ bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),\r
+ bRequest: REQ_SetInterface,\r
+ wValue: PrinterAltSetting,\r
+ wIndex: PrinterInterfaceNumber,\r
+ wLength: 0,\r
+ };\r
+ \r
+ if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)\r
+ {\r
+ puts_P(PSTR("Control Error (Set Interface).\r\n"));\r
+ printf_P(PSTR(" -- Error Code: %d\r\n"), ErrorCode);\r
+\r
+ /* Indicate error via status LEDs */\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+\r
+ /* Wait until USB device disconnected */\r
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+ break; \r
+ }\r
+ }\r
+ \r
USB_HostState = HOST_STATE_Configured;\r
break;\r
case HOST_STATE_Configured:\r
- printf_P(PSTR("Printer Protocol: %d\r\n"), PrinterProtocol);\r
- \r
puts_P(PSTR("Retrieving Device ID...\r\n"));\r
\r
Device_ID_String_t DeviceIDString;\r