summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-02-13 18:51:08 +1100
committerDamien George <damien.p.george@gmail.com>2018-02-13 18:51:08 +1100
commit5c320bd0b093f44cad19046d84a63e5ed4e7fc87 (patch)
treec059deb480a12d08b72fc1936a3c7ed78d3c8b2c
parent8aad22fdca757fd7135fb2f68ff8023a1f5bebc3 (diff)
stm32: Introduce MICROPY_HW_ENABLE_USB and clean up USB config.
This patch allows to completely compile-out support for USB, and no-USB is now the default. If a board wants to enable USB it should define: #define MICROPY_HW_ENABLE_USB (1) And then one or more of the following to select the USB PHY: #define MICROPY_HW_USB_FS (1) #define MICROPY_HW_USB_HS (1) #define MICROPY_HW_USB_HS_IN_FS (1)
-rw-r--r--ports/stm32/main.c12
-rw-r--r--ports/stm32/modmachine.c2
-rw-r--r--ports/stm32/modpyb.c2
-rw-r--r--ports/stm32/mpconfigboard_common.h11
-rw-r--r--ports/stm32/mphalport.c7
-rw-r--r--ports/stm32/stm32_it.c12
-rw-r--r--ports/stm32/stm32_it.h4
-rw-r--r--ports/stm32/usb.c25
-rw-r--r--ports/stm32/usbd_conf.c28
-rw-r--r--ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h9
10 files changed, 57 insertions, 55 deletions
diff --git a/ports/stm32/main.c b/ports/stm32/main.c
index 92a6100c9..cb3bdf749 100644
--- a/ports/stm32/main.c
+++ b/ports/stm32/main.c
@@ -308,14 +308,14 @@ STATIC bool init_sdcard_fs(void) {
}
}
- #if defined(USE_DEVICE_MODE)
+ #if MICROPY_HW_ENABLE_USB
if (pyb_usb_storage_medium == PYB_USB_STORAGE_MEDIUM_NONE) {
// if no USB MSC medium is selected then use the SD card
pyb_usb_storage_medium = PYB_USB_STORAGE_MEDIUM_SDCARD;
}
#endif
- #if defined(USE_DEVICE_MODE)
+ #if MICROPY_HW_ENABLE_USB
// only use SD card as current directory if that's what the USB medium is
if (pyb_usb_storage_medium == PYB_USB_STORAGE_MEDIUM_SDCARD)
#endif
@@ -539,7 +539,9 @@ soft_reset:
can_init0();
#endif
+ #if MICROPY_HW_ENABLE_USB
pyb_usb_init0();
+ #endif
// Initialise the local flash filesystem.
// Create it if needed, mount in on /flash, and set it as current dir.
@@ -556,7 +558,7 @@ soft_reset:
}
#endif
- #if defined(USE_DEVICE_MODE)
+ #if MICROPY_HW_ENABLE_USB
// if the SD card isn't used as the USB MSC medium then use the internal flash
if (pyb_usb_storage_medium == PYB_USB_STORAGE_MEDIUM_NONE) {
pyb_usb_storage_medium = PYB_USB_STORAGE_MEDIUM_FLASH;
@@ -607,12 +609,12 @@ soft_reset:
// or whose initialisation can be safely deferred until after running
// boot.py.
-#if defined(USE_DEVICE_MODE)
+ #if MICROPY_HW_ENABLE_USB
// init USB device to default setting if it was not already configured
if (!(pyb_usb_flags & PYB_USB_FLAG_USB_MODE_CALLED)) {
pyb_usb_dev_init(USBD_VID, USBD_PID_CDC_MSC, USBD_MODE_CDC_MSC, NULL);
}
-#endif
+ #endif
#if MICROPY_HW_HAS_MMA7660
// MMA accel: init and reset
diff --git a/ports/stm32/modmachine.c b/ports/stm32/modmachine.c
index 363fbe321..5a499e3da 100644
--- a/ports/stm32/modmachine.c
+++ b/ports/stm32/modmachine.c
@@ -204,7 +204,9 @@ MP_DEFINE_CONST_FUN_OBJ_0(machine_soft_reset_obj, machine_soft_reset);
// Activate the bootloader without BOOT* pins.
STATIC NORETURN mp_obj_t machine_bootloader(void) {
+ #if MICROPY_HW_ENABLE_USB
pyb_usb_dev_deinit();
+ #endif
storage_flush();
HAL_RCC_DeInit();
diff --git a/ports/stm32/modpyb.c b/ports/stm32/modpyb.c
index 970b5b954..2192b5fcf 100644
--- a/ports/stm32/modpyb.c
+++ b/ports/stm32/modpyb.c
@@ -151,6 +151,7 @@ STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_main), MP_ROM_PTR(&pyb_main_obj) },
{ MP_ROM_QSTR(MP_QSTR_repl_uart), MP_ROM_PTR(&pyb_repl_uart_obj) },
+ #if MICROPY_HW_ENABLE_USB
{ MP_ROM_QSTR(MP_QSTR_usb_mode), MP_ROM_PTR(&pyb_usb_mode_obj) },
{ MP_ROM_QSTR(MP_QSTR_hid_mouse), MP_ROM_PTR(&pyb_usb_hid_mouse_obj) },
{ MP_ROM_QSTR(MP_QSTR_hid_keyboard), MP_ROM_PTR(&pyb_usb_hid_keyboard_obj) },
@@ -159,6 +160,7 @@ STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = {
// these 2 are deprecated; use USB_VCP.isconnected and USB_HID.send instead
{ MP_ROM_QSTR(MP_QSTR_have_cdc), MP_ROM_PTR(&pyb_have_cdc_obj) },
{ MP_ROM_QSTR(MP_QSTR_hid), MP_ROM_PTR(&pyb_hid_send_report_obj) },
+ #endif
{ MP_ROM_QSTR(MP_QSTR_millis), MP_ROM_PTR(&mp_utime_ticks_ms_obj) },
{ MP_ROM_QSTR(MP_QSTR_elapsed_millis), MP_ROM_PTR(&pyb_elapsed_millis_obj) },
diff --git a/ports/stm32/mpconfigboard_common.h b/ports/stm32/mpconfigboard_common.h
index 1e3d6913b..32b69cc78 100644
--- a/ports/stm32/mpconfigboard_common.h
+++ b/ports/stm32/mpconfigboard_common.h
@@ -50,6 +50,11 @@
#define MICROPY_HW_ENABLE_CAN (0)
#endif
+// Whether to enable USB support
+#ifndef MICROPY_HW_ENABLE_USB
+#define MICROPY_HW_ENABLE_USB (0)
+#endif
+
// Whether to enable the PA0-PA3 servo driver, exposed as pyb.Servo
#ifndef MICROPY_HW_ENABLE_SERVO
#define MICROPY_HW_ENABLE_SERVO (0)
@@ -106,11 +111,5 @@
#define MICROPY_HW_ENABLE_HW_I2C (0)
#endif
-// USB configuration
-// see stm32f4XX_hal_conf.h USE_USB_FS & USE_USB_HS
-// at the moment only USB_FS is supported
-#define USE_DEVICE_MODE
-//#define USE_HOST_MODE
-
// Pin definition header file
#define MICROPY_PIN_DEFS_PORT_H "pin_defs_stm32.h"
diff --git a/ports/stm32/mphalport.c b/ports/stm32/mphalport.c
index 2252e4f57..74906311e 100644
--- a/ports/stm32/mphalport.c
+++ b/ports/stm32/mphalport.c
@@ -33,10 +33,13 @@ int mp_hal_stdin_rx_chr(void) {
#endif
#endif
+ #if MICROPY_HW_ENABLE_USB
byte c;
if (usb_vcp_recv_byte(&c) != 0) {
return c;
- } else if (MP_STATE_PORT(pyb_stdio_uart) != NULL && uart_rx_any(MP_STATE_PORT(pyb_stdio_uart))) {
+ }
+ #endif
+ if (MP_STATE_PORT(pyb_stdio_uart) != NULL && uart_rx_any(MP_STATE_PORT(pyb_stdio_uart))) {
return uart_rx_char(MP_STATE_PORT(pyb_stdio_uart));
}
int dupterm_c = mp_uos_dupterm_rx_chr();
@@ -58,9 +61,11 @@ void mp_hal_stdout_tx_strn(const char *str, size_t len) {
#if 0 && defined(USE_HOST_MODE) && MICROPY_HW_HAS_LCD
lcd_print_strn(str, len);
#endif
+ #if MICROPY_HW_ENABLE_USB
if (usb_vcp_is_enabled()) {
usb_vcp_send_strn(str, len);
}
+ #endif
mp_uos_dupterm_tx_strn(str, len);
}
diff --git a/ports/stm32/stm32_it.c b/ports/stm32/stm32_it.c
index f1ac9b6b8..f933250b1 100644
--- a/ports/stm32/stm32_it.c
+++ b/ports/stm32/stm32_it.c
@@ -143,9 +143,11 @@ void HardFault_C_Handler(ExceptionRegisters_t *regs) {
NVIC_SystemReset();
}
+ #if MICROPY_HW_ENABLE_USB
// We need to disable the USB so it doesn't try to write data out on
// the VCP and then block indefinitely waiting for the buffer to drain.
pyb_usb_flags = 0;
+ #endif
mp_hal_stdout_tx_str("HardFault\r\n");
@@ -337,14 +339,14 @@ void SysTick_Handler(void) {
* @param None
* @retval None
*/
-#if defined(USE_USB_FS)
+#if MICROPY_HW_USB_FS
void OTG_FS_IRQHandler(void) {
IRQ_ENTER(OTG_FS_IRQn);
HAL_PCD_IRQHandler(&pcd_fs_handle);
IRQ_EXIT(OTG_FS_IRQn);
}
#endif
-#if defined(USE_USB_HS)
+#if MICROPY_HW_USB_HS
void OTG_HS_IRQHandler(void) {
IRQ_ENTER(OTG_HS_IRQn);
HAL_PCD_IRQHandler(&pcd_hs_handle);
@@ -352,7 +354,7 @@ void OTG_HS_IRQHandler(void) {
}
#endif
-#if defined(USE_USB_FS) || defined(USE_USB_HS)
+#if MICROPY_HW_USB_FS || MICROPY_HW_USB_HS
/**
* @brief This function handles USB OTG Common FS/HS Wakeup functions.
* @param *pcd_handle for FS or HS
@@ -393,7 +395,7 @@ STATIC void OTG_CMD_WKUP_Handler(PCD_HandleTypeDef *pcd_handle) {
}
#endif
-#if defined(USE_USB_FS)
+#if MICROPY_HW_USB_FS
/**
* @brief This function handles USB OTG FS Wakeup IRQ Handler.
* @param None
@@ -411,7 +413,7 @@ void OTG_FS_WKUP_IRQHandler(void) {
}
#endif
-#if defined(USE_USB_HS)
+#if MICROPY_HW_USB_HS
/**
* @brief This function handles USB OTG HS Wakeup IRQ Handler.
* @param None
diff --git a/ports/stm32/stm32_it.h b/ports/stm32/stm32_it.h
index b498dee8d..0f200fb6f 100644
--- a/ports/stm32/stm32_it.h
+++ b/ports/stm32/stm32_it.h
@@ -76,11 +76,7 @@ void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
-#ifdef USE_USB_FS
void OTG_FS_IRQHandler(void);
-#endif
-#ifdef USE_USB_HS
void OTG_HS_IRQHandler(void);
-#endif
#endif // MICROPY_INCLUDED_STMHAL_STM32_IT_H
diff --git a/ports/stm32/usb.c b/ports/stm32/usb.c
index e134781b4..b0bdb3a08 100644
--- a/ports/stm32/usb.c
+++ b/ports/stm32/usb.c
@@ -42,11 +42,13 @@
#include "bufhelper.h"
#include "usb.h"
+#if MICROPY_HW_ENABLE_USB
+
// Work out which USB device to use as the main one (the one with the REPL)
#if !defined(MICROPY_HW_USB_MAIN_DEV)
-#if defined(USE_USB_FS)
+#if defined(MICROPY_HW_USB_FS)
#define MICROPY_HW_USB_MAIN_DEV (USB_PHY_FS_ID)
-#elif defined(USE_USB_HS) && defined(USE_USB_HS_IN_FS)
+#elif defined(MICROPY_HW_USB_HS) && defined(MICROPY_HW_USB_HS_IN_FS)
#define MICROPY_HW_USB_MAIN_DEV (USB_PHY_HS_ID)
#else
#error Unable to determine proper MICROPY_HW_USB_MAIN_DEV to use
@@ -64,10 +66,8 @@ typedef struct _usb_device_t {
usbd_hid_itf_t usbd_hid_itf;
} usb_device_t;
-#ifdef USE_DEVICE_MODE
usb_device_t usb_device;
pyb_usb_storage_medium_t pyb_usb_storage_medium = PYB_USB_STORAGE_MEDIUM_NONE;
-#endif
// predefined hid mouse data
STATIC const mp_obj_str_t pyb_usb_hid_mouse_desc_obj = {
@@ -113,7 +113,6 @@ void pyb_usb_init0(void) {
}
bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, usb_device_mode_t mode, USBD_HID_ModeInfoTypeDef *hid_info) {
-#ifdef USE_DEVICE_MODE
bool high_speed = (mode & USBD_MODE_HIGH_SPEED) != 0;
mode &= 0x7f;
usb_device_t *usb_dev = &usb_device;
@@ -153,7 +152,6 @@ bool pyb_usb_dev_init(uint16_t vid, uint16_t pid, usb_device_mode_t mode, USBD_H
USBD_LL_Start(usbd);
usb_dev->enabled = true;
}
-#endif
return true;
}
@@ -175,11 +173,9 @@ int usb_vcp_recv_byte(uint8_t *c) {
}
void usb_vcp_send_strn(const char *str, int len) {
-#ifdef USE_DEVICE_MODE
if (usb_device.enabled) {
usbd_cdc_tx_always(&usb_device.usbd_cdc_itf, (const uint8_t*)str, len);
}
-#endif
}
/******************************************************************************/
@@ -226,7 +222,7 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
if (n_args == 0) {
#if defined(USE_HOST_MODE)
return MP_OBJ_NEW_QSTR(MP_QSTR_host);
- #elif defined(USE_DEVICE_MODE)
+ #else
uint8_t mode = USBD_GetMode(&usb_device.usbd_cdc_msc_hid_state);
switch (mode) {
case USBD_MODE_CDC:
@@ -257,9 +253,7 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
// check if user wants to disable the USB
if (args[0].u_obj == mp_const_none) {
// disable usb
- #if defined(USE_DEVICE_MODE)
pyb_usb_dev_deinit();
- #endif
return mp_const_none;
}
@@ -276,7 +270,7 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
goto bad_mode;
}
-#elif defined(USE_DEVICE_MODE)
+#else
// hardware configured for USB device mode
@@ -339,9 +333,6 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
goto bad_mode;
}
-#else
- // hardware not configured for USB
- goto bad_mode;
#endif
return mp_const_none;
@@ -619,7 +610,6 @@ STATIC mp_obj_t pyb_usb_hid_recv(size_t n_args, const mp_obj_t *args, mp_map_t *
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_usb_hid_recv_obj, 1, pyb_usb_hid_recv);
STATIC mp_obj_t pyb_usb_hid_send(mp_obj_t self_in, mp_obj_t report_in) {
-#ifdef USE_DEVICE_MODE
pyb_usb_vcp_obj_t *self = MP_OBJ_TO_PTR(self_in);
mp_buffer_info_t bufinfo;
byte temp_buf[8];
@@ -643,7 +633,6 @@ STATIC mp_obj_t pyb_usb_hid_send(mp_obj_t self_in, mp_obj_t report_in) {
} else {
return mp_obj_new_int(0);
}
-#endif
return mp_const_none;
}
@@ -757,3 +746,5 @@ void USR_KEYBRD_ProcessData(uint8_t pbuf) {
}
#endif // USE_HOST_MODE
+
+#endif // MICROPY_HW_ENABLE_USB
diff --git a/ports/stm32/usbd_conf.c b/ports/stm32/usbd_conf.c
index cdbf14a3f..e8031c49b 100644
--- a/ports/stm32/usbd_conf.c
+++ b/ports/stm32/usbd_conf.c
@@ -39,10 +39,10 @@
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
-#ifdef USE_USB_FS
+#if MICROPY_HW_USB_FS
PCD_HandleTypeDef pcd_fs_handle;
#endif
-#ifdef USE_USB_HS
+#if MICROPY_HW_USB_HS
PCD_HandleTypeDef pcd_hs_handle;
#endif
/* Private function prototypes -----------------------------------------------*/
@@ -113,10 +113,10 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
/* Enable USBFS Interrupt */
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
}
-#if defined(USE_USB_HS)
+#if MICROPY_HW_USB_HS
else if(hpcd->Instance == USB_OTG_HS)
{
-#if defined(USE_USB_HS_IN_FS)
+#if MICROPY_HW_USB_HS_IN_FS
/* Configure USB FS GPIOs */
__HAL_RCC_GPIOB_CLK_ENABLE();
@@ -166,7 +166,7 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
__HAL_RCC_USB_OTG_HS_CLK_ENABLE();
-#else // !USE_USB_HS_IN_FS
+#else // !MICROPY_HW_USB_HS_IN_FS
/* Configure USB HS GPIOs */
__HAL_RCC_GPIOA_CLK_ENABLE();
@@ -223,7 +223,7 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
/* Enable USB HS Clocks */
__USB_OTG_HS_CLK_ENABLE();
__USB_OTG_HS_ULPI_CLK_ENABLE();
-#endif // !USE_USB_HS_IN_FS
+#endif // !MICROPY_HW_USB_HS_IN_FS
/* Set USBHS Interrupt to the lowest priority */
HAL_NVIC_SetPriority(OTG_HS_IRQn, IRQ_PRI_OTG_HS, IRQ_SUBPRI_OTG_HS);
@@ -231,7 +231,7 @@ void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
/* Enable USBHS Interrupt */
HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
}
-#endif // USE_USB_HS
+#endif // MICROPY_HW_USB_HS
}
/**
* @brief DeInitializes the PCD MSP.
@@ -246,7 +246,7 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
__USB_OTG_FS_CLK_DISABLE();
__SYSCFG_CLK_DISABLE();
}
- #if defined(USE_USB_HS)
+ #if MICROPY_HW_USB_HS
else if(hpcd->Instance == USB_OTG_HS)
{
/* Disable USB FS Clocks */
@@ -410,7 +410,7 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
*/
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev, int high_speed)
{
-#if defined(USE_USB_FS)
+#if MICROPY_HW_USB_FS
if (pdev->id == USB_PHY_FS_ID)
{
/*Set LL Driver parameters */
@@ -445,10 +445,10 @@ if (pdev->id == USB_PHY_FS_ID)
HAL_PCD_SetTxFiFo(&pcd_fs_handle, 3, 0x40);
}
#endif
-#if defined(USE_USB_HS)
+#if MICROPY_HW_USB_HS
if (pdev->id == USB_PHY_HS_ID)
{
-#if defined(USE_USB_HS_IN_FS)
+#if MICROPY_HW_USB_HS_IN_FS
/*Set LL Driver parameters */
pcd_hs_handle.Instance = USB_OTG_HS;
pcd_hs_handle.Init.dev_endpoints = 4;
@@ -484,7 +484,7 @@ if (pdev->id == USB_PHY_HS_ID)
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 1, 0x100);
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 2, 0x20);
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 3, 0xc0);
-#else // !defined(USE_USB_HS_IN_FS)
+#else // !MICROPY_HW_USB_HS_IN_FS
/*Set LL Driver parameters */
pcd_hs_handle.Instance = USB_OTG_HS;
pcd_hs_handle.Init.dev_endpoints = 6;
@@ -513,9 +513,9 @@ if (pdev->id == USB_PHY_HS_ID)
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 0, 0x80);
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 1, 0x174);
-#endif // !USE_USB_HS_IN_FS
+#endif // !MICROPY_HW_USB_HS_IN_FS
}
-#endif // USE_USB_HS
+#endif // MICROPY_HW_USB_HS
return USBD_OK;
}
diff --git a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
index 600d86379..217712701 100644
--- a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
+++ b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
@@ -5,11 +5,14 @@
#include "usbd_msc_bot.h"
#include "usbd_msc_scsi.h"
#include "usbd_ioreq.h"
-#include STM32_HAL_H
+
+// These are included to get direct access the MICROPY_HW_USB_xxx config
+#include "mpconfigboard.h"
+#include "mpconfigboard_common.h"
// Work out if we should support USB high-speed device mode
-#if defined(USE_USB_HS) \
- && (!defined(USE_USB_HS_IN_FS) || defined(STM32F723xx) || defined(STM32F733xx))
+#if MICROPY_HW_USB_HS \
+ && (!MICROPY_HW_USB_HS_IN_FS || defined(STM32F723xx) || defined(STM32F733xx))
#define USBD_SUPPORT_HS_MODE (1)
#else
#define USBD_SUPPORT_HS_MODE (0)