Explorar o código

Fixes for 2021 board

Michael McMaster %!s(int64=4) %!d(string=hai) anos
pai
achega
75acbd6f46

+ 1 - 1
lib/SCSI2SD/Makefile.2020c

@@ -2,7 +2,7 @@
 ARMCC=arm-none-eabi-gcc
 OBJCOPY=arm-none-eabi-objcopy
 
-CPPFLAGS=-DSTM32F205xx -DSTM32F2xx -DUSE_HAL_DRIVER -Wall 
+CPPFLAGS=-DSTM32F205xx -DSTM32F2xx -DUSE_HAL_DRIVER -Wall -DS2S_USB_FS
 CFLAGS=-mcpu=cortex-m3 -mthumb -mslow-flash-data \
 	-std=gnu11 \
 	-specs=nosys.specs \

+ 2 - 1
lib/SCSI2SD/Makefile.2021

@@ -2,7 +2,8 @@
 ARMCC=arm-none-eabi-gcc
 OBJCOPY=arm-none-eabi-objcopy
 
-CPPFLAGS=-DSTM32F446xx -DSTM32F4xx -DUSE_HAL_DRIVER -Wall 
+#CPPFLAGS=-DSTM32F446xx -DSTM32F4xx -DUSE_HAL_DRIVER -Wall -DS2S_USB_HS
+CPPFLAGS=-DSTM32F446xx -DSTM32F4xx -DUSE_HAL_DRIVER -Wall -DS2S_USB_FS
 CFLAGS=-mcpu=cortex-m4 -mthumb -mslow-flash-data \
 	-std=gnu11 \
 	-specs=nosys.specs \

+ 16 - 10
lib/SCSI2SD/src/firmware/config.c

@@ -41,6 +41,12 @@ static const uint16_t FIRMWARE_VERSION = 0x0632;
 // Optional static config
 extern uint8_t* __fixed_config;
 
+#ifdef S2S_USB_HS
+#define configUsbDev hUsbDeviceHS
+#else
+#define configUsbDev configUsbDev
+#endif
+
 // 1 flash row
 static const uint8_t DEFAULT_CONFIG[128] =
 {
@@ -322,19 +328,19 @@ void s2s_configPoll()
 {
 	s2s_spin_lock(&usbDevLock);
 
-	if (!USBD_Composite_IsConfigured(&hUsbDeviceFS))
+	if (!USBD_Composite_IsConfigured(&configUsbDev))
 	{
 		usbInEpState = USB_IDLE;
 		goto out;
 	}
 
-	if (USBD_HID_IsReportReady(&hUsbDeviceFS))
+	if (USBD_HID_IsReportReady(&configUsbDev))
 	{
 		s2s_ledOn();
 
 		// The host sent us some data!
 		uint8_t hidBuffer[USBHID_LEN];
-		int byteCount = USBD_HID_GetReport(&hUsbDeviceFS, hidBuffer, sizeof(hidBuffer));
+		int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));
 		hidPacket_recv(hidBuffer, byteCount);
 
 		size_t cmdSize;
@@ -356,14 +362,14 @@ void s2s_configPoll()
 
 			if (nextChunk)
 			{
-				USBD_HID_SendReport (&hUsbDeviceFS, nextChunk, sizeof(hidBuffer));
+				USBD_HID_SendReport (&configUsbDev, nextChunk, sizeof(hidBuffer));
 				usbInEpState = USB_DATA_SENT;
 			}
 		}
 		break;
 
 	case USB_DATA_SENT:
-		if (!USBD_HID_IsBusy(&hUsbDeviceFS))
+		if (!USBD_HID_IsBusy(&configUsbDev))
 		{
 			// Data accepted.
 			usbInEpState = USB_IDLE;
@@ -377,16 +383,16 @@ out:
 
 void s2s_debugTimer()
 {
-	if (!USBD_Composite_IsConfigured(&hUsbDeviceFS))
+	if (!USBD_Composite_IsConfigured(&configUsbDev))
 	{
 		usbInEpState = USB_IDLE;
 		return;
 	}
 
-	if (USBD_HID_IsReportReady(&hUsbDeviceFS))
+	if (USBD_HID_IsReportReady(&configUsbDev))
 	{
 		uint8_t hidBuffer[USBHID_LEN];
-		int byteCount = USBD_HID_GetReport(&hUsbDeviceFS, hidBuffer, sizeof(hidBuffer));
+		int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));
 		hidPacket_recv(hidBuffer, byteCount);
 
 		size_t cmdSize;
@@ -416,14 +422,14 @@ void s2s_debugTimer()
 
 			if (nextChunk)
 			{
-				USBD_HID_SendReport (&hUsbDeviceFS, nextChunk, sizeof(hidBuffer));
+				USBD_HID_SendReport (&configUsbDev, nextChunk, sizeof(hidBuffer));
 				usbInEpState = USB_DATA_SENT;
 			}
 		}
 		break;
 
 		case USB_DATA_SENT:
