summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/class/hid/hid_device.c29
-rw-r--r--src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c43
-rw-r--r--src/portable/st/stm32_fsdev/dcd_stm32_fsdev_pvt_st.h77
3 files changed, 82 insertions, 67 deletions
diff --git a/src/class/hid/hid_device.c b/src/class/hid/hid_device.c
index 572f2cad2..b57d6219f 100644
--- a/src/class/hid/hid_device.c
+++ b/src/class/hid/hid_device.c
@@ -46,12 +46,13 @@ typedef struct
uint8_t boot_protocol; // Boot mouse or keyboard
bool boot_mode; // default = false (Report)
uint8_t idle_rate; // up to application to handle idle rate
- uint16_t reprot_desc_len;
+ uint16_t report_desc_len;
CFG_TUSB_MEM_ALIGN uint8_t epin_buf[CFG_TUD_HID_BUFSIZE];
CFG_TUSB_MEM_ALIGN uint8_t epout_buf[CFG_TUD_HID_BUFSIZE];
-}hidd_interface_t;
+ tusb_hid_descriptor_hid_t const * hid_descriptor;
+} hidd_interface_t;
CFG_TUSB_MEM_SECTION static hidd_interface_t _hidd_itf[CFG_TUD_HID];
@@ -167,8 +168,8 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
//------------- HID descriptor -------------//
p_desc = tu_desc_next(p_desc);
- tusb_hid_descriptor_hid_t const *desc_hid = (tusb_hid_descriptor_hid_t const *) p_desc;
- TU_ASSERT(HID_DESC_TYPE_HID == desc_hid->bDescriptorType);
+ p_hid->hid_descriptor = (tusb_hid_descriptor_hid_t const *) p_desc;
+ TU_ASSERT(HID_DESC_TYPE_HID == p_hid->hid_descriptor->bDescriptorType);
//------------- Endpoint Descriptor -------------//
p_desc = tu_desc_next(p_desc);
@@ -178,7 +179,7 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
p_hid->boot_mode = false; // default mode is REPORT
p_hid->itf_num = desc_itf->bInterfaceNumber;
- memcpy(&p_hid->reprot_desc_len, &desc_hid->wReportLength, 2);
+ memcpy(&p_hid->report_desc_len, &(p_hid->hid_descriptor->wReportLength), 2);
*p_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + desc_itf->bNumEndpoints*sizeof(tusb_desc_endpoint_t);
@@ -192,6 +193,10 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
// return false to stall control endpoint (e.g unsupported request)
bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
{
+ if (p_request->bmRequestType_bit.recipient != TUSB_REQ_RCPT_INTERFACE)
+ {
+ return false;
+ }
hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) p_request->wIndex );
TU_ASSERT(p_hid);
@@ -202,11 +207,17 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * p_reque
uint8_t const desc_index = tu_u16_low (p_request->wValue);
(void) desc_index;
- if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT)
+ if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID)
+ {
+ TU_VERIFY(p_hid->hid_descriptor != NULL);
+ TU_VERIFY(tud_control_xfer(rhport, p_request, (void*) p_hid->hid_descriptor, p_hid->hid_descriptor->bLength));
+ }
+ else if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT)
{
uint8_t const * desc_report = tud_hid_descriptor_report_cb();
- tud_control_xfer(rhport, p_request, (void*) desc_report, p_hid->reprot_desc_len);
- }else
+ tud_control_xfer(rhport, p_request, (void*) desc_report, p_hid->report_desc_len);
+ }
+ else
{
return false; // stall unsupported request
}
@@ -251,7 +262,7 @@ bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * p_reque
case HID_REQ_CONTROL_GET_PROTOCOL:
{
- uint8_t protocol = 1-p_hid->boot_mode; // 0 is Boot, 1 is Report protocol
+ uint8_t protocol = (uint8_t)(1-p_hid->boot_mode); // 0 is Boot, 1 is Report protocol
tud_control_xfer(rhport, p_request, &protocol, 1);
}
break;
diff --git a/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c b/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
index aec8ea0c7..9bd4d2362 100644
--- a/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
+++ b/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
@@ -30,10 +30,7 @@
/**********************************************
* This driver has been tested with the following MCUs:
- *
- *
- * STM32F070RB
- *
+ * - F070, F072, L053
*
* It also should work with minimal changes for any ST MCU with an "USB A"/"PCD"/"HCD" peripheral. This
* covers:
@@ -106,14 +103,17 @@
#include "tusb_option.h"
+#define STM32F1_FSDEV ( \
+ defined(STM32F102x6) || defined(STM32F102xB) || \
+ defined(STM32F103x6) || defined(STM32F103xB) || \
+ defined(STM32F103xE) || defined(STM32F103xG) \
+)
+
#if (TUSB_OPT_DEVICE_ENABLED) && ( \
- ((CFG_TUSB_MCU) == OPT_MCU_STM32F0) || \
- (((CFG_TUSB_MCU) == OPT_MCU_STM32F1) && ( \
- defined(stm32f102x6) || defined(stm32f102xb) || \
- defined(stm32f103x6) || defined(stm32f103xb) || \
- defined(stm32f103xe) || defined(stm32f103xg) \
- )) || \
- ((CFG_TUSB_MCU) == OPT_MCU_STM32F3) \
+ (CFG_TUSB_MCU == OPT_MCU_STM32F0 ) || \
+ (CFG_TUSB_MCU == OPT_MCU_STM32F1 && STM32F1_FSDEV ) || \
+ (CFG_TUSB_MCU == OPT_MCU_STM32F3 ) || \
+ (CFG_TUSB_MCU == OPT_MCU_STM32L0 ) \
)
// In order to reduce the dependance on HAL, we undefine this.
@@ -165,7 +165,7 @@ typedef struct
static xfer_ctl_t xfer_status[MAX_EP_COUNT][2];
-static xfer_ctl_t* xfer_ctl_ptr(uint32_t epnum, uint32_t dir)
+static inline xfer_ctl_t* xfer_ctl_ptr(uint32_t epnum, uint32_t dir)
{
return &xfer_status[epnum][dir];
}
@@ -252,9 +252,10 @@ void dcd_init (uint8_t rhport)
void dcd_int_enable (uint8_t rhport)
{
(void)rhport;
-#if defined(STM32F0)
+
+#if CFG_TUSB_MCU == OPT_MCU_STM32F0 || CFG_TUSB_MCU == OPT_MCU_STM32L0
NVIC_EnableIRQ(USB_IRQn);
-#elif defined(STM32F3)
+#elif CFG_TUSB_MCU == OPT_MCU_STM32F3
NVIC_EnableIRQ(USB_HP_CAN_TX_IRQn);
NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn);
NVIC_EnableIRQ(USBWakeUp_IRQn);
@@ -265,14 +266,15 @@ void dcd_int_enable (uint8_t rhport)
void dcd_int_disable(uint8_t rhport)
{
(void)rhport;
-#if defined(STM32F0)
+
+#if CFG_TUSB_MCU == OPT_MCU_STM32F0 || CFG_TUSB_MCU == OPT_MCU_STM32L0
NVIC_DisableIRQ(USB_IRQn);
-#elif defined(STM32F3)
+#elif CFG_TUSB_MCU == OPT_MCU_STM32F3
NVIC_DisableIRQ(USB_HP_CAN_TX_IRQn);
NVIC_DisableIRQ(USB_LP_CAN_RX0_IRQn);
NVIC_DisableIRQ(USBWakeUp_IRQn);
#else
-#error Unknown arch in USB driver
+ #error Unknown arch in USB driver
#endif
// I'm not convinced that memory synchronization is completely necessary, but
// it isn't a bad idea.
@@ -305,7 +307,7 @@ void dcd_remote_wakeup(uint8_t rhport)
{
(void) rhport;
- USB->CNTR |= (uint16_t)USB_CNTR_RESUME;
+ USB->CNTR |= (uint16_t) USB_CNTR_RESUME;
remoteWakeCountdown = 4u; // required to be 1 to 15 ms, ESOF should trigger every 1ms.
}
@@ -448,14 +450,11 @@ static uint16_t dcd_ep_ctr_handler(void)
{
pcd_set_ep_rx_status(USB, EPindex, USB_EP_RX_VALID);// Await next SETUP
}
-
}
-
}
}
else /* Decode and service non control endpoints interrupt */
{
-
/* process related endpoint register */
wEPVal = pcd_get_endpoint(USB, EPindex);
if ((wEPVal & USB_EP_CTR_RX) != 0U) // OUT
@@ -809,7 +808,7 @@ static bool dcd_read_packet_memory(void *__restrict dst, uint16_t src, size_t wN
// Interrupt handlers
-#if (CFG_TUSB_MCU) == (OPT_MCU_STM32F0)
+#if CFG_TUSB_MCU == OPT_MCU_STM32F0 || CFG_TUSB_MCU == OPT_MCU_STM32L0
void USB_IRQHandler(void)
{
dcd_fs_irqHandler();
diff --git a/src/portable/st/stm32_fsdev/dcd_stm32_fsdev_pvt_st.h b/src/portable/st/stm32_fsdev/dcd_stm32_fsdev_pvt_st.h
index ff25df048..30538541a 100644
--- a/src/portable/st/stm32_fsdev/dcd_stm32_fsdev_pvt_st.h
+++ b/src/portable/st/stm32_fsdev/dcd_stm32_fsdev_pvt_st.h
@@ -41,51 +41,56 @@
#ifndef PORTABLE_ST_STM32F0_DCD_STM32F0_FSDEV_PVT_ST_H_
#define PORTABLE_ST_STM32F0_DCD_STM32F0_FSDEV_PVT_ST_H_
-#if defined(STM32F042x6) | \
- defined(STM32F070x6) | defined(STM32F070xB) | \
- defined(STM32F072xB) | \
+#if defined(STM32F042x6) || \
+ defined(STM32F070x6) || defined(STM32F070xB) || \
+ defined(STM32F072xB) || \
defined(STM32F078xx)
-#include "stm32f0xx.h"
-#define PMA_LENGTH (1024u)
-// F0x2 models are crystal-less
-// All have internal D+ pull-up
-// 070RB: 2 x 16 bits/word memory LPM Support, BCD Support
-// PMA dedicated to USB (no sharing with CAN)
-#elif defined(STM32F102x6) | defined(STM32F102x6) | \
- defined(STM32F103x6) | defined(STM32F103xB) | \
- defined(STM32F103xE) | defined(STM32F103xB)
-#include "stm32f1xx.h"
-#define PMA_LENGTH (512u)
-// NO internal Pull-ups
-// *B, and *C: 2 x 16 bits/word
-#error The F102/F103 driver is expected not to work, but it might? Try it?
+ #include "stm32f0xx.h"
+ #define PMA_LENGTH (1024u)
+ // F0x2 models are crystal-less
+ // All have internal D+ pull-up
+ // 070RB: 2 x 16 bits/word memory LPM Support, BCD Support
+ // PMA dedicated to USB (no sharing with CAN)
-#elif defined(STM32F302xB) | defined(STM32F302xC) | \
- defined(STM32F303xB) | defined(STM32F303xC) | \
+#elif STM32F1_FSDEV
+ #include "stm32f1xx.h"
+ #define PMA_LENGTH (512u)
+ // NO internal Pull-ups
+ // *B, and *C: 2 x 16 bits/word
+ #error The F102/F103 driver is expected not to work, but it might? Try it?
+
+#elif defined(STM32F302xB) || defined(STM32F302xC) || \
+ defined(STM32F303xB) || defined(STM32F303xC) || \
defined(STM32F373xC)
-#include "stm32f3xx.h"
-#define PMA_LENGTH (512u)
-// NO internal Pull-ups
-// *B, and *C: 1 x 16 bits/word
-// PMA dedicated to USB (no sharing with CAN)
-#elif defined(STM32F302x6) | defined(STM32F302x8) | \
- defined(STM32F302xD) | defined(STM32F302xE) | \
- defined(STM32F303xD) | defined(STM32F303xE) | \
-#include "stm32f3xx.h"
-#define PMA_LENGTH (1024u)
-// NO internal Pull-ups
-// *6, *8, *D, and *E: 2 x 16 bits/word LPM Support
-// When CAN clock is enabled, USB can use first 768 bytes ONLY.
+ #include "stm32f3xx.h"
+ #define PMA_LENGTH (512u)
+ // NO internal Pull-ups
+ // *B, and *C: 1 x 16 bits/word
+ // PMA dedicated to USB (no sharing with CAN)
+
+#elif defined(STM32F302x6) || defined(STM32F302x8) || \
+ defined(STM32F302xD) || defined(STM32F302xE) || \
+ defined(STM32F303xD) || defined(STM32F303xE)
+ #include "stm32f3xx.h"
+ #define PMA_LENGTH (1024u)
+ // NO internal Pull-ups
+ // *6, *8, *D, and *E: 2 x 16 bits/word LPM Support
+ // When CAN clock is enabled, USB can use first 768 bytes ONLY.
+
+#elif CFG_TUSB_MCU == OPT_MCU_STM32L0
+ #include "stm32l0xx.h"
+ #define PMA_LENGTH (1024u)
+
#else
-#error You are using an untested or unimplemented STM32 variant. Please update the driver.
-// This includes L0x2, L0x3, L1x0, L1x1, L1x2, L4x2 and L4x3, G1x1, G1x3, and G1x4
+ #error You are using an untested or unimplemented STM32 variant. Please update the driver.
+ // This includes L1x0, L1x1, L1x2, L4x2 and L4x3, G1x1, G1x3, and G1x4
#endif
// For purposes of accessing the packet
#if ((PMA_LENGTH) == 512u)
-#define PMA_STRIDE (2u)
+ #define PMA_STRIDE (2u)
#elif ((PMA_LENGTH) == 1024u)
-#define PMA_STRIDE (1u)
+ #define PMA_STRIDE (1u)
#endif
// And for type-safety create a new macro for the volatile address of PMAADDR