diff --git a/sys/pic32/_startup.S b/sys/pic32/_startup.S index dddbdee..df81a95 100644 --- a/sys/pic32/_startup.S +++ b/sys/pic32/_startup.S @@ -1,8 +1,9 @@ # # Startup code for Microchip PIC32 microcontrollers. -# Using HID bootloader. +# Based on the MIPS application note: +# "Boot-CPS: Example Boot Code for MIPSĀ® Cores". # -# Copyright (C) 2010 Serge Vakulenko, +# Copyright (C) 2010-2014 Serge Vakulenko, # # Permission to use, copy, modify, and distribute this software # and its documentation for any purpose and without fee is hereby @@ -24,86 +25,350 @@ # #include "machine/io.h" -#define UBASE 0x7f008000 /* User space base address */ +#define UBASE 0x7f008000 /* User space base address */ - .set noreorder - .set mips32r2 - .set nomips16 +/* + * MIPS Coprocessor 0 register numbers + */ +#define C0_INDEX $0 +#define C0_ENTRYLO0 $2 +#define C0_ENTRYLO1 $3 +#define C0_PAGEMASK $5 +#define C0_WIRED $6 +#define C0_COUNT $9 +#define C0_ENTRYHI $10 +#define C0_COMPARE $11 +#define C0_STATUS $12 +#define C0_SRSCTL $12,2 +#define C0_CAUSE $13 +#define C0_EPC $14 +#define C0_CONFIG $16 +#define C0_CONFIG1 $16,1 +#define C0_CONFIG7 $16,7 +#define C0_WATCHLO $18 +#define C0_WATCHHI $19 +#define C0_DEBUG $23 +#define C0_DEPC $24 +#define C0_ITAGLO $28 +#define C0_DTAGLO $28,2 +#define C0_ERRPC $30 - .extern u - .extern u_end - .extern u0 - .extern main - .extern exception +/* + * MIPS Config1 register + */ +#define CFG1_MMUSSHIFT 25 // mmu size - 1 +#define CFG1_ISSHIFT 22 // icache lines 64<p_addr = &u0 + lw $v1, 0($v0) # u.u_procp + sw $a0, 60($v1) # u.u_procp->p_addr = &u0 - # exchange contents of u and u0 - move $v1, $v0 + # exchange contents of u and u0 + move $v1, $v0 1: - lw $t1, 0($v1) - lw $t0, 0($a0) - sw $t0, 0($v1) - sw $t1, 0($a0) - lw $t1, 4($v1) - lw $t0, 4($a0) - sw $t0, 4($v1) - sw $t1, 4($a0) - lw $t1, 8($v1) - lw $t0, 8($a0) - sw $t0, 8($v1) - sw $t1, 8($a0) - lw $t1, 12($v1) - lw $t0, 12($a0) - sw $t0, 12($v1) - sw $t1, 12($a0) - addiu $v1, $v1, 16 - bne $a3, $v1, 1b - addiu $a0, $a0, 16 + lw $t1, 0($v1) + lw $t0, 0($a0) + sw $t0, 0($v1) + sw $t1, 0($a0) + lw $t1, 4($v1) + lw $t0, 4($a0) + sw $t0, 4($v1) + sw $t1, 4($a0) + lw $t1, 8($v1) + lw $t0, 8($a0) + sw $t0, 8($v1) + sw $t1, 8($a0) + lw $t1, 12($v1) + lw $t0, 12($a0) + sw $t0, 12($v1) + sw $t1, 12($a0) + addiu $v1, $v1, 16 + bne $a3, $v1, 1b + addiu $a0, $a0, 16 - lw $v1, 0($v0) # u.u_procp - sw $v0, 60($v1) # u.u_procp->p_addr = &u + lw $v1, 0($v0) # u.u_procp + sw $v0, 60($v1) # u.u_procp->p_addr = &u 2: - lw $s0, (0 * 4) ($a1) # restore register variables s0-s8 - lw $s1, (1 * 4) ($a1) - lw $s2, (2 * 4) ($a1) - lw $s3, (3 * 4) ($a1) - lw $s4, (4 * 4) ($a1) - lw $s5, (5 * 4) ($a1) - lw $s6, (6 * 4) ($a1) - lw $s7, (7 * 4) ($a1) - lw $s8, (8 * 4) ($a1) # frame pointer - lw $ra, (9 * 4) ($a1) # return address - lw $gp, (10 * 4) ($a1) # global data pointer - lw $sp, (11 * 4) ($a1) # stack pointer + lw $s0, (0 * 4) ($a1) # restore register variables s0-s8 + lw $s1, (1 * 4) ($a1) + lw $s2, (2 * 4) ($a1) + lw $s3, (3 * 4) ($a1) + lw $s4, (4 * 4) ($a1) + lw $s5, (5 * 4) ($a1) + lw $s6, (6 * 4) ($a1) + lw $s7, (7 * 4) ($a1) + lw $s8, (8 * 4) ($a1) # frame pointer + lw $ra, (9 * 4) ($a1) # return address + lw $gp, (10 * 4) ($a1) # global data pointer + lw $sp, (11 * 4) ($a1) # stack pointer - ei # release interrupts - j $ra # transfer back to setjmp() - li $v0, 1 # return value of 1 + ei # release interrupts + j $ra # transfer back to setjmp() + li $v0, 1 # return value of 1 diff --git a/sys/pic32/pic32mx.h b/sys/pic32/pic32mx.h index cc79e7a..4e69fc8 100644 --- a/sys/pic32/pic32mx.h +++ b/sys/pic32/pic32mx.h @@ -27,6 +27,7 @@ /*-------------------------------------- * Coprocessor 0 registers. */ +#ifndef __ASSEMBLER__ #define C0_HWRENA 7 /* Enable RDHWR in non-privileged mode */ #define C0_BADVADDR 8 /* Virtual address of last exception */ #define C0_COUNT 9 /* Processor cycle count */ @@ -47,6 +48,7 @@ #define C0_DEPC 24 /* Program counter at last debug exception */ #define C0_ERROREPC 30 /* Program counter at last error */ #define C0_DESAVE 31 /* Debug handler scratchpad register */ +#endif /* * Status register.