rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
at32_common.cpp
Go to the documentation of this file.
1/**
2 * @file at32_common.cpp
3 * @brief Low level common Artery AT32 code
4 *
5 * @date Oct 29, 2023
6 * @author Andrey Gusakov, (c) 2023
7 */
8
9#include "pch.h"
10#include "os_util.h"
11
12int at32GetMcuType(uint32_t id, const char **pn, const char **package, uint32_t *flashSize)
13{
14 const struct {
15 uint32_t uid;
16 const char *pn;
17 uint32_t flashSize;
18 const char *package;
19 } at32f43x_types[] = {
20 { 0x70084540, "AT32F435ZMT7", 4032, "LQFP144" },
21 { 0x70083341, "AT32F435ZGT7", 1024, "LQFP144" },
22 { 0x70084598, "AT32F435ZDT7", 448, "LQFP144" },
23 { 0x70083242, "AT32F435ZCT7", 256, "LQFP144" },
24 { 0x70084543, "AT32F435VMT7", 4032, "LQFP100" },
25 { 0x70083344, "AT32F435VGT7", 1024, "LQFP100" },
26 { 0x70084599, "AT32F435VDT7", 448, "LQFP100" },
27 { 0x70083245, "AT32F435VCT7", 256, "LQFP100" },
28 { 0x70084546, "AT32F435RMT7", 4032, "LQFP64" },
29 { 0x70083347, "AT32F435RGT7", 1024, "LQFP64" },
30 { 0x7008459A, "AT32F435RDT7", 448, "LQFP64" },
31 { 0x70083248, "AT32F435RCT7", 256, "LQFP64" },
32 { 0x70084549, "AT32F435CMT7", 4032, "LQFP48" },
33 { 0x7008334A, "AT32F435CGT7", 1024, "LQFP48" },
34 { 0x7008459B, "AT32F435CDT7", 448, "LQFP48" },
35 { 0x7008324B, "AT32F435CCT7", 256, "LQFP48" },
36 { 0x7008454C, "AT32F435CMU7", 4032, "QFN48" },
37 { 0x7008334D, "AT32F435CGU7", 1024, "QFN48" },
38 { 0x7008459C, "AT32F435CDU7", 448, "QFN48" },
39 { 0x7008324E, "AT32F435CCU7", 256, "QFN48" },
40 { 0x7008454F, "AT32F437ZMT7", 4032, "LQFP144" },
41 { 0x70083350, "AT32F437ZGT7", 1024, "LQFP144" },
42 { 0x7008459D, "AT32F437ZDT7", 448, "LQFP144" },
43 { 0x70083251, "AT32F437ZCT7", 256, "LQFP144" },
44 { 0x70084552, "AT32F437VMT7", 4032, "LQFP100" },
45 { 0x70083353, "AT32F437VGT7", 1024, "LQFP100" },
46 { 0x7008459E, "AT32F437VDT7", 448, "LQFP100" },
47 { 0x70083254, "AT32F437VCT7", 256, "LQFP100" },
48 { 0x70084555, "AT32F437RMT7", 4032, "LQFP64" },
49 { 0x70083356, "AT32F437RGT7", 1024, "LQFP64" },
50 { 0x7008459F, "AT32F437RDT7", 448, "LQFP64" },
51 { 0x70083257, "AT32F437RCT7", 256, "LQFP64" },
52 };
53
54 for (size_t i = 0; i < efi::size(at32f43x_types); i++) {
55 if (id == at32f43x_types[i].uid) {
56 if (pn)
57 *pn = at32f43x_types[i].pn;
58 if (package)
59 *package = at32f43x_types[i].package;
60 if (flashSize)
61 *flashSize = at32f43x_types[i].flashSize;
62 return 0;
63 }
64 }
65
66 /* unknown */
67 return -1;
68}
69
71{
72 uint8_t EOPB0 = *(__IO uint16_t *) (0x1FFFC010);
73 /* TODO: check inverted value */
74
75 switch ((*(__IO uint16_t *) (FLASHSIZE_BASE))) {
76 case 256:
77 EOPB0 &= 0x03;
78 if (EOPB0 == 3)
79 EOPB0 = 2;
80 return 512 - (64 * EOPB0);
81 case 448:
82 EOPB0 &= 0x07;
83 if (EOPB0 > 5)
84 EOPB0 = 5;
85 return 512 - (64 * EOPB0);
86 case 1024:
87 case 4032:
88 EOPB0 &= 0x07;
89 if (EOPB0 > 6)
90 EOPB0 = 6;
91 return 512 - (64 * EOPB0);
92 default:
93 return 0;
94 }
95 return 0;
96}
97
98#if EFI_PROD_CODE
99
100static void reset_and_jump(void) {
101 // and now reboot
102 NVIC_SystemReset();
103}
104
105#if EFI_DFU_JUMP
107 // leave DFU breadcrumb which assembly startup code would check, see [rusefi][DFU] section in assembly code
108
109 *((unsigned long *)0x2001FFF0) = 0xDEADBEEF; // End of RAM
110
112}
113#endif
114
116#if EFI_USE_OPENBLT
117 /* safe to call on already inited shares area */
119 /* Store sing to stay in OpenBLT */
121
123#endif
124}
125
127 /* TODO: Artery */
128 /* Fake */
129 return BOR_Level_None;
130}
131
133 /* NOP */
134 return BOR_Result_Ok;
135}
136
137void startWatchdog(int) {
138}
139
141}
142
144}
145
147 // looks like this holds a random value on start? Let's set a nice clean zero
148 DWT->CYCCNT = 0;
149
150 BOR_Set(BOR_Level_1); // one step above default value
151}
152
153/* used to detect additional RAM available for LUA
154 * TODO: find RAM on AT32
155 * TODO: better name */
156bool isStm32F42x(void) {
157 return false;
158}
159
160extern uint32_t __main_stack_base__;
161
162typedef struct port_intctx intctx_t;
163
164int getRemainingStack(thread_t *otp) {
165#if CH_DBG_ENABLE_STACK_CHECK
166 // this would dismiss coverity warning - see http://rusefi.com/forum/viewtopic.php?f=5&t=655
167 // coverity[uninit_use]
168 register intctx_t *r13 asm ("r13");
169 otp->activeStack = r13;
170
171 int remainingStack;
172 if (ch0.dbg.isr_cnt > 0) {
173 // ISR context
174 remainingStack = (int)(r13 - 1) - (int)&__main_stack_base__;
175 } else {
176 remainingStack = (int)(r13 - 1) - (int)otp->wabase;
177 }
178 otp->remainingStack = remainingStack;
179 return remainingStack;
180#else
181 UNUSED(otp);
182 return 99999;
183#endif /* CH_DBG_ENABLE_STACK_CHECK */
184}
185
188
192
194 return "Unknown";
195}
196
197#endif /* EFI_PROD_CODE */
void startWatchdog(int)
Reset_Cause_t getMCUResetCause()
void tryResetWatchdog()
BOR_Level_t BOR_Get(void)
void setWatchdogResetPeriod(int)
BOR_Result_t BOR_Set(BOR_Level_t BORValue)
void jump_to_openblt()
int getRemainingStack(thread_t *otp)
uint32_t __main_stack_base__
void baseMCUInit()
int at32GetMcuType(uint32_t id, const char **pn, const char **package, uint32_t *flashSize)
struct port_intctx intctx_t
void jump_to_bootloader()
bool isStm32F42x(void)
int at32GetRamSizeKb(void)
static void reset_and_jump(void)
typedef __attribute__
Ignition Mode.
BOR_Level_t
@ BOR_Level_None
@ BOR_Level_1
UNUSED(samplingTimeSeconds)
BOR_Result_t
Definition mpu_util.h:95
@ BOR_Result_Ok
Definition mpu_util.h:96
Reset_Cause_t
Definition mpu_util.h:104
@ Reset_Cause_Unknown
Definition mpu_util.h:105
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value)
Writes a data byte to the shared parameter buffer at the specified index.
void SharedParamsInit(void)
Initializes the shared RAM parameters module.
void boardPrepareForStandby()
static uint16_t flashSize()
Definition mpu_util.cpp:21