IndustrialDeviceController/Software/MT3620_IDC_RTApp/lib/VectorTable.c (272 lines of code) (raw):
#include "VectorTable.h"
#include "NVIC.h"
#include "mt3620/dma.h"
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
extern uintptr_t StackTop; // &StackTop == end of TCM0
_Noreturn void RTCoreMain(void);
// Exception Handlers
static _Noreturn void DefaultExceptionHandler(void) { while (true); }
static _Noreturn void NMIExceptionHandler(void) { while (true); }
static _Noreturn void HardFaultExceptionHandler(void) { while (true); }
static _Noreturn void MPUFaultExceptionHandler(void) { while (true); }
static _Noreturn void BusFaultExceptionHandler(void) { while (true); }
static _Noreturn void UsageFaultExceptionHandler(void) { while (true); }
static _Noreturn void SVCallExceptionHandler(void) { while (true); }
static _Noreturn void DebugMonitorExceptionHandler(void) { while (true); }
static _Noreturn void PendSVExceptionHandler(void) { while (true); }
static _Noreturn void SysTickExceptionHandler(void) { while (true); }
void __attribute__((weak, alias("NMIExceptionHandler"))) NMI(void);
void __attribute__((weak, alias("HardFaultExceptionHandler"))) HardFault(void);
void __attribute__((weak, alias("MPUFaultExceptionHandler"))) MPUFault(void);
void __attribute__((weak, alias("BusFaultExceptionHandler"))) BusFault(void);
void __attribute__((weak, alias("UsageFaultExceptionHandler"))) UsageFault(void);
void __attribute__((weak, alias("SVCallExceptionHandler"))) SVCall(void);
void __attribute__((weak, alias("DebugMonitorExceptionHandler"))) DebugMonitor(void);
void __attribute__((weak, alias("PendSVExceptionHandler"))) PendSV(void);
void __attribute__((weak, alias("SysTickExceptionHandler"))) SysTick(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) wic_int_wake_up(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpt_int_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpt3_int_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) wdt_m4_io_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) uart_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) infra_bus_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4a2a7n_rd_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4a2a7n_nf_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_a7n2m4a_wr_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_a7n2m4a_ne_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_a7n_fifo_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_a7n2m4a_sw_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4a2m4b_rd_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4a2m4b_nf_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4b2m4a_wr_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4b2m4a_ne_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4b_fifo_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) cm4_mbox_m4b2m4a_sw_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) mbox_a7n_wake_m4a_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) mbox_m4b_wake_m4a_int(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g0_irq0(void); // EINT0
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g0_irq1(void); // EINT1
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g0_irq2(void); // EINT2
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g0_irq3(void); // EINT3
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g1_irq0(void); // EINT4
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g1_irq1(void); // EINT5
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g1_irq2(void); // EINT6
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g1_irq3(void); // EINT7
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g2_irq0(void); // EINT8
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g2_irq1(void); // EINT9
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g2_irq2(void); // EINT10
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g2_irq3(void); // EINT11
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g3_irq0(void); // EINT12
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g3_irq1(void); // EINT13
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g3_irq2(void); // EINT14
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g3_irq3(void); // EINT15
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g4_irq0(void); // EINT16
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g4_irq1(void); // EINT17
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g4_irq2(void); // EINT18
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g4_irq3(void); // EINT19
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g5_irq0(void); // EINT20
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g5_irq1(void); // EINT21
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g5_irq2(void); // EINT22
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g5_irq3(void); // EINT23
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g0_i2c_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g0_spim_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g0_uart_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g1_i2c_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g1_spim_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g1_uart_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g2_i2c_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g2_spim_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g2_uart_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g3_i2c_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g3_spim_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g3_uart_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g4_i2c_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g4_spim_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g4_uart_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g5_i2c_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g5_spim_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) isu_g5_uart_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) i2s0_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) i2s1_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) adc_irq_b(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g3_cnt_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g4_cnt_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) gpio_g5_cnt_irq(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) iom4_CDBGPWRUPREQ(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) iom4_CDBGPWRUPACK(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) m4dma_irq_b_adc(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) m4dma_irq_b_i2s0_tx(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) m4dma_irq_b_i2s0_rx(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) m4dma_irq_b_i2s1_tx(void);
void __attribute__((weak, alias("DefaultExceptionHandler"))) m4dma_irq_b_i2s1_rx(void);
// DMA can interrupt many drivers, so we handle that here.
static void m4dma_irq_b(void)
{
static void (*m4dma_irq_b_isr[MT3620_DMA_COUNT])(void) = {
[25] = m4dma_irq_b_i2s0_tx,
[26] = m4dma_irq_b_i2s0_rx,
[27] = m4dma_irq_b_i2s1_tx,
[28] = m4dma_irq_b_i2s1_rx,
[29] = m4dma_irq_b_adc,
};
unsigned i;
for (i = 0; i < MT3620_DMA_COUNT; i++) {
uint32_t glbsta = (i < 16
? mt3620_dma_global->glbsta0
: mt3620_dma_global->glbsta1);
if (((glbsta >> (((i % 16) * 2) + 1)) & 1) != 0) {
void (*isr)(void) = m4dma_irq_b_isr[i];
if (isr) isr();
}
}
}
#define EXC(x) ((x) + 0)
#define INT(x) ((x) + 16)
// ARM DDI0403E.d SB1.5.2-3
// From SB1.5.3, "The Vector table must be naturally aligned to a power of two whose alignment
// value is greater than or equal to (Number of Exceptions supported x 4), with a minimum alignment
// of 128 bytes.". The array is aligned in linker.ld, using the dedicated section ".vector_table".
// The exception vector table contains a stack pointer, 15 exception handlers, and an entry for
// each interrupt.
const void (*ExceptionVectorTable[])(void)
__attribute__((section(".vector_table"))) __attribute__((used)) = {
[EXC( 0)] = (void*)&StackTop, // Main Stack Pointer (MSP)
[EXC( 1)] = RTCoreMain, // Reset
[EXC( 2)] = NMI,
[EXC( 3)] = HardFault,
[EXC( 4)] = MPUFault,
[EXC( 5)] = BusFault,
[EXC( 6)] = UsageFault,
[EXC( 7)] = NULL,
[EXC( 8)] = NULL,
[EXC( 9)] = NULL,
[EXC(10)] = NULL,
[EXC(11)] = SVCall,
[EXC(12)] = DebugMonitor,
[EXC(13)] = NULL,
[EXC(14)] = PendSV,
[EXC(15)] = SysTick,
[INT( 0)] = wic_int_wake_up,
[INT( 1)] = gpt_int_b,
[INT( 2)] = gpt3_int_b,
[INT( 3)] = wdt_m4_io_irq_b,
[INT( 4)] = uart_irq_b,
[INT( 5)] = infra_bus_int,
[INT( 6)] = cm4_mbox_m4a2a7n_rd_int,
[INT( 7)] = cm4_mbox_m4a2a7n_nf_int,
[INT( 8)] = cm4_mbox_a7n2m4a_wr_int,
[INT( 9)] = cm4_mbox_a7n2m4a_ne_int,
[INT(10)] = cm4_mbox_a7n_fifo_int,
[INT(11)] = cm4_mbox_a7n2m4a_sw_int,
[INT(12)] = cm4_mbox_m4a2m4b_rd_int,
[INT(13)] = cm4_mbox_m4a2m4b_nf_int,
[INT(14)] = cm4_mbox_m4b2m4a_wr_int,
[INT(15)] = cm4_mbox_m4b2m4a_ne_int,
[INT(16)] = cm4_mbox_m4b_fifo_int,
[INT(17)] = cm4_mbox_m4b2m4a_sw_int,
[INT(18)] = mbox_a7n_wake_m4a_int,
[INT(19)] = mbox_m4b_wake_m4a_int,
[INT(20)] = gpio_g0_irq0, // EINT0
[INT(21)] = gpio_g0_irq1, // EINT1
[INT(22)] = gpio_g0_irq2, // EINT2
[INT(23)] = gpio_g0_irq3, // EINT3
[INT(24)] = gpio_g1_irq0, // EINT4
[INT(25)] = gpio_g1_irq1, // EINT5
[INT(26)] = gpio_g1_irq2, // EINT6
[INT(27)] = gpio_g1_irq3, // EINT7
[INT(28)] = gpio_g2_irq0, // EINT8
[INT(29)] = gpio_g2_irq1, // EINT9
[INT(30)] = gpio_g2_irq2, // EINT10
[INT(31)] = gpio_g2_irq3, // EINT11
[INT(32)] = gpio_g3_irq0, // EINT12
[INT(33)] = gpio_g3_irq1, // EINT13
[INT(34)] = gpio_g3_irq2, // EINT14
[INT(35)] = gpio_g3_irq3, // EINT15
[INT(36)] = gpio_g4_irq0, // EINT16
[INT(37)] = gpio_g4_irq1, // EINT17
[INT(38)] = gpio_g4_irq2, // EINT18
[INT(39)] = gpio_g4_irq3, // EINT19
[INT(40)] = gpio_g5_irq0, // EINT20
[INT(41)] = gpio_g5_irq1, // EINT21
[INT(42)] = gpio_g5_irq2, // EINT22
[INT(43)] = gpio_g5_irq3, // EINT23
[INT(44)] = isu_g0_i2c_irq,
[INT(45)] = isu_g0_spim_irq,
[INT(46)] = NULL,
[INT(47)] = isu_g0_uart_irq_b,
[INT(48)] = isu_g1_i2c_irq,
[INT(49)] = isu_g1_spim_irq,
[INT(50)] = NULL,
[INT(51)] = isu_g1_uart_irq_b,
[INT(52)] = isu_g2_i2c_irq,
[INT(53)] = isu_g2_spim_irq,
[INT(54)] = NULL,
[INT(55)] = isu_g2_uart_irq_b,
[INT(56)] = isu_g3_i2c_irq,
[INT(57)] = isu_g3_spim_irq,
[INT(58)] = NULL,
[INT(59)] = isu_g3_uart_irq_b,
[INT(60)] = isu_g4_i2c_irq,
[INT(61)] = isu_g4_spim_irq,
[INT(62)] = NULL,
[INT(63)] = isu_g4_uart_irq_b,
[INT(64)] = isu_g5_i2c_irq,
[INT(65)] = isu_g5_spim_irq,
[INT(66)] = NULL,
[INT(67)] = isu_g5_uart_irq_b,
[INT(68)] = i2s0_irq_b,
[INT(69)] = i2s1_irq_b,
[INT(70)] = adc_irq_b,
[INT(71)] = NULL,
[INT(72)] = NULL,
[INT(73)] = NULL,
[INT(74)] = gpio_g3_cnt_irq,
[INT(75)] = gpio_g4_cnt_irq,
[INT(76)] = gpio_g5_cnt_irq,
[INT(77)] = m4dma_irq_b,
[INT(78)] = iom4_CDBGPWRUPREQ,
[INT(79)] = iom4_CDBGPWRUPACK,
[INT(80)] = NULL,
[INT(81)] = NULL,
[INT(82)] = NULL,
[INT(83)] = NULL,
[INT(84)] = NULL,
[INT(85)] = NULL,
[INT(86)] = NULL,
[INT(87)] = NULL,
[INT(88)] = NULL,
[INT(89)] = NULL,
[INT(90)] = NULL,
[INT(91)] = NULL,
[INT(92)] = NULL,
[INT(93)] = NULL,
[INT(94)] = NULL,
[INT(95)] = NULL,
[INT(96)] = NULL,
[INT(97)] = NULL,
[INT(98)] = NULL,
[INT(99)] = NULL,
};
static volatile uint32_t * const VTOR = (volatile uint32_t *)0xE000ED08;
void VectorTableInit(void)
{
// SCB->VTOR = ExceptionVectorTable
*VTOR = (uint32_t)ExceptionVectorTable;
// We have to enable DMA here as it's used in multiple drivers.
NVIC_EnableIRQ(MT3620_DMA_INTERRUPT, 2);
}
#include "CPUFreq.h"
#include "mt3620/clock.h"
#define CPUFREQ_TOLERANCE_PERCENT 5
bool CPUFreq_Set(unsigned freq)
{
unsigned freq_high = (freq * (100ULL + CPUFREQ_TOLERANCE_PERCENT)) / 100;
unsigned freq_low = (freq * (100ULL - CPUFREQ_TOLERANCE_PERCENT)) / 100;
unsigned i;
for (i = 0; i < MT3620_CLOCK_COUNT; i++) {
if ((mt3620_clock_freq[i] >= freq_low)
&& (mt3620_clock_freq[i] <= freq_high)) {
mt3620_hclk_clock_source_set(i);
return true;
}
}
return false;
}
unsigned CPUFreq_Get(void)
{
mt3620_clock_t src = mt3620_hclk_clock_source_get();
if (src >= MT3620_CLOCK_COUNT) return 0;
return mt3620_clock_freq[src];
}