-			if (!USBD_HID_IsBusy(&hUsbDeviceFS))
+			if (!USBD_HID_IsBusy(&configUsbDev))
 			{
 				// Data accepted.
 				usbInEpState = USB_IDLE;

+ 1 - 0
lib/SCSI2SD/src/firmware/hwversion.c

@@ -66,6 +66,7 @@ checkHwSensePins()
 void
 s2s_checkHwVersion()
 {
+return; // TODO FIX FOR 2021
 	checkHwSensePins();
 
 	// Write a marker to flash that can be read by dfu-util now that we know

+ 15 - 3
lib/SCSI2SD/src/firmware/main.c

@@ -54,8 +54,14 @@ void mainInit()
 	s2s_timeInit();
 	s2s_checkHwVersion();
 
-	// DISable the ULPI chip
-	HAL_GPIO_WritePin(nULPI_RESET_GPIO_Port, nULPI_RESET_Pin, GPIO_PIN_RESET);
+	#ifdef S2S_USB_HS
+		// Enable the ULPI chip
+		HAL_GPIO_WritePin(nULPI_RESET_GPIO_Port, nULPI_RESET_Pin, GPIO_PIN_SET);
+		s2s_delay_ms(5);
+	#else
+		// DISable the ULPI chip
+		HAL_GPIO_WritePin(nULPI_RESET_GPIO_Port, nULPI_RESET_Pin, GPIO_PIN_RESET);
+	#endif
 
 	s2s_ledInit();
 	s2s_fpgaInit();
@@ -95,7 +101,13 @@ void mainLoop()
 	scsiPoll();
 	scsiDiskPoll();
 	s2s_configPoll();
-	s2s_usbDevicePoll();
+
+#ifdef S2S_USB_FS
+	s2s_usbDevicePoll(&hUsbDeviceFS);
+#endif
+#ifdef S2S_USB_FS
+	s2s_usbDevicePoll(&hUsbDeviceHS);
+#endif
 
 #if 0
 	sdPoll();

+ 15 - 5
lib/SCSI2SD/src/firmware/usb_device/usb_device.c

@@ -39,19 +39,29 @@
 #include "usbd_desc.h"
 #include "usbd_composite.h"
 
+//#include "usbd_hidt.h"
+
 /* USB Device Core handle declaration */
 USBD_HandleTypeDef hUsbDeviceFS;
+USBD_HandleTypeDef hUsbDeviceHS;
 
-/* init function */				        
 void MX_USB_DEVICE_Init(void)
 {
-  /* Init Device Library,Add Supported Class and Start the library*/
-  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
+#if S2S_USB_FS
+	USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
+	USBD_RegisterClass(&hUsbDeviceFS, &USBD_Composite);
+	USBD_Start(&hUsbDeviceFS);
+#endif
+#if S2S_USB_HS
+	USBD_Init(&hUsbDeviceHS, &FS_Desc, DEVICE_HS);
+	USBD_RegisterClass(&hUsbDeviceHS, &USBD_Composite);
 
-  USBD_RegisterClass(&hUsbDeviceFS, &USBD_Composite);
+USB_OTG_GlobalTypeDef* USBx  = USB_OTG_HS;
+USBx_DEVICE->DCFG |= 0x4000; // BIT 14
 
-  USBD_Start(&hUsbDeviceFS);
+	USBD_Start(&hUsbDeviceHS);
 
+#endif
 }
 /**
   * @}

+ 1 - 0
lib/SCSI2SD/src/firmware/usb_device/usb_device.h

@@ -49,6 +49,7 @@
 #include "usbd_def.h"
 
 extern USBD_HandleTypeDef hUsbDeviceFS;
+extern USBD_HandleTypeDef hUsbDeviceHS;
 
 /* USB_Device init function */	
 void MX_USB_DEVICE_Init(void);

+ 35 - 27
lib/SCSI2SD/src/firmware/usb_device/usbd_composite.c

@@ -27,6 +27,9 @@
 #include "usbd_ctlreq.h"
 
 
+// Support 2 USB devices.
+__ALIGN_BEGIN static USBD_CompositeClassData fsClassData __ALIGN_END;
+__ALIGN_BEGIN static USBD_CompositeClassData hsClassData __ALIGN_END;
 
 static uint8_t  USBD_Composite_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx);
 
@@ -179,11 +182,20 @@ static uint8_t  USBD_Composite_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
 	USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET);
 
 
