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 \
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 \
// Optional static config\r
extern uint8_t* __fixed_config;\r
\r
+#ifdef S2S_USB_HS\r
+#define configUsbDev hUsbDeviceHS\r
+#else\r
+#define configUsbDev configUsbDev\r
+#endif\r
+\r
// 1 flash row\r
static const uint8_t DEFAULT_CONFIG[128] =\r
{\r
{\r
s2s_spin_lock(&usbDevLock);\r
\r
- if (!USBD_Composite_IsConfigured(&hUsbDeviceFS))\r
+ if (!USBD_Composite_IsConfigured(&configUsbDev))\r
{\r
usbInEpState = USB_IDLE;\r
goto out;\r
}\r
\r
- if (USBD_HID_IsReportReady(&hUsbDeviceFS))\r
+ if (USBD_HID_IsReportReady(&configUsbDev))\r
{\r
s2s_ledOn();\r
\r
// The host sent us some data!\r
uint8_t hidBuffer[USBHID_LEN];\r
- int byteCount = USBD_HID_GetReport(&hUsbDeviceFS, hidBuffer, sizeof(hidBuffer));\r
+ int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));\r
hidPacket_recv(hidBuffer, byteCount);\r
\r
size_t cmdSize;\r
\r
if (nextChunk)\r
{\r
- USBD_HID_SendReport (&hUsbDeviceFS, nextChunk, sizeof(hidBuffer));\r
+ USBD_HID_SendReport (&configUsbDev, nextChunk, sizeof(hidBuffer));\r
usbInEpState = USB_DATA_SENT;\r
}\r
}\r
break;\r
\r
case USB_DATA_SENT:\r
- if (!USBD_HID_IsBusy(&hUsbDeviceFS))\r
+ if (!USBD_HID_IsBusy(&configUsbDev))\r
{\r
// Data accepted.\r
usbInEpState = USB_IDLE;\r
\r
void s2s_debugTimer()\r
{\r
- if (!USBD_Composite_IsConfigured(&hUsbDeviceFS))\r
+ if (!USBD_Composite_IsConfigured(&configUsbDev))\r
{\r
usbInEpState = USB_IDLE;\r
return;\r
}\r
\r
- if (USBD_HID_IsReportReady(&hUsbDeviceFS))\r
+ if (USBD_HID_IsReportReady(&configUsbDev))\r
{\r
uint8_t hidBuffer[USBHID_LEN];\r
- int byteCount = USBD_HID_GetReport(&hUsbDeviceFS, hidBuffer, sizeof(hidBuffer));\r
+ int byteCount = USBD_HID_GetReport(&configUsbDev, hidBuffer, sizeof(hidBuffer));\r
hidPacket_recv(hidBuffer, byteCount);\r
\r
size_t cmdSize;\r
\r
if (nextChunk)\r
{\r
- USBD_HID_SendReport (&hUsbDeviceFS, nextChunk, sizeof(hidBuffer));\r
+ USBD_HID_SendReport (&configUsbDev, nextChunk, sizeof(hidBuffer));\r
usbInEpState = USB_DATA_SENT;\r
}\r
}\r
break;\r
\r
case USB_DATA_SENT:\r
- if (!USBD_HID_IsBusy(&hUsbDeviceFS))\r
+ if (!USBD_HID_IsBusy(&configUsbDev))\r
{\r
// Data accepted.\r
usbInEpState = USB_IDLE;\r
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
s2s_timeInit();\r
s2s_checkHwVersion();\r
\r
- // DISable the ULPI chip\r
- HAL_GPIO_WritePin(nULPI_RESET_GPIO_Port, nULPI_RESET_Pin, GPIO_PIN_RESET);\r
+ #ifdef S2S_USB_HS\r
+ // Enable the ULPI chip\r
+ HAL_GPIO_WritePin(nULPI_RESET_GPIO_Port, nULPI_RESET_Pin, GPIO_PIN_SET);\r
+ s2s_delay_ms(5);\r
+ #else\r
+ // DISable the ULPI chip\r
+ HAL_GPIO_WritePin(nULPI_RESET_GPIO_Port, nULPI_RESET_Pin, GPIO_PIN_RESET);\r
+ #endif\r
\r
s2s_ledInit();\r
s2s_fpgaInit();\r
scsiPoll();\r
scsiDiskPoll();\r
s2s_configPoll();\r
- s2s_usbDevicePoll();\r
+\r
+#ifdef S2S_USB_FS\r
+ s2s_usbDevicePoll(&hUsbDeviceFS);\r
+#endif\r
+#ifdef S2S_USB_FS\r
+ s2s_usbDevicePoll(&hUsbDeviceHS);\r
+#endif\r
\r
#if 0\r
sdPoll();\r
#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
}
/**
* @}
#include "usbd_def.h"
extern USBD_HandleTypeDef hUsbDeviceFS;
+extern USBD_HandleTypeDef hUsbDeviceHS;
/* USB_Device init function */
void MX_USB_DEVICE_Init(void);
#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);
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);
USBD_LL_PrepareReceive(
pdev,
HID_EPOUT_ADDR,
- classData.hid.rxBuffer,
- sizeof(classData.hid.rxBuffer));
+ classData->hid.rxBuffer,
+ sizeof(classData->hid.rxBuffer));
return ret;
}
}
-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 */
}
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);
}
}
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;
* @{
*/
extern USBD_DescriptorsTypeDef FS_Desc;
+//extern USBD_DescriptorsTypeDef HS_Desc;
/**
* @}
*/
#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 =
{
{
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;
*/
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)
#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
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;
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;