-
-
Notifications
You must be signed in to change notification settings - Fork 805
/
Copy pathplatform.h
167 lines (148 loc) · 6.05 KB
/
platform.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
* This file is part of the Black Magic Debug project.
*
* Copyright (C) 2011 Black Sphere Technologies Ltd.
* Written by Gareth McMullin <gareth@blacksphere.co.nz>
* Copyright (C) 2018 Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* This file provides the platform specific declarations for the "swlink" (ST-Link clones) implementation. */
#ifndef PLATFORMS_SWLINK_PLATFORM_H
#define PLATFORMS_SWLINK_PLATFORM_H
#include "gpio.h"
#include "timing.h"
#include "timing_stm32.h"
#define PLATFORM_HAS_TRACESWO
#if ENABLE_DEBUG == 1
#define PLATFORM_HAS_DEBUG
extern bool debug_bmp;
#endif
#define PLATFORM_IDENT "(SWLINK) "
/* Hardware definitions... */
#define TMS_PORT GPIOA
#define TCK_PORT GPIOA
#define TDI_PORT GPIOA
#define TDO_PORT GPIOB
#define TRST_PORT GPIOB
#define TMS_PIN GPIO13
#define TCK_PIN GPIO14
#define TDI_PIN GPIO15
#define TDO_PIN GPIO3
#define TRST_PIN GPIO4
#define SWDIO_PORT TMS_PORT
#define SWCLK_PORT TCK_PORT
#define SWDIO_PIN TMS_PIN
#define SWCLK_PIN TCK_PIN
#define SWO_PORT GPIOB
#define SWO_PIN GPIO3
/* Use PC14 for a "dummy" UART LED so we can observere at least with scope */
#define LED_PORT_UART GPIOC
#define LED_UART GPIO14
#define SWD_CR GPIO_CRH(SWDIO_PORT)
#define SWD_CR_MULT (1U << ((13U - 8U) << 2U))
#define TMS_SET_MODE() gpio_set_mode(TMS_PORT, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, TMS_PIN);
#define SWDIO_MODE_FLOAT() \
do { \
uint32_t cr = SWD_CR; \
cr &= ~(0xfU * SWD_CR_MULT); \
cr |= (0x4U * SWD_CR_MULT); \
SWD_CR = cr; \
} while (0)
#define SWDIO_MODE_DRIVE() \
do { \
uint32_t cr = SWD_CR; \
cr &= ~(0xfU * SWD_CR_MULT); \
cr |= (0x1U * SWD_CR_MULT); \
SWD_CR = cr; \
} while (0)
#define UART_PIN_SETUP() \
do { \
AFIO_MAPR |= AFIO_MAPR_USART1_REMAP; \
gpio_set_mode(USBUSART_PORT, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, USBUSART_TX_PIN); \
gpio_set_mode(USBUSART_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, USBUSART_RX_PIN); \
gpio_set(USBUSART_PORT, USBUSART_RX_PIN); \
gpio_set_mode( \
USBUSART_PORT, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, USBUSART_RTS_PIN | USBUSART_DTR_PIN); \
} while (0)
#define USB_DRIVER st_usbfs_v1_usb_driver
#define USB_IRQ NVIC_USB_LP_CAN_RX0_IRQ
#define USB_ISR(x) usb_lp_can_rx0_isr(x)
/*
* Interrupt priorities. Low numbers are high priority.
* TIM2 is used for traceswo capture and must be highest priority.
*/
#define IRQ_PRI_USB (1U << 4U)
#define IRQ_PRI_USBUSART (2U << 4U)
#define IRQ_PRI_USBUSART_DMA (2U << 4U)
#define IRQ_PRI_USB_VBUS (14U << 4U)
#define IRQ_PRI_SWO_DMA (0U << 4U)
#define IRQ_PRI_SWO_TIM (0U << 4U)
#define USBUSART USART1
#define USBUSART_CR1 USART1_CR1
#define USBUSART_DR USART1_DR
#define USBUSART_IRQ NVIC_USART1_IRQ
#define USBUSART_CLK RCC_USART1
#define USBUSART_PORT GPIOB
#define USBUSART_TX_PIN GPIO6
#define USBUSART_RX_PIN GPIO7
#define USBUSART_RTS_PIN GPIO8
#define USBUSART_DTR_PIN GPIO9
#define USBUSART_ISR(x) usart1_isr(x)
#define USBUSART_DMA_BUS DMA1
#define USBUSART_DMA_CLK RCC_DMA1
#define USBUSART_DMA_TX_CHAN DMA_CHANNEL4
#define USBUSART_DMA_TX_IRQ NVIC_DMA1_CHANNEL4_IRQ
#define USBUSART_DMA_TX_ISR(x) dma1_channel4_isr(x)
#define USBUSART_DMA_RX_CHAN DMA_CHANNEL5
#define USBUSART_DMA_RX_IRQ NVIC_DMA1_CHANNEL5_IRQ
#define USBUSART_DMA_RX_ISR(x) dma1_channel5_isr(x)
/* Use TIM2 Input 2 (from PB3/TDO with Remap) */
#define SWO_TIM TIM2
#define SWO_TIM_CLK_EN() rcc_periph_clock_enable(RCC_TIM2)
#define SWO_TIM_IRQ NVIC_TIM2_IRQ
#define SWO_TIM_ISR(x) tim2_isr(x)
#define SWO_IC_IN TIM_IC_IN_TI2
#define SWO_IC_RISING TIM_IC1
#define SWO_CC_RISING TIM2_CCR1
#define SWO_ITR_RISING TIM_DIER_CC1IE
#define SWO_STATUS_RISING TIM_SR_CC1IF
#define SWO_IC_FALLING TIM_IC2
#define SWO_CC_FALLING TIM2_CCR2
#define SWO_STATUS_FALLING TIM_SR_CC2IF
#define SWO_STATUS_OVERFLOW (TIM_SR_CC1OF | TIM_SR_CC2OF)
#define SWO_TRIG_IN TIM_SMCR_TS_TI2FP2
/*
* On F103, only USART1 is on AHB2 and can reach 4.5MBaud at 72 MHz.
* Unfortunately, USART1 is already used, so the maximum speed
* we can hit is 2.25 MBaud.
*/
#define SWO_UART USART2
#define SWO_UART_DR USART2_DR
#define SWO_UART_CLK RCC_USART2
#define SWO_UART_PORT GPIOA
#define SWO_UART_RX_PIN GPIO3
/* This DMA channel is set by the USART in use */
#define SWO_DMA_BUS DMA1
#define SWO_DMA_CLK RCC_DMA1
#define SWO_DMA_CHAN DMA_CHANNEL6
#define SWO_DMA_IRQ NVIC_DMA1_CHANNEL6_IRQ
#define SWO_DMA_ISR(x) dma1_channel6_isr(x)
#define LED_PORT GPIOC
#define LED_IDLE_RUN GPIO15
#define SET_RUN_STATE(state)
#define SET_ERROR_STATE(state)
extern void set_idle_state(int state);
#define SET_IDLE_STATE(state) set_idle_state(state)
#endif /* PLATFORMS_SWLINK_PLATFORM_H */