Commit 57f5d0bc19a6407ebc778df5ff2ed7a6adf7dde7

Authored by dmohamed
1 parent 1e53d5cc

FIX - Oublie de modification du fichier USBgadget.c

Showing 1 changed file with 104 additions and 94 deletions   Show diff stats
1 /* 1 /*
2 LUFA Library 2 LUFA Library
3 - Copyright (C) Dean Camera, 2017. 3 + Copyright (C) Dean Camera, 2010.
4 4
5 dean [at] fourwalledcubicle [dot] com 5 dean [at] fourwalledcubicle [dot] com
6 - www.lufa-lib.org 6 + www.fourwalledcubicle.com
7 */ 7 */
8 8
9 /* 9 /*
10 - Copyright 2017 Dean Camera (dean [at] fourwalledcubicle [dot] com) 10 + Copyright 2010 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 disclaims all warranties with regard to this 21 + The author disclaim 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
@@ -30,11 +30,17 @@ @@ -30,11 +30,17 @@
30 30
31 /** \file 31 /** \file
32 * 32 *
33 - * Main source file for the VirtualSerial demo. 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 demo and is responsible for the initial application hardware configuration.
35 */ 35 */
36 36
37 -#include "USB_Gadget.h" 37 +#include "USBtoSerial.h"
  38 +
  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;
  41 +
  42 +/** Circular buffer to hold data from the serial port before it is sent to the host. */
  43 +RingBuff_t USARTtoUSB_Buffer;
38 44
39 /** LUFA CDC Class driver interface configuration and state information. This structure is 45 /** LUFA CDC Class driver interface configuration and state information. This structure is
40 * passed to all CDC Class driver functions, so that multiple instances of the same class 46 * passed to all CDC Class driver functions, so that multiple instances of the same class
@@ -44,33 +50,21 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = @@ -44,33 +50,21 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
44 { 50 {
45 .Config = 51 .Config =
46 { 52 {
47 - .ControlInterfaceNumber = INTERFACE_ID_CDC_CCI,  
48 - . DataINEndpoint =  
49 - {  
50 - .Address = CDC_TX_EPADDR,  
51 - .Size = CDC_TXRX_EPSIZE,  
52 - .Banks = 1,  
53 - },  
54 - .DataOUTEndpoint =  
55 - {  
56 - .Address = CDC_RX_EPADDR,  
57 - .Size = CDC_TXRX_EPSIZE,  
58 - .Banks = 1,  
59 - },  
60 - .NotificationEndpoint =  
61 - {  
62 - .Address = CDC_NOTIFICATION_EPADDR,  
63 - .Size = CDC_NOTIFICATION_EPSIZE,  
64 - .Banks = 1,  
65 - },  
66 - },  
67 - }; 53 + .ControlInterfaceNumber = 0,
68 54
69 -/** Standard file stream for the CDC interface when set up, so that the virtual CDC COM port can be  
70 - * used like any regular character stream in the C APIs.  
71 - */  
72 -static FILE USBSerialStream; 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,
73 62
  63 + .NotificationEndpointNumber = CDC_NOTIFICATION_EPNUM,
  64 + .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
  65 + .NotificationEndpointDoubleBank = false,
  66 + },
  67 + };
74 68
75 /** Main program entry point. This routine contains the overall program flow, including initial 69 /** Main program entry point. This routine contains the overall program flow, including initial
76 * setup of all components and the main program loop. 70 * setup of all components and the main program loop.
@@ -79,18 +73,33 @@ int main(void) @@ -79,18 +73,33 @@ int main(void)
79 { 73 {
80 SetupHardware(); 74 SetupHardware();
81 75
82 - /* Create a regular character stream for the interface so that it can be used with the stdio.h functions */  
83 - CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream); 76 + RingBuffer_InitBuffer(&USBtoUSART_Buffer);
  77 + RingBuffer_InitBuffer(&USARTtoUSB_Buffer);
84 78
85 LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); 79 LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
86 - GlobalInterruptEnable(); 80 + sei();
87 81
88 for (;;) 82 for (;;)
89 { 83 {
90 - //CheckJoystickMovement();  
91 -  
92 - /* Must throw away unused bytes from the host, or it will lock up while waiting for the device */  
93 - CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface); 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))
  92 + {
  93 + TIFR0 |= (1 << TOV0);
  94 +
  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));
  98 + }
  99 +
  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));
94 103
95 CDC_Device_USBTask(&VirtualSerial_CDC_Interface); 104 CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
96 USB_USBTask(); 105 USB_USBTask();
@@ -100,61 +109,19 @@ int main(void) @@ -100,61 +109,19 @@ int main(void)
100 /** Configures the board hardware and chip peripherals for the demo's functionality. */ 109 /** Configures the board hardware and chip peripherals for the demo's functionality. */
101 void SetupHardware(void) 110 void SetupHardware(void)
102 { 111 {
103 -#if (ARCH == ARCH_AVR8)  
104 /* Disable watchdog if enabled by bootloader/fuses */ 112 /* Disable watchdog if enabled by bootloader/fuses */
105 MCUSR &= ~(1 << WDRF); 113 MCUSR &= ~(1 << WDRF);
106 wdt_disable(); 114 wdt_disable();
107 115
108 /* Disable clock division */ 116 /* Disable clock division */
109 clock_prescale_set(clock_div_1); 117 clock_prescale_set(clock_div_1);
110 -#elif (ARCH == ARCH_XMEGA)  
111 - /* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */  
112 - XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU);  
113 - XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL);  
114 -  
115 - /* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */  
116 - XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ);  
117 - XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB);  
118 -  
119 - PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;  
120 -#endif  
121 118
122 /* Hardware Initialization */ 119 /* Hardware Initialization */
123 - Joystick_Init();  
124 LEDs_Init(); 120 LEDs_Init();
125 USB_Init(); 121 USB_Init();
126 -}  
127 -  
128 -/** Checks for changes in the position of the board joystick, sending strings to the host upon each change. */  
129 -void CheckJoystickMovement(void)  
130 -{  
131 - uint8_t JoyStatus_LCL = Joystick_GetStatus();  
132 - char* ReportString = NULL;  
133 - static bool ActionSent = false;  
134 -  
135 - if (JoyStatus_LCL & JOY_UP)  
136 - ReportString = "Joystick Up\r\n";  
137 - else if (JoyStatus_LCL & JOY_DOWN)  
138 - ReportString = "Joystick Down\r\n";  
139 - else if (JoyStatus_LCL & JOY_LEFT)  
140 - ReportString = "Joystick Left\r\n";  
141 - else if (JoyStatus_LCL & JOY_RIGHT)  
142 - ReportString = "Joystick Right\r\n";  
143 - else if (JoyStatus_LCL & JOY_PRESS)  
144 - ReportString = "Joystick Pressed\r\n";  
145 - else  
146 - ActionSent = false;  
147 -  
148 - if ((ReportString != NULL) && (ActionSent == false))  
149 - {  
150 - ActionSent = true;  
151 -  
152 - /* Write the string to the virtual COM port via the created character stream */  
153 - fputs(ReportString, &USBSerialStream);  
154 122
155 - /* Alternatively, without the stream: */  
156 - // CDC_Device_SendString(&VirtualSerial_CDC_Interface, ReportString);  
157 - } 123 + /* Start the flush timer so that overflows occur rapidly to push received bytes to the USB interface */
  124 + TCCR0B = (1 << CS02);
158 } 125 }
159 126
160 /** Event handler for the library USB Connection event. */ 127 /** Event handler for the library USB Connection event. */
@@ -179,24 +146,67 @@ void EVENT_USB_Device_ConfigurationChanged(void) @@ -179,24 +146,67 @@ void EVENT_USB_Device_ConfigurationChanged(void)
179 LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); 146 LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
180 } 147 }
181 148
182 -/** Event handler for the library USB Control Request reception event. */  
183 -void EVENT_USB_Device_ControlRequest(void) 149 +/** Event handler for the library USB Unhandled Control Request event. */
  150 +void EVENT_USB_Device_UnhandledControlRequest(void)
184 { 151 {
185 CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface); 152 CDC_Device_ProcessControlRequest(&VirtualSerial_CDC_Interface);
186 } 153 }
187 154
188 -/** CDC class driver callback function the processing of changes to the virtual  
189 - * control lines sent from the host.. 155 +/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer
  156 + * for later transmission to the host.
  157 + */
  158 +ISR(USART1_RX_vect, ISR_BLOCK)
  159 +{
  160 + uint8_t ReceivedByte = UDR1;
  161 +
  162 + if (USB_DeviceState == DEVICE_STATE_Configured)
  163 + RingBuffer_Insert(&USARTtoUSB_Buffer, ReceivedByte);
  164 +}
  165 +
  166 +/** Event handler for the CDC Class driver Line Encoding Changed event.
190 * 167 *
191 * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced 168 * \param[in] CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced
192 */ 169 */
193 -void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo) 170 +void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
194 { 171 {
195 - /* You can get changes to the virtual CDC lines in this callback; a common  
196 - use-case is to use the Data Terminal Ready (DTR) flag to enable and  
197 - disable CDC communications in your application when set to avoid the  
198 - application blocking while waiting for a host to become ready and read  
199 - in the pending data from the USB endpoints.  
200 - */  
201 - bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0; 172 + uint8_t ConfigMask = 0;
  173 +
  174 + switch (CDCInterfaceInfo->State.LineEncoding.ParityType)
  175 + {
  176 + case CDC_PARITY_Odd:
  177 + ConfigMask = ((1 << UPM11) | (1 << UPM10));
  178 + break;
  179 + case CDC_PARITY_Even:
  180 + ConfigMask = (1 << UPM11);
  181 + break;
  182 + }
  183 +
  184 + if (CDCInterfaceInfo->State.LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits)
  185 + ConfigMask |= (1 << USBS1);
  186 +
  187 + switch (CDCInterfaceInfo->State.LineEncoding.DataBits)
  188 + {
  189 + case 6:
  190 + ConfigMask |= (1 << UCSZ10);
  191 + break;
  192 + case 7:
  193 + ConfigMask |= (1 << UCSZ11);
  194 + break;
  195 + case 8:
  196 + ConfigMask |= ((1 << UCSZ11) | (1 << UCSZ10));
  197 + break;
  198 + }
  199 +
  200 + /* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
  201 + UCSR1B = 0;
  202 + UCSR1A = 0;
  203 + UCSR1C = 0;
  204 +
  205 + /* Set the new baud rate before configuring the USART */
  206 + UBRR1 = SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);
  207 +
  208 + /* Reconfigure the USART in double speed mode for a wider baud rate range at the expense of accuracy */
  209 + UCSR1C = ConfigMask;
  210 + UCSR1A = (1 << U2X1);
  211 + UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1));
202 } 212 }