Commit 1f4f912124fce2ce393d7507476ebc9a71ccb40f
1 parent
57f5d0bc
UPDATE:Inspiration d'un projet LUFA
Showing
10 changed files
with
261 additions
and
119 deletions
Show diff stats
lufa/Config/LUFAConfig.h
@@ -71,7 +71,7 @@ | @@ -71,7 +71,7 @@ | ||
71 | // #define USE_EEPROM_DESCRIPTORS | 71 | // #define USE_EEPROM_DESCRIPTORS |
72 | // #define NO_INTERNAL_SERIAL | 72 | // #define NO_INTERNAL_SERIAL |
73 | #define FIXED_CONTROL_ENDPOINT_SIZE 8 | 73 | #define FIXED_CONTROL_ENDPOINT_SIZE 8 |
74 | -// #define DEVICE_STATE_AS_GPIOR {Insert Value Here} | 74 | + #define DEVICE_STATE_AS_GPIOR 0 |
75 | #define FIXED_NUM_CONFIGURATIONS 1 | 75 | #define FIXED_NUM_CONFIGURATIONS 1 |
76 | // #define CONTROL_ONLY_DEVICE | 76 | // #define CONTROL_ONLY_DEVICE |
77 | #define INTERRUPT_CONTROL_ENDPOINT | 77 | #define INTERRUPT_CONTROL_ENDPOINT |
@@ -79,45 +79,12 @@ | @@ -79,45 +79,12 @@ | ||
79 | // #define NO_DEVICE_SELF_POWER | 79 | // #define NO_DEVICE_SELF_POWER |
80 | 80 | ||
81 | /* USB Host Mode Driver Related Tokens: */ | 81 | /* USB Host Mode Driver Related Tokens: */ |
82 | -// #define HOST_STATE_AS_GPIOR {Insert Value Here} | 82 | +// #define HOST_STATE_AS_GPIOR 0 |
83 | // #define USB_HOST_TIMEOUT_MS {Insert Value Here} | 83 | // #define USB_HOST_TIMEOUT_MS {Insert Value Here} |
84 | // #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here} | 84 | // #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here} |
85 | // #define NO_AUTO_VBUS_MANAGEMENT | 85 | // #define NO_AUTO_VBUS_MANAGEMENT |
86 | // #define INVERTED_VBUS_ENABLE_LINE | 86 | // #define INVERTED_VBUS_ENABLE_LINE |
87 | 87 | ||
88 | - #elif (ARCH == ARCH_XMEGA) | ||
89 | - | ||
90 | - /* Non-USB Related Configuration Tokens: */ | ||
91 | -// #define DISABLE_TERMINAL_CODES | ||
92 | - | ||
93 | - /* USB Class Driver Related Tokens: */ | ||
94 | -// #define HID_HOST_BOOT_PROTOCOL_ONLY | ||
95 | -// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here} | ||
96 | -// #define HID_USAGE_STACK_DEPTH {Insert Value Here} | ||
97 | -// #define HID_MAX_COLLECTIONS {Insert Value Here} | ||
98 | -// #define HID_MAX_REPORTITEMS {Insert Value Here} | ||
99 | -// #define HID_MAX_REPORT_IDS {Insert Value Here} | ||
100 | -// #define NO_CLASS_DRIVER_AUTOFLUSH | ||
101 | - | ||
102 | - /* General USB Driver Related Tokens: */ | ||
103 | - #define USE_STATIC_OPTIONS (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||
104 | -// #define USB_STREAM_TIMEOUT_MS {Insert Value Here} | ||
105 | -// #define NO_LIMITED_CONTROLLER_CONNECT | ||
106 | -// #define NO_SOF_EVENTS | ||
107 | - | ||
108 | - /* USB Device Mode Driver Related Tokens: */ | ||
109 | -// #define USE_RAM_DESCRIPTORS | ||
110 | - #define USE_FLASH_DESCRIPTORS | ||
111 | -// #define USE_EEPROM_DESCRIPTORS | ||
112 | -// #define NO_INTERNAL_SERIAL | ||
113 | - #define FIXED_CONTROL_ENDPOINT_SIZE 8 | ||
114 | -// #define DEVICE_STATE_AS_GPIOR {Insert Value Here} | ||
115 | - #define FIXED_NUM_CONFIGURATIONS 1 | ||
116 | -// #define CONTROL_ONLY_DEVICE | ||
117 | - #define MAX_ENDPOINT_INDEX 4 | ||
118 | -// #define NO_DEVICE_REMOTE_WAKEUP | ||
119 | -// #define NO_DEVICE_SELF_POWER | ||
120 | - | ||
121 | #else | 88 | #else |
122 | 89 | ||
123 | #error Unsupported architecture for this LUFA configuration file. | 90 | #error Unsupported architecture for this LUFA configuration file. |
lufa/Descriptors.c
@@ -55,7 +55,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = | @@ -55,7 +55,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = | ||
55 | .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, | 55 | .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, |
56 | 56 | ||
57 | .VendorID = 0x03EB, | 57 | .VendorID = 0x03EB, |
58 | - .ProductID = 0x2044, | 58 | + .ProductID = 0x204B, |
59 | .ReleaseNumber = VERSION_BCD(0,0,1), | 59 | .ReleaseNumber = VERSION_BCD(0,0,1), |
60 | 60 | ||
61 | .ManufacturerStrIndex = STRING_ID_Manufacturer, | 61 | .ManufacturerStrIndex = STRING_ID_Manufacturer, |
@@ -191,7 +191,7 @@ const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR | @@ -191,7 +191,7 @@ const USB_Descriptor_String_t PROGMEM ManufacturerString = USB_STRING_DESCRIPTOR | ||
191 | * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device | 191 | * and is read out upon request by the host when the appropriate string ID is requested, listed in the Device |
192 | * Descriptor. | 192 | * Descriptor. |
193 | */ | 193 | */ |
194 | -const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA CDC Demo"); | 194 | +const USB_Descriptor_String_t PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA USB-RS232 Adapter"); |
195 | 195 | ||
196 | /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" | 196 | /** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" |
197 | * documentation) by the application code so that the address and size of a requested descriptor can be given | 197 | * documentation) by the application code so that the address and size of a requested descriptor can be given |
lufa/Descriptors.h
@@ -66,7 +66,7 @@ | @@ -66,7 +66,7 @@ | ||
66 | { | 66 | { |
67 | USB_Descriptor_Configuration_Header_t Config; | 67 | USB_Descriptor_Configuration_Header_t Config; |
68 | 68 | ||
69 | - // CDC Control Interface | 69 | + // CDC Command Interface |
70 | USB_Descriptor_Interface_t CDC_CCI_Interface; | 70 | USB_Descriptor_Interface_t CDC_CCI_Interface; |
71 | USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; | 71 | USB_CDC_Descriptor_FunctionalHeader_t CDC_Functional_Header; |
72 | USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; | 72 | USB_CDC_Descriptor_FunctionalACM_t CDC_Functional_ACM; |
@@ -0,0 +1,66 @@ | @@ -0,0 +1,66 @@ | ||
1 | +;************************************************************ | ||
2 | +; Windows USB CDC ACM Setup File | ||
3 | +; Copyright (c) 2000 Microsoft Corporation | ||
4 | +;************************************************************ | ||
5 | + | ||
6 | +[DefaultInstall] | ||
7 | +CopyINF="LUFA USBtoSerial.inf" | ||
8 | + | ||
9 | +[Version] | ||
10 | +Signature="$Windows NT$" | ||
11 | +Class=Ports | ||
12 | +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} | ||
13 | +Provider=%MFGNAME% | ||
14 | +DriverVer=7/1/2012,10.0.0.0 | ||
15 | + | ||
16 | +[Manufacturer] | ||
17 | +%MFGNAME%=DeviceList, NTx86, NTamd64, NTia64 | ||
18 | + | ||
19 | +[SourceDisksNames] | ||
20 | + | ||
21 | +[SourceDisksFiles] | ||
22 | + | ||
23 | +[DestinationDirs] | ||
24 | +DefaultDestDir=12 | ||
25 | + | ||
26 | +[DriverInstall] | ||
27 | +Include=mdmcpq.inf | ||
28 | +CopyFiles=FakeModemCopyFileSection | ||
29 | +AddReg=DriverInstall.AddReg | ||
30 | + | ||
31 | +[DriverInstall.Services] | ||
32 | +Include=mdmcpq.inf | ||
33 | +AddService=usbser, 0x00000002, LowerFilter_Service_Inst | ||
34 | + | ||
35 | +[DriverInstall.AddReg] | ||
36 | +HKR,,EnumPropPages32,,"msports.dll,SerialPortPropPageProvider" | ||
37 | + | ||
38 | +;------------------------------------------------------------------------------ | ||
39 | +; Vendor and Product ID Definitions | ||
40 | +;------------------------------------------------------------------------------ | ||
41 | +; When developing your USB device, the VID and PID used in the PC side | ||
42 | +; application program and the firmware on the microcontroller must match. | ||
43 | +; Modify the below line to use your VID and PID. Use the format as shown below. | ||
44 | +; Note: One INF file can be used for multiple devices with different VID and PIDs. | ||
45 | +; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. | ||
46 | +;------------------------------------------------------------------------------ | ||
47 | +[DeviceList] | ||
48 | +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B | ||
49 | + | ||
50 | +[DeviceList.NTx86] | ||
51 | +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B | ||
52 | + | ||
53 | +[DeviceList.NTamd64] | ||
54 | +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B | ||
55 | + | ||
56 | +[DeviceList.NTia64] | ||
57 | +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204B | ||
58 | + | ||
59 | +;------------------------------------------------------------------------------ | ||
60 | +; String Definitions | ||
61 | +;------------------------------------------------------------------------------ | ||
62 | +;Modify these strings to customize your device | ||
63 | +;------------------------------------------------------------------------------ | ||
64 | +[Strings] | ||
65 | +MFGNAME="http://www.lufa-lib.org" | ||
66 | +DESCRIPTION="LUFA USB to Serial" | ||
0 | \ No newline at end of file | 67 | \ No newline at end of file |
lufa/USB_gadget.c
1 | /* | 1 | /* |
2 | LUFA Library | 2 | LUFA Library |
3 | - Copyright (C) Dean Camera, 2010. | 3 | + Copyright (C) Dean Camera, 2017. |
4 | 4 | ||
5 | dean [at] fourwalledcubicle [dot] com | 5 | dean [at] fourwalledcubicle [dot] com |
6 | - www.fourwalledcubicle.com | 6 | + www.lufa-lib.org |
7 | */ | 7 | */ |
8 | 8 | ||
9 | /* | 9 | /* |
10 | - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) | 10 | + Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) |
11 | 11 | ||
12 | Permission to use, copy, modify, distribute, and sell this | 12 | Permission to use, copy, modify, distribute, and sell this |
13 | software and its documentation for any purpose is hereby granted | 13 | software and its documentation for any purpose is hereby granted |
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | advertising or publicity pertaining to distribution of the | 18 | advertising or publicity pertaining to distribution of the |
19 | software without specific, written prior permission. | 19 | software without specific, written prior permission. |
20 | 20 | ||
21 | - The author disclaim all warranties with regard to this | 21 | + The author disclaims all warranties with regard to this |
22 | software, including all implied warranties of merchantability | 22 | software, including all implied warranties of merchantability |
23 | and fitness. In no event shall the author be liable for any | 23 | and fitness. In no event shall the author be liable for any |
24 | special, indirect or consequential damages or any damages | 24 | special, indirect or consequential damages or any damages |
@@ -31,16 +31,22 @@ | @@ -31,16 +31,22 @@ | ||
31 | /** \file | 31 | /** \file |
32 | * | 32 | * |
33 | * Main source file for the USBtoSerial project. This file contains the main tasks of | 33 | * Main source file for the USBtoSerial project. This file contains the main tasks of |
34 | - * the demo and is responsible for the initial application hardware configuration. | 34 | + * the project and is responsible for the initial application hardware configuration. |
35 | */ | 35 | */ |
36 | 36 | ||
37 | -#include "USBtoSerial.h" | 37 | +#include "USB_gadget.h" |
38 | 38 | ||
39 | /** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ | 39 | /** Circular buffer to hold data from the host before it is sent to the device via the serial port. */ |
40 | -RingBuff_t USBtoUSART_Buffer; | 40 | +static RingBuffer_t USBtoUSART_Buffer; |
41 | + | ||
42 | +/** Underlying data buffer for \ref USBtoUSART_Buffer, where the stored bytes are located. */ | ||
43 | +static uint8_t USBtoUSART_Buffer_Data[128]; | ||
41 | 44 | ||
42 | /** Circular buffer to hold data from the serial port before it is sent to the host. */ | 45 | /** Circular buffer to hold data from the serial port before it is sent to the host. */ |
43 | -RingBuff_t USARTtoUSB_Buffer; | 46 | +static RingBuffer_t USARTtoUSB_Buffer; |
47 | + | ||
48 | +/** Underlying data buffer for \ref USARTtoUSB_Buffer, where the stored bytes are located. */ | ||
49 | +static uint8_t USARTtoUSB_Buffer_Data[128]; | ||
44 | 50 | ||
45 | /** LUFA CDC Class driver interface configuration and state information. This structure is | 51 | /** LUFA CDC Class driver interface configuration and state information. This structure is |
46 | * passed to all CDC Class driver functions, so that multiple instances of the same class | 52 | * passed to all CDC Class driver functions, so that multiple instances of the same class |
@@ -50,22 +56,29 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = | @@ -50,22 +56,29 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = | ||
50 | { | 56 | { |
51 | .Config = | 57 | .Config = |
52 | { | 58 | { |
53 | - .ControlInterfaceNumber = 0, | ||
54 | - | ||
55 | - .DataINEndpointNumber = CDC_TX_EPNUM, | ||
56 | - .DataINEndpointSize = CDC_TXRX_EPSIZE, | ||
57 | - .DataINEndpointDoubleBank = false, | ||
58 | - | ||
59 | - .DataOUTEndpointNumber = CDC_RX_EPNUM, | ||
60 | - .DataOUTEndpointSize = CDC_TXRX_EPSIZE, | ||
61 | - .DataOUTEndpointDoubleBank = false, | ||
62 | - | ||
63 | - .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM, | ||
64 | - .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, | ||
65 | - .NotificationEndpointDoubleBank = false, | 59 | + .ControlInterfaceNumber = INTERFACE_ID_CDC_CCI, |
60 | + .DataINEndpoint = | ||
61 | + { | ||
62 | + .Address = CDC_TX_EPADDR, | ||
63 | + .Size = CDC_TXRX_EPSIZE, | ||
64 | + .Banks = 1, | ||
65 | + }, | ||
66 | + .DataOUTEndpoint = | ||
67 | + { | ||
68 | + .Address = CDC_RX_EPADDR, | ||
69 | + .Size = CDC_TXRX_EPSIZE, | ||
70 | + .Banks = 1, | ||
71 | + }, | ||
72 | + .NotificationEndpoint = | ||
73 | + { | ||
74 | + .Address = CDC_NOTIFICATION_EPADDR, | ||
75 | + .Size = CDC_NOTIFICATION_EPSIZE, | ||
76 | + .Banks = 1, | ||
77 | + }, | ||
66 | }, | 78 | }, |
67 | }; | 79 | }; |
68 | 80 | ||
81 | + | ||
69 | /** Main program entry point. This routine contains the overall program flow, including initial | 82 | /** Main program entry point. This routine contains the overall program flow, including initial |
70 | * setup of all components and the main program loop. | 83 | * setup of all components and the main program loop. |
71 | */ | 84 | */ |
@@ -73,33 +86,56 @@ int main(void) | @@ -73,33 +86,56 @@ int main(void) | ||
73 | { | 86 | { |
74 | SetupHardware(); | 87 | SetupHardware(); |
75 | 88 | ||
76 | - RingBuffer_InitBuffer(&USBtoUSART_Buffer); | ||
77 | - RingBuffer_InitBuffer(&USARTtoUSB_Buffer); | 89 | + RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data)); |
90 | + RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data)); | ||
78 | 91 | ||
79 | LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | 92 | LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); |
80 | - sei(); | 93 | + GlobalInterruptEnable(); |
81 | 94 | ||
82 | for (;;) | 95 | for (;;) |
83 | { | 96 | { |
84 | - /* Read bytes from the USB OUT endpoint into the USART transmit buffer */ | ||
85 | - int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); | ||
86 | - if (!(ReceivedByte < 0) && !(RingBuffer_IsFull(&USBtoUSART_Buffer))) | ||
87 | - RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); | ||
88 | - | ||
89 | - /* Check if the UART receive buffer flush timer has expired or the buffer is nearly full */ | ||
90 | - RingBuff_Count_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); | ||
91 | - if ((TIFR0 & (1 << TOV0)) || (BufferCount > 200)) | 97 | + /* Only try to read in bytes from the CDC interface if the transmit buffer is not full */ |
98 | + if (!(RingBuffer_IsFull(&USBtoUSART_Buffer))) | ||
92 | { | 99 | { |
93 | - TIFR0 |= (1 << TOV0); | 100 | + int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); |
94 | 101 | ||
95 | - /* Read bytes from the USART receive buffer into the USB IN endpoint */ | ||
96 | - while (BufferCount--) | ||
97 | - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&USARTtoUSB_Buffer)); | 102 | + /* Store received byte into the USART transmit buffer */ |
103 | + if (!(ReceivedByte < 0)) | ||
104 | + RingBuffer_Insert(&USBtoUSART_Buffer, ReceivedByte); | ||
98 | } | 105 | } |
99 | 106 | ||
100 | - /* Load the next byte from the USART transmit buffer into the USART */ | ||
101 | - if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) | ||
102 | - Serial_TxByte(RingBuffer_Remove(&USBtoUSART_Buffer)); | 107 | + uint16_t BufferCount = RingBuffer_GetCount(&USARTtoUSB_Buffer); |
108 | + if (BufferCount) | ||
109 | + { | ||
110 | + Endpoint_SelectEndpoint(VirtualSerial_CDC_Interface.Config.DataINEndpoint.Address); | ||
111 | + | ||
112 | + /* Check if a packet is already enqueued to the host - if so, we shouldn't try to send more data | ||
113 | + * until it completes as there is a chance nothing is listening and a lengthy timeout could occur */ | ||
114 | + if (Endpoint_IsINReady()) | ||
115 | + { | ||
116 | + /* Never send more than one bank size less one byte to the host at a time, so that we don't block | ||
117 | + * while a Zero Length Packet (ZLP) to terminate the transfer is sent if the host isn't listening */ | ||
118 | + uint8_t BytesToSend = MIN(BufferCount, (CDC_TXRX_EPSIZE - 1)); | ||
119 | + | ||
120 | + /* Read bytes from the USART receive buffer into the USB IN endpoint */ | ||
121 | + while (BytesToSend--) | ||
122 | + { | ||
123 | + /* Try to send the next byte of data to the host, abort if there is an error without dequeuing */ | ||
124 | + if (CDC_Device_SendByte(&VirtualSerial_CDC_Interface, | ||
125 | + RingBuffer_Peek(&USARTtoUSB_Buffer)) != ENDPOINT_READYWAIT_NoError) | ||
126 | + { | ||
127 | + break; | ||
128 | + } | ||
129 | + | ||
130 | + /* Dequeue the already sent byte from the buffer now we have confirmed that no transmission error occurred */ | ||
131 | + RingBuffer_Remove(&USARTtoUSB_Buffer); | ||
132 | + } | ||
133 | + } | ||
134 | + } | ||
135 | + | ||
136 | + /* Load the next byte from the USART transmit buffer into the USART if transmit buffer space is available */ | ||
137 | + if (Serial_IsSendReady() && !(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) | ||
138 | + Serial_SendByte(RingBuffer_Remove(&USBtoUSART_Buffer)); | ||
103 | 139 | ||
104 | CDC_Device_USBTask(&VirtualSerial_CDC_Interface); | 140 | CDC_Device_USBTask(&VirtualSerial_CDC_Interface); |
105 | USB_USBTask(); | 141 | USB_USBTask(); |
@@ -109,19 +145,18 @@ int main(void) | @@ -109,19 +145,18 @@ int main(void) | ||
109 | /** Configures the board hardware and chip peripherals for the demo's functionality. */ | 145 | /** Configures the board hardware and chip peripherals for the demo's functionality. */ |
110 | void SetupHardware(void) | 146 | void SetupHardware(void) |
111 | { | 147 | { |
148 | +#if (ARCH == ARCH_AVR8) | ||
112 | /* Disable watchdog if enabled by bootloader/fuses */ | 149 | /* Disable watchdog if enabled by bootloader/fuses */ |
113 | MCUSR &= ~(1 << WDRF); | 150 | MCUSR &= ~(1 << WDRF); |
114 | wdt_disable(); | 151 | wdt_disable(); |
115 | 152 | ||
116 | /* Disable clock division */ | 153 | /* Disable clock division */ |
117 | clock_prescale_set(clock_div_1); | 154 | clock_prescale_set(clock_div_1); |
155 | +#endif | ||
118 | 156 | ||
119 | /* Hardware Initialization */ | 157 | /* Hardware Initialization */ |
120 | LEDs_Init(); | 158 | LEDs_Init(); |
121 | USB_Init(); | 159 | USB_Init(); |
122 | - | ||
123 | - /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */ | ||
124 | - TCCR0B = (1 << CS02); | ||
125 | } | 160 | } |
126 | 161 | ||
127 | /** Event handler for the library USB Connection event. */ | 162 | /** Event handler for the library USB Connection event. */ |
@@ -146,8 +181,8 @@ void EVENT_USB_Device_ConfigurationChanged(void) | @@ -146,8 +181,8 @@ void EVENT_USB_Device_ConfigurationChanged(void) | ||
146 | LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | 181 | LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); |
147 | } | 182 | } |
148 | 183 | ||
149 | -/** Event handler for the library USB Unhandled Control Request event. */ | ||
150 | -void EVENT_USB_Device_UnhandledControlRequest(void) | 184 | +/** Event handler for the library USB Control Request reception event. */ |
185 | +void EVENT_USB_Device_ControlRequest(void) | ||
151 | { | 186 | { |
152 | CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); | 187 | CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); |
153 | } | 188 | } |
@@ -159,7 +194,7 @@ ISR(USART1_RX_vect, ISR_BLOCK) | @@ -159,7 +194,7 @@ ISR(USART1_RX_vect, ISR_BLOCK) | ||
159 | { | 194 | { |
160 | uint8_t ReceivedByte = UDR1; | 195 | uint8_t ReceivedByte = UDR1; |
161 | 196 | ||
162 | - if (USB_DeviceState == DEVICE_STATE_Configured) | 197 | + if ((USB_DeviceState == DEVICE_STATE_Configured) && !(RingBuffer_IsFull(&USARTtoUSB_Buffer))) |
163 | RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); | 198 | RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte); |
164 | } | 199 | } |
165 | 200 | ||
@@ -197,6 +232,9 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI | @@ -197,6 +232,9 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI | ||
197 | break; | 232 | break; |
198 | } | 233 | } |
199 | 234 | ||
235 | + /* Keep the TX line held high (idle) while the USART is reconfigured */ | ||
236 | + PORTD |= (1 << 3); | ||
237 | + | ||
200 | /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ | 238 | /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */ |
201 | UCSR1B = 0; | 239 | UCSR1B = 0; |
202 | UCSR1A = 0; | 240 | UCSR1A = 0; |
@@ -209,4 +247,8 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI | @@ -209,4 +247,8 @@ void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCI | ||
209 | UCSR1C = ConfigMask; | 247 | UCSR1C = ConfigMask; |
210 | UCSR1A = (1 << U2X1); | 248 | UCSR1A = (1 << U2X1); |
211 | UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); | 249 | UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1)); |
250 | + | ||
251 | + /* Release the TX line after the USART has been reconfigured */ | ||
252 | + PORTD &= ~(1 << 3); | ||
212 | } | 253 | } |
254 | + |
lufa/USB_gadget.h
@@ -30,24 +30,23 @@ | @@ -30,24 +30,23 @@ | ||
30 | 30 | ||
31 | /** \file | 31 | /** \file |
32 | * | 32 | * |
33 | - * Header file for VirtualSerial.c. | 33 | + * Header file for USBtoSerial.c. |
34 | */ | 34 | */ |
35 | 35 | ||
36 | -#ifndef _VIRTUALSERIAL_H_ | ||
37 | -#define _VIRTUALSERIAL_H_ | 36 | +#ifndef _USB_SERIAL_H_ |
37 | +#define _USB_SERIAL_H_ | ||
38 | 38 | ||
39 | /* Includes: */ | 39 | /* Includes: */ |
40 | #include <avr/io.h> | 40 | #include <avr/io.h> |
41 | #include <avr/wdt.h> | 41 | #include <avr/wdt.h> |
42 | - #include <avr/power.h> | ||
43 | #include <avr/interrupt.h> | 42 | #include <avr/interrupt.h> |
44 | - #include <string.h> | ||
45 | - #include <stdio.h> | 43 | + #include <avr/power.h> |
46 | 44 | ||
47 | #include "Descriptors.h" | 45 | #include "Descriptors.h" |
48 | 46 | ||
49 | - //#include <LUFA/Drivers/Board/LEDs.h> | ||
50 | - //#include <LUFA/Drivers/Board/Joystick.h> | 47 | + #include <LUFA/Drivers/Board/LEDs.h> |
48 | + #include <LUFA/Drivers/Peripheral/Serial.h> | ||
49 | + #include <LUFA/Drivers/Misc/RingBuffer.h> | ||
51 | #include <LUFA/Drivers/USB/USB.h> | 50 | #include <LUFA/Drivers/USB/USB.h> |
52 | #include <LUFA/Platform/Platform.h> | 51 | #include <LUFA/Platform/Platform.h> |
53 | 52 | ||
@@ -66,12 +65,13 @@ | @@ -66,12 +65,13 @@ | ||
66 | 65 | ||
67 | /* Function Prototypes: */ | 66 | /* Function Prototypes: */ |
68 | void SetupHardware(void); | 67 | void SetupHardware(void); |
69 | - void CheckJoystickMovement(void); | ||
70 | 68 | ||
71 | void EVENT_USB_Device_Connect(void); | 69 | void EVENT_USB_Device_Connect(void); |
72 | void EVENT_USB_Device_Disconnect(void); | 70 | void EVENT_USB_Device_Disconnect(void); |
73 | void EVENT_USB_Device_ConfigurationChanged(void); | 71 | void EVENT_USB_Device_ConfigurationChanged(void); |
74 | void EVENT_USB_Device_ControlRequest(void); | 72 | void EVENT_USB_Device_ControlRequest(void); |
75 | 73 | ||
74 | + void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo); | ||
75 | + | ||
76 | #endif | 76 | #endif |
77 | 77 |
@@ -0,0 +1,78 @@ | @@ -0,0 +1,78 @@ | ||
1 | +/** \file | ||
2 | + * | ||
3 | + * This file contains special DoxyGen information for the generation of the main page and other special | ||
4 | + * documentation pages. It is not a project source file. | ||
5 | + */ | ||
6 | + | ||
7 | +/** \mainpage USB to Serial Converter Project | ||
8 | + * | ||
9 | + * \section Sec_Compat Project Compatibility: | ||
10 | + * | ||
11 | + * The following list indicates what microcontrollers are compatible with this project. | ||
12 | + * | ||
13 | + * \li Series 7 USB AVRs (AT90USBxxx7) | ||
14 | + * \li Series 6 USB AVRs (AT90USBxxx6) | ||
15 | + * \li Series 4 USB AVRs (ATMEGAxxU4) | ||
16 | + * \li Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) | ||
17 | + * | ||
18 | + * \section Sec_Info USB Information: | ||
19 | + * | ||
20 | + * The following table gives a rundown of the USB utilization of this project. | ||
21 | + * | ||
22 | + * <table> | ||
23 | + * <tr> | ||
24 | + * <td><b>USB Mode:</b></td> | ||
25 | + * <td>Device</td> | ||
26 | + * </tr> | ||
27 | + * <tr> | ||
28 | + * <td><b>USB Class:</b></td> | ||
29 | + * <td>Communications Device Class (CDC)</td> | ||
30 | + * </tr> | ||
31 | + * <tr> | ||
32 | + * <td><b>USB Subclass:</b></td> | ||
33 | + * <td>Abstract Control Model (ACM)</td> | ||
34 | + * </tr> | ||
35 | + * <tr> | ||
36 | + * <td><b>Relevant Standards:</b></td> | ||
37 | + * <td>USBIF CDC Class Standard</td> | ||
38 | + * </tr> | ||
39 | + * <tr> | ||
40 | + * <td><b>Supported USB Speeds:</b></td> | ||
41 | + * <td>Full Speed Mode</td> | ||
42 | + * </tr> | ||
43 | + * </table> | ||
44 | + * | ||
45 | + * \section Sec_Description Project Description: | ||
46 | + * | ||
47 | + * USB to Serial bridge project. This project allows a USB AVR to serve | ||
48 | + * as a USB to USART bridge between a USB host and a device lacking a | ||
49 | + * USB port. When programmed into a USB AVR, the AVR will enumerate as a | ||
50 | + * virtual COM port. | ||
51 | + * | ||
52 | + * The AVR's hardware USART's settings will change to mirror as closely as | ||
53 | + * possible the serial settings set on the host. However, due to hardware | ||
54 | + * limitations, some options may not be supported (baud rates with unacceptable | ||
55 | + * error rates at the AVR's clock speed, data lengths other than 6, 7 or 8 bits, | ||
56 | + * 1.5 stop bits, parity other than none, even or odd). | ||
57 | + * | ||
58 | + * After running this project for the first time on a new computer, | ||
59 | + * you will need to supply the .INF file located in this project | ||
60 | + * project's directory as the device's driver when running under | ||
61 | + * Windows. This will enable Windows to use its inbuilt CDC drivers, | ||
62 | + * negating the need for custom drivers for the device. Other | ||
63 | + * Operating Systems should automatically use their own inbuilt | ||
64 | + * CDC-ACM drivers. | ||
65 | + * | ||
66 | + * \section Sec_Options Project Options | ||
67 | + * | ||
68 | + * The following defines can be found in this project, which can control the project behaviour when defined, or changed in value. | ||
69 | + * | ||
70 | + * <table> | ||
71 | + * <tr> | ||
72 | + * <td> | ||
73 | + * None | ||
74 | + * </td> | ||
75 | + * </tr> | ||
76 | + * </table> | ||
77 | + */ | ||
78 | + |
lufa/asf.xml
1 | <asf xmlversion="1.0"> | 1 | <asf xmlversion="1.0"> |
2 | - <project caption="Virtual Serial CDC Device Demo (Class Driver APIs)" id="lufa.demos.device.class.cdc.example.avr8"> | ||
3 | - <require idref="lufa.demos.device.class.cdc"/> | 2 | + <project caption="USB to Serial Converter" id="lufa.projects.usb_to_serial.avr8"> |
3 | + <require idref="lufa.projects.usb_to_serial"/> | ||
4 | <require idref="lufa.boards.dummy.avr8"/> | 4 | <require idref="lufa.boards.dummy.avr8"/> |
5 | <generator value="as5_8"/> | 5 | <generator value="as5_8"/> |
6 | 6 | ||
7 | <device-support value="at90usb1287"/> | 7 | <device-support value="at90usb1287"/> |
8 | - <config name="lufa.drivers.board.name" value="none"/> | 8 | + <config name="lufa.drivers.board.name" value="usbkey"/> |
9 | 9 | ||
10 | - <build type="define" name="F_CPU" value="16000000UL"/> | ||
11 | - <build type="define" name="F_USB" value="16000000UL"/> | 10 | + <build type="define" name="F_CPU" value="8000000UL"/> |
11 | + <build type="define" name="F_USB" value="8000000UL"/> | ||
12 | </project> | 12 | </project> |
13 | 13 | ||
14 | - <project caption="Virtual Serial CDC Device Demo (Class Driver APIs)" id="lufa.demos.device.class.cdc.example.xmega"> | ||
15 | - <require idref="lufa.demos.device.class.cdc"/> | ||
16 | - <require idref="lufa.boards.dummy.xmega"/> | ||
17 | - <generator value="as5_8"/> | ||
18 | - | ||
19 | - <device-support value="atxmega128a1u"/> | ||
20 | - <config name="lufa.drivers.board.name" value="none"/> | ||
21 | - | ||
22 | - <build type="define" name="F_CPU" value="32000000UL"/> | ||
23 | - <build type="define" name="F_USB" value="48000000UL"/> | ||
24 | - </project> | ||
25 | - | ||
26 | - <module type="application" id="lufa.demos.device.class.cdc" caption="Virtual Serial CDC Device Demo (Class Driver APIs)"> | 14 | + <module type="application" id="lufa.projects.usb_to_serial" caption="USB to Serial Converter"> |
27 | <info type="description" value="summary"> | 15 | <info type="description" value="summary"> |
28 | - Virtual Serial device demo, implementing a virtual serial channel between the host PC and the device. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | 16 | + USB to Serial USART converter project. |
29 | </info> | 17 | </info> |
30 | 18 | ||
31 | <info type="gui-flag" value="move-to-root"/> | 19 | <info type="gui-flag" value="move-to-root"/> |
@@ -41,12 +29,12 @@ | @@ -41,12 +29,12 @@ | ||
41 | <device-support-alias value="lufa_uc3"/> | 29 | <device-support-alias value="lufa_uc3"/> |
42 | 30 | ||
43 | <build type="distribute" subtype="user-file" value="doxyfile"/> | 31 | <build type="distribute" subtype="user-file" value="doxyfile"/> |
44 | - <build type="distribute" subtype="user-file" value="VirtualSerial.txt"/> | ||
45 | - <build type="distribute" subtype="user-file" value="LUFA VirtualSerial.inf"/> | 32 | + <build type="distribute" subtype="user-file" value="USBtoSerial.txt"/> |
33 | + <build type="distribute" subtype="user-file" value="LUFA USBtoSerial.inf"/> | ||
46 | 34 | ||
47 | - <build type="c-source" value="VirtualSerial.c"/> | 35 | + <build type="c-source" value="USBtoSerial.c"/> |
48 | <build type="c-source" value="Descriptors.c"/> | 36 | <build type="c-source" value="Descriptors.c"/> |
49 | - <build type="header-file" value="VirtualSerial.h"/> | 37 | + <build type="header-file" value="USBtoSerial.h"/> |
50 | <build type="header-file" value="Descriptors.h"/> | 38 | <build type="header-file" value="Descriptors.h"/> |
51 | 39 | ||
52 | <build type="module-config" subtype="path" value="Config"/> | 40 | <build type="module-config" subtype="path" value="Config"/> |
@@ -54,9 +42,10 @@ | @@ -54,9 +42,10 @@ | ||
54 | 42 | ||
55 | <require idref="lufa.common"/> | 43 | <require idref="lufa.common"/> |
56 | <require idref="lufa.platform"/> | 44 | <require idref="lufa.platform"/> |
45 | + <require idref="lufa.drivers.peripheral.usart"/> | ||
57 | <require idref="lufa.drivers.usb"/> | 46 | <require idref="lufa.drivers.usb"/> |
58 | <require idref="lufa.drivers.board"/> | 47 | <require idref="lufa.drivers.board"/> |
59 | <require idref="lufa.drivers.board.leds"/> | 48 | <require idref="lufa.drivers.board.leds"/> |
60 | - <require idref="lufa.drivers.board.joystick"/> | 49 | + <require idref="lufa.drivers.misc.ringbuffer"/> |
61 | </module> | 50 | </module> |
62 | </asf> | 51 | </asf> |
lufa/doxyfile
@@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 | @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 | ||
32 | # title of most generated pages and in a few other places. | 32 | # title of most generated pages and in a few other places. |
33 | # The default value is: My Project. | 33 | # The default value is: My Project. |
34 | 34 | ||
35 | -PROJECT_NAME = "LUFA Library - Virtual Serial Device Demo" | 35 | +PROJECT_NAME = "LUFA Library - USB to Serial Device Project" |
36 | 36 | ||
37 | # The PROJECT_NUMBER tag can be used to enter a project or revision number. This | 37 | # The PROJECT_NUMBER tag can be used to enter a project or revision number. This |
38 | # could be handy for archiving the generated documentation or if some version | 38 | # could be handy for archiving the generated documentation or if some version |
lufa/makefile
@@ -17,9 +17,9 @@ BOARD = USBKEY | @@ -17,9 +17,9 @@ BOARD = USBKEY | ||
17 | F_CPU = 8000000 | 17 | F_CPU = 8000000 |
18 | F_USB = $(F_CPU) | 18 | F_USB = $(F_CPU) |
19 | OPTIMIZATION = s | 19 | OPTIMIZATION = s |
20 | -TARGET = VirtualSerial | 20 | +TARGET = USB_gadget |
21 | SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | 21 | SRC = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) |
22 | -LUFA_PATH = ../../../../LUFA | 22 | +LUFA_PATH = ../../LUFA |
23 | CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | 23 | CC_FLAGS = -DUSE_LUFA_CONFIG_HEADER -IConfig/ |
24 | LD_FLAGS = | 24 | LD_FLAGS = |
25 | 25 |