-	// Use static memory. This limits us to a single HID and MSC devicd
-	static USBD_CompositeClassData classData;
-	classData.hid.state = HID_IDLE;
-	classData.hid.reportReady = 0;
-	pdev->pClassData = &classData;
+	USBD_CompositeClassData* classData;
+	if (pdev->id == DEVICE_HS)
+	{
+		classData = &hsClassData;
+	}
+	else
+	{
+		classData = &fsClassData;
+	}
+	classData->hid.state = HID_IDLE;
+	classData->hid.reportReady = 0;
+	classData->DataInReady = 0;
+	classData->DataOutReady = 0;
+	pdev->pClassData = classData;
 
 	MSC_BOT_Init(pdev);
 
@@ -191,8 +203,8 @@ static uint8_t  USBD_Composite_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
 	USBD_LL_PrepareReceive(
 		pdev,
 		HID_EPOUT_ADDR,
-		classData.hid.rxBuffer,
-		sizeof(classData.hid.rxBuffer));
+		classData->hid.rxBuffer,
+		sizeof(classData->hid.rxBuffer));
 
 	return ret;
 }
@@ -350,15 +362,11 @@ static uint8_t USBD_Composite_Setup(
 }
 
 
-int FIXME_IN = 0;
-int FIXME_OUT = 0;
-USBD_HandleTypeDef  *pdevtmp;
 static uint8_t USBD_Composite_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
 {
-pdevtmp = pdev;
+	USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
 	if (epnum == (HID_EPIN_ADDR & 0x7F))
 	{
-		USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
 		USBD_HID_HandleTypeDef *hhid = &(classData->hid);
 		/* Ensure that the FIFO is empty before a new transfer, this condition could 
 		be caused by  a new transfer before the end of the previous transfer */
@@ -366,40 +374,40 @@ pdevtmp = pdev;
 	}
 	else if (epnum == (MSC_EPIN_ADDR & 0x7F))
 	{
-	FIXME_IN = epnum;
-	//	MSC_BOT_DataIn(pdev , epnum);
+		classData->DataInReady = epnum;
 	}
 	return USBD_OK;
 }
 
 static uint8_t USBD_Composite_DataOut(USBD_HandleTypeDef  *pdev, uint8_t epnum)
 {
-pdevtmp = pdev;
+	USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
 	if (epnum == (HID_EPOUT_ADDR & 0x7F))
 	{
-		USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
 		USBD_HID_HandleTypeDef *hhid = &(classData->hid);
 		hhid->reportReady = 1;
 	}
 	else if (epnum == (MSC_EPOUT_ADDR & 0x7F))
 	{
-	FIXME_OUT = epnum;
-		//MSC_BOT_DataOut(pdev, epnum);
+		classData->DataOutReady = epnum;
 	}
 	return USBD_OK;
 }
 
-void s2s_usbDevicePoll(void) {
-	if (FIXME_IN) {
-		int tmp = FIXME_IN;
-		FIXME_IN = 0;
-		MSC_BOT_DataIn(pdevtmp, tmp);
+void s2s_usbDevicePoll(USBD_HandleTypeDef  *pdev) {
+	USBD_CompositeClassData *classData = (USBD_CompositeClassData*) pdev->pClassData;
+
+	if (classData->DataInReady)
+	{
+		int tmp = classData->DataInReady;
+		classData->DataInReady = 0;
+		MSC_BOT_DataIn(pdev, tmp);
 	}
 
-	if (FIXME_OUT) {
-		int tmp = FIXME_OUT;
-		FIXME_OUT = 0;
-		MSC_BOT_DataOut(pdevtmp, tmp);
+	if (classData->DataOutReady) {
+		int tmp = classData->DataOutReady;
+		classData->DataOutReady = 0;
+		MSC_BOT_DataOut(pdev, tmp);
 	}
 }
 

+ 6 - 3
lib/SCSI2SD/src/firmware/usb_device/usbd_composite.h

@@ -40,12 +40,15 @@ extern USBD_ClassTypeDef  USBD_Composite;
 
 
 typedef struct {
-	USBD_HID_HandleTypeDef hid;
-	USBD_MSC_BOT_HandleTypeDef msc;
+	__ALIGN_BEGIN USBD_HID_HandleTypeDef hid __ALIGN_END;
+	__ALIGN_BEGIN USBD_MSC_BOT_HandleTypeDef msc __ALIGN_END;
+
+	int DataInReady; // Endpoint number, 0 if not ready.
+	int DataOutReady;// Endpoint number, 0 if not ready.
 } USBD_CompositeClassData;
 
 
-void s2s_usbDevicePoll(void);
+void s2s_usbDevicePoll(USBD_HandleTypeDef* pdev);
 
 static inline uint8_t USBD_Composite_IsConfigured(USBD_HandleTypeDef *pdev) {
 	return pdev->dev_state == USBD_STATE_CONFIGURED;

+ 1 - 0
lib/SCSI2SD/src/firmware/usb_device/usbd_desc.h

@@ -76,6 +76,7 @@
   * @{
   */ 
 extern USBD_DescriptorsTypeDef FS_Desc;
+//extern USBD_DescriptorsTypeDef HS_Desc;
 /**
   * @}
   */ 

+ 24 - 11
lib/SCSI2SD/src/firmware/usb_device/usbd_hid.c

@@ -53,12 +53,6 @@
 #include "usbd_desc.h"
 #include "usbd_ctlreq.h"
 
-
-
-int usbdReportReady = 0; // Global to allow poll-based HID report processing
-
-
-
 /* USB HID device Configuration Descriptor */
 __ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ]  __ALIGN_END  =
 {
@@ -116,11 +110,15 @@ uint8_t USBD_HID_SendReport     (USBD_HandleTypeDef  *pdev,
 	{
 		if(hhid->state == HID_IDLE)
 		{
+			uint16_t safeLen =
+				len < sizeof(hhid->txBuffer) ? len : sizeof(hhid->txBuffer);
+			memcpy(hhid->txBuffer, report, safeLen);
+
 			hhid->state = HID_BUSY;
 			USBD_LL_Transmit (pdev,
 					HID_EPIN_ADDR,
-					(uint8_t*)report,
-					len);
+					(uint8_t*)hhid->txBuffer,
+					safeLen);
 		}
 	}
 	return USBD_OK;
@@ -134,9 +132,24 @@ uint8_t USBD_HID_SendReport     (USBD_HandleTypeDef  *pdev,
   */
 uint32_t USBD_HID_GetPollingInterval (USBD_HandleTypeDef *pdev)
 {
-	/* Sets the data transfer polling interval for low and full 
-	speed transfers */
-	return HID_FS_BINTERVAL;
+	uint32_t polling_interval = 0;
+
+	/* HIGH-speed endpoints */
+	if(pdev->dev_speed == USBD_SPEED_HIGH)
+	{
+		/* Sets the data transfer polling interval for high speed transfers. 
+		Values between 1..16 are allowed. Values correspond to interval 
+		of 2 ^ (bInterval-1). This option (8 ms, corresponds to HID_HS_BINTERVAL */
+		polling_interval = (((1 <<(HID_HS_BINTERVAL - 1)))/8);
+	}
+	else   /* LOW and FULL-speed endpoints */
+	{
+		/* Sets the data transfer polling interval for low and full 
+		speed transfers */
+		polling_interval =  HID_FS_BINTERVAL;
+	}
+
+	return ((uint32_t)(polling_interval));
 }
 
 uint8_t USBD_HID_GetReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint8_t maxLen)

+ 3 - 1
lib/SCSI2SD/src/firmware/usb_device/usbd_hid.h

@@ -51,6 +51,7 @@
 #define HID_REPORT_DESC               0x22
 
 #define HID_FS_BINTERVAL               0x20 // 32ms
+#define HID_HS_BINTERVAL               0x20 // 32ms
 
 #define HID_REQ_SET_PROTOCOL          0x0B
 #define HID_REQ_GET_PROTOCOL          0x03
@@ -75,7 +76,8 @@ typedef struct
 	uint32_t             IdleState;
 	uint32_t             AltSetting;
 	HID_StateTypeDef     state;
-	uint8_t              rxBuffer[HID_EPOUT_SIZE];
+	__ALIGN_BEGIN uint8_t rxBuffer[HID_EPOUT_SIZE] __ALIGN_END;
+	__ALIGN_BEGIN uint8_t txBuffer[HID_EPOUT_SIZE] __ALIGN_END;
 	int                  reportReady;
 }
 USBD_HID_HandleTypeDef;

+ 3 - 3
lib/SCSI2SD/src/firmware/usb_device/usbd_msc.h

@@ -91,9 +91,9 @@ typedef struct
   uint8_t                  bot_state;
   uint8_t                  bot_status;  
   uint16_t                 bot_data_length;
-  uint8_t                  bot_data[S2S_MSC_MEDIA_PACKET];  
-  USBD_MSC_BOT_CBWTypeDef  cbw;
-  USBD_MSC_BOT_CSWTypeDef  csw;
+  __ALIGN_BEGIN uint8_t                  bot_data[S2S_MSC_MEDIA_PACKET] __ALIGN_END;
+  __ALIGN_BEGIN USBD_MSC_BOT_CBWTypeDef  cbw __ALIGN_END;
+  __ALIGN_BEGIN USBD_MSC_BOT_CSWTypeDef  csw __ALIGN_END;
   
   USBD_SCSI_SenseTypeDef   scsi_sense [SENSE_LIST_DEEPTH];
   uint8_t                  scsi_sense_head;