diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c index b4afac15b0bb3a3eb0b34241b08cad70fe96b4d8..c8307183c3a6c4bebda220df8682c33a9a9d509b 100644 --- a/LUFA/Drivers/USB/Class/Device/CDC.c +++ b/LUFA/Drivers/USB/Class/Device/CDC.c @@ -134,7 +134,7 @@ bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfac } if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, - DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) { return false; } diff --git a/LUFA/Drivers/USB/Class/Device/MIDI.c b/LUFA/Drivers/USB/Class/Device/MIDI.c index 78d9043a9d9ec231dbb75a4ea71241fd0afee7aa..83081bece6655d8461be3926882980d609b32b3a 100644 --- a/LUFA/Drivers/USB/Class/Device/MIDI.c +++ b/LUFA/Drivers/USB/Class/Device/MIDI.c @@ -67,7 +67,7 @@ bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInter } if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, - DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) { return false; } diff --git a/LUFA/Drivers/USB/Class/Device/MassStorage.c b/LUFA/Drivers/USB/Class/Device/MassStorage.c index 7f01d5ef4e3f7553c1060e476e1ab6f136f79b3a..3ee10d65fc067dbd1c91a1086b2de83b35c46568 100644 --- a/LUFA/Drivers/USB/Class/Device/MassStorage.c +++ b/LUFA/Drivers/USB/Class/Device/MassStorage.c @@ -102,7 +102,7 @@ bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceIn } if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, - DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) { return false; } diff --git a/LUFA/Drivers/USB/Class/Device/RNDIS.c b/LUFA/Drivers/USB/Class/Device/RNDIS.c index 759e41449555cbc778d8e4dbecdebdbdaf7d5067..fa6aeae14837fe215fbc6e2f61ab609aecc0fc1d 100644 --- a/LUFA/Drivers/USB/Class/Device/RNDIS.c +++ b/LUFA/Drivers/USB/Class/Device/RNDIS.c @@ -148,7 +148,7 @@ bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISIn } if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, - DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) + DoubleBanked ? ENDPOINT_BANK_DOUBLE : ENDPOINT_BANK_SINGLE))) { return false; } diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c index e48d487cee8a2ea4fc6a2f8a45072a681b84defd..40fe3fd864d84fedabb8c8d011e50db1f96e8a11 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.c +++ b/LUFA/Drivers/USB/Class/Host/CDC.c @@ -100,31 +100,59 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { + uint16_t Size; + uint8_t Type; + uint8_t Token; + uint8_t EndpointAddress; + uint8_t InterruptPeriod; + bool DoubleBanked; + if (PipeNum == CDCInterfaceInfo->Config.DataINPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, - DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, - CDCInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataINEndpoint->EndpointSize; + EndpointAddress = DataINEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_BULK; + DoubleBanked = CDCInterfaceInfo->Config.DataINPipeDoubleBank; + InterruptPeriod = 0; CDCInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == CDCInterfaceInfo->Config.DataOUTPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, - DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, - CDCInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataOUTEndpoint->EndpointSize; + EndpointAddress = DataOUTEndpoint->EndpointAddress; + Token = PIPE_TOKEN_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = CDCInterfaceInfo->Config.DataOUTPipeDoubleBank; + InterruptPeriod = 0; CDCInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } else if (PipeNum == CDCInterfaceInfo->Config.NotificationPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, - NotificationEndpoint->EndpointAddress, NotificationEndpoint->EndpointSize, - CDCInterfaceInfo->Config.NotificationPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - Pipe_SetInterruptPeriod(NotificationEndpoint->PollingIntervalMS); + Size = NotificationEndpoint->EndpointSize; + EndpointAddress = NotificationEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_INTERRUPT; + DoubleBanked = CDCInterfaceInfo->Config.NotificationPipeDoubleBank; + InterruptPeriod = NotificationEndpoint->PollingIntervalMS; CDCInterfaceInfo->State.NotificationPipeSize = NotificationEndpoint->EndpointSize; } + else + { + continue; + } + + if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size, + DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE))) + { + return CDC_ENUMERROR_PipeConfigurationFailed; + } + + if (InterruptPeriod) + Pipe_SetInterruptPeriod(InterruptPeriod); } CDCInterfaceInfo->State.ControlInterfaceNumber = CDCControlInterface->InterfaceNumber; diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h index fdbc7aee5cc11edb24baf27dbd8aa137784ea523..016f4a5d16ebff1def838ac509db3bba48a9ee8b 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.h +++ b/LUFA/Drivers/USB/Class/Host/CDC.h @@ -139,6 +139,7 @@ CDC_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */ CDC_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ CDC_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible CDC interface was not found in the device's Configuration Descriptor. */ + CDC_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ }; /* Function Prototypes: */ diff --git a/LUFA/Drivers/USB/Class/Host/HID.c b/LUFA/Drivers/USB/Class/Host/HID.c index bb10ee2dd0f6a500da54f866b6dd3fc6d0c762f5..e6c575e21248d912602de427308bad4b12d4e3b1 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.c +++ b/LUFA/Drivers/USB/Class/Host/HID.c @@ -95,25 +95,49 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { + uint16_t Size; + uint8_t Type; + uint8_t Token; + uint8_t EndpointAddress; + uint8_t InterruptPeriod; + bool DoubleBanked; + if (PipeNum == HIDInterfaceInfo->Config.DataINPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, - DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, - HIDInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - Pipe_SetInterruptPeriod(DataINEndpoint->PollingIntervalMS); - - HIDInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; + Size = DataINEndpoint->EndpointSize; + EndpointAddress = DataINEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_INTERRUPT; + DoubleBanked = HIDInterfaceInfo->Config.DataINPipeDoubleBank; + InterruptPeriod = DataINEndpoint->PollingIntervalMS; + + HIDInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == HIDInterfaceInfo->Config.DataOUTPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_INTERRUPT, PIPE_TOKEN_OUT, - DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, - HIDInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - Pipe_SetInterruptPeriod(DataOUTEndpoint->PollingIntervalMS); - - HIDInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; + Size = DataOUTEndpoint->EndpointSize; + EndpointAddress = DataOUTEndpoint->EndpointAddress; + Token = PIPE_TOKEN_OUT; + Type = EP_TYPE_INTERRUPT; + DoubleBanked = HIDInterfaceInfo->Config.DataOUTPipeDoubleBank; + InterruptPeriod = DataOUTEndpoint->PollingIntervalMS; + + HIDInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; HIDInterfaceInfo->State.DeviceUsesOUTPipe = true; } + else + { + continue; + } + + if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size, + DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE))) + { + return HID_ENUMERROR_PipeConfigurationFailed; + } + + if (InterruptPeriod) + Pipe_SetInterruptPeriod(InterruptPeriod); } HIDInterfaceInfo->State.InterfaceNumber = HIDInterface->InterfaceNumber; diff --git a/LUFA/Drivers/USB/Class/Host/HID.h b/LUFA/Drivers/USB/Class/Host/HID.h index 200cbda40179a3891bc8e751c21d386f5b2a8096..d1392c94b1f319658e85e9698d61d185de7bc8f8 100644 --- a/LUFA/Drivers/USB/Class/Host/HID.h +++ b/LUFA/Drivers/USB/Class/Host/HID.h @@ -145,6 +145,7 @@ HID_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */ HID_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ HID_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor. */ + HID_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ }; /* Function Prototypes: */ diff --git a/LUFA/Drivers/USB/Class/Host/MIDI.c b/LUFA/Drivers/USB/Class/Host/MIDI.c index 87e429010b5ab6aa00d04896bff851d764da81ae..3dd98be1094c810ed523f8fb04680c10d1f5031b 100644 --- a/LUFA/Drivers/USB/Class/Host/MIDI.c +++ b/LUFA/Drivers/USB/Class/Host/MIDI.c @@ -79,22 +79,42 @@ uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceI for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { + uint16_t Size; + uint8_t Type; + uint8_t Token; + uint8_t EndpointAddress; + bool DoubleBanked; + if (PipeNum == MIDIInterfaceInfo->Config.DataINPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, - DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, - MIDIInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataINEndpoint->EndpointSize; + EndpointAddress = DataINEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_BULK; + DoubleBanked = MIDIInterfaceInfo->Config.DataINPipeDoubleBank; MIDIInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == MIDIInterfaceInfo->Config.DataOUTPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, - DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, - MIDIInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataOUTEndpoint->EndpointSize; + EndpointAddress = DataOUTEndpoint->EndpointAddress; + Token = PIPE_TOKEN_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = MIDIInterfaceInfo->Config.DataOUTPipeDoubleBank; MIDIInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } + else + { + continue; + } + + if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size, + DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE))) + { + return MIDI_ENUMERROR_PipeConfigurationFailed; + } } MIDIInterfaceInfo->State.InterfaceNumber = MIDIInterface->InterfaceNumber; diff --git a/LUFA/Drivers/USB/Class/Host/MIDI.h b/LUFA/Drivers/USB/Class/Host/MIDI.h index 83b08d1ae234a659464a8afbed58ee7dfb1c4c5e..7ac4ab7c41a6f51697091b5ca968b11ed58d292e 100644 --- a/LUFA/Drivers/USB/Class/Host/MIDI.h +++ b/LUFA/Drivers/USB/Class/Host/MIDI.h @@ -114,6 +114,7 @@ MIDI_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */ MIDI_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ MIDI_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible MIDI interface was not found in the device's Configuration Descriptor. */ + MIDI_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ }; /* Function Prototypes: */ diff --git a/LUFA/Drivers/USB/Class/Host/MassStorage.c b/LUFA/Drivers/USB/Class/Host/MassStorage.c index ef8053bc3dcf6823816725984ec2ccf92b0e7ecc..682a6964cc609ef3dc8621df44cc29ed5f8357c4 100644 --- a/LUFA/Drivers/USB/Class/Host/MassStorage.c +++ b/LUFA/Drivers/USB/Class/Host/MassStorage.c @@ -79,22 +79,42 @@ uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { + uint16_t Size; + uint8_t Type; + uint8_t Token; + uint8_t EndpointAddress; + bool DoubleBanked; + if (PipeNum == MSInterfaceInfo->Config.DataINPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, - DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, - MSInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataINEndpoint->EndpointSize; + EndpointAddress = DataINEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_BULK; + DoubleBanked = MSInterfaceInfo->Config.DataINPipeDoubleBank; MSInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == MSInterfaceInfo->Config.DataOUTPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, - DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, - MSInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - + Size = DataOUTEndpoint->EndpointSize; + EndpointAddress = DataOUTEndpoint->EndpointAddress; + Token = PIPE_TOKEN_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = MSInterfaceInfo->Config.DataOUTPipeDoubleBank; + MSInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } + else + { + continue; + } + + if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size, + DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE))) + { + return MS_ENUMERROR_PipeConfigurationFailed; + } } MSInterfaceInfo->State.InterfaceNumber = MassStorageInterface->InterfaceNumber; diff --git a/LUFA/Drivers/USB/Class/Host/MassStorage.h b/LUFA/Drivers/USB/Class/Host/MassStorage.h index bef26fd1384055911d43bdd5bca818bf514a6636..5779a4721a441ffc3d0c824deca57fcd6b79c490 100644 --- a/LUFA/Drivers/USB/Class/Host/MassStorage.h +++ b/LUFA/Drivers/USB/Class/Host/MassStorage.h @@ -131,6 +131,7 @@ MS_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */ MS_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ MS_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Mass Storage interface was not found in the device's Configuration Descriptor. */ + MS_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ }; /* Function Prototypes: */ diff --git a/LUFA/Drivers/USB/Class/Host/Printer.c b/LUFA/Drivers/USB/Class/Host/Printer.c index f08ee5bd958d019685ff337a80003be590cec105..922992241e4543b9a24dd400e99c23f9b8837e69 100644 --- a/LUFA/Drivers/USB/Class/Host/Printer.c +++ b/LUFA/Drivers/USB/Class/Host/Printer.c @@ -79,22 +79,42 @@ uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceI for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { + uint16_t Size; + uint8_t Type; + uint8_t Token; + uint8_t EndpointAddress; + bool DoubleBanked; + if (PipeNum == PRNTInterfaceInfo->Config.DataINPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, - DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, - PRNTInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataINEndpoint->EndpointSize; + EndpointAddress = DataINEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_BULK; + DoubleBanked = PRNTInterfaceInfo->Config.DataINPipeDoubleBank; PRNTInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == PRNTInterfaceInfo->Config.DataOUTPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, - DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, - PRNTInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataOUTEndpoint->EndpointSize; + EndpointAddress = DataOUTEndpoint->EndpointAddress; + Token = PIPE_TOKEN_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = PRNTInterfaceInfo->Config.DataOUTPipeDoubleBank; PRNTInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } + else + { + continue; + } + + if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size, + DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE))) + { + return PRNT_ENUMERROR_PipeConfigurationFailed; + } } PRNTInterfaceInfo->State.InterfaceNumber = PrinterInterface->InterfaceNumber; diff --git a/LUFA/Drivers/USB/Class/Host/Printer.h b/LUFA/Drivers/USB/Class/Host/Printer.h index b44ea561e71376c40fd124ee8a5c13136bc46d9c..99df01fa4ea0920b904c40e5f654e18e157d70a3 100644 --- a/LUFA/Drivers/USB/Class/Host/Printer.h +++ b/LUFA/Drivers/USB/Class/Host/Printer.h @@ -114,6 +114,7 @@ PRNT_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */ PRNT_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ PRNT_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Printer interface was not found in the device's Configuration Descriptor. */ + PRNT_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ }; /* Function Prototypes: */ diff --git a/LUFA/Drivers/USB/Class/Host/RNDIS.c b/LUFA/Drivers/USB/Class/Host/RNDIS.c index e3948ec6c1927d2305dd7422e6309a99e9057f9c..aae445a913e5591674be79b31392d8e6c020a158 100644 --- a/LUFA/Drivers/USB/Class/Host/RNDIS.c +++ b/LUFA/Drivers/USB/Class/Host/RNDIS.c @@ -102,31 +102,59 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { + uint16_t Size; + uint8_t Type; + uint8_t Token; + uint8_t EndpointAddress; + uint8_t InterruptPeriod; + bool DoubleBanked; + if (PipeNum == RNDISInterfaceInfo->Config.DataINPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, - DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, - RNDISInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataINEndpoint->EndpointSize; + EndpointAddress = DataINEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_BULK; + DoubleBanked = RNDISInterfaceInfo->Config.DataINPipeDoubleBank; + InterruptPeriod = 0; RNDISInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == RNDISInterfaceInfo->Config.DataOUTPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, - DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, - RNDISInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataOUTEndpoint->EndpointSize; + EndpointAddress = DataOUTEndpoint->EndpointAddress; + Token = PIPE_TOKEN_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = RNDISInterfaceInfo->Config.DataOUTPipeDoubleBank; + InterruptPeriod = 0; RNDISInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } else if (PipeNum == RNDISInterfaceInfo->Config.NotificationPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, - NotificationEndpoint->EndpointAddress, NotificationEndpoint->EndpointSize, - RNDISInterfaceInfo->Config.NotificationPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - Pipe_SetInterruptPeriod(NotificationEndpoint->PollingIntervalMS); + Size = NotificationEndpoint->EndpointSize; + EndpointAddress = NotificationEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_INTERRUPT; + DoubleBanked = RNDISInterfaceInfo->Config.NotificationPipeDoubleBank; + InterruptPeriod = NotificationEndpoint->PollingIntervalMS; RNDISInterfaceInfo->State.NotificationPipeSize = NotificationEndpoint->EndpointSize; } + else + { + continue; + } + + if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size, + DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE))) + { + return CDC_ENUMERROR_PipeConfigurationFailed; + } + + if (InterruptPeriod) + Pipe_SetInterruptPeriod(InterruptPeriod); } RNDISInterfaceInfo->State.ControlInterfaceNumber = RNDISControlInterface->InterfaceNumber; diff --git a/LUFA/Drivers/USB/Class/Host/RNDIS.h b/LUFA/Drivers/USB/Class/Host/RNDIS.h index b7f844e420672796122946f898a8f2f63bef1d22..6eaf131eac0011007b4369e143391c7e1c3d3324 100644 --- a/LUFA/Drivers/USB/Class/Host/RNDIS.h +++ b/LUFA/Drivers/USB/Class/Host/RNDIS.h @@ -128,6 +128,7 @@ RNDIS_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully. */ RNDIS_ENUMERROR_InvalidConfigDescriptor = 1, /**< The device returned an invalid Configuration Descriptor. */ RNDIS_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible RNDIS interface was not found in the device's Configuration Descriptor. */ + RNDIS_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ }; /* Macros: */ diff --git a/LUFA/Drivers/USB/Class/Host/StillImage.c b/LUFA/Drivers/USB/Class/Host/StillImage.c index d3dda8fe3bcafdb89ca3cf2fbc909dd1e0f1cb58..45c3872bbdaef017e0281e409dd68a8f1c04d06f 100644 --- a/LUFA/Drivers/USB/Class/Host/StillImage.c +++ b/LUFA/Drivers/USB/Class/Host/StillImage.c @@ -88,31 +88,59 @@ uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, for (uint8_t PipeNum = 1; PipeNum < PIPE_TOTAL_PIPES; PipeNum++) { + uint16_t Size; + uint8_t Type; + uint8_t Token; + uint8_t EndpointAddress; + uint8_t InterruptPeriod; + bool DoubleBanked; + if (PipeNum == SIInterfaceInfo->Config.DataINPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_IN, - DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, - SIInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataINEndpoint->EndpointSize; + EndpointAddress = DataINEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_BULK; + DoubleBanked = SIInterfaceInfo->Config.DataINPipeDoubleBank; + InterruptPeriod = 0; SIInterfaceInfo->State.DataINPipeSize = DataINEndpoint->EndpointSize; } else if (PipeNum == SIInterfaceInfo->Config.DataOUTPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_BULK, PIPE_TOKEN_OUT, - DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, - SIInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); + Size = DataOUTEndpoint->EndpointSize; + EndpointAddress = DataOUTEndpoint->EndpointAddress; + Token = PIPE_TOKEN_OUT; + Type = EP_TYPE_BULK; + DoubleBanked = SIInterfaceInfo->Config.DataOUTPipeDoubleBank; + InterruptPeriod = 0; SIInterfaceInfo->State.DataOUTPipeSize = DataOUTEndpoint->EndpointSize; } else if (PipeNum == SIInterfaceInfo->Config.EventsPipeNumber) { - Pipe_ConfigurePipe(PipeNum, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN, - EventsEndpoint->EndpointAddress, EventsEndpoint->EndpointSize, - SIInterfaceInfo->Config.EventsPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE); - Pipe_SetInterruptPeriod(EventsEndpoint->PollingIntervalMS); + Size = EventsEndpoint->EndpointSize; + EndpointAddress = EventsEndpoint->EndpointAddress; + Token = PIPE_TOKEN_IN; + Type = EP_TYPE_INTERRUPT; + DoubleBanked = SIInterfaceInfo->Config.EventsPipeDoubleBank; + InterruptPeriod = EventsEndpoint->PollingIntervalMS; SIInterfaceInfo->State.EventsPipeSize = EventsEndpoint->EndpointSize; } + else + { + continue; + } + + if (!(Pipe_ConfigurePipe(PipeNum, Type, Token, EndpointAddress, Size, + DoubleBanked ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE))) + { + return SI_ENUMERROR_PipeConfigurationFailed; + } + + if (InterruptPeriod) + Pipe_SetInterruptPeriod(InterruptPeriod); } SIInterfaceInfo->State.InterfaceNumber = StillImageInterface->InterfaceNumber; diff --git a/LUFA/Drivers/USB/Class/Host/StillImage.h b/LUFA/Drivers/USB/Class/Host/StillImage.h index 2d1b41e2de460ba8838e507f41e8708e8b77522f..39ab65ddf75d24451798c6b11d200e460a61d3c4 100644 --- a/LUFA/Drivers/USB/Class/Host/StillImage.h +++ b/LUFA/Drivers/USB/Class/Host/StillImage.h @@ -127,6 +127,7 @@ SI_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Still Image interface was not found in the device's * Configuration Descriptor. */ + SI_ENUMERROR_PipeConfigurationFailed = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ }; /* Function Prototypes: */ diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 8be0c9cc9fe32d90d5c9d263e1a3f4477556b7cc..494f1797be5c3d9aaedb263333018f56eaf5c313 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -16,7 +16,8 @@ * * <b>Changed:</b> * - Core: - * - None + * - Refactored Host mode Class Driver *_Host_ConfigurePipes() routines to be more space efficient when compiled + * - Added new *_ENUMERROR_PipeConfigurationFailed error codes for the *_Host_ConfigurePipes() routines * - Library Applications: * - Changed the XPLAINBridge software UART to use the regular CTC mode instead of the alternative CTC mode * via the Input Capture register, to reduce user confusion