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