Repostiory containing DAPLink source code with Reset Pin workaround for HANI_IOT board.

Upstream: https://github.com/ARMmbed/DAPLink

Committer:
Pawel Zarembski
Date:
Tue Apr 07 12:55:42 2020 +0200
Revision:
0:01f31e923fe2
hani: DAPLink with reset workaround

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:01f31e923fe2 1 /**
Pawel Zarembski 0:01f31e923fe2 2 * @file main.c
Pawel Zarembski 0:01f31e923fe2 3 * @brief Entry point for interface program logic
Pawel Zarembski 0:01f31e923fe2 4 *
Pawel Zarembski 0:01f31e923fe2 5 * DAPLink Interface Firmware
Pawel Zarembski 0:01f31e923fe2 6 * Copyright (c) 2009-2019, ARM Limited, All Rights Reserved
Pawel Zarembski 0:01f31e923fe2 7 * SPDX-License-Identifier: Apache-2.0
Pawel Zarembski 0:01f31e923fe2 8 *
Pawel Zarembski 0:01f31e923fe2 9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
Pawel Zarembski 0:01f31e923fe2 10 * not use this file except in compliance with the License.
Pawel Zarembski 0:01f31e923fe2 11 * You may obtain a copy of the License at
Pawel Zarembski 0:01f31e923fe2 12 *
Pawel Zarembski 0:01f31e923fe2 13 * http://www.apache.org/licenses/LICENSE-2.0
Pawel Zarembski 0:01f31e923fe2 14 *
Pawel Zarembski 0:01f31e923fe2 15 * Unless required by applicable law or agreed to in writing, software
Pawel Zarembski 0:01f31e923fe2 16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Pawel Zarembski 0:01f31e923fe2 17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Pawel Zarembski 0:01f31e923fe2 18 * See the License for the specific language governing permissions and
Pawel Zarembski 0:01f31e923fe2 19 * limitations under the License.
Pawel Zarembski 0:01f31e923fe2 20 */
Pawel Zarembski 0:01f31e923fe2 21
Pawel Zarembski 0:01f31e923fe2 22 #include <string.h>
Pawel Zarembski 0:01f31e923fe2 23 #include <stdio.h>
Pawel Zarembski 0:01f31e923fe2 24
Pawel Zarembski 0:01f31e923fe2 25 #include "cmsis_os2.h"
Pawel Zarembski 0:01f31e923fe2 26 #include "rl_usb.h"
Pawel Zarembski 0:01f31e923fe2 27 #include "main.h"
Pawel Zarembski 0:01f31e923fe2 28 #include "gpio.h"
Pawel Zarembski 0:01f31e923fe2 29 #include "uart.h"
Pawel Zarembski 0:01f31e923fe2 30 #include "tasks.h"
Pawel Zarembski 0:01f31e923fe2 31 #include "swd_host.h"
Pawel Zarembski 0:01f31e923fe2 32 #include "info.h"
Pawel Zarembski 0:01f31e923fe2 33 #include "settings.h"
Pawel Zarembski 0:01f31e923fe2 34 #include "daplink.h"
Pawel Zarembski 0:01f31e923fe2 35 #include "util.h"
Pawel Zarembski 0:01f31e923fe2 36 #include "DAP.h"
Pawel Zarembski 0:01f31e923fe2 37 #include "bootloader.h"
Pawel Zarembski 0:01f31e923fe2 38 #include "cortex_m.h"
Pawel Zarembski 0:01f31e923fe2 39 #include "sdk.h"
Pawel Zarembski 0:01f31e923fe2 40 #include "target_family.h"
Pawel Zarembski 0:01f31e923fe2 41 #include "target_board.h"
Pawel Zarembski 0:01f31e923fe2 42
Pawel Zarembski 0:01f31e923fe2 43 #ifdef DRAG_N_DROP_SUPPORT
Pawel Zarembski 0:01f31e923fe2 44 #include "vfs_manager.h"
Pawel Zarembski 0:01f31e923fe2 45 #include "flash_intf.h"
Pawel Zarembski 0:01f31e923fe2 46 #include "flash_manager.h"
Pawel Zarembski 0:01f31e923fe2 47 #endif
Pawel Zarembski 0:01f31e923fe2 48
Pawel Zarembski 0:01f31e923fe2 49 // Event flags for main task
Pawel Zarembski 0:01f31e923fe2 50 // Timers events
Pawel Zarembski 0:01f31e923fe2 51 #define FLAGS_MAIN_90MS (1 << 0)
Pawel Zarembski 0:01f31e923fe2 52 #define FLAGS_MAIN_30MS (1 << 1)
Pawel Zarembski 0:01f31e923fe2 53 // Reset events
Pawel Zarembski 0:01f31e923fe2 54 #define FLAGS_MAIN_RESET (1 << 2)
Pawel Zarembski 0:01f31e923fe2 55 // Other Events
Pawel Zarembski 0:01f31e923fe2 56 #define FLAGS_MAIN_POWERDOWN (1 << 4)
Pawel Zarembski 0:01f31e923fe2 57 #define FLAGS_MAIN_DISABLEDEBUG (1 << 5)
Pawel Zarembski 0:01f31e923fe2 58 #define FLAGS_MAIN_PROC_USB (1 << 9)
Pawel Zarembski 0:01f31e923fe2 59 // Used by cdc when an event occurs
Pawel Zarembski 0:01f31e923fe2 60 #define FLAGS_MAIN_CDC_EVENT (1 << 11)
Pawel Zarembski 0:01f31e923fe2 61 // Used by msd when flashing a new binary
Pawel Zarembski 0:01f31e923fe2 62 #define FLAGS_LED_BLINK_30MS (1 << 6)
Pawel Zarembski 0:01f31e923fe2 63
Pawel Zarembski 0:01f31e923fe2 64 // Timing constants (in 90mS ticks)
Pawel Zarembski 0:01f31e923fe2 65 // USB busy time (~3 sec)
Pawel Zarembski 0:01f31e923fe2 66 #define USB_BUSY_TIME (33)
Pawel Zarembski 0:01f31e923fe2 67 // Delay before a USB device connect may occur (~1 sec)
Pawel Zarembski 0:01f31e923fe2 68 #define USB_CONNECT_DELAY (11)
Pawel Zarembski 0:01f31e923fe2 69 // Timeout for USB being configured (~2 sec)
Pawel Zarembski 0:01f31e923fe2 70 #define USB_CONFIGURE_TIMEOUT (22)
Pawel Zarembski 0:01f31e923fe2 71 // Delay before target may be taken out of reset or reprogrammed after startup
Pawel Zarembski 0:01f31e923fe2 72 #define STARTUP_DELAY (1)
Pawel Zarembski 0:01f31e923fe2 73
Pawel Zarembski 0:01f31e923fe2 74 // Decrement to zero
Pawel Zarembski 0:01f31e923fe2 75 #define DECZERO(x) (x ? --x : 0)
Pawel Zarembski 0:01f31e923fe2 76
Pawel Zarembski 0:01f31e923fe2 77 //default hid led settings
Pawel Zarembski 0:01f31e923fe2 78 #ifndef HID_LED_DEF
Pawel Zarembski 0:01f31e923fe2 79 #define HID_LED_DEF GPIO_LED_OFF
Pawel Zarembski 0:01f31e923fe2 80 #endif
Pawel Zarembski 0:01f31e923fe2 81
Pawel Zarembski 0:01f31e923fe2 82 //default cdc led settings
Pawel Zarembski 0:01f31e923fe2 83 #ifndef CDC_LED_DEF
Pawel Zarembski 0:01f31e923fe2 84 #define CDC_LED_DEF GPIO_LED_OFF
Pawel Zarembski 0:01f31e923fe2 85 #endif
Pawel Zarembski 0:01f31e923fe2 86
Pawel Zarembski 0:01f31e923fe2 87 //default msc led settings
Pawel Zarembski 0:01f31e923fe2 88 #ifndef MSC_LED_DEF
Pawel Zarembski 0:01f31e923fe2 89 #define MSC_LED_DEF GPIO_LED_OFF
Pawel Zarembski 0:01f31e923fe2 90 #endif
Pawel Zarembski 0:01f31e923fe2 91
Pawel Zarembski 0:01f31e923fe2 92 // Reference to our main task
Pawel Zarembski 0:01f31e923fe2 93 osThreadId_t main_task_id;
Pawel Zarembski 0:01f31e923fe2 94
Pawel Zarembski 0:01f31e923fe2 95 // USB busy LED state; when TRUE the LED will flash once using 30mS clock tick
Pawel Zarembski 0:01f31e923fe2 96 static uint8_t hid_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 97 static uint8_t cdc_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 98 static uint8_t msc_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 99 static main_led_state_t hid_led_state = MAIN_LED_FLASH;
Pawel Zarembski 0:01f31e923fe2 100 static main_led_state_t cdc_led_state = MAIN_LED_FLASH;
Pawel Zarembski 0:01f31e923fe2 101 static main_led_state_t msc_led_state = MAIN_LED_FLASH;
Pawel Zarembski 0:01f31e923fe2 102
Pawel Zarembski 0:01f31e923fe2 103 // Global state of usb
Pawel Zarembski 0:01f31e923fe2 104 main_usb_connect_t usb_state;
Pawel Zarembski 0:01f31e923fe2 105 static bool usb_test_mode = false;
Pawel Zarembski 0:01f31e923fe2 106
Pawel Zarembski 0:01f31e923fe2 107 // Timer task, set flags every 30mS and 90mS
Pawel Zarembski 0:01f31e923fe2 108 void timer_task_30mS(void * arg)
Pawel Zarembski 0:01f31e923fe2 109 {
Pawel Zarembski 0:01f31e923fe2 110 static uint32_t i = 0;
Pawel Zarembski 0:01f31e923fe2 111 osThreadFlagsSet(main_task_id, FLAGS_MAIN_30MS);
Pawel Zarembski 0:01f31e923fe2 112 if (!(i++ % 3)) {
Pawel Zarembski 0:01f31e923fe2 113 osThreadFlagsSet(main_task_id, FLAGS_MAIN_90MS);
Pawel Zarembski 0:01f31e923fe2 114 }
Pawel Zarembski 0:01f31e923fe2 115 }
Pawel Zarembski 0:01f31e923fe2 116
Pawel Zarembski 0:01f31e923fe2 117 // Functions called from other tasks to trigger events in the main task
Pawel Zarembski 0:01f31e923fe2 118 // parameter should be reset type??
Pawel Zarembski 0:01f31e923fe2 119 void main_reset_target(uint8_t send_unique_id)
Pawel Zarembski 0:01f31e923fe2 120 {
Pawel Zarembski 0:01f31e923fe2 121 osThreadFlagsSet(main_task_id, FLAGS_MAIN_RESET);
Pawel Zarembski 0:01f31e923fe2 122 return;
Pawel Zarembski 0:01f31e923fe2 123 }
Pawel Zarembski 0:01f31e923fe2 124
Pawel Zarembski 0:01f31e923fe2 125 // Flash HID LED using 30mS tick
Pawel Zarembski 0:01f31e923fe2 126 void main_blink_hid_led(main_led_state_t state)
Pawel Zarembski 0:01f31e923fe2 127 {
Pawel Zarembski 0:01f31e923fe2 128 hid_led_usb_activity = 1;
Pawel Zarembski 0:01f31e923fe2 129 hid_led_state = state;
Pawel Zarembski 0:01f31e923fe2 130 return;
Pawel Zarembski 0:01f31e923fe2 131 }
Pawel Zarembski 0:01f31e923fe2 132
Pawel Zarembski 0:01f31e923fe2 133 // Flash CDC LED using 30mS tick
Pawel Zarembski 0:01f31e923fe2 134 void main_blink_cdc_led(main_led_state_t state)
Pawel Zarembski 0:01f31e923fe2 135 {
Pawel Zarembski 0:01f31e923fe2 136 cdc_led_usb_activity = 1;
Pawel Zarembski 0:01f31e923fe2 137 cdc_led_state = state;
Pawel Zarembski 0:01f31e923fe2 138 return;
Pawel Zarembski 0:01f31e923fe2 139 }
Pawel Zarembski 0:01f31e923fe2 140
Pawel Zarembski 0:01f31e923fe2 141 // Flash MSC LED using 30mS tick
Pawel Zarembski 0:01f31e923fe2 142 void main_blink_msc_led(main_led_state_t state)
Pawel Zarembski 0:01f31e923fe2 143 {
Pawel Zarembski 0:01f31e923fe2 144 msc_led_usb_activity = 1;
Pawel Zarembski 0:01f31e923fe2 145 msc_led_state = state;
Pawel Zarembski 0:01f31e923fe2 146 return;
Pawel Zarembski 0:01f31e923fe2 147 }
Pawel Zarembski 0:01f31e923fe2 148
Pawel Zarembski 0:01f31e923fe2 149 // Power down the interface
Pawel Zarembski 0:01f31e923fe2 150 void main_powerdown_event(void)
Pawel Zarembski 0:01f31e923fe2 151 {
Pawel Zarembski 0:01f31e923fe2 152 osThreadFlagsSet(main_task_id, FLAGS_MAIN_POWERDOWN);
Pawel Zarembski 0:01f31e923fe2 153 return;
Pawel Zarembski 0:01f31e923fe2 154 }
Pawel Zarembski 0:01f31e923fe2 155
Pawel Zarembski 0:01f31e923fe2 156 // Disable debug on target
Pawel Zarembski 0:01f31e923fe2 157 void main_disable_debug_event(void)
Pawel Zarembski 0:01f31e923fe2 158 {
Pawel Zarembski 0:01f31e923fe2 159 osThreadFlagsSet(main_task_id, FLAGS_MAIN_DISABLEDEBUG);
Pawel Zarembski 0:01f31e923fe2 160 return;
Pawel Zarembski 0:01f31e923fe2 161 }
Pawel Zarembski 0:01f31e923fe2 162
Pawel Zarembski 0:01f31e923fe2 163 // Start CDC processing
Pawel Zarembski 0:01f31e923fe2 164 void main_cdc_send_event(void)
Pawel Zarembski 0:01f31e923fe2 165 {
Pawel Zarembski 0:01f31e923fe2 166 osThreadFlagsSet(main_task_id, FLAGS_MAIN_CDC_EVENT);
Pawel Zarembski 0:01f31e923fe2 167 return;
Pawel Zarembski 0:01f31e923fe2 168 }
Pawel Zarembski 0:01f31e923fe2 169
Pawel Zarembski 0:01f31e923fe2 170 void main_usb_set_test_mode(bool enabled)
Pawel Zarembski 0:01f31e923fe2 171 {
Pawel Zarembski 0:01f31e923fe2 172 usb_test_mode = enabled;
Pawel Zarembski 0:01f31e923fe2 173 }
Pawel Zarembski 0:01f31e923fe2 174
Pawel Zarembski 0:01f31e923fe2 175 void USBD_SignalHandler()
Pawel Zarembski 0:01f31e923fe2 176 {
Pawel Zarembski 0:01f31e923fe2 177 osThreadFlagsSet(main_task_id, FLAGS_MAIN_PROC_USB);
Pawel Zarembski 0:01f31e923fe2 178 }
Pawel Zarembski 0:01f31e923fe2 179
Pawel Zarembski 0:01f31e923fe2 180 extern void cdc_process_event(void);
Pawel Zarembski 0:01f31e923fe2 181
Pawel Zarembski 0:01f31e923fe2 182 void main_task(void * arg)
Pawel Zarembski 0:01f31e923fe2 183 {
Pawel Zarembski 0:01f31e923fe2 184 // State processing
Pawel Zarembski 0:01f31e923fe2 185 uint16_t flags = 0;
Pawel Zarembski 0:01f31e923fe2 186 // LED
Pawel Zarembski 0:01f31e923fe2 187 gpio_led_state_t hid_led_value = HID_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 188 gpio_led_state_t cdc_led_value = CDC_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 189 gpio_led_state_t msc_led_value = MSC_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 190 // USB
Pawel Zarembski 0:01f31e923fe2 191 uint32_t usb_state_count = USB_BUSY_TIME;
Pawel Zarembski 0:01f31e923fe2 192 uint32_t usb_no_config_count = USB_CONFIGURE_TIMEOUT;
Pawel Zarembski 0:01f31e923fe2 193 // button state
Pawel Zarembski 0:01f31e923fe2 194 uint8_t reset_pressed = 0;
Pawel Zarembski 0:01f31e923fe2 195 #ifdef PBON_BUTTON
Pawel Zarembski 0:01f31e923fe2 196 uint8_t power_on = 1;
Pawel Zarembski 0:01f31e923fe2 197 #endif
Pawel Zarembski 0:01f31e923fe2 198
Pawel Zarembski 0:01f31e923fe2 199 // Initialize settings - required for asserts to work
Pawel Zarembski 0:01f31e923fe2 200 config_init();
Pawel Zarembski 0:01f31e923fe2 201 // Update bootloader if it is out of date
Pawel Zarembski 0:01f31e923fe2 202 bootloader_check_and_update();
Pawel Zarembski 0:01f31e923fe2 203 // Get a reference to this task
Pawel Zarembski 0:01f31e923fe2 204 main_task_id = osThreadGetId();
Pawel Zarembski 0:01f31e923fe2 205 // leds
Pawel Zarembski 0:01f31e923fe2 206 gpio_init();
Pawel Zarembski 0:01f31e923fe2 207 // Turn to LED default settings
Pawel Zarembski 0:01f31e923fe2 208 gpio_set_hid_led(hid_led_value);
Pawel Zarembski 0:01f31e923fe2 209 gpio_set_cdc_led(cdc_led_value);
Pawel Zarembski 0:01f31e923fe2 210 gpio_set_msc_led(msc_led_value);
Pawel Zarembski 0:01f31e923fe2 211 // Initialize the DAP
Pawel Zarembski 0:01f31e923fe2 212 DAP_Setup();
Pawel Zarembski 0:01f31e923fe2 213
Pawel Zarembski 0:01f31e923fe2 214 // make sure we have a valid board info structure.
Pawel Zarembski 0:01f31e923fe2 215 util_assert(g_board_info.info_version == kBoardInfoVersion);
Pawel Zarembski 0:01f31e923fe2 216
Pawel Zarembski 0:01f31e923fe2 217 // do some init with the target before USB and files are configured
Pawel Zarembski 0:01f31e923fe2 218 if (g_board_info.prerun_board_config) {
Pawel Zarembski 0:01f31e923fe2 219 g_board_info.prerun_board_config();
Pawel Zarembski 0:01f31e923fe2 220 }
Pawel Zarembski 0:01f31e923fe2 221
Pawel Zarembski 0:01f31e923fe2 222 //initialize the family
Pawel Zarembski 0:01f31e923fe2 223 init_family();
Pawel Zarembski 0:01f31e923fe2 224
Pawel Zarembski 0:01f31e923fe2 225 if (g_target_family && g_target_family->prerun_target_config) {
Pawel Zarembski 0:01f31e923fe2 226 g_target_family->prerun_target_config();
Pawel Zarembski 0:01f31e923fe2 227 }
Pawel Zarembski 0:01f31e923fe2 228
Pawel Zarembski 0:01f31e923fe2 229 //setup some flags
Pawel Zarembski 0:01f31e923fe2 230 if (g_board_info.flags & kEnableUnderResetConnect) {
Pawel Zarembski 0:01f31e923fe2 231 swd_set_reset_connect(CONNECT_UNDER_RESET);
Pawel Zarembski 0:01f31e923fe2 232 }
Pawel Zarembski 0:01f31e923fe2 233 if (g_board_info.flags & kEnablePageErase) {
Pawel Zarembski 0:01f31e923fe2 234 #ifdef DRAG_N_DROP_SUPPORT
Pawel Zarembski 0:01f31e923fe2 235 flash_manager_set_page_erase(true);
Pawel Zarembski 0:01f31e923fe2 236 #endif
Pawel Zarembski 0:01f31e923fe2 237 }
Pawel Zarembski 0:01f31e923fe2 238
Pawel Zarembski 0:01f31e923fe2 239 // Update versions and IDs
Pawel Zarembski 0:01f31e923fe2 240 info_init();
Pawel Zarembski 0:01f31e923fe2 241 // USB
Pawel Zarembski 0:01f31e923fe2 242 usbd_init();
Pawel Zarembski 0:01f31e923fe2 243 #ifdef DRAG_N_DROP_SUPPORT
Pawel Zarembski 0:01f31e923fe2 244 vfs_mngr_fs_enable((config_ram_get_disable_msd()==0));
Pawel Zarembski 0:01f31e923fe2 245 #endif
Pawel Zarembski 0:01f31e923fe2 246 usbd_connect(0);
Pawel Zarembski 0:01f31e923fe2 247 usb_state = USB_CONNECTING;
Pawel Zarembski 0:01f31e923fe2 248 usb_state_count = USB_CONNECT_DELAY;
Pawel Zarembski 0:01f31e923fe2 249
Pawel Zarembski 0:01f31e923fe2 250 // Start timer tasks
Pawel Zarembski 0:01f31e923fe2 251 osTimerId_t tmr_id = osTimerNew(timer_task_30mS, osTimerPeriodic, NULL, NULL);
Pawel Zarembski 0:01f31e923fe2 252 osTimerStart(tmr_id, 3);
Pawel Zarembski 0:01f31e923fe2 253 while (1) {
Pawel Zarembski 0:01f31e923fe2 254 flags = osThreadFlagsWait(FLAGS_MAIN_RESET // Put target in reset state
Pawel Zarembski 0:01f31e923fe2 255 | FLAGS_MAIN_90MS // 90mS tick
Pawel Zarembski 0:01f31e923fe2 256 | FLAGS_MAIN_30MS // 30mS tick
Pawel Zarembski 0:01f31e923fe2 257 | FLAGS_MAIN_POWERDOWN // Power down interface
Pawel Zarembski 0:01f31e923fe2 258 | FLAGS_MAIN_DISABLEDEBUG // Disable target debug
Pawel Zarembski 0:01f31e923fe2 259 | FLAGS_MAIN_PROC_USB // process usb events
Pawel Zarembski 0:01f31e923fe2 260 | FLAGS_MAIN_CDC_EVENT // cdc event
Pawel Zarembski 0:01f31e923fe2 261 , osFlagsWaitAny
Pawel Zarembski 0:01f31e923fe2 262 , osWaitForever);
Pawel Zarembski 0:01f31e923fe2 263
Pawel Zarembski 0:01f31e923fe2 264 if (flags & FLAGS_MAIN_PROC_USB) {
Pawel Zarembski 0:01f31e923fe2 265 if (usb_test_mode) {
Pawel Zarembski 0:01f31e923fe2 266 // When in USB test mode Insert a delay to
Pawel Zarembski 0:01f31e923fe2 267 // simulate worst-case behavior.
Pawel Zarembski 0:01f31e923fe2 268 osDelay(1);
Pawel Zarembski 0:01f31e923fe2 269 }
Pawel Zarembski 0:01f31e923fe2 270 USBD_Handler();
Pawel Zarembski 0:01f31e923fe2 271 }
Pawel Zarembski 0:01f31e923fe2 272
Pawel Zarembski 0:01f31e923fe2 273 if (flags & FLAGS_MAIN_RESET) {
Pawel Zarembski 0:01f31e923fe2 274 target_set_state(RESET_RUN);
Pawel Zarembski 0:01f31e923fe2 275 }
Pawel Zarembski 0:01f31e923fe2 276
Pawel Zarembski 0:01f31e923fe2 277 if (flags & FLAGS_MAIN_POWERDOWN) {
Pawel Zarembski 0:01f31e923fe2 278 // Disable debug
Pawel Zarembski 0:01f31e923fe2 279 target_set_state(NO_DEBUG);
Pawel Zarembski 0:01f31e923fe2 280 // Disable board power before USB is disconnected.
Pawel Zarembski 0:01f31e923fe2 281 gpio_set_board_power(false);
Pawel Zarembski 0:01f31e923fe2 282 // Disconnect USB
Pawel Zarembski 0:01f31e923fe2 283 usbd_connect(0);
Pawel Zarembski 0:01f31e923fe2 284 // Turn off LED
Pawel Zarembski 0:01f31e923fe2 285 gpio_set_hid_led(GPIO_LED_OFF);
Pawel Zarembski 0:01f31e923fe2 286 gpio_set_cdc_led(GPIO_LED_OFF);
Pawel Zarembski 0:01f31e923fe2 287 gpio_set_msc_led(GPIO_LED_OFF);
Pawel Zarembski 0:01f31e923fe2 288
Pawel Zarembski 0:01f31e923fe2 289 // TODO: put the interface chip in sleep mode
Pawel Zarembski 0:01f31e923fe2 290 while (1);
Pawel Zarembski 0:01f31e923fe2 291 }
Pawel Zarembski 0:01f31e923fe2 292
Pawel Zarembski 0:01f31e923fe2 293 if (flags & FLAGS_MAIN_DISABLEDEBUG) {
Pawel Zarembski 0:01f31e923fe2 294 // Disable debug
Pawel Zarembski 0:01f31e923fe2 295 target_set_state(NO_DEBUG);
Pawel Zarembski 0:01f31e923fe2 296 }
Pawel Zarembski 0:01f31e923fe2 297
Pawel Zarembski 0:01f31e923fe2 298 if (flags & FLAGS_MAIN_CDC_EVENT) {
Pawel Zarembski 0:01f31e923fe2 299 cdc_process_event();
Pawel Zarembski 0:01f31e923fe2 300 }
Pawel Zarembski 0:01f31e923fe2 301
Pawel Zarembski 0:01f31e923fe2 302 if (flags & FLAGS_MAIN_90MS) {
Pawel Zarembski 0:01f31e923fe2 303 // Update USB busy status
Pawel Zarembski 0:01f31e923fe2 304 #ifdef DRAG_N_DROP_SUPPORT
Pawel Zarembski 0:01f31e923fe2 305 vfs_mngr_periodic(90); // FLAGS_MAIN_90MS
Pawel Zarembski 0:01f31e923fe2 306 #endif
Pawel Zarembski 0:01f31e923fe2 307 // Update USB connect status
Pawel Zarembski 0:01f31e923fe2 308 switch (usb_state) {
Pawel Zarembski 0:01f31e923fe2 309 case USB_DISCONNECTING:
Pawel Zarembski 0:01f31e923fe2 310 usb_state = USB_DISCONNECTED;
Pawel Zarembski 0:01f31e923fe2 311 // Disable board power before USB is disconnected.
Pawel Zarembski 0:01f31e923fe2 312 gpio_set_board_power(false);
Pawel Zarembski 0:01f31e923fe2 313 usbd_connect(0);
Pawel Zarembski 0:01f31e923fe2 314 break;
Pawel Zarembski 0:01f31e923fe2 315
Pawel Zarembski 0:01f31e923fe2 316 case USB_CONNECTING:
Pawel Zarembski 0:01f31e923fe2 317 // Wait before connecting
Pawel Zarembski 0:01f31e923fe2 318 if (DECZERO(usb_state_count) == 0) {
Pawel Zarembski 0:01f31e923fe2 319 usbd_connect(1);
Pawel Zarembski 0:01f31e923fe2 320 usb_state = USB_CHECK_CONNECTED;
Pawel Zarembski 0:01f31e923fe2 321 // Reset connect timeout
Pawel Zarembski 0:01f31e923fe2 322 usb_no_config_count = USB_CONFIGURE_TIMEOUT;
Pawel Zarembski 0:01f31e923fe2 323 }
Pawel Zarembski 0:01f31e923fe2 324
Pawel Zarembski 0:01f31e923fe2 325 break;
Pawel Zarembski 0:01f31e923fe2 326
Pawel Zarembski 0:01f31e923fe2 327 case USB_CHECK_CONNECTED:
Pawel Zarembski 0:01f31e923fe2 328 if (usbd_configured()) {
Pawel Zarembski 0:01f31e923fe2 329 // Let the HIC enable power to the target now that high power has been negotiated.
Pawel Zarembski 0:01f31e923fe2 330 gpio_set_board_power(true);
Pawel Zarembski 0:01f31e923fe2 331
Pawel Zarembski 0:01f31e923fe2 332 usb_state = USB_CONNECTED;
Pawel Zarembski 0:01f31e923fe2 333 }
Pawel Zarembski 0:01f31e923fe2 334 else if (DECZERO(usb_no_config_count) == 0) {
Pawel Zarembski 0:01f31e923fe2 335 // USB configuration timed out, which most likely indicates that the HIC is
Pawel Zarembski 0:01f31e923fe2 336 // powered by a USB wall wart or similar power source. Go ahead and enable
Pawel Zarembski 0:01f31e923fe2 337 // board power.
Pawel Zarembski 0:01f31e923fe2 338 gpio_set_board_power(true);
Pawel Zarembski 0:01f31e923fe2 339 }
Pawel Zarembski 0:01f31e923fe2 340
Pawel Zarembski 0:01f31e923fe2 341 break;
Pawel Zarembski 0:01f31e923fe2 342
Pawel Zarembski 0:01f31e923fe2 343 case USB_CONNECTED:
Pawel Zarembski 0:01f31e923fe2 344 case USB_DISCONNECTED:
Pawel Zarembski 0:01f31e923fe2 345 default:
Pawel Zarembski 0:01f31e923fe2 346 break;
Pawel Zarembski 0:01f31e923fe2 347 }
Pawel Zarembski 0:01f31e923fe2 348 }
Pawel Zarembski 0:01f31e923fe2 349
Pawel Zarembski 0:01f31e923fe2 350 // 30mS tick used for flashing LED when USB is busy
Pawel Zarembski 0:01f31e923fe2 351 if (flags & FLAGS_MAIN_30MS) {
Pawel Zarembski 0:01f31e923fe2 352
Pawel Zarembski 0:01f31e923fe2 353 // handle reset button without eventing
Pawel Zarembski 0:01f31e923fe2 354 if (!reset_pressed && gpio_get_reset_btn_fwrd()) {
Pawel Zarembski 0:01f31e923fe2 355 #ifdef DRAG_N_DROP_SUPPORT
Pawel Zarembski 0:01f31e923fe2 356 if (!flash_intf_target->flash_busy()) //added checking if flashing on target is in progress
Pawel Zarembski 0:01f31e923fe2 357 #endif
Pawel Zarembski 0:01f31e923fe2 358 {
Pawel Zarembski 0:01f31e923fe2 359 // Reset button pressed
Pawel Zarembski 0:01f31e923fe2 360 target_set_state(RESET_HOLD);
Pawel Zarembski 0:01f31e923fe2 361 reset_pressed = 1;
Pawel Zarembski 0:01f31e923fe2 362 }
Pawel Zarembski 0:01f31e923fe2 363 } else if (reset_pressed && !gpio_get_reset_btn_fwrd()) {
Pawel Zarembski 0:01f31e923fe2 364 // Reset button released
Pawel Zarembski 0:01f31e923fe2 365 target_set_state(RESET_RUN);
Pawel Zarembski 0:01f31e923fe2 366 reset_pressed = 0;
Pawel Zarembski 0:01f31e923fe2 367 }
Pawel Zarembski 0:01f31e923fe2 368
Pawel Zarembski 0:01f31e923fe2 369 #ifdef PBON_BUTTON
Pawel Zarembski 0:01f31e923fe2 370 // handle PBON pressed
Pawel Zarembski 0:01f31e923fe2 371 if(gpio_get_pbon_btn())
Pawel Zarembski 0:01f31e923fe2 372 {
Pawel Zarembski 0:01f31e923fe2 373 if(power_on)
Pawel Zarembski 0:01f31e923fe2 374 {
Pawel Zarembski 0:01f31e923fe2 375 // Loop till PBON is pressed
Pawel Zarembski 0:01f31e923fe2 376 while (gpio_get_pbon_btn()) {;}
Pawel Zarembski 0:01f31e923fe2 377 // Power button released when target was running
Pawel Zarembski 0:01f31e923fe2 378 target_set_state(SHUTDOWN);
Pawel Zarembski 0:01f31e923fe2 379 power_on = 0;
Pawel Zarembski 0:01f31e923fe2 380 }
Pawel Zarembski 0:01f31e923fe2 381 else
Pawel Zarembski 0:01f31e923fe2 382 {
Pawel Zarembski 0:01f31e923fe2 383 // Loop till PBON is pressed
Pawel Zarembski 0:01f31e923fe2 384 while (gpio_get_pbon_btn()) {;}
Pawel Zarembski 0:01f31e923fe2 385 // Power button released when target was already powered off
Pawel Zarembski 0:01f31e923fe2 386 target_set_state(POWER_ON);
Pawel Zarembski 0:01f31e923fe2 387 power_on = 1;
Pawel Zarembski 0:01f31e923fe2 388 }
Pawel Zarembski 0:01f31e923fe2 389 }
Pawel Zarembski 0:01f31e923fe2 390 #endif
Pawel Zarembski 0:01f31e923fe2 391
Pawel Zarembski 0:01f31e923fe2 392 // DAP LED
Pawel Zarembski 0:01f31e923fe2 393 if (hid_led_usb_activity) {
Pawel Zarembski 0:01f31e923fe2 394
Pawel Zarembski 0:01f31e923fe2 395 if ((hid_led_state == MAIN_LED_FLASH) || (hid_led_state == MAIN_LED_FLASH_PERMANENT)) {
Pawel Zarembski 0:01f31e923fe2 396 // Toggle LED value
Pawel Zarembski 0:01f31e923fe2 397 hid_led_value = GPIO_LED_ON == hid_led_value ? GPIO_LED_OFF : GPIO_LED_ON;
Pawel Zarembski 0:01f31e923fe2 398
Pawel Zarembski 0:01f31e923fe2 399 // If in flash mode stop after one cycle
Pawel Zarembski 0:01f31e923fe2 400 if ((HID_LED_DEF == hid_led_value) && (MAIN_LED_FLASH == hid_led_state)) {
Pawel Zarembski 0:01f31e923fe2 401 hid_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 402 hid_led_state = MAIN_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 403 }
Pawel Zarembski 0:01f31e923fe2 404 } else {
Pawel Zarembski 0:01f31e923fe2 405 //LED next state is MAIN_LED_DEF
Pawel Zarembski 0:01f31e923fe2 406 hid_led_value = HID_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 407 hid_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 408 }
Pawel Zarembski 0:01f31e923fe2 409
Pawel Zarembski 0:01f31e923fe2 410 // Update hardware
Pawel Zarembski 0:01f31e923fe2 411 gpio_set_hid_led(hid_led_value);
Pawel Zarembski 0:01f31e923fe2 412 }
Pawel Zarembski 0:01f31e923fe2 413
Pawel Zarembski 0:01f31e923fe2 414 // MSD LED
Pawel Zarembski 0:01f31e923fe2 415 if (msc_led_usb_activity) {
Pawel Zarembski 0:01f31e923fe2 416
Pawel Zarembski 0:01f31e923fe2 417 if ((msc_led_state == MAIN_LED_FLASH) || (msc_led_state == MAIN_LED_FLASH_PERMANENT)) {
Pawel Zarembski 0:01f31e923fe2 418 // Toggle LED value
Pawel Zarembski 0:01f31e923fe2 419 msc_led_value = GPIO_LED_ON == msc_led_value ? GPIO_LED_OFF : GPIO_LED_ON;
Pawel Zarembski 0:01f31e923fe2 420
Pawel Zarembski 0:01f31e923fe2 421 // If in flash mode stop after one cycle
Pawel Zarembski 0:01f31e923fe2 422 if ((MSC_LED_DEF == msc_led_value) && (MAIN_LED_FLASH == msc_led_state)) {
Pawel Zarembski 0:01f31e923fe2 423 msc_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 424 msc_led_state = MAIN_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 425 }
Pawel Zarembski 0:01f31e923fe2 426 } else {
Pawel Zarembski 0:01f31e923fe2 427 //LED next state is MAIN_LED_DEF
Pawel Zarembski 0:01f31e923fe2 428 msc_led_value = MSC_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 429 msc_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 430 }
Pawel Zarembski 0:01f31e923fe2 431
Pawel Zarembski 0:01f31e923fe2 432 // Update hardware
Pawel Zarembski 0:01f31e923fe2 433 gpio_set_msc_led(msc_led_value);
Pawel Zarembski 0:01f31e923fe2 434 }
Pawel Zarembski 0:01f31e923fe2 435
Pawel Zarembski 0:01f31e923fe2 436 // CDC LED
Pawel Zarembski 0:01f31e923fe2 437 if (cdc_led_usb_activity) {
Pawel Zarembski 0:01f31e923fe2 438
Pawel Zarembski 0:01f31e923fe2 439 if ((cdc_led_state == MAIN_LED_FLASH) || (cdc_led_state == MAIN_LED_FLASH_PERMANENT)){
Pawel Zarembski 0:01f31e923fe2 440 // Toggle LED value
Pawel Zarembski 0:01f31e923fe2 441 cdc_led_value = GPIO_LED_ON == cdc_led_value ? GPIO_LED_OFF : GPIO_LED_ON;
Pawel Zarembski 0:01f31e923fe2 442
Pawel Zarembski 0:01f31e923fe2 443 // If in flash mode stop after one cycle
Pawel Zarembski 0:01f31e923fe2 444 if ((CDC_LED_DEF == cdc_led_value) && (MAIN_LED_FLASH == cdc_led_state)) {
Pawel Zarembski 0:01f31e923fe2 445 cdc_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 446 cdc_led_state = MAIN_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 447 }
Pawel Zarembski 0:01f31e923fe2 448 }else{
Pawel Zarembski 0:01f31e923fe2 449 //LED next state is MAIN_LED_DEF
Pawel Zarembski 0:01f31e923fe2 450 cdc_led_value = CDC_LED_DEF;
Pawel Zarembski 0:01f31e923fe2 451 cdc_led_usb_activity = 0;
Pawel Zarembski 0:01f31e923fe2 452 }
Pawel Zarembski 0:01f31e923fe2 453
Pawel Zarembski 0:01f31e923fe2 454 // Update hardware
Pawel Zarembski 0:01f31e923fe2 455 gpio_set_cdc_led(cdc_led_value);
Pawel Zarembski 0:01f31e923fe2 456 }
Pawel Zarembski 0:01f31e923fe2 457 }
Pawel Zarembski 0:01f31e923fe2 458 }
Pawel Zarembski 0:01f31e923fe2 459 }
Pawel Zarembski 0:01f31e923fe2 460
Pawel Zarembski 0:01f31e923fe2 461 int main(void)
Pawel Zarembski 0:01f31e923fe2 462 {
Pawel Zarembski 0:01f31e923fe2 463 // Explicitly set the vector table since the bootloader might not set
Pawel Zarembski 0:01f31e923fe2 464 // it to what we expect.
Pawel Zarembski 0:01f31e923fe2 465 #if DAPLINK_ROM_BL_SIZE > 0
Pawel Zarembski 0:01f31e923fe2 466 SCB->VTOR = SCB_VTOR_TBLOFF_Msk & DAPLINK_ROM_IF_START;
Pawel Zarembski 0:01f31e923fe2 467 #endif
Pawel Zarembski 0:01f31e923fe2 468 // initialize vendor sdk
Pawel Zarembski 0:01f31e923fe2 469 sdk_init();
Pawel Zarembski 0:01f31e923fe2 470
Pawel Zarembski 0:01f31e923fe2 471 osKernelInitialize(); // Initialize CMSIS-RTOS
Pawel Zarembski 0:01f31e923fe2 472 osThreadNew(main_task, NULL, NULL); // Create application main thread
Pawel Zarembski 0:01f31e923fe2 473 osKernelStart(); // Start thread execution
Pawel Zarembski 0:01f31e923fe2 474 for (;;) {}
Pawel Zarembski 0:01f31e923fe2 475 }