modifications. Also correct project settings to compile for Cortex M4 architecture.pull/7/head
							parent
							
								
									674cb621a7
								
							
						
					
					
						commit
						b9b6123642
					
				| @ -0,0 +1,20 @@ | ||||
| /*
 | ||||
|  * downstream_msc.h | ||||
|  * | ||||
|  *  Created on: 8/08/2015 | ||||
|  *      Author: Robert Fisk | ||||
|  */ | ||||
| 
 | ||||
| #ifndef INC_DOWNSTREAM_MSC_H_ | ||||
| #define INC_DOWNSTREAM_MSC_H_ | ||||
| 
 | ||||
| 
 | ||||
| #include "downstream_spi.h" | ||||
| 
 | ||||
| 
 | ||||
| HAL_StatusTypeDef Downstream_MSC_ApproveConnectedDevice(void); | ||||
| void Downstream_MSC_PacketProcessor(DownstreamPacketTypeDef* receivedPacket); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #endif /* INC_DOWNSTREAM_MSC_H_ */ | ||||
| @ -0,0 +1,132 @@ | ||||
| /*
 | ||||
|  * downstream_msc.c | ||||
|  * | ||||
|  *  Created on: 8/08/2015 | ||||
|  *      Author: Robert Fisk | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| #include "downstream_msc.h" | ||||
| #include "downstream_interface_def.h" | ||||
| #include "downstream_statemachine.h" | ||||
| #include "usbh_msc.h" | ||||
| 
 | ||||
| 
 | ||||
| extern USBH_HandleTypeDef hUsbHostFS;		//Hard-link ourselves to usb_host.c
 | ||||
| 
 | ||||
| 
 | ||||
| void Downstream_MSC_PacketProcessor_TestUnitReady(DownstreamPacketTypeDef* receivedPacket); | ||||
| void Downstream_MSC_PacketProcessor_GetCapacity(DownstreamPacketTypeDef* receivedPacket); | ||||
| void Downstream_MSC_PacketProcessor_BeginRead(DownstreamPacketTypeDef* receivedPacket); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| //High-level checks on the connected device. We don't want some weirdly
 | ||||
| //configured device to bomb our USB stack, accidentally or otherwise.
 | ||||
| HAL_StatusTypeDef Downstream_MSC_ApproveConnectedDevice(void) | ||||
| { | ||||
| 	MSC_HandleTypeDef* MSC_Handle =  (MSC_HandleTypeDef*)hUsbHostFS.pActiveClass->pData; | ||||
| 
 | ||||
| 	if ((MSC_Handle->unit[0].capacity.block_nbr == 0) || | ||||
| 		(MSC_Handle->unit[0].capacity.block_nbr == UINT32_MAX)) | ||||
| 	{ | ||||
| 		return HAL_ERROR; | ||||
| 	} | ||||
| 
 | ||||
| 	if (MSC_Handle->unit[0].capacity.block_size != 512) | ||||
| 	{ | ||||
| 		return HAL_ERROR; | ||||
| 	} | ||||
| 
 | ||||
| 	return HAL_OK; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Downstream_MSC_PacketProcessor(DownstreamPacketTypeDef* receivedPacket) | ||||
| { | ||||
| 	switch (receivedPacket->Command) | ||||
| 	{ | ||||
| 	case COMMAND_MSC_TEST_UNIT_READY: | ||||
| 		Downstream_MSC_PacketProcessor_TestUnitReady(receivedPacket); | ||||
| 		break; | ||||
| 
 | ||||
| 	case COMMAND_MSC_GET_CAPACITY: | ||||
| 		Downstream_MSC_PacketProcessor_GetCapacity(receivedPacket); | ||||
| 		break; | ||||
| 
 | ||||
| 	case COMMAND_MSC_BEGIN_READ: | ||||
| 		Downstream_MSC_PacketProcessor_BeginRead(receivedPacket); | ||||
| 		break; | ||||
| 
 | ||||
| 	default: | ||||
| 		Downstream_PacketProcessor_ErrorReply(receivedPacket); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Downstream_MSC_PacketProcessor_TestUnitReady(DownstreamPacketTypeDef* receivedPacket) | ||||
| { | ||||
| 	if (USBH_MSC_UnitIsReady(&hUsbHostFS, 0)) | ||||
| 	{ | ||||
| 		receivedPacket->Data[0] = HAL_OK; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		receivedPacket->Data[0] = HAL_ERROR; | ||||
| 	} | ||||
| 	receivedPacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + 1; | ||||
| 	Downstream_PacketProcessor_ClassReply(receivedPacket); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Downstream_MSC_PacketProcessor_GetCapacity(DownstreamPacketTypeDef* receivedPacket) | ||||
| { | ||||
| 	MSC_HandleTypeDef* MSC_Handle =  (MSC_HandleTypeDef*)hUsbHostFS.pActiveClass->pData; | ||||
| 
 | ||||
| 	receivedPacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + 8; | ||||
| 	*(uint32_t*)&(receivedPacket->Data[0]) = MSC_Handle->unit[0].capacity.block_nbr; | ||||
| 	*(uint32_t*)&(receivedPacket->Data[4]) = (uint32_t)MSC_Handle->unit[0].capacity.block_size; | ||||
| 	Downstream_PacketProcessor_ClassReply(receivedPacket); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| void Downstream_MSC_PacketProcessor_BeginRead(DownstreamPacketTypeDef* receivedPacket) | ||||
| { | ||||
| 	uint64_t address; | ||||
| 	uint32_t count; | ||||
| 	MSC_HandleTypeDef* MSC_Handle =  (MSC_HandleTypeDef*)hUsbHostFS.pActiveClass->pData; | ||||
| 
 | ||||
| 	if (receivedPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + (4 * 3))) | ||||
| 	{ | ||||
| 		Downstream_PacketProcessor_ErrorReply(receivedPacket); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	address = *(uint64_t*)&(receivedPacket->Data[0]); | ||||
| 	count = *(uint32_t*)&(receivedPacket->Data[8]); | ||||
| 	if ((address 		       >= (uint64_t)MSC_Handle->unit[0].capacity.block_nbr) || | ||||
| 		((address + count - 1) >= (uint64_t)MSC_Handle->unit[0].capacity.block_nbr)) | ||||
| 	{ | ||||
| 		Downstream_PacketProcessor_ErrorReply(receivedPacket); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (USBH_MSC_UnitIsReady(&hUsbHostFS, 0)) | ||||
| 	{ | ||||
| 		receivedPacket->Data[0] = HAL_OK; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		receivedPacket->Data[0] = HAL_ERROR; | ||||
| 	} | ||||
| 	receivedPacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + 1; | ||||
| 	Downstream_TransmitPacket(receivedPacket); | ||||
| 
 | ||||
| 	USBH_MSC_Read(&hUsbHostFS, | ||||
| 				  0, | ||||
| 				  (uint32_t)address, | ||||
| 				  count); | ||||
| } | ||||
| 
 | ||||
					Loading…
					
					
				
		Reference in new issue
	
	 Robert Fisk
						Robert Fisk