From: Michael McMaster Date: Sat, 6 Feb 2021 10:19:59 +0000 (+1000) Subject: Fixes for 2021 board X-Git-Tag: v6.4.0~6^2~13 X-Git-Url: http://git.codesrc.com/gitweb.cgi?a=commitdiff_plain;h=8c002ff6c777bc6ea0d6a635ce5895380bd51024;p=SCSI2SD-V6.git Fixes for 2021 board --- diff --git a/Makefile.2020c b/Makefile.2020c index 33a3f4fd..bbc1f9f1 100644 --- a/Makefile.2020c +++ b/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 \ diff --git a/Makefile.2021 b/Makefile.2021 index 5894e973..d8d6860f 100644 --- a/Makefile.2021 +++ b/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 \ diff --git a/src/firmware/config.c b/src/firmware/config.c index 7c26d94a..1803aa10 100755 --- a/src/firmware/config.c +++ b/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; diff --git a/src/firmware/hwversion.c b/src/firmware/hwversion.c index 7f55b2e5..d88a0c9b 100755 --- a/src/firmware/hwversion.c +++ b/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 diff --git a/src/firmware/main.c b/src/firmware/main.c index 8e194da2..a254b065 100755 --- a/src/firmware/main.c +++ b/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(); diff --git a/src/firmware/usb_device/usb_device.c b/src/firmware/usb_device/usb_device.c index 9aecb09b..189fbef3 100755 --- a/src/firmware/usb_device/usb_device.c +++ b/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 } /** * @} diff --git a/src/firmware/usb_device/usb_device.h b/src/firmware/usb_device/usb_device.h index 0c096087..5da3ecef 100755 --- a/src/firmware/usb_device/usb_device.h +++ b/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); diff --git a/src/firmware/usb_device/usbd_composite.c b/src/firmware/usb_device/usbd_composite.c index 50dca00e..2cf9f2ee 100755 --- a/src/firmware/usb_device/usbd_composite.c +++ b/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); } } diff --git a/src/firmware/usb_device/usbd_composite.h b/src/firmware/usb_device/usbd_composite.h index ca279efe..dbb9778d 100755 --- a/src/firmware/usb_device/usbd_composite.h +++ b/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; diff --git a/src/firmware/usb_device/usbd_desc.h b/src/firmware/usb_device/usbd_desc.h index aff7527e..de7b0256 100755 --- a/src/firmware/usb_device/usbd_desc.h +++ b/src/firmware/usb_device/usbd_desc.h @@ -76,6 +76,7 @@ * @{ */ extern USBD_DescriptorsTypeDef FS_Desc; +//extern USBD_DescriptorsTypeDef HS_Desc; /** * @} */ diff --git a/src/firmware/usb_device/usbd_hid.c b/src/firmware/usb_device/usbd_hid.c index 4371308c..9044be79 100755 --- a/src/firmware/usb_device/usbd_hid.c +++ b/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) diff --git a/src/firmware/usb_device/usbd_hid.h b/src/firmware/usb_device/usbd_hid.h index 09f1f8fd..bd0e55f8 100755 --- a/src/firmware/usb_device/usbd_hid.h +++ b/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; diff --git a/src/firmware/usb_device/usbd_msc.h b/src/firmware/usb_device/usbd_msc.h index 5f7a93dc..0c7902d2 100755 --- a/src/firmware/usb_device/usbd_msc.h +++ b/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;