Add FatFS library to the Webserver project, extend the HTTP server so that it now...
[pub/USBasp.git] / Projects / Webserver / Webserver.c
index ec1dabf..47fd9c7 100644 (file)
  \r
 #include "Webserver.h"\r
 \r
  \r
 #include "Webserver.h"\r
 \r
-/** LUFA RNDIS Class driver interface configuration and state information. This structure is\r
- *  passed to all RNDIS Class driver functions, so that multiple instances of the same class\r
- *  within a device can be differentiated from one another.\r
- */\r
-USB_ClassInfo_RNDIS_Host_t Ethernet_RNDIS_Interface =\r
-       {\r
-               .Config =\r
-                       {\r
-                               .DataINPipeNumber           = 1,\r
-                               .DataINPipeDoubleBank       = false,\r
-\r
-                               .DataOUTPipeNumber          = 2,\r
-                               .DataOUTPipeDoubleBank      = false,\r
-\r
-                               .NotificationPipeNumber     = 3,\r
-                               .NotificationPipeDoubleBank = false,\r
-                               \r
-                               .HostMaxPacketSize          = UIP_CONF_BUFFER_SIZE,\r
-                       },\r
-       };\r
-\r
-/** Connection timer, to retain the time elapsed since the last time the uIP connections were managed. */\r
-struct timer ConnectionTimer;\r
-\r
-/** ARP timer, to retain the time elapsed since the ARP cache was last updated. */\r
-struct timer ARPTimer;\r
-\r
-/** MAC address of the RNDIS device, when enumerated */\r
-struct uip_eth_addr MACAddress;\r
-\r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
  *  enters a loop to run the application tasks in sequence.\r
  */\r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
  *  enters a loop to run the application tasks in sequence.\r
  */\r
