123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #include "nds32_intrinsic.h"
- #include "nds32.h"
- #ifndef VECTOR_BASE
- #define VECTOR_BASE 0x00000000
- #endif
- #define PSW_MSK \
- (PSW_mskGIE | PSW_mskINTL | PSW_mskPOM | PSW_mskIFCON | PSW_mskCPL)
- #define PSW_INIT \
- (0x0UL << PSW_offGIE \
- | 0x0UL << PSW_offINTL \
- | 0x1UL << PSW_offPOM \
- | 0x0UL << PSW_offIFCON \
- | 0x7UL << PSW_offCPL)
- #define IVB_MSK \
- (IVB_mskEVIC | IVB_mskESZ | IVB_mskIVBASE)
- #define IVB_INIT \
- ((VECTOR_BASE >> IVB_offIVBASE) << IVB_offIVBASE\
- | 0x1UL << IVB_offESZ \
- | 0x0UL << IVB_offEVIC)
- #pragma weak c_startup = c_startup_common
- void c_startup(void);
- /*
- * Default c_startup() function which used for those relocation from LMA to VMA.
- */
- static void c_startup_common(void)
- {
- #ifdef XIP_MODE
- /* Data section initialization */
- #define MEMCPY(des, src, n) __builtin_memcpy ((des), (src), (n))
- extern char __rw_lma_start, __rw_lma_end, __rw_vma_start;
- unsigned int size = &__rw_lma_end - &__rw_lma_start;
- /* Copy data section from LMA to VMA */
- MEMCPY(&__rw_vma_start, &__rw_lma_start, size);
- #else
- /* We do nothing for those LMA equal to VMA */
- #endif
- }
- static void cpu_init(void)
- {
- unsigned int reg;
- /* Set PSW GIE/INTL to 0, superuser & CPL to 7 */
- reg = (__nds32__mfsr(NDS32_SR_PSW) & ~PSW_MSK) | PSW_INIT;
- __nds32__mtsr(reg, NDS32_SR_PSW);
- __nds32__isb();
- /* Set vector size: 16 byte, base: VECTOR_BASE, mode: IVIC */
- reg = (__nds32__mfsr(NDS32_SR_IVB) & ~IVB_MSK) | IVB_INIT;
- __nds32__mtsr(reg, NDS32_SR_IVB);
- /*
- * Check interrupt priority programmable (IVB.PROG_PRI_LVL)
- * 0: Fixed priority, 1: Programmable priority
- */
- if (reg & IVB_mskPROG_PRI_LVL)
- {
- /* Set PPL2FIX_EN to 0 to enable Programmable Priority Level */
- __nds32__mtsr(0x0, NDS32_SR_INT_CTRL);
- }
- /* Mask and clear hardware interrupts */
- if (reg & IVB_mskIVIC_VER)
- {
- /* IVB.IVIC_VER >= 1*/
- __nds32__mtsr(0x0, NDS32_SR_INT_MASK2);
- __nds32__mtsr(-1, NDS32_SR_INT_PEND2);
- }
- else
- {
- __nds32__mtsr(__nds32__mfsr(NDS32_SR_INT_MASK) & ~0xFFFF, NDS32_SR_INT_MASK);
- }
- }
- /*
- * Vectors initialization. This means to copy exception handler code to
- * vector entry base address.
- */
- static void vector_init(void)
- {
- extern unsigned int OS_Int_Vectors, OS_Int_Vectors_End;
- if ((unsigned int)&OS_Int_Vectors != VECTOR_BASE)
- {
- volatile unsigned int *vector_srcptr = &OS_Int_Vectors;
- volatile unsigned int *vector_dstptr = (unsigned int *)VECTOR_BASE;
- /* copy vector table to VECTOR_BASE */
- while (vector_srcptr != &OS_Int_Vectors_End)
- *vector_dstptr++ = *vector_srcptr++;
- }
- }
- /*
- * NDS32 reset handler to reset all devices sequentially and call application
- * entry function.
- */
- void reset(void)
- {
- extern void hardware_init(void);
- extern void bsp_init(void);
- extern void rtthread_startup(void);
- /*
- * Initialize CPU to a post-reset state, ensuring the ground doesn't
- * shift under us while we try to set things up.
- */
- cpu_init();
- /*
- * Initialize LMA/VMA sections.
- * Relocation for any sections that need to be copied from LMA to VMA.
- */
- c_startup();
- /* Copy vector table to vector base address */
- vector_init();
- /* Call platform specific hardware initialization */
- hardware_init();
- /* Setup the OS system required initialization */
- bsp_init();
- /* Application enrty function */
- rtthread_startup();
- /* Never go back here! */
- while(1);
- }
|