From 6e6909c507a5fca04c3c9eadb6e76c0aebcff267 Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Sat, 17 Mar 2018 21:23:08 -0700 Subject: [PATCH 01/13] enable RTOS support for cortex-debug --- Firmware/.vscode/launch.json | 1 + Firmware/FreeRTOS-openocd.c | 20 ++++++++++++++++++++ Firmware/Tupfile.lua | 4 +++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Firmware/FreeRTOS-openocd.c diff --git a/Firmware/.vscode/launch.json b/Firmware/.vscode/launch.json index 06d37018..fe7adb83 100644 --- a/Firmware/.vscode/launch.json +++ b/Firmware/.vscode/launch.json @@ -11,6 +11,7 @@ "request": "launch", "name": "Debug ODrive", "executable": "${workspaceRoot}/build/ODriveFirmware.elf", + "rtos": "FreeRTOS", "configFiles": [ "interface/stlink-v2.cfg", "target/stm32f4x_stlink.cfg", diff --git a/Firmware/FreeRTOS-openocd.c b/Firmware/FreeRTOS-openocd.c new file mode 100644 index 00000000..81a3ab77 --- /dev/null +++ b/Firmware/FreeRTOS-openocd.c @@ -0,0 +1,20 @@ +/* + * Since at least FreeRTOS V7.5.3 uxTopUsedPriority is no longer + * present in the kernel, so it has to be supplied by other means for + * OpenOCD's threads awareness. + * + * Add this file to your project, and, if you're using --gc-sections, + * ``--undefined=uxTopUsedPriority'' (or + * ``-Wl,--undefined=uxTopUsedPriority'' when using gcc for final + * linking) to your LDFLAGS; same with all the other symbols you need. + */ + +#include "FreeRTOS.h" + +#ifdef __GNUC__ +#define USED __attribute__((used)) +#else +#define USED +#endif + +const int USED uxTopUsedPriority = configMAX_PRIORITIES - 1; diff --git a/Firmware/Tupfile.lua b/Firmware/Tupfile.lua index c6440db0..9d746830 100644 --- a/Firmware/Tupfile.lua +++ b/Firmware/Tupfile.lua @@ -85,6 +85,7 @@ LDFLAGS += '-T'..boarddir..'/STM32F405RGTx_FLASH.ld' LDFLAGS += '-L'..boarddir..'/Drivers/CMSIS/Lib' -- lib dir LDFLAGS += '-lc -lm -lnosys -larm_cortexM4lf_math' -- libs LDFLAGS += '-mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -specs=nosys.specs -specs=nano.specs -u _printf_float -u _scanf_float -Wl,--cref -Wl,--gc-sections' +LDFLAGS += '-Wl,--undefined=uxTopUsedPriority' -- common flags for ASM, C and C++ @@ -133,7 +134,8 @@ build{ 'MotorControl/axis.cpp', 'MotorControl/commands.cpp', 'MotorControl/protocol.cpp', - 'MotorControl/config.cpp' + 'MotorControl/config.cpp', + 'FreeRTOS-openocd.c' }, includes={ 'Drivers/DRV8301', From a0dc56f2b0da8e9c1c6999ae0cf5ff0484bb2f06 Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Tue, 27 Mar 2018 13:21:38 -0700 Subject: [PATCH 02/13] change release binary naming convention --- Firmware/build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/build.sh b/Firmware/build.sh index 26718282..811a4ab7 100755 --- a/Firmware/build.sh +++ b/Firmware/build.sh @@ -18,6 +18,6 @@ bash -xe ./tup_build.sh # Deploy if ! [ -z ${DEPLOY+x} ]; then mkdir -p deploy - cp build/ODriveFirmware.elf deploy/ODriveFirmware-"$DEPLOY".elf - cp build/ODriveFirmware.hex deploy/ODriveFirmware-"$DEPLOY".hex + cp build/ODriveFirmware.elf deploy/ODriveFirmware_"$DEPLOY".elf + cp build/ODriveFirmware.hex deploy/ODriveFirmware_"$DEPLOY".hex fi From a4812f4ed869bb41c1fae254eb6a590dcf8a5cd4 Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Thu, 29 Mar 2018 14:58:21 -0700 Subject: [PATCH 03/13] change USB PID from 0x0D33 to 0x0D32 The official ODrive PID is 0x0D32 however the firmware wrongly announced PID 0x0D33. This was already fixed earlier but the fix was undone by CubeMX. This commit also fixes the CubeMX setting. --- .../0001-display-correct-ODrive-version-in-USB-descriptor.patch | 2 +- Firmware/Board/v3/Odrive.ioc | 2 +- Firmware/Board/v3/Src/usbd_desc.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Firmware/Board/v3/0001-display-correct-ODrive-version-in-USB-descriptor.patch b/Firmware/Board/v3/0001-display-correct-ODrive-version-in-USB-descriptor.patch index f57298b0..0b031242 100644 --- a/Firmware/Board/v3/0001-display-correct-ODrive-version-in-USB-descriptor.patch +++ b/Firmware/Board/v3/0001-display-correct-ODrive-version-in-USB-descriptor.patch @@ -14,7 +14,7 @@ index 94dc49b..37b4302 100644 @@ -96,7 +96,9 @@ #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "ODrive Robotics" - #define USBD_PID_FS 0x0D33 + #define USBD_PID_FS 0x0D32 -#define USBD_PRODUCT_STRING_FS "ODrive v3.3" +#define USBD_PRODUCT_XSTR(s) USBD_PRODUCT_STR(s) +#define USBD_PRODUCT_STR(s) #s diff --git a/Firmware/Board/v3/Odrive.ioc b/Firmware/Board/v3/Odrive.ioc index aea71bef..583cb7f7 100644 --- a/Firmware/Board/v3/Odrive.ioc +++ b/Firmware/Board/v3/Odrive.ioc @@ -599,7 +599,7 @@ USB_DEVICE.APP_TX_DATA_SIZE-CDC_FS=64 USB_DEVICE.CLASS_NAME_FS=CDC USB_DEVICE.IPParameters=VirtualMode-CDC_FS,VirtualModeFS,CLASS_NAME_FS,MANUFACTURER_STRING-CDC_FS,PRODUCT_STRING_CDC_FS,VID-CDC_FS,PID_CDC_FS,SERIALNUMBER_STRING_CDC_FS,APP_RX_DATA_SIZE-CDC_FS,APP_TX_DATA_SIZE-CDC_FS USB_DEVICE.MANUFACTURER_STRING-CDC_FS=ODrive Robotics -USB_DEVICE.PID_CDC_FS=0x0D33 +USB_DEVICE.PID_CDC_FS=0x0D32 USB_DEVICE.PRODUCT_STRING_CDC_FS=ODrive v3.3 USB_DEVICE.SERIALNUMBER_STRING_CDC_FS=000000000001 USB_DEVICE.VID-CDC_FS=0x1209 diff --git a/Firmware/Board/v3/Src/usbd_desc.c b/Firmware/Board/v3/Src/usbd_desc.c index 37b43026..e812a013 100644 --- a/Firmware/Board/v3/Src/usbd_desc.c +++ b/Firmware/Board/v3/Src/usbd_desc.c @@ -95,7 +95,7 @@ #define USBD_VID 0x1209 #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "ODrive Robotics" -#define USBD_PID_FS 0x0D33 +#define USBD_PID_FS 0x0D32 #define USBD_PRODUCT_XSTR(s) USBD_PRODUCT_STR(s) #define USBD_PRODUCT_STR(s) #s #define USBD_PRODUCT_STRING_FS ODrive version HW_VERSION_MAJOR.HW_VERSION_MINOR From b2df11a41699efbd1c80018a739fc1bd07f26d9c Mon Sep 17 00:00:00 2001 From: Oskar Weigl Date: Thu, 29 Mar 2018 23:47:58 -0700 Subject: [PATCH 04/13] Update tup.config.default --- Firmware/tup.config.default | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/tup.config.default b/Firmware/tup.config.default index 740e1dde..be0515fc 100644 --- a/Firmware/tup.config.default +++ b/Firmware/tup.config.default @@ -1,6 +1,6 @@ # Copy this file to tup.config and adapt it to your needs # make sure this fits your board -#CONFIG_BOARD_VERSION=v3.3 +#CONFIG_BOARD_VERSION=v3.4-24V CONFIG_USB_PROTOCOL=native CONFIG_UART_PROTOCOL=ascii CONFIG_STEP_DIR=n From e5badaf724f309d26606b26e668576834e3e8797 Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Fri, 30 Mar 2018 12:49:53 -0700 Subject: [PATCH 05/13] update VSCode C++ settings --- Firmware/.vscode/c_cpp_properties.json | 145 +++++++++++++------------ 1 file changed, 74 insertions(+), 71 deletions(-) diff --git a/Firmware/.vscode/c_cpp_properties.json b/Firmware/.vscode/c_cpp_properties.json index b337bc20..88c6c273 100644 --- a/Firmware/.vscode/c_cpp_properties.json +++ b/Firmware/.vscode/c_cpp_properties.json @@ -5,17 +5,17 @@ "includePath": [ "${workspaceRoot}", "${workspaceRoot}/MotorControl", - "${workspaceRoot}/Board/v3.3/Inc", - "${workspaceRoot}/Board/v3.3/Drivers/CMSIS/Include", - "${workspaceRoot}/Board/v3.3/Drivers/CMSIS/Device/ST/STM32F4xx/Include", - "${workspaceRoot}/Board/v3.3/Drivers/DRV8301", - "${workspaceRoot}/Board/v3.3/Drivers/STM32F4xx_HAL_Driver/Inc", - "${workspaceRoot}/Board/v3.3/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", - "${workspaceRoot}/Board/v3.3/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", - "${workspaceRoot}/Board/v3.3/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", - "${workspaceRoot}/Board/v3.3/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", - "${workspaceRoot}/Board/v3.3/Middlewares/Third_Party/FreeRTOS/Source/include", - "${workspaceRoot}/Board/v3.3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", + "${workspaceRoot}/Board/v3/Inc", + "${workspaceRoot}/Board/v3/Drivers/CMSIS/Include", + "${workspaceRoot}/Board/v3/Drivers/CMSIS/Device/ST/STM32F4xx/Include", + "${workspaceRoot}/Board/v3/Drivers/DRV8301", + "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc", + "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", + "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", + "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/include", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", "c:/program files (x86)/gnu tools arm embedded/6 2017-q1-update/arm-none-eabi/include/c++/6.3.1", "c:/program files (x86)/gnu tools arm embedded/6 2017-q1-update/arm-none-eabi/include/c++/6.3.1/arm-none-eabi", "c:/program files (x86)/gnu tools arm embedded/6 2017-q1-update/arm-none-eabi/include/c++/6.3.1/backward", @@ -39,79 +39,82 @@ "limitSymbolsToIncludedHeaders": true } }, - { - "name": "Linux", - "includePath": [ - "${workspaceRoot}", - "${workspaceRoot}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", - "${workspaceRoot}/Middlewares/Third_Party/FreeRTOS/Source/include", - "${workspaceRoot}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", - "${workspaceRoot}/Drivers/DRV8301", - "${workspaceRoot}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", - "${workspaceRoot}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", - "${workspaceRoot}/Drivers/STM32F4xx_HAL_Driver/Inc", - "${workspaceRoot}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", - "${workspaceRoot}/Drivers/CMSIS/Device/ST/STM32F4xx/Include", - "${workspaceRoot}/Drivers/CMSIS/Include", - "${workspaceRoot}/Inc", - "${workspaceRoot}/MotorControl", - "/usr/lib/gcc/arm-none-eabi/4.9.3/include", - "/usr/lib/arm-none-eabi/include" - ], - "defines": [ + { + "name": "Linux", + "includePath": [ + "${workspaceRoot}", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/include", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", + "${workspaceRoot}/Board/v3/Drivers/DRV8301", + "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", + "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", + "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc", + "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", + "${workspaceRoot}/Board/v3/Drivers/CMSIS/Device/ST/STM32F4xx/Include", + "${workspaceRoot}/Board/v3/Drivers/CMSIS/Include", + "${workspaceRoot}/Board/v3/Inc", + "${workspaceRoot}/MotorControl", + "/usr/lib/gcc/arm-none-eabi/4.9.3/include", + "/usr/lib/arm-none-eabi/include" + ], + "defines": [ "STM32F405xx", "USE_HAL_DRIVER", "__weak=\"__attribute__((weak))\"", "__packed=\"__attribute__((__packed__))\"", "__GNUC__" - ], - "intelliSenseMode": "clang-x64", - "browse": { - "path": [ + ], + "intelliSenseMode": "clang-x64", + "browse": { + "path": [ "${workspaceRoot}", - "/usr/lib/gcc/arm-none-eabi/4.9.3/include", - "/usr/lib/arm-none-eabi/include" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" - } - }, - { - "name": "Mac", - "includePath": [ - "${workspaceRoot}", - "${workspaceRoot}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", - "${workspaceRoot}/Middlewares/Third_Party/FreeRTOS/Source/include", - "${workspaceRoot}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", - "${workspaceRoot}/Drivers/DRV8301", - "${workspaceRoot}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", - "${workspaceRoot}/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", - "${workspaceRoot}/Drivers/STM32F4xx_HAL_Driver/Inc", - "${workspaceRoot}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", - "${workspaceRoot}/Drivers/CMSIS/Device/ST/STM32F4xx/Include", - "${workspaceRoot}/Drivers/CMSIS/Include", - "${workspaceRoot}/Inc", - "${workspaceRoot}/MotorControl", - "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include", - "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include/c++/6.3.1", - "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include/c++/6.3.1/arm-none-eabi", - "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/lib/gcc/arm-none-eabi/6.3.1/include" - ], - "defines": [ + "/usr/lib/gcc/arm-none-eabi/4.9.3/include", + "/usr/lib/arm-none-eabi/include" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + }, + "compilerPath": "arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -specs=nosys.specs -specs=nano.specs -u _printf_float -u _scanf_float", + "cStandard": "c11", + "cppStandard": "c++14" + }, + { + "name": "Mac", + "includePath": [ + "${workspaceRoot}", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/include", + "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", + "${workspaceRoot}/Board/v3/Drivers/DRV8301", + "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", + "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", + "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc", + "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", + "${workspaceRoot}/Board/v3/Drivers/CMSIS/Device/ST/STM32F4xx/Include", + "${workspaceRoot}/Board/v3/Drivers/CMSIS/Include", + "${workspaceRoot}/Board/v3/Inc", + "${workspaceRoot}/MotorControl", + "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include", + "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include/c++/6.3.1", + "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include/c++/6.3.1/arm-none-eabi", + "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/lib/gcc/arm-none-eabi/6.3.1/include" + ], + "defines": [ "STM32F405xx", "USE_HAL_DRIVER", "__weak=\"__attribute__((weak))\"", "__packed=\"__attribute__((__packed__))\"", "__GNUC__" - ], - "intelliSenseMode": "clang-x64", - "browse": { - "path": [ + ], + "intelliSenseMode": "clang-x64", + "browse": { + "path": [ "${workspaceRoot}", "/usr/local/Caskroom/gcc-arm-embedded/" - ], - "limitSymbolsToIncludedHeaders": true, - "databaseFilename": "" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" } } ], From f6e52c0f14818282069871cba064b7aaa744a3dc Mon Sep 17 00:00:00 2001 From: Oskar Weigl Date: Fri, 30 Mar 2018 13:23:28 -0700 Subject: [PATCH 06/13] reflect move of drv driver --- Firmware/.vscode/c_cpp_properties.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Firmware/.vscode/c_cpp_properties.json b/Firmware/.vscode/c_cpp_properties.json index 88c6c273..de6eb463 100644 --- a/Firmware/.vscode/c_cpp_properties.json +++ b/Firmware/.vscode/c_cpp_properties.json @@ -5,10 +5,10 @@ "includePath": [ "${workspaceRoot}", "${workspaceRoot}/MotorControl", + "${workspaceRoot}/Drivers/DRV8301", "${workspaceRoot}/Board/v3/Inc", "${workspaceRoot}/Board/v3/Drivers/CMSIS/Include", "${workspaceRoot}/Board/v3/Drivers/CMSIS/Device/ST/STM32F4xx/Include", - "${workspaceRoot}/Board/v3/Drivers/DRV8301", "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc", "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", @@ -43,18 +43,18 @@ "name": "Linux", "includePath": [ "${workspaceRoot}", + "${workspaceRoot}/MotorControl", + "${workspaceRoot}/Drivers/DRV8301", + "${workspaceRoot}/Board/v3/Inc", "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/include", "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", - "${workspaceRoot}/Board/v3/Drivers/DRV8301", "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc", "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", "${workspaceRoot}/Board/v3/Drivers/CMSIS/Device/ST/STM32F4xx/Include", "${workspaceRoot}/Board/v3/Drivers/CMSIS/Include", - "${workspaceRoot}/Board/v3/Inc", - "${workspaceRoot}/MotorControl", "/usr/lib/gcc/arm-none-eabi/4.9.3/include", "/usr/lib/arm-none-eabi/include" ], @@ -83,18 +83,18 @@ "name": "Mac", "includePath": [ "${workspaceRoot}", + "${workspaceRoot}/MotorControl", + "${workspaceRoot}/Drivers/DRV8301", + "${workspaceRoot}/Board/v3/Inc", "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F", "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/include", "${workspaceRoot}/Board/v3/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS", - "${workspaceRoot}/Board/v3/Drivers/DRV8301", "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Core/Inc", "${workspaceRoot}/Board/v3/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc", "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc", "${workspaceRoot}/Board/v3/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy", "${workspaceRoot}/Board/v3/Drivers/CMSIS/Device/ST/STM32F4xx/Include", "${workspaceRoot}/Board/v3/Drivers/CMSIS/Include", - "${workspaceRoot}/Board/v3/Inc", - "${workspaceRoot}/MotorControl", "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include", "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include/c++/6.3.1", "/usr/local/Caskroom/gcc-arm-embedded/6-2017-q2-update/gcc-arm-none-eabi-6-2017-q2-update/arm-none-eabi/include/c++/6.3.1/arm-none-eabi", From bc7ff1e623e3625b2a6f13bc9ac0dc96d1014409 Mon Sep 17 00:00:00 2001 From: Oskar Weigl Date: Mon, 2 Apr 2018 22:08:32 -0700 Subject: [PATCH 07/13] Update README.md --- Firmware/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/README.md b/Firmware/README.md index ad9cbf2c..214afe68 100644 --- a/Firmware/README.md +++ b/Firmware/README.md @@ -118,7 +118,7 @@ the device during upgrade. Otherwise, if something goes wrong, you need an exter programmer to recover the device. This will be fixed in the future. ### Flashing the firmware (external Programmer) -* **Make sure you have [configured the parameters first](#configuring-parameters)** +* **Make sure you have [configured the build first](#configuring-the-build)** * Connect `GND`, `SWD`, and `SWC` on connector J2 to the programmer. Note: Always plug in `GND` first! * You need to power the board by only **ONE** of the following: VCC(3.3v), 5V, or the main power connection (the DC bus). The USB port (J1) does not power the board. * Run `make flash` in the `Firmware` directory. From 0b0acebf23dd660fb30d82b9d83464e701534a00 Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Fri, 6 Apr 2018 13:07:24 -0700 Subject: [PATCH 08/13] make two separate debug configurations --- Firmware/.vscode/launch.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Firmware/.vscode/launch.json b/Firmware/.vscode/launch.json index fe7adb83..71e7db4c 100644 --- a/Firmware/.vscode/launch.json +++ b/Firmware/.vscode/launch.json @@ -11,6 +11,19 @@ "request": "launch", "name": "Debug ODrive", "executable": "${workspaceRoot}/build/ODriveFirmware.elf", + "configFiles": [ + "interface/stlink-v2.cfg", + "target/stm32f4x_stlink.cfg", + ], + "cwd": "${workspaceRoot}" + }, + { + // For the Cortex-Debug extension + "type": "cortex-debug", + "servertype": "openocd", + "request": "launch", + "name": "Debug ODrive - FreeRTOS", + "executable": "${workspaceRoot}/build/ODriveFirmware.elf", "rtos": "FreeRTOS", "configFiles": [ "interface/stlink-v2.cfg", From 95994309ae580f5e269d8bdecbff1954983de5eb Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Sat, 7 Apr 2018 12:49:29 -0700 Subject: [PATCH 09/13] fix bug where an invalid motor config could be loaded Before this commit, if the NVM is deemed valid and but the subsequent config load fails (e.g. because of a checksum mismatch), the motor config could be left in an undefined state. Also a variable user_config_loaded is added to indicate whether the device is using user-saved config or factory defaults. --- Firmware/MotorControl/commands.cpp | 1 + Firmware/MotorControl/config.cpp | 7 ++++--- Firmware/MotorControl/config.h | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Firmware/MotorControl/commands.cpp b/Firmware/MotorControl/commands.cpp index d725afa0..7d99387a 100644 --- a/Firmware/MotorControl/commands.cpp +++ b/Firmware/MotorControl/commands.cpp @@ -123,6 +123,7 @@ const Endpoint endpoints[] = { Endpoint::make_object("config"), Endpoint::make_property("brake_resistance", &brake_resistance), Endpoint::close_tree(), + Endpoint::make_property("user_config_loaded", const_cast(&user_config_loaded)), Endpoint::make_object("axis0"), Endpoint::make_object("config"), Endpoint::make_property("enable_control_at_start", &axis_configs[0].enable_control_at_start), diff --git a/Firmware/MotorControl/config.cpp b/Firmware/MotorControl/config.cpp index f860381e..abbb915d 100644 --- a/Firmware/MotorControl/config.cpp +++ b/Firmware/MotorControl/config.cpp @@ -212,6 +212,7 @@ void get_motor_config(const Motor_t* motor, MotorConfig_t* config) { config->encoder_motor_dir = motor->encoder.motor_dir; } +bool user_config_loaded = false; void init_configuration(void) { MotorConfig_t motor_config[2]; @@ -230,11 +231,11 @@ void init_configuration(void) { // Default config coming from flashed Motor_t return; } else { + user_config_loaded = true; //printf("load config successful\r\n"); osDelay(5); + set_motor_config(&motor_config[0], &motors[0]); + set_motor_config(&motor_config[1], &motors[1]); } - - set_motor_config(&motor_config[0], &motors[0]); - set_motor_config(&motor_config[1], &motors[1]); } void save_configuration(void) { diff --git a/Firmware/MotorControl/config.h b/Firmware/MotorControl/config.h index 57fafcca..69191451 100644 --- a/Firmware/MotorControl/config.h +++ b/Firmware/MotorControl/config.h @@ -5,6 +5,7 @@ extern "C" { #endif +extern bool user_config_loaded; void init_configuration(void); void save_configuration(void); void erase_configuration(void); From 9430851791f2cc91941d80f5ba1f4488adfa13ed Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Fri, 6 Apr 2018 21:19:24 -0700 Subject: [PATCH 10/13] set usb task pump priority to osPriorityAboveNormal osPriorityNormal is the same priority as the communication task. If the USB pump task runs on the same priority, it sometimes fails to respond to the host in time, causing spurious halt conditions. --- Firmware/Board/v3/Src/freertos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Board/v3/Src/freertos.c b/Firmware/Board/v3/Src/freertos.c index 9439fd97..f370b539 100644 --- a/Firmware/Board/v3/Src/freertos.c +++ b/Firmware/Board/v3/Src/freertos.c @@ -166,7 +166,7 @@ void StartDefaultTask(void const * argument) thread_cmd_parse = osThreadCreate(osThread(task_cmd_parse), NULL); // Start USB interrupt handler thread - osThreadDef(task_usb_pump, usb_update_thread, osPriorityNormal, 0, 512); + osThreadDef(task_usb_pump, usb_update_thread, osPriorityAboveNormal, 0, 512); thread_usb_pump = osThreadCreate(osThread(task_usb_pump), NULL); //If we get to here, then the default task is done. From 338e9759ce7fb1db897019feb6fb067135757135 Mon Sep 17 00:00:00 2001 From: Samuel Sadok Date: Sun, 8 Apr 2018 14:06:30 -0700 Subject: [PATCH 11/13] fix how enums are exposed on the protocol Previously the assumption was made that the compiler uses 32 bits for each enum value. This assumption was invalid and meant that when reading/writing from control_mode you would also read/write to enable_step_dir. --- Firmware/MotorControl/commands.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Firmware/MotorControl/commands.cpp b/Firmware/MotorControl/commands.cpp index d725afa0..a163ae4c 100644 --- a/Firmware/MotorControl/commands.cpp +++ b/Firmware/MotorControl/commands.cpp @@ -25,6 +25,8 @@ #include #include +#include + #define UART_TX_BUFFER_SIZE 64 /* Private defines -----------------------------------------------------------*/ @@ -131,7 +133,7 @@ const Endpoint endpoints[] = { Endpoint::close_tree(), Endpoint::make_object("motor0"), Endpoint::make_object("config"), - Endpoint::make_property("control_mode", reinterpret_cast(&motors[0].control_mode)), + Endpoint::make_property("control_mode", reinterpret_cast*>(&motors[0].control_mode)), Endpoint::make_property("counts_per_step", &motors[0].counts_per_step), Endpoint::make_property("pole_pairs", &motors[0].pole_pairs), Endpoint::make_property("pos_gain", &motors[0].pos_gain), @@ -142,10 +144,10 @@ const Endpoint endpoints[] = { Endpoint::make_property("resistance_calib_max_voltage", &motors[0].resistance_calib_max_voltage), Endpoint::make_property("phase_inductance", &motors[0].phase_inductance), Endpoint::make_property("phase_resistance", &motors[0].phase_resistance), - Endpoint::make_property("motor_type", reinterpret_cast(&motors[0].motor_type)), - Endpoint::make_property("rotor_mode", reinterpret_cast(&motors[0].rotor_mode)), + Endpoint::make_property("motor_type", reinterpret_cast*>(&motors[0].motor_type)), + Endpoint::make_property("rotor_mode", reinterpret_cast*>(&motors[0].rotor_mode)), Endpoint::close_tree(), - Endpoint::make_property("error", reinterpret_cast(&motors[0].error)), + Endpoint::make_property("error", reinterpret_cast*>(&motors[0].error)), Endpoint::make_property("pos_setpoint", &motors[0].pos_setpoint), Endpoint::make_property("vel_setpoint", &motors[0].vel_setpoint), Endpoint::make_property("vel_integrator_current", &motors[0].vel_integrator_current), @@ -173,7 +175,7 @@ const Endpoint endpoints[] = { Endpoint::make_property("Ibus", const_cast(&motors[0].current_control.Ibus)), Endpoint::close_tree(), Endpoint::make_object("gate_driver"), - Endpoint::make_property("drv_fault", reinterpret_cast(&motors[0].drv_fault)), + Endpoint::make_property("drv_fault", reinterpret_cast*>(&motors[0].drv_fault)), Endpoint::make_property("status_reg_1", (&motors[0].gate_driver_regs.Stat_Reg_1_Value)), Endpoint::make_property("status_reg_2", (&motors[0].gate_driver_regs.Stat_Reg_2_Value)), Endpoint::make_property("ctrl_reg_1", (&motors[0].gate_driver_regs.Ctrl_Reg_1_Value)), @@ -231,7 +233,7 @@ const Endpoint endpoints[] = { Endpoint::close_tree(), Endpoint::make_object("motor1"), Endpoint::make_object("config"), - Endpoint::make_property("control_mode", reinterpret_cast(&motors[1].control_mode)), + Endpoint::make_property("control_mode", reinterpret_cast*>(&motors[1].control_mode)), Endpoint::make_property("counts_per_step", &motors[1].counts_per_step), Endpoint::make_property("pole_pairs", &motors[1].pole_pairs), Endpoint::make_property("pos_gain", &motors[1].pos_gain), @@ -242,10 +244,10 @@ const Endpoint endpoints[] = { Endpoint::make_property("resistance_calib_max_voltage", &motors[1].resistance_calib_max_voltage), Endpoint::make_property("phase_inductance", &motors[1].phase_inductance), Endpoint::make_property("phase_resistance", &motors[1].phase_resistance), - Endpoint::make_property("motor_type", reinterpret_cast(&motors[1].motor_type)), - Endpoint::make_property("rotor_mode", reinterpret_cast(&motors[1].rotor_mode)), + Endpoint::make_property("motor_type", reinterpret_cast*>(&motors[1].motor_type)), + Endpoint::make_property("rotor_mode", reinterpret_cast*>(&motors[1].rotor_mode)), Endpoint::close_tree(), - Endpoint::make_property("error", reinterpret_cast(&motors[1].error)), + Endpoint::make_property("error", reinterpret_cast*>(&motors[1].error)), Endpoint::make_property("pos_setpoint", &motors[1].pos_setpoint), Endpoint::make_property("vel_setpoint", &motors[1].vel_setpoint), Endpoint::make_property("vel_integrator_current", &motors[1].vel_integrator_current), @@ -273,7 +275,7 @@ const Endpoint endpoints[] = { Endpoint::make_property("Ibus", const_cast(&motors[1].current_control.Ibus)), Endpoint::close_tree(), Endpoint::make_object("gate_driver"), - Endpoint::make_property("drv_fault", reinterpret_cast(&motors[1].drv_fault)), + Endpoint::make_property("drv_fault", reinterpret_cast*>(&motors[1].drv_fault)), Endpoint::make_property("status_reg_1", (&motors[1].gate_driver_regs.Stat_Reg_1_Value)), Endpoint::make_property("status_reg_2", (&motors[1].gate_driver_regs.Stat_Reg_2_Value)), Endpoint::make_property("ctrl_reg_1", (&motors[1].gate_driver_regs.Ctrl_Reg_1_Value)), From d6074fdf2cff7247073bb725ccdf3359f89d7b8e Mon Sep 17 00:00:00 2001 From: Oskar Weigl Date: Sun, 8 Apr 2018 21:20:24 -0700 Subject: [PATCH 12/13] Update README.md --- Firmware/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/README.md b/Firmware/README.md index 214afe68..2d2c32b7 100644 --- a/Firmware/README.md +++ b/Firmware/README.md @@ -110,6 +110,7 @@ If you have multiple ODrives connected, you should specify which one to upgrade. iSerial 3 306A396A3235 ``` * The last column is the serial number you're looking for. You can unplug selected devices to track down the one you want to update. +* If you only get `iSerial 3`, then you can try to substitute `sudo lsusb` in place of `lsusb`. * Run `make dfu SERIAL_NUMBER=385F324D3037`, where `385F324D3037` is the targeted serial number. __Warning:__ Currently it is advised that you only do this to flash From 5b4be59e522204d7040cddf1565ce11f1c0b58f2 Mon Sep 17 00:00:00 2001 From: Oskar Weigl Date: Mon, 9 Apr 2018 14:57:55 -0700 Subject: [PATCH 13/13] update changelog --- Firmware/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/CHANGELOG.md b/Firmware/CHANGELOG.md index 1dacb0c1..0d6195e1 100644 --- a/Firmware/CHANGELOG.md +++ b/Firmware/CHANGELOG.md @@ -3,7 +3,9 @@ Please add a note of your changes below this heading if you make a Pull Request. ### Added ### Changed +* Set thread priority of USB pump thread above protocol thread ### Fixed +* Enums now transported with correct underlying type on native protocol # Releases