Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
05fa6e0c
Commit
05fa6e0c
authored
Jul 26, 2009
by
Dean Camera
Browse files
Corrected new Pipe_IsEndpointBound() function.
Completed host CDC class driver enumeration code.
parent
cbbd3d74
Changes
4
Hide whitespace changes
Inline
Side-by-side
Demos/Host/ClassDriver/CDCHost/CDCHost.c
View file @
05fa6e0c
...
@@ -54,6 +54,7 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface =
...
@@ -54,6 +54,7 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface =
// Leave all state values to their defaults
// Leave all state values to their defaults
}
}
};
};
/** Main program entry point. This routine configures the hardware required by the application, then
/** Main program entry point. This routine configures the hardware required by the application, then
* starts the scheduler to run the application tasks.
* starts the scheduler to run the application tasks.
...
@@ -71,7 +72,9 @@ int main(void)
...
@@ -71,7 +72,9 @@ int main(void)
switch
(
USB_HostState
)
switch
(
USB_HostState
)
{
{
case
HOST_STATE_Addressed
:
case
HOST_STATE_Addressed
:
if
(
!
(
CDC_Host_ConfigurePipes
(
&
VirtualSerial_CDC_Interface
)))
LEDs_SetAllLEDs
(
LEDMASK_USB_ENUMERATING
);
if
(
CDC_Host_ConfigurePipes
(
&
VirtualSerial_CDC_Interface
,
512
)
!=
CDC_ENUMERROR_NoError
)
{
{
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
...
@@ -88,9 +91,6 @@ int main(void)
...
@@ -88,9 +91,6 @@ int main(void)
USB_HostState
=
HOST_STATE_Configured
;
USB_HostState
=
HOST_STATE_Configured
;
break
;
break
;
case
HOST_STATE_Configured
:
case
HOST_STATE_Configured
:
USB_HostState
=
HOST_STATE_Ready
;
break
;
case
HOST_STATE_Ready
:
break
;
break
;
}
}
...
...
LUFA/Drivers/USB/Class/Host/CDC.c
View file @
05fa6e0c
...
@@ -34,16 +34,16 @@
...
@@ -34,16 +34,16 @@
#define INCLUDE_FROM_CDC_CLASS_HOST_C
#define INCLUDE_FROM_CDC_CLASS_HOST_C
#include "CDC.h"
#include "CDC.h"
static
uint8_t
CDC_Host_
ProcessConfigDescriptor
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
)
uint8_t
CDC_Host_
ConfigurePipes
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
,
uint16_t
MaxConfigBufferSize
)
{
{
uint8_t
*
ConfigDescriptorData
;
uint8_t
*
ConfigDescriptorData
;
uint16_t
ConfigDescriptorSize
;
uint16_t
ConfigDescriptorSize
;
uint8_t
FoundEndpoints
=
0
;
uint8_t
FoundEndpoints
=
0
;
if
(
USB_GetDeviceConfigDescriptor
(
1
,
&
ConfigDescriptorSize
,
NULL
)
!=
HOST_SENDCONTROL_Successful
)
if
(
USB_GetDeviceConfigDescriptor
(
1
,
&
ConfigDescriptorSize
,
NULL
)
!=
HOST_SENDCONTROL_Successful
)
return
CDC_ENUMERROR_ControlError
;
return
CDC_ENUMERROR_ControlError
;
if
(
ConfigDescriptorSize
>
512
)
if
(
ConfigDescriptorSize
>
MaxConfigBufferSize
)
return
CDC_ENUMERROR_DescriptorTooLarge
;
return
CDC_ENUMERROR_DescriptorTooLarge
;
ConfigDescriptorData
=
alloca
(
ConfigDescriptorSize
);
ConfigDescriptorData
=
alloca
(
ConfigDescriptorSize
);
...
@@ -64,10 +64,8 @@ static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInt
...
@@ -64,10 +64,8 @@ static uint8_t CDC_Host_ProcessConfigDescriptor(USB_ClassInfo_CDC_Host_t* CDCInt
if
(
USB_GetNextDescriptorComp
(
&
ConfigDescriptorSize
,
&
ConfigDescriptorData
,
if
(
USB_GetNextDescriptorComp
(
&
ConfigDescriptorSize
,
&
ConfigDescriptorData
,
DComp_CDC_Host_NextInterfaceCDCDataEndpoint
)
!=
DESCRIPTOR_SEARCH_COMP_Found
)
DComp_CDC_Host_NextInterfaceCDCDataEndpoint
)
!=
DESCRIPTOR_SEARCH_COMP_Found
)
{
{
/* Check to see if the control interface's notification pipe has been found, if so search for the data interface */
if
(
FoundEndpoints
&
CDC_FOUND_DATAPIPE_NOTIFICATION
)
if
(
FoundEndpoints
&
CDC_FOUND_DATAPIPE_NOTIFICATION
)
{
{
/* Get the next CDC data interface from the configuration descriptor (CDC class has two CDC interfaces) */
if
(
USB_GetNextDescriptorComp
(
&
ConfigDescriptorSize
,
&
ConfigDescriptorData
,
if
(
USB_GetNextDescriptorComp
(
&
ConfigDescriptorSize
,
&
ConfigDescriptorData
,
DComp_CDC_Host_NextCDCDataInterface
)
!=
DESCRIPTOR_SEARCH_COMP_Found
)
DComp_CDC_Host_NextCDCDataInterface
)
!=
DESCRIPTOR_SEARCH_COMP_Found
)
{
{
...
@@ -179,12 +177,15 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
...
@@ -179,12 +177,15 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
if
(
DESCRIPTOR_TYPE
(
CurrentDescriptor
)
==
DTYPE_Endpoint
)
if
(
DESCRIPTOR_TYPE
(
CurrentDescriptor
)
==
DTYPE_Endpoint
)
{
{
USB_Descriptor_Endpoint_t
*
CurrentEndpoint
=
DESCRIPTOR_PCAST
(
CurrentDescriptor
,
USB_Descriptor_Endpoint_t
*
CurrentEndpoint
=
DESCRIPTOR_PCAST
(
CurrentDescriptor
,
USB_Descriptor_Endpoint_t
)
USB_Descriptor_Endpoint_t
)
;
uint8_t
EndpointType
=
(
CurrentEndpoint
->
Attributes
&
EP_TYPE_MASK
);
uint8_t
EndpointType
=
(
CurrentEndpoint
->
Attributes
&
EP_TYPE_MASK
);
if
((
EndpointType
==
EP_TYPE_BULK
)
||
(
EndpointType
==
EP_TYPE_INTERRUPT
))
if
(((
EndpointType
==
EP_TYPE_BULK
)
||
(
EndpointType
==
EP_TYPE_INTERRUPT
))
&&
return
DESCRIPTOR_SEARCH_Found
;
!
(
Pipe_IsEndpointBound
(
CurrentEndpoint
->
EndpointAddress
)))
{
return
DESCRIPTOR_SEARCH_Found
;
}
}
}
else
if
(
DESCRIPTOR_TYPE
(
CurrentDescriptor
)
==
DTYPE_Interface
)
else
if
(
DESCRIPTOR_TYPE
(
CurrentDescriptor
)
==
DTYPE_Interface
)
{
{
...
@@ -196,27 +197,7 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
...
@@ -196,27 +197,7 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
void
CDC_Host_USBTask
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
)
void
CDC_Host_USBTask
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
)
{
{
uint8_t
ErrorCode
;
switch
(
USB_HostState
)
{
case
HOST_STATE_Addressed
:
if
((
ErrorCode
=
CDC_Host_ProcessConfigDescriptor
(
CDCInterfaceInfo
))
!=
CDC_ENUMERROR_NoError
)
{
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
}
if
((
ErrorCode
=
USB_Host_SetDeviceConfiguration
(
1
))
!=
HOST_SENDCONTROL_Successful
)
{
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
}
USB_HostState
=
HOST_STATE_Configured
;
break
;
case
HOST_STATE_Configured
:
USB_HostState
=
HOST_STATE_Ready
;
break
;
}
}
}
#endif
#endif
LUFA/Drivers/USB/Class/Host/CDC.h
View file @
05fa6e0c
...
@@ -136,12 +136,14 @@
...
@@ -136,12 +136,14 @@
/* Function Prototypes: */
/* Function Prototypes: */
#if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)
#if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)
static
uint8_t
CDC_Host_ProcessConfigDescriptor
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
);
static
uint8_t
DComp_CDC_Host_NextCDCControlInterface
(
void
*
CurrentDescriptor
);
static
uint8_t
DComp_CDC_Host_NextCDCControlInterface
(
void
*
CurrentDescriptor
);
static
uint8_t
DComp_CDC_Host_NextCDCDataInterface
(
void
*
CurrentDescriptor
);
static
uint8_t
DComp_CDC_Host_NextCDCDataInterface
(
void
*
CurrentDescriptor
);
static
uint8_t
DComp_CDC_Host_NextInterfaceCDCDataEndpoint
(
void
*
CurrentDescriptor
);
static
uint8_t
DComp_CDC_Host_NextInterfaceCDCDataEndpoint
(
void
*
CurrentDescriptor
);
#endif
#endif
uint8_t
CDC_Host_ConfigurePipes
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
,
uint16_t
MaxConfigBufferSize
);
void
CDC_Host_USBTask
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
);
void
EVENT_CDC_Host_ControLineStateChanged
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
);
void
EVENT_CDC_Host_ControLineStateChanged
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
);
uint8_t
CDC_Host_SetLineEncoding
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
);
uint8_t
CDC_Host_SetLineEncoding
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
);
...
...
LUFA/Drivers/USB/LowLevel/Pipe.c
View file @
05fa6e0c
...
@@ -72,13 +72,13 @@ void Pipe_ClearPipes(void)
...
@@ -72,13 +72,13 @@ void Pipe_ClearPipes(void)
bool
Pipe_IsEndpointBound
(
uint8_t
EndpointAddress
)
bool
Pipe_IsEndpointBound
(
uint8_t
EndpointAddress
)
{
{
uint8_t
PrevPipeNumber
=
Pipe_Get
PipeNumber
();
uint8_t
PrevPipeNumber
=
Pipe_Get
CurrentPipe
();
for
(
uint8_t
PNum
=
0
;
PNum
<
PIPE_TOTAL_PIPES
;
PNum
++
)
for
(
uint8_t
PNum
=
0
;
PNum
<
PIPE_TOTAL_PIPES
;
PNum
++
)
{
{
Pipe_SelectPipe
(
PNum
);
Pipe_SelectPipe
(
PNum
);
if
(
Pipe_IsConfigured
()
&&
(
Pipe_BoundEndpoint
Address
()
==
EndpointAddress
))
if
(
Pipe_IsConfigured
()
&&
(
Pipe_BoundEndpoint
Number
()
==
EndpointAddress
))
return
true
;
return
true
;
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment