Move and rename DevChaper9.c/.h and HostChapter9.c/.h to the HighLevel directory, new named DeviceStandardReq.c/.h and HostStandardReq.c/.h.
Rename LowLevel.c/.h to USBController.c/.h. Remove dependancies on the complete <avr/io.h> header in the HighLevel USB driver directory, to ensure less work is required in later (possible) ports.
This commit is contained in:
parent
5f57785404
commit
99d8a39363
20 changed files with 72 additions and 53 deletions
|
|
@ -1,395 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2010.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this
|
||||
software and its documentation for any purpose is hereby granted
|
||||
without fee, 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.
|
||||
*/
|
||||
|
||||
#define __INCLUDE_FROM_USB_DRIVER
|
||||
#include "../HighLevel/USBMode.h"
|
||||
|
||||
#if defined(USB_CAN_BE_DEVICE)
|
||||
|
||||
#define __INCLUDE_FROM_DEVCHAPTER9_C
|
||||
#include "DevChapter9.h"
|
||||
|
||||
uint8_t USB_ConfigurationNumber;
|
||||
|
||||
#if !defined(NO_DEVICE_SELF_POWER)
|
||||
bool USB_CurrentlySelfPowered;
|
||||
#endif
|
||||
|
||||
#if !defined(NO_DEVICE_REMOTE_WAKEUP)
|
||||
bool USB_RemoteWakeupEnabled;
|
||||
#endif
|
||||
|
||||
void USB_Device_ProcessControlRequest(void)
|
||||
{
|
||||
bool RequestHandled = false;
|
||||
uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest;
|
||||
|
||||
for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++)
|
||||
*(RequestHeader++) = Endpoint_Read_Byte();
|
||||
|
||||
uint8_t bmRequestType = USB_ControlRequest.bmRequestType;
|
||||
|
||||
switch (USB_ControlRequest.bRequest)
|
||||
{
|
||||
case REQ_GetStatus:
|
||||
if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
|
||||
(bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT)))
|
||||
{
|
||||
USB_Device_GetStatus();
|
||||
RequestHandled = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case REQ_ClearFeature:
|
||||
case REQ_SetFeature:
|
||||
if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) ||
|
||||
(bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT)))
|
||||
{
|
||||
USB_Device_ClearSetFeature();
|
||||
RequestHandled = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case REQ_SetAddress:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
|
||||
{
|
||||
USB_Device_SetAddress();
|
||||
RequestHandled = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case REQ_GetDescriptor:
|
||||
if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
|
||||
(bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE)))
|
||||
{
|
||||
USB_Device_GetDescriptor();
|
||||
RequestHandled = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case REQ_GetConfiguration:
|
||||
if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))
|
||||
{
|
||||
USB_Device_GetConfiguration();
|
||||
RequestHandled = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case REQ_SetConfiguration:
|
||||
if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
|
||||
{
|
||||
USB_Device_SetConfiguration();
|
||||
RequestHandled = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(RequestHandled))
|
||||
EVENT_USB_Device_UnhandledControlRequest();
|
||||
|
||||
if (Endpoint_IsSETUPReceived())
|
||||
{
|
||||
Endpoint_StallTransaction();
|
||||
Endpoint_ClearSETUP();
|
||||
}
|
||||
}
|
||||
|
||||
static void USB_Device_SetAddress(void)
|
||||
{
|
||||
uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
Endpoint_ClearStatusStage();
|
||||
|
||||
while (!(Endpoint_IsINReady()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
|
||||
|
||||
UDADDR = ((1 << ADDEN) | DeviceAddress);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void USB_Device_SetConfiguration(void)
|
||||
{
|
||||
#if defined(FIXED_NUM_CONFIGURATIONS)
|
||||
if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS)
|
||||
return;
|
||||
#else
|
||||
#if defined(USE_FLASH_DESCRIPTORS)
|
||||
#define MemoryAddressSpace MEMSPACE_FLASH
|
||||
#elif defined(USE_EEPROM_DESCRIPTORS)
|
||||
#define MemoryAddressSpace MEMSPACE_EEPROM
|
||||
#elif defined(USE_SRAM_DESCRIPTORS)
|
||||
#define MemoryAddressSpace MEMSPACE_SRAM
|
||||
#else
|
||||
uint8_t MemoryAddressSpace;
|
||||
#endif
|
||||
|
||||
USB_Descriptor_Device_t* DevDescriptorPtr;
|
||||
|
||||
if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr
|
||||
#if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
|
||||
, &MemoryAddressSpace
|
||||
#endif
|
||||
) == NO_DESCRIPTOR)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (MemoryAddressSpace == MEMSPACE_FLASH)
|
||||
{
|
||||
if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
|
||||
return;
|
||||
}
|
||||
else if (MemoryAddressSpace == MEMSPACE_EEPROM)
|
||||
{
|
||||
if (((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
USB_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue;
|
||||
|
||||
Endpoint_ClearStatusStage();
|
||||
|
||||
USB_DeviceState = (USB_ConfigurationNumber) ? DEVICE_STATE_Configured : DEVICE_STATE_Addressed;
|
||||
|
||||
EVENT_USB_Device_ConfigurationChanged();
|
||||
}
|
||||
|
||||
void USB_Device_GetConfiguration(void)
|
||||
{
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
Endpoint_Write_Byte(USB_ConfigurationNumber);
|
||||
Endpoint_ClearIN();
|
||||
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
|
||||
static char USB_Device_NibbleToASCII(uint8_t Nibble)
|
||||
{
|
||||
Nibble = ((Nibble & 0x0F) + '0');
|
||||
return (Nibble > '9') ? (Nibble + ('A' - '9' - 1)) : Nibble;
|
||||
}
|
||||
|
||||
static void USB_Device_GetInternalSerialDescriptor(void)
|
||||
{
|
||||
struct
|
||||
{
|
||||
USB_Descriptor_Header_t Header;
|
||||
int16_t UnicodeString[20];
|
||||
} SignatureDescriptor;
|
||||
|
||||
SignatureDescriptor.Header.Type = DTYPE_String;
|
||||
SignatureDescriptor.Header.Size = sizeof(SignatureDescriptor);
|
||||
|
||||
uint8_t SigReadAddress = 0x0E;
|
||||
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
|
||||
{
|
||||
for (uint8_t SerialCharNum = 0; SerialCharNum < 20; SerialCharNum++)
|
||||
{
|
||||
uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
|
||||
|
||||
if (SerialCharNum & 0x01)
|
||||
{
|
||||
SerialByte >>= 4;
|
||||
SigReadAddress++;
|
||||
}
|
||||
|
||||
SignatureDescriptor.UnicodeString[SerialCharNum] = USB_Device_NibbleToASCII(SerialByte);
|
||||
}
|
||||
}
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
|
||||
|
||||
Endpoint_ClearOUT();
|
||||
}
|
||||
#endif
|
||||
|
||||
static void USB_Device_GetDescriptor(void)
|
||||
{
|
||||
void* DescriptorPointer;
|
||||
uint16_t DescriptorSize;
|
||||
|
||||
#if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
|
||||
uint8_t DescriptorAddressSpace;
|
||||
#endif
|
||||
|
||||
#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
|
||||
if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
|
||||
{
|
||||
USB_Device_GetInternalSerialDescriptor();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex,
|
||||
&DescriptorPointer
|
||||
#if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
|
||||
, &DescriptorAddressSpace
|
||||
#endif
|
||||
)) == NO_DESCRIPTOR)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
#if defined(USE_RAM_DESCRIPTORS)
|
||||
Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
|
||||
#elif defined(USE_EEPROM_DESCRIPTORS)
|
||||
Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
|
||||
#elif defined(USE_FLASH_DESCRIPTORS)
|
||||
Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
|
||||
#else
|
||||
if (DescriptorAddressSpace == MEMSPACE_FLASH)
|
||||
Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
|
||||
else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
|
||||
Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
|
||||
else
|
||||
Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
|
||||
#endif
|
||||
|
||||
Endpoint_ClearOUT();
|
||||
}
|
||||
|
||||
static void USB_Device_GetStatus(void)
|
||||
{
|
||||
uint8_t CurrentStatus = 0;
|
||||
|
||||
switch (USB_ControlRequest.bmRequestType)
|
||||
{
|
||||
#if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP)
|
||||
case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE):
|
||||
#if !defined(NO_DEVICE_SELF_POWER)
|
||||
if (USB_CurrentlySelfPowered)
|
||||
CurrentStatus |= FEATURE_SELFPOWERED_ENABLED;
|
||||
#endif
|
||||
|
||||
#if !defined(NO_DEVICE_REMOTE_WAKEUP)
|
||||
if (USB_RemoteWakeupEnabled)
|
||||
CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED;
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
#if !defined(CONTROL_ONLY_DEVICE)
|
||||
case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):
|
||||
Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
|
||||
|
||||
CurrentStatus = Endpoint_IsStalled();
|
||||
|
||||
Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
|
||||
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
Endpoint_Write_Word_LE(CurrentStatus);
|
||||
Endpoint_ClearIN();
|
||||
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
static void USB_Device_ClearSetFeature(void)
|
||||
{
|
||||
switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT)
|
||||
{
|
||||
#if !defined(NO_DEVICE_REMOTE_WAKEUP)
|
||||
case REQREC_DEVICE:
|
||||
if ((uint8_t)USB_ControlRequest.wValue == FEATURE_REMOTE_WAKEUP)
|
||||
USB_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
|
||||
else
|
||||
return;
|
||||
|
||||
break;
|
||||
#endif
|
||||
#if !defined(CONTROL_ONLY_DEVICE)
|
||||
case REQREC_ENDPOINT:
|
||||
if ((uint8_t)USB_ControlRequest.wValue == FEATURE_ENDPOINT_HALT)
|
||||
{
|
||||
uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
|
||||
|
||||
if (EndpointIndex == ENDPOINT_CONTROLEP)
|
||||
return;
|
||||
|
||||
Endpoint_SelectEndpoint(EndpointIndex);
|
||||
|
||||
if (!(Endpoint_IsEnabled()))
|
||||
return;
|
||||
|
||||
if (USB_ControlRequest.bRequest == REQ_SetFeature)
|
||||
{
|
||||
Endpoint_StallTransaction();
|
||||
}
|
||||
else
|
||||
{
|
||||
Endpoint_ClearStall();
|
||||
Endpoint_ResetFIFO(EndpointIndex);
|
||||
Endpoint_ResetDataToggle();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
|
||||
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,164 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2010.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this
|
||||
software and its documentation for any purpose is hereby granted
|
||||
without fee, 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.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief USB device standard request management.
|
||||
*
|
||||
* This file contains the function prototypes necessary for the processing of incoming standard control requests
|
||||
* when the library is in USB device mode.
|
||||
*
|
||||
* \note This file should not be included directly. It is automatically included as needed by the USB driver
|
||||
* dispatch header located in LUFA/Drivers/USB/USB.h.
|
||||
*/
|
||||
|
||||
#ifndef __DEVCHAPTER9_H__
|
||||
#define __DEVCHAPTER9_H__
|
||||
|
||||
/* Includes: */
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include <avr/eeprom.h>
|
||||
#include <avr/boot.h>
|
||||
#include <util/atomic.h>
|
||||
|
||||
#include "../HighLevel/StdDescriptors.h"
|
||||
#include "../HighLevel/Events.h"
|
||||
#include "../HighLevel/StdRequestType.h"
|
||||
#include "../HighLevel/USBTask.h"
|
||||
#include "LowLevel.h"
|
||||
|
||||
/* Enable C linkage for C++ Compilers: */
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Preprocessor Checks: */
|
||||
#if !defined(__INCLUDE_FROM_USB_DRIVER)
|
||||
#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
|
||||
#endif
|
||||
|
||||
/* Public Interface - May be used in end-application: */
|
||||
/* Macros: */
|
||||
#if defined(USE_SINGLE_DEVICE_CONFIGURATION)
|
||||
#define FIXED_NUM_CONFIGURATIONS 1
|
||||
#endif
|
||||
|
||||
/* Enums: */
|
||||
#if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
|
||||
/** Enum for the possible descriptor memory spaces, for the MemoryAddressSpace of the
|
||||
* \ref CALLBACK_USB_GetDescriptor() function. This can be used when none of the USE_*_DESCRIPTORS
|
||||
* compile time options are used, to indicate in which memory space the descriptor is stored.
|
||||
*
|
||||
* \ingroup Group_Device
|
||||
*/
|
||||
enum USB_DescriptorMemorySpaces_t
|
||||
{
|
||||
MEMSPACE_FLASH = 0, /**< Indicates the requested descriptor is located in FLASH memory. */
|
||||
MEMSPACE_EEPROM = 1, /**< Indicates the requested descriptor is located in EEPROM memory. */
|
||||
MEMSPACE_RAM = 2, /**< Indicates the requested descriptor is located in RAM memory. */
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Global Variables: */
|
||||
/** Indicates the currently set configuration number of the device. USB devices may have several
|
||||
* different configurations which the host can select between; this indicates the currently selected
|
||||
* value, or 0 if no configuration has been selected.
|
||||
*
|
||||
* \note This variable should be treated as read-only in the user application, and never manually
|
||||
* changed in value.
|
||||
*
|
||||
* \ingroup Group_Device
|
||||
*/
|
||||
extern uint8_t USB_ConfigurationNumber;
|
||||
|
||||
#if !defined(NO_DEVICE_REMOTE_WAKEUP)
|
||||
/** Indicates if the host is currently allowing the device to issue remote wakeup events. If this
|
||||
* flag is cleared, the device should not issue remote wakeup events to the host.
|
||||
*
|
||||
* \note This variable should be treated as read-only in the user application, and never manually
|
||||
* changed in value.
|
||||
* \n\n
|
||||
*
|
||||
* \note To reduce FLASH usage of the compiled applications where Remote Wakeup is not supported,
|
||||
* this global and the underlying management code can be disabled by defining the
|
||||
* NO_DEVICE_REMOTE_WAKEUP token in the project makefile and passing it to the compiler via
|
||||
* the -D switch.
|
||||
*
|
||||
* \ingroup Group_Device
|
||||
*/
|
||||
extern bool USB_RemoteWakeupEnabled;
|
||||
#endif
|
||||
|
||||
#if !defined(NO_DEVICE_SELF_POWER)
|
||||
/** Indicates if the device is currently being powered by its own power supply, rather than being
|
||||
* powered by the host's USB supply. This flag should remain cleared if the device does not
|
||||
* support self powered mode, as indicated in the device descriptors.
|
||||
*
|
||||
* \ingroup Group_Device
|
||||
*/
|
||||
extern bool USB_CurrentlySelfPowered;
|
||||
#endif
|
||||
|
||||
/* Private Interface - For use in library only: */
|
||||
#if !defined(__DOXYGEN__)
|
||||
#if defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
|
||||
#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
|
||||
#elif defined(USE_RAM_DESCRIPTORS) && defined(USE_FLASH_DESCRIPTORS)
|
||||
#error USE_RAM_DESCRIPTORS and USE_FLASH_DESCRIPTORS are mutually exclusive.
|
||||
#elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
|
||||
#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
|
||||
#elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS)
|
||||
#error Only one of the USE_*_DESCRIPTORS modes should be selected.
|
||||
#endif
|
||||
|
||||
/* Function Prototypes: */
|
||||
void USB_Device_ProcessControlRequest(void);
|
||||
|
||||
#if defined(__INCLUDE_FROM_DEVCHAPTER9_C)
|
||||
static void USB_Device_SetAddress(void);
|
||||
static void USB_Device_SetConfiguration(void);
|
||||
static void USB_Device_GetConfiguration(void);
|
||||
static void USB_Device_GetDescriptor(void);
|
||||
static void USB_Device_GetStatus(void);
|
||||
static void USB_Device_ClearSetFeature(void);
|
||||
|
||||
#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
|
||||
static char USB_Device_NibbleToASCII(uint8_t Nibble) ATTR_ALWAYS_INLINE;
|
||||
static void USB_Device_GetInternalSerialDescriptor(void);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Disable C linkage for C++ Compilers: */
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -191,8 +191,11 @@
|
|||
/* Private Interface - For use in library only: */
|
||||
#if !defined(__DOXYGEN__)
|
||||
/* Macros: */
|
||||
#define USB_Device_SetLowSpeed() MACROS{ UDCON |= (1 << LSM); }MACROE
|
||||
#define USB_Device_SetFullSpeed() MACROS{ UDCON &= ~(1 << LSM); }MACROE
|
||||
#define USB_Device_SetLowSpeed() MACROS{ UDCON |= (1 << LSM); }MACROE
|
||||
#define USB_Device_SetFullSpeed() MACROS{ UDCON &= ~(1 << LSM); }MACROE
|
||||
|
||||
#define USB_Device_SetDeviceAddress(addr) MACROS{ UDADDR = ((1 << ADDEN) | (addr & 0x7F)); }MACROE
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,179 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2010.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this
|
||||
software and its documentation for any purpose is hereby granted
|
||||
without fee, 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.
|
||||
*/
|
||||
|
||||
#define __INCLUDE_FROM_USB_DRIVER
|
||||
#include "../HighLevel/USBMode.h"
|
||||
|
||||
#if defined(USB_CAN_BE_HOST)
|
||||
|
||||
#define __INCLUDE_FROM_HOSTCHAPTER9_C
|
||||
#include "HostChapter9.h"
|
||||
|
||||
uint8_t USB_Host_SendControlRequest(void* BufferPtr)
|
||||
{
|
||||
uint8_t* HeaderStream = (uint8_t*)&USB_ControlRequest;
|
||||
uint8_t* DataStream = (uint8_t*)BufferPtr;
|
||||
bool BusSuspended = USB_Host_IsBusSuspended();
|
||||
uint8_t ReturnStatus = HOST_SENDCONTROL_Successful;
|
||||
uint16_t DataLen = USB_ControlRequest.wLength;
|
||||
|
||||
USB_Host_ResumeBus();
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
Pipe_SetPipeToken(PIPE_TOKEN_SETUP);
|
||||
Pipe_ClearErrorFlags();
|
||||
|
||||
Pipe_Unfreeze();
|
||||
|
||||
for (uint8_t HeaderByte = 0; HeaderByte < sizeof(USB_Request_Header_t); HeaderByte++)
|
||||
Pipe_Write_Byte(*(HeaderStream++));
|
||||
|
||||
Pipe_ClearSETUP();
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
Pipe_Freeze();
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST)
|
||||
{
|
||||
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
||||
|
||||
if (DataStream != NULL)
|
||||
{
|
||||
while (DataLen)
|
||||
{
|
||||
Pipe_Unfreeze();
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
if (!(Pipe_BytesInPipe()))
|
||||
DataLen = 0;
|
||||
|
||||
while (Pipe_BytesInPipe() && DataLen)
|
||||
{
|
||||
*(DataStream++) = Pipe_Read_Byte();
|
||||
DataLen--;
|
||||
}
|
||||
|
||||
Pipe_Freeze();
|
||||
Pipe_ClearIN();
|
||||
}
|
||||
}
|
||||
|
||||
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
||||
Pipe_Unfreeze();
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
Pipe_ClearOUT();
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DataStream != NULL)
|
||||
{
|
||||
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
||||
Pipe_Unfreeze();
|
||||
|
||||
while (DataLen)
|
||||
{
|
||||
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize))
|
||||
{
|
||||
Pipe_Write_Byte(*(DataStream++));
|
||||
DataLen--;
|
||||
}
|
||||
|
||||
Pipe_ClearOUT();
|
||||
}
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
Pipe_Freeze();
|
||||
}
|
||||
|
||||
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
||||
Pipe_Unfreeze();
|
||||
|
||||
if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
|
||||
goto End_Of_Control_Send;
|
||||
|
||||
Pipe_ClearIN();
|
||||
}
|
||||
|
||||
End_Of_Control_Send:
|
||||
Pipe_Freeze();
|
||||
|
||||
if (BusSuspended)
|
||||
USB_Host_SuspendBus();
|
||||
|
||||
Pipe_ResetPipe(PIPE_CONTROLPIPE);
|
||||
|
||||
return ReturnStatus;
|
||||
}
|
||||
|
||||
static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType)
|
||||
{
|
||||
#if (USB_HOST_TIMEOUT_MS < 0xFF)
|
||||
uint8_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
||||
#else
|
||||
uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
|
||||
#endif
|
||||
|
||||
while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) ||
|
||||
((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
|
||||
((WaitType == USB_HOST_WAITFOR_OutReady) && Pipe_IsOUTReady())))
|
||||
{
|
||||
uint8_t ErrorCode;
|
||||
|
||||
if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
|
||||
return ErrorCode;
|
||||
|
||||
if (!(TimeoutCounter--))
|
||||
return HOST_SENDCONTROL_SoftwareTimeOut;
|
||||
}
|
||||
|
||||
return HOST_SENDCONTROL_Successful;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
LUFA Library
|
||||
Copyright (C) Dean Camera, 2010.
|
||||
|
||||
dean [at] fourwalledcubicle [dot] com
|
||||
www.fourwalledcubicle.com
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||
|
||||
Permission to use, copy, modify, distribute, and sell this
|
||||
software and its documentation for any purpose is hereby granted
|
||||
without fee, 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.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \brief USB host standard request management.
|
||||
*
|
||||
* This file contains the function prototypes necessary for the issuing of outgoing standard control requests
|
||||
* when the library is in USB host mode.
|
||||
*
|
||||
* \note This file should not be included directly. It is automatically included as needed by the USB driver
|
||||
* dispatch header located in LUFA/Drivers/USB/USB.h.
|
||||
*/
|
||||
|
||||
#ifndef __HOSTCHAPTER9_H__
|
||||
#define __HOSTCHAPTER9_H__
|
||||
|
||||
/* Includes: */
|
||||
#include <avr/io.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "LowLevel.h"
|
||||
#include "../HighLevel/USBMode.h"
|
||||
#include "../HighLevel/StdRequestType.h"
|
||||
|
||||
/* Enable C linkage for C++ Compilers: */
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Preprocessor Checks: */
|
||||
#if !defined(__INCLUDE_FROM_USB_DRIVER)
|
||||
#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
|
||||
#endif
|
||||
|
||||
/* Public Interface - May be used in end-application: */
|
||||
/* Enums: */
|
||||
/** Enum for the \ref USB_Host_SendControlRequest() return code, indicating the reason for the error
|
||||
* if the transfer of the request is unsuccessful.
|
||||
*
|
||||
* \ingroup Group_PipeControlReq
|
||||
*/
|
||||
enum USB_Host_SendControlErrorCodes_t
|
||||
{
|
||||
HOST_SENDCONTROL_Successful = 0, /**< No error occurred in the request transfer. */
|
||||
HOST_SENDCONTROL_DeviceDisconnected = 1, /**< The attached device was disconnected during the
|
||||
* request transfer.
|
||||
*/
|
||||
HOST_SENDCONTROL_PipeError = 2, /**< An error occurred in the pipe while sending the request. */
|
||||
HOST_SENDCONTROL_SetupStalled = 3, /**< The attached device stalled the request, usually
|
||||
* indicating that the request is unsupported on the device.
|
||||
*/
|
||||
HOST_SENDCONTROL_SoftwareTimeOut = 4, /**< The request or data transfer timed out. */
|
||||
};
|
||||
|
||||
/* Function Prototypes: */
|
||||
/** Sends the request stored in the \ref USB_ControlRequest global structure to the attached device,
|
||||
* and transfers the data stored in the buffer to the device, or from the device to the buffer
|
||||
* as requested. The transfer is made on the currently selected pipe.
|
||||
*
|
||||
* \ingroup Group_PipeControlReq
|
||||
*
|
||||
* \param[in] BufferPtr Pointer to the start of the data buffer if the request has a data stage, or
|
||||
* NULL if the request transfers no data to or from the device.
|
||||
*
|
||||
* \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
|
||||
*/
|
||||
uint8_t USB_Host_SendControlRequest(void* BufferPtr);
|
||||
|
||||
/* Private Interface - For use in library only: */
|
||||
#if !defined(__DOXYGEN__)
|
||||
/* Enums: */
|
||||
enum USB_WaitForTypes_t
|
||||
{
|
||||
USB_HOST_WAITFOR_SetupSent,
|
||||
USB_HOST_WAITFOR_InReceived,
|
||||
USB_HOST_WAITFOR_OutReady,
|
||||
};
|
||||
|
||||
/* Function Prototypes: */
|
||||
#if defined(__INCLUDE_FROM_HOSTCHAPTER9_C)
|
||||
static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Disable C linkage for C++ Compilers: */
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
*/
|
||||
|
||||
#define __INCLUDE_FROM_USB_DRIVER
|
||||
#include "LowLevel.h"
|
||||
#include "USBController.h"
|
||||
|
||||
#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
|
||||
volatile uint8_t USB_CurrentMode = USB_MODE_NONE;
|
||||
|
|
@ -46,8 +46,8 @@
|
|||
* @{
|
||||
*/
|
||||
|
||||
#ifndef __USBLOWLEVEL_H__
|
||||
#define __USBLOWLEVEL_H__
|
||||
#ifndef __USBCONTROLLER_H__
|
||||
#define __USBCONTROLLER_H__
|
||||
|
||||
/* Includes: */
|
||||
#include <avr/io.h>
|
||||
|
|
@ -66,12 +66,13 @@
|
|||
#include "Host.h"
|
||||
#include "Pipe.h"
|
||||
#include "OTG.h"
|
||||
#include "../HighLevel/HostStandardReq.h"
|
||||
#endif
|
||||
|
||||
#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
|
||||
#include "Device.h"
|
||||
#include "Endpoint.h"
|
||||
#include "DevChapter9.h"
|
||||
#include "../HighLevel/DeviceStandardReq.h"
|
||||
#endif
|
||||
|
||||
/* Enable C linkage for C++ Compilers: */
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
#include "../../../Common/Common.h"
|
||||
#include "../HighLevel/USBMode.h"
|
||||
#include "../HighLevel/Events.h"
|
||||
#include "LowLevel.h"
|
||||
#include "USBController.h"
|
||||
|
||||
/* Enable C linkage for C++ Compilers: */
|
||||
#if defined(__cplusplus)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue