Fix flip-ee DFU build target accidentally erasing the target FLASH memory space.
[pub/USBasp.git] / Demos / Device / LowLevel / RNDISEthernet / RNDISEthernet.c
index 4e26db7..51b827a 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  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
@@ -48,7 +48,7 @@ int main(void)
        Webserver_Init();
 
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
-       sei();
+       GlobalInterruptEnable();
 
        for (;;)
        {
@@ -71,8 +71,11 @@ void SetupHardware(void)
 
        /* Hardware Initialization */
        LEDs_Init();
-       SerialStream_Init(9600, false);
+       Serial_Init(9600, false);
        USB_Init();
+
+       /* Create a stdio stream for the serial port for stdin and stdout */
+       Serial_CreateStream(NULL);
 }
 
 /** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs and
@@ -101,22 +104,19 @@ void EVENT_USB_Device_ConfigurationChanged(void)
        bool ConfigSuccess = true;
 
        /* Setup RNDIS Data Endpoints */
-       ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_IN,
-                                                   CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE);
-       ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK, ENDPOINT_DIR_OUT,
-                                                   CDC_TXRX_EPSIZE, ENDPOINT_BANK_SINGLE);
-       ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
-                                                   CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE);
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_TX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_RX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT, CDC_NOTIFICATION_EPSIZE, 1);
 
        /* Indicate endpoint configuration success or failure */
        LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
 }
 
-/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific
- *  control requests that are not handled internally by the USB library (including the RNDIS control commands,
- *  which set up the USB RNDIS network adapter), so that they can be handled appropriately for the application.
+/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
+ *  the device from the USB host before passing along unhandled control requests to the library for processing
+ *  internally.
  */
-void EVENT_USB_Device_UnhandledControlRequest(void)
+void EVENT_USB_Device_ControlRequest(void)
 {
        /* Process RNDIS class commands */
        switch (USB_ControlRequest.bRequest)
@@ -167,7 +167,7 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 void RNDIS_Task(void)
 {
        /* Select the notification endpoint */
-       Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM);
+       Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPADDR);
 
        /* Check if a message response is ready for the host */
        if (Endpoint_IsINReady() && ResponseReady)
@@ -182,7 +182,7 @@ void RNDIS_Task(void)
                        };
 
                /* Indicate that a message response is ready for the host */
-               Endpoint_Write_Stream_LE(&Notification, sizeof(Notification));
+               Endpoint_Write_Stream_LE(&Notification, sizeof(Notification), NULL);
 
                /* Finalize the stream transfer to send the last packet */
                Endpoint_ClearIN();
@@ -198,13 +198,13 @@ void RNDIS_Task(void)
                RNDIS_Packet_Message_t RNDISPacketHeader;
 
                /* Select the data OUT endpoint */
-               Endpoint_SelectEndpoint(CDC_RX_EPNUM);
+               Endpoint_SelectEndpoint(CDC_RX_EPADDR);
 
                /* Check if the data OUT endpoint contains data, and that the IN buffer is empty */
-               if (Endpoint_IsOUTReceived() && !(FrameIN.FrameInBuffer))
+               if (Endpoint_IsOUTReceived() && !(FrameIN.FrameLength))
                {
                        /* Read in the packet message header */
-                       Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t));
+                       Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL);
 
                        /* Stall the request if the data is too large */
                        if (RNDISPacketHeader.DataLength > ETHERNET_FRAME_SIZE_MAX)
@@ -214,23 +214,20 @@ void RNDIS_Task(void)
                        }
 
                        /* Read in the Ethernet frame into the buffer */
-                       Endpoint_Read_Stream_LE(FrameIN.FrameData, RNDISPacketHeader.DataLength);
+                       Endpoint_Read_Stream_LE(FrameIN.FrameData, RNDISPacketHeader.DataLength, NULL);
 
                        /* Finalize the stream transfer to send the last packet */
                        Endpoint_ClearOUT();
 
                        /* Store the size of the Ethernet frame */
                        FrameIN.FrameLength = RNDISPacketHeader.DataLength;
-
-                       /* Indicate Ethernet IN buffer full */
-                       FrameIN.FrameInBuffer = true;
                }
 
                /* Select the data IN endpoint */
-               Endpoint_SelectEndpoint(CDC_TX_EPNUM);
+               Endpoint_SelectEndpoint(CDC_TX_EPADDR);
 
                /* Check if the data IN endpoint is ready for more data, and that the IN buffer is full */
-               if (Endpoint_IsINReady() && FrameOUT.FrameInBuffer)
+               if (Endpoint_IsINReady() && FrameOUT.FrameLength)
                {
                        /* Clear the packet header with all 0s so that the relevant fields can be filled */
                        memset(&RNDISPacketHeader, 0, sizeof(RNDIS_Packet_Message_t));
@@ -242,16 +239,16 @@ void RNDIS_Task(void)
                        RNDISPacketHeader.DataLength    = FrameOUT.FrameLength;
 
                        /* Send the packet header to the host */
-                       Endpoint_Write_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t));
+                       Endpoint_Write_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL);
 
                        /* Send the Ethernet frame data to the host */
-                       Endpoint_Write_Stream_LE(FrameOUT.FrameData, RNDISPacketHeader.DataLength);
+                       Endpoint_Write_Stream_LE(FrameOUT.FrameData, RNDISPacketHeader.DataLength, NULL);
 
                        /* Finalize the stream transfer to send the last packet */
                        Endpoint_ClearIN();
 
                        /* Indicate Ethernet OUT buffer no longer full */
-                       FrameOUT.FrameInBuffer = false;
+                       FrameOUT.FrameLength = 0;
                }
        }
 }
@@ -270,7 +267,7 @@ void Ethernet_Task(void)
          return;
 
        /* Check if a frame has been written to the IN frame buffer */
-       if (FrameIN.FrameInBuffer)
+       if (FrameIN.FrameLength)
        {
                /* Indicate packet processing started */
                LEDs_SetAllLEDs(LEDMASK_USB_BUSY);