@@ -77,177 +47,13 @@ int main(void)
 \r
        for (;;)\r
        {\r
 \r
        for (;;)\r
        {\r
-               switch (USB_HostState)\r
-               {\r
-                       case HOST_STATE_Addressed:\r
-                               LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
-                       \r
-                               uint16_t ConfigDescriptorSize;\r
-                               uint8_t  ConfigDescriptorData[512];\r
+               USBDeviceMode_USBTask();\r
+               USBHostMode_USBTask();\r
 \r
 \r
-                               if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,\r
-                                                                      sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)\r
-                               {\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-\r
-                               if (RNDIS_Host_ConfigurePipes(&Ethernet_RNDIS_Interface,\r
-                                                             ConfigDescriptorSize, ConfigDescriptorData) != RNDIS_ENUMERROR_NoError)\r
-                               {\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-                               \r
-                               if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)\r
-                               {\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-                               \r
-                               if (RNDIS_Host_InitializeDevice(&Ethernet_RNDIS_Interface) != HOST_SENDCONTROL_Successful)\r
-                               {\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;                  \r
-                               }\r
-                               \r
-                               uint32_t PacketFilter = (REMOTE_NDIS_PACKET_DIRECTED | REMOTE_NDIS_PACKET_BROADCAST);\r
-                               if (RNDIS_Host_SetRNDISProperty(&Ethernet_RNDIS_Interface, OID_GEN_CURRENT_PACKET_FILTER,\r
-                                                               &PacketFilter, sizeof(PacketFilter)) != HOST_SENDCONTROL_Successful)\r
-                               {\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-                               \r
-                               if (RNDIS_Host_QueryRNDISProperty(&Ethernet_RNDIS_Interface, OID_802_3_CURRENT_ADDRESS,\r
-                                                                 &MACAddress, sizeof(MACAddress)) != HOST_SENDCONTROL_Successful)\r
-                               {\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-\r
-                               uip_setethaddr(MACAddress);\r
-                               \r
-                               LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-                               USB_HostState = HOST_STATE_Configured;\r
-                               break;\r
-                       case HOST_STATE_Configured:\r
-                               ProcessIncommingPacket();\r
-                               ManageConnections();\r
-                       \r
-                               break;\r
-               }\r
-       \r
-               RNDIS_Host_USBTask(&Ethernet_RNDIS_Interface);\r
                USB_USBTask();\r
        }\r
 }\r
 \r
                USB_USBTask();\r
        }\r
 }\r
 \r
-/** Processes incomming packets to the server from the connected RNDIS device, creating responses as needed. */\r
-void ProcessIncommingPacket(void)\r
-{\r
-       if (RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface))\r
-       {\r
-               LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
-\r
-               /* Read the incomming packet straight into the UIP packet buffer */\r
-               RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], &uip_len);\r
-\r
-               if (uip_len > 0)\r
-               {\r
-                       bool PacketHandled = true;\r
-\r
-                       struct uip_eth_hdr* EthernetHeader = (struct uip_eth_hdr*)&uip_buf[0];\r
-                       if (EthernetHeader->type == HTONS(UIP_ETHTYPE_IP))\r
-                       {\r
-                               /* Filter packet by MAC destination */\r
-                               uip_arp_ipin();\r
-\r
-                               /* Process incomming packet */\r
-                               uip_input();\r
-\r
-                               /* Add destination MAC to outgoing packet */\r
-                               if (uip_len > 0)\r
-                                 uip_arp_out();\r
-                       }\r
-                       else if (EthernetHeader->type == HTONS(UIP_ETHTYPE_ARP))\r
-                       {\r
-                               /* Process ARP packet */\r
-                               uip_arp_arpin();\r
-                       }\r
-                       else\r
-                       {\r
-                               PacketHandled = false;\r
-                       }\r
-\r
-                       /* If a response was generated, send it */\r
-                       if ((uip_len > 0) && PacketHandled)\r
-                         RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len);\r
-               }\r
-\r
-               LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-       }\r
-}\r
-\r
-/** Manages the currently open network connections, including TCP and (if enabled) UDP. */\r
-void ManageConnections(void)\r
-{\r
-       /* Manage open connections */\r
-       if (timer_expired(&ConnectionTimer))\r
-       {\r
-               timer_reset(&ConnectionTimer);\r
-\r
-               LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
-               \r
-               for (uint8_t i = 0; i < UIP_CONNS; i++)\r
-               {\r
-                       /* Run periodic connection management for each TCP connection */\r
-                       uip_periodic(i);\r
-\r
-                       /* If a response was generated, send it */\r
-                       if (uip_len > 0)\r
-                       {\r
-                               /* Add destination MAC to outgoing packet */\r
-                               uip_arp_out();\r
-\r
-                               RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len);\r
-                       }\r
-               }\r
-               \r
-               #if defined(ENABLE_DHCP)\r
-               for (uint8_t i = 0; i < UIP_UDP_CONNS; i++)\r
-               {\r
-                       /* Run periodic connection management for each UDP connection */\r
-                       uip_udp_periodic(i);\r
-\r
-                       /* If a response was generated, send it */\r
-                       if (uip_len > 0)\r
-                       {\r
-                               /* Add destination MAC to outgoing packet */\r
-                               uip_arp_out();\r
-\r
-                               RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len);\r
-                       }\r
-               }\r
-               #endif\r
-\r
-               LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-       }\r
-\r
-       /* Manage ARP cache refreshing */\r
-       if (timer_expired(&ARPTimer))\r
-       {\r
-               timer_reset(&ARPTimer);\r
-               uip_arp_timer();\r
-       }\r
-}\r
-\r
 /** Configures the board hardware and chip peripherals for the demo's functionality. */\r
 void SetupHardware(void)\r
 {\r
 /** Configures the board hardware and chip peripherals for the demo's functionality. */\r
 void SetupHardware(void)\r
 {\r
@@ -259,71 +65,8 @@ void SetupHardware(void)
        clock_prescale_set(clock_div_1);\r
 \r
        /* Hardware Initialization */\r
        clock_prescale_set(clock_div_1);\r
 \r
        /* Hardware Initialization */\r
+       SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);\r
+       Dataflash_Init();\r
        LEDs_Init();\r
        LEDs_Init();\r
-       USB_Init();\r
-\r
-       /* uIP Timing Initialization */\r
-       clock_init();\r
-       timer_set(&ConnectionTimer, CLOCK_SECOND / 2);\r
-       timer_set(&ARPTimer, CLOCK_SECOND * 10);        \r
-\r
-       /* uIP Stack Initialization */\r
-       uip_init();\r
-\r
-       /* DHCP/Server IP Settings Initialization */\r
-       #if defined(ENABLE_DHCP)\r
-       DHCPApp_Init();\r
-       #else\r
-       uip_ipaddr_t IPAddress, Netmask, GatewayIPAddress;\r
-       uip_ipaddr(&IPAddress,        DEVICE_IP_ADDRESS[0], DEVICE_IP_ADDRESS[1], DEVICE_IP_ADDRESS[2], DEVICE_IP_ADDRESS[3]);\r
-       uip_ipaddr(&Netmask,          DEVICE_NETMASK[0],    DEVICE_NETMASK[1],    DEVICE_NETMASK[2],    DEVICE_NETMASK[3]);\r
-       uip_ipaddr(&GatewayIPAddress, DEVICE_GATEWAY[0],    DEVICE_GATEWAY[1],    DEVICE_GATEWAY[2],    DEVICE_GATEWAY[3]);\r
-       uip_sethostaddr(&IPAddress);\r
-       uip_setnetmask(&Netmask);\r
-       uip_setdraddr(&GatewayIPAddress);\r
-       #endif\r
-       \r
-       /* HTTP Webserver Initialization */\r
-       WebserverApp_Init();\r
-}\r
-\r
-/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and\r
- *  starts the library USB task to begin the enumeration and USB management process.\r
- */\r
-void EVENT_USB_Host_DeviceAttached(void)\r
-{\r
-       LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
-}\r
-\r
-/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and\r
- *  stops the library USB task management process.\r
- */\r
-void EVENT_USB_Host_DeviceUnattached(void)\r
-{\r
-       LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
-}\r
-\r
-/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully\r
- *  enumerated by the host and is now ready to be used by the application.\r
- */\r
-void EVENT_USB_Host_DeviceEnumerationComplete(void)\r
-{\r
-       LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-}\r
-\r
-/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */\r
-void EVENT_USB_Host_HostError(const uint8_t ErrorCode)\r
-{\r
-       USB_ShutDown();\r
-\r
-       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-       for(;;);\r
-}\r
-\r
-/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while\r
- *  enumerating an attached USB device.\r
- */\r
-void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode)\r
-{\r
-       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+       USB_Init(USB_MODE_UID);\r
 }\r
 }\r