195 lines
5.2 KiB
C++
195 lines
5.2 KiB
C++
/**
|
|
* @file at32_common.cpp
|
|
* @brief Low level common Artery AT32 code
|
|
*
|
|
* @date Oct 29, 2023
|
|
* @author Andrey Gusakov, (c) 2023
|
|
*/
|
|
|
|
#include "pch.h"
|
|
|
|
int at32GetMcuType(uint32_t id, const char **pn, const char **package, uint32_t *flashSize)
|
|
{
|
|
const struct {
|
|
uint32_t uid;
|
|
const char *pn;
|
|
uint32_t flashSize;
|
|
const char *package;
|
|
} at32f43x_types[] = {
|
|
{ 0x70084540, "AT32F435ZMT7", 4032, "LQFP144" },
|
|
{ 0x70083341, "AT32F435ZGT7", 1024, "LQFP144" },
|
|
{ 0x70084598, "AT32F435ZDT7", 448, "LQFP144" },
|
|
{ 0x70083242, "AT32F435ZCT7", 256, "LQFP144" },
|
|
{ 0x70084543, "AT32F435VMT7", 4032, "LQFP100" },
|
|
{ 0x70083344, "AT32F435VGT7", 1024, "LQFP100" },
|
|
{ 0x70084599, "AT32F435VDT7", 448, "LQFP100" },
|
|
{ 0x70083245, "AT32F435VCT7", 256, "LQFP100" },
|
|
{ 0x70084546, "AT32F435RMT7", 4032, "LQFP64" },
|
|
{ 0x70083347, "AT32F435RGT7", 1024, "LQFP64" },
|
|
{ 0x7008459A, "AT32F435RDT7", 448, "LQFP64" },
|
|
{ 0x70083248, "AT32F435RCT7", 256, "LQFP64" },
|
|
{ 0x70084549, "AT32F435CMT7", 4032, "LQFP48" },
|
|
{ 0x7008334A, "AT32F435CGT7", 1024, "LQFP48" },
|
|
{ 0x7008459B, "AT32F435CDT7", 448, "LQFP48" },
|
|
{ 0x7008324B, "AT32F435CCT7", 256, "LQFP48" },
|
|
{ 0x7008454C, "AT32F435CMU7", 4032, "QFN48" },
|
|
{ 0x7008334D, "AT32F435CGU7", 1024, "QFN48" },
|
|
{ 0x7008459C, "AT32F435CDU7", 448, "QFN48" },
|
|
{ 0x7008324E, "AT32F435CCU7", 256, "QFN48" },
|
|
{ 0x7008454F, "AT32F437ZMT7", 4032, "LQFP144" },
|
|
{ 0x70083350, "AT32F437ZGT7", 1024, "LQFP144" },
|
|
{ 0x7008459D, "AT32F437ZDT7", 448, "LQFP144" },
|
|
{ 0x70083251, "AT32F437ZCT7", 256, "LQFP144" },
|
|
{ 0x70084552, "AT32F437VMT7", 4032, "LQFP100" },
|
|
{ 0x70083353, "AT32F437VGT7", 1024, "LQFP100" },
|
|
{ 0x7008459E, "AT32F437VDT7", 448, "LQFP100" },
|
|
{ 0x70083254, "AT32F437VCT7", 256, "LQFP100" },
|
|
{ 0x70084555, "AT32F437RMT7", 4032, "LQFP64" },
|
|
{ 0x70083356, "AT32F437RGT7", 1024, "LQFP64" },
|
|
{ 0x7008459F, "AT32F437RDT7", 448, "LQFP64" },
|
|
{ 0x70083257, "AT32F437RCT7", 256, "LQFP64" },
|
|
};
|
|
|
|
for (size_t i = 0; i < efi::size(at32f43x_types); i++) {
|
|
if (id == at32f43x_types[i].uid) {
|
|
if (pn)
|
|
*pn = at32f43x_types[i].pn;
|
|
if (package)
|
|
*package = at32f43x_types[i].package;
|
|
if (flashSize)
|
|
*flashSize = at32f43x_types[i].flashSize;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* unknown */
|
|
return -1;
|
|
}
|
|
|
|
int at32GetRamSizeKb(void)
|
|
{
|
|
uint8_t EOPB0 = *(__IO uint16_t *) (0x1FFFC010);
|
|
/* TODO: check inverted value */
|
|
|
|
switch ((*(__IO uint16_t *) (FLASHSIZE_BASE))) {
|
|
case 256:
|
|
EOPB0 &= 0x03;
|
|
if (EOPB0 == 3)
|
|
EOPB0 = 2;
|
|
return 512 - (64 * EOPB0);
|
|
case 448:
|
|
EOPB0 &= 0x07;
|
|
if (EOPB0 > 5)
|
|
EOPB0 = 5;
|
|
return 512 - (64 * EOPB0);
|
|
case 1024:
|
|
case 4032:
|
|
EOPB0 &= 0x07;
|
|
if (EOPB0 > 6)
|
|
EOPB0 = 6;
|
|
return 512 - (64 * EOPB0);
|
|
default:
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#if EFI_PROD_CODE
|
|
|
|
static void reset_and_jump(void) {
|
|
// and now reboot
|
|
NVIC_SystemReset();
|
|
}
|
|
|
|
void jump_to_bootloader() {
|
|
// leave DFU breadcrumb which assembly startup code would check, see [rusefi][DFU] section in assembly code
|
|
|
|
*((unsigned long *)0x2001FFF0) = 0xDEADBEEF; // End of RAM
|
|
|
|
reset_and_jump();
|
|
}
|
|
|
|
void jump_to_openblt() {
|
|
#if EFI_USE_OPENBLT
|
|
/* safe to call on already inited shares area */
|
|
SharedParamsInit();
|
|
/* Store sing to stay in OpenBLT */
|
|
SharedParamsWriteByIndex(0, 0x01);
|
|
|
|
reset_and_jump();
|
|
#endif
|
|
}
|
|
|
|
BOR_Level_t BOR_Get(void) {
|
|
/* TODO: Artery */
|
|
/* Fake */
|
|
return BOR_Level_None;
|
|
}
|
|
|
|
BOR_Result_t BOR_Set(BOR_Level_t BORValue) {
|
|
/* NOP */
|
|
return BOR_Result_Ok;
|
|
}
|
|
|
|
void startWatchdog(int) {
|
|
}
|
|
|
|
void tryResetWatchdog() {
|
|
}
|
|
|
|
void setWatchdogResetPeriod(int) {
|
|
}
|
|
|
|
void baseMCUInit(void) {
|
|
// looks like this holds a random value on start? Let's set a nice clean zero
|
|
DWT->CYCCNT = 0;
|
|
|
|
BOR_Set(BOR_Level_1); // one step above default value
|
|
}
|
|
|
|
/* used to detect additional RAM available for LUA
|
|
* TODO: find RAM on AT32
|
|
* TODO: better name */
|
|
bool isStm32F42x(void) {
|
|
return false;
|
|
}
|
|
|
|
extern uint32_t __main_stack_base__;
|
|
|
|
typedef struct port_intctx intctx_t;
|
|
|
|
EXTERNC int getRemainingStack(thread_t *otp) {
|
|
#if CH_DBG_ENABLE_STACK_CHECK
|
|
// this would dismiss coverity warning - see http://rusefi.com/forum/viewtopic.php?f=5&t=655
|
|
// coverity[uninit_use]
|
|
register intctx_t *r13 asm ("r13");
|
|
otp->activeStack = r13;
|
|
|
|
int remainingStack;
|
|
if (ch.dbg.isr_cnt > 0) {
|
|
// ISR context
|
|
remainingStack = (int)(r13 - 1) - (int)&__main_stack_base__;
|
|
} else {
|
|
remainingStack = (int)(r13 - 1) - (int)otp->wabase;
|
|
}
|
|
otp->remainingStack = remainingStack;
|
|
return remainingStack;
|
|
#else
|
|
UNUSED(otp);
|
|
return 99999;
|
|
#endif /* CH_DBG_ENABLE_STACK_CHECK */
|
|
}
|
|
|
|
__attribute__((weak)) void boardPrepareForStandby() {
|
|
}
|
|
|
|
Reset_Cause_t getMCUResetCause() {
|
|
return Reset_Cause_Unknown;
|
|
}
|
|
|
|
const char *getMCUResetCause(Reset_Cause_t) {
|
|
return "Unknown";
|
|
}
|
|
|
|
#endif /* EFI_PROD_CODE */
|