You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					163 lines
				
				5.3 KiB
			
		
		
			
		
	
	
					163 lines
				
				5.3 KiB
			| 
								 
											8 years ago
										 
									 | 
							
								/*
							 | 
						||
| 
								 | 
							
								             LUFA Library
							 | 
						||
| 
								 | 
							
								     Copyright (C) Dean Camera, 2017.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  dean [at] fourwalledcubicle [dot] com
							 | 
						||
| 
								 | 
							
								           www.lufa-lib.org
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								  Copyright 2017  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
							 | 
						||
| 
								 | 
							
								  without fee, provided that the above copyright notice appear in
							 | 
						||
| 
								 | 
							
								  all copies and that both that the copyright notice and this
							 | 
						||
| 
								 | 
							
								  permission notice and warranty disclaimer appear in supporting
							 | 
						||
| 
								 | 
							
								  documentation, and that the name of the author not be used in
							 | 
						||
| 
								 | 
							
								  advertising or publicity pertaining to distribution of the
							 | 
						||
| 
								 | 
							
								  software without specific, written prior permission.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The author disclaims all warranties with regard to this
							 | 
						||
| 
								 | 
							
								  software, including all implied warranties of merchantability
							 | 
						||
| 
								 | 
							
								  and fitness.  In no event shall the author be liable for any
							 | 
						||
| 
								 | 
							
								  special, indirect or consequential damages or any damages
							 | 
						||
| 
								 | 
							
								  whatsoever resulting from loss of use, data or profits, whether
							 | 
						||
| 
								 | 
							
								  in an action of contract, negligence or other tortious action,
							 | 
						||
| 
								 | 
							
								  arising out of or in connection with the use or performance of
							 | 
						||
| 
								 | 
							
								  this software.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** \file
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *  USB Device Mode management functions and variables. This file contains the LUFA code required to
							 | 
						||
| 
								 | 
							
								 *  manage the USB Mass Storage device mode.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "USBDeviceMode.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Message buffer for RNDIS messages processed by the RNDIS device class driver. */
							 | 
						||
| 
								 | 
							
								static uint8_t RNDIS_Message_Buffer[192];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** 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_Device_t Ethernet_RNDIS_Interface_Device =
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										.Config =
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												.ControlInterfaceNumber         = INTERFACE_ID_CDC_CCI,
							 | 
						||
| 
								 | 
							
												.DataINEndpoint                 =
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														.Address                = CDC_TX_EPADDR,
							 | 
						||
| 
								 | 
							
														.Size                   = CDC_TXRX_EPSIZE,
							 | 
						||
| 
								 | 
							
														.Banks                  = 1,
							 | 
						||
| 
								 | 
							
													},
							 | 
						||
| 
								 | 
							
												.DataOUTEndpoint                =
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														.Address                = CDC_RX_EPADDR,
							 | 
						||
| 
								 | 
							
														.Size                   = CDC_TXRX_EPSIZE,
							 | 
						||
| 
								 | 
							
														.Banks                  = 1,
							 | 
						||
| 
								 | 
							
													},
							 | 
						||
| 
								 | 
							
												.NotificationEndpoint           =
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														.Address                = CDC_NOTIFICATION_EPADDR,
							 | 
						||
| 
								 | 
							
														.Size                   = CDC_NOTIFICATION_EPSIZE,
							 | 
						||
| 
								 | 
							
														.Banks                  = 1,
							 | 
						||
| 
								 | 
							
													},
							 | 
						||
| 
								 | 
							
												.AdapterVendorDescription       = "LUFA RNDIS Adapter",
							 | 
						||
| 
								 | 
							
												.AdapterMACAddress              = {{0x02, 0x00, 0x02, 0x00, 0x02, 0x00}},
							 | 
						||
| 
								 | 
							
												.MessageBuffer                  = RNDIS_Message_Buffer,
							 | 
						||
| 
								 | 
							
												.MessageBufferLength            = sizeof(RNDIS_Message_Buffer),
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** LUFA Mass Storage Class driver interface configuration and state information. This structure is
							 | 
						||
| 
								 | 
							
								 *  passed to all Mass Storage Class driver functions, so that multiple instances of the same class
							 | 
						||
| 
								 | 
							
								 *  within a device can be differentiated from one another.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								USB_ClassInfo_MS_Device_t Disk_MS_Interface =
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										.Config =
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												.InterfaceNumber                = INTERFACE_ID_MassStorage,
							 | 
						||
| 
								 | 
							
												.DataINEndpoint                 =
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														.Address                = MASS_STORAGE_IN_EPADDR,
							 | 
						||
| 
								 | 
							
														.Size                   = MASS_STORAGE_IO_EPSIZE,
							 | 
						||
| 
								 | 
							
														.Banks                  = 1,
							 | 
						||
| 
								 | 
							
													},
							 | 
						||
| 
								 | 
							
												.DataOUTEndpoint                =
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														.Address                = MASS_STORAGE_OUT_EPADDR,
							 | 
						||
| 
								 | 
							
														.Size                   = MASS_STORAGE_IO_EPSIZE,
							 | 
						||
| 
								 | 
							
														.Banks                  = 1,
							 | 
						||
| 
								 | 
							
													},
							 | 
						||
| 
								 | 
							
												.TotalLUNs                 = 1,
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** USB device mode management task. This function manages the Mass Storage Device class driver when the device is
							 | 
						||
| 
								 | 
							
								 *  initialized in USB device mode.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void USBDeviceMode_USBTask(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (USB_CurrentMode != USB_MODE_Device)
							 | 
						||
| 
								 | 
							
									  return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									uIPManagement_ManageNetwork();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									RNDIS_Device_USBTask(&Ethernet_RNDIS_Interface_Device);
							 | 
						||
| 
								 | 
							
									MS_Device_USBTask(&Disk_MS_Interface);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Event handler for the library USB Connection event. */
							 | 
						||
| 
								 | 
							
								void EVENT_USB_Device_Connect(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									uIPManagement_Init();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Event handler for the library USB Disconnection event. */
							 | 
						||
| 
								 | 
							
								void EVENT_USB_Device_Disconnect(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Event handler for the library USB Configuration Changed event. */
							 | 
						||
| 
								 | 
							
								void EVENT_USB_Device_ConfigurationChanged(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									bool ConfigSuccess = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									ConfigSuccess &= RNDIS_Device_ConfigureEndpoints(&Ethernet_RNDIS_Interface_Device);
							 | 
						||
| 
								 | 
							
									ConfigSuccess &= MS_Device_ConfigureEndpoints(&Disk_MS_Interface);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Event handler for the library USB Control Request reception event. */
							 | 
						||
| 
								 | 
							
								void EVENT_USB_Device_ControlRequest(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									RNDIS_Device_ProcessControlRequest(&Ethernet_RNDIS_Interface_Device);
							 | 
						||
| 
								 | 
							
									MS_Device_ProcessControlRequest(&Disk_MS_Interface);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** Mass Storage class driver callback function the reception of SCSI commands from the host, which must be processed.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *  \param[in] MSInterfaceInfo  Pointer to the Mass Storage class interface configuration structure being referenced
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								bool CALLBACK_MS_Device_SCSICommandReceived(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									bool CommandSuccess;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
							 | 
						||
| 
								 | 
							
									CommandSuccess = SCSI_DecodeSCSICommand(MSInterfaceInfo);
							 | 
						||
| 
								 | 
							
									LEDs_SetAllLEDs(LEDMASK_USB_READY);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return CommandSuccess;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |