mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-26 19:43:42 +02:00

Updated boot code for all Cortex-M3 controllers, and sc32442b to use weak linking for exception tables. Cortex-M3 devices now also share initialization routine to simplify maintenance STM32F10x classes now have specific units which fit the interrupt source names and counts git-svn-id: branches/laksen/arm-embedded@22581 -
478 lines
15 KiB
ObjectPascal
478 lines
15 KiB
ObjectPascal
{
|
|
Initialization stub copied from at91sam7x256.pp
|
|
}
|
|
unit sc32442b;
|
|
|
|
{$goto on}
|
|
|
|
interface
|
|
|
|
var
|
|
{ Memory Controller }
|
|
BWSCON: longword absolute $48000000;
|
|
BANKCON0: longword absolute $48000004;
|
|
BANKCON1: longword absolute $48000008;
|
|
BANKCON2: longword absolute $4800000C;
|
|
BANKCON3: longword absolute $48000010;
|
|
BANKCON4: longword absolute $48000014;
|
|
BANKCON5: longword absolute $48000018;
|
|
BANKCON6: longword absolute $4800001C;
|
|
BANKCON7: longword absolute $48000020;
|
|
REFRESH: longword absolute $48000024;
|
|
BANKSIZE: longword absolute $48000028;
|
|
MRSRB6: longword absolute $4800002C;
|
|
|
|
{ USB Host Controller }
|
|
HcRevision: longword absolute $49000000;
|
|
HcControl: longword absolute $49000004;
|
|
HcCommonStatus: longword absolute $49000008;
|
|
HcInterruptStatus: longword absolute $4900000C;
|
|
HcInterruptEnable: longword absolute $49000010;
|
|
HcInterruptDisable: longword absolute $49000014;
|
|
HcHCCA: longword absolute $49000018;
|
|
HcPeriodCuttentED: longword absolute $4900001C;
|
|
HcControlHeadED: longword absolute $49000020;
|
|
HcControlCurrentED: longword absolute $49000024;
|
|
HcBulkHeadED: longword absolute $49000028;
|
|
HcBulkCurrentED: longword absolute $4900002C;
|
|
HcDoneHead: longword absolute $49000030;
|
|
HcRmInterval: longword absolute $49000034;
|
|
HcFmRemaining: longword absolute $49000038;
|
|
HcFmNumber: longword absolute $4900003C;
|
|
HcPeriodicStart: longword absolute $49000040;
|
|
HcLSThreshold: longword absolute $49000044;
|
|
HcRhDescriptorA: longword absolute $49000048;
|
|
HcRhDescriptorB: longword absolute $4900004C;
|
|
HcRhStatus: longword absolute $49000050;
|
|
HcRhPortStatus1: longword absolute $49000054;
|
|
HcRhPortStatus2: longword absolute $49000058;
|
|
|
|
{ Interrupt controller }
|
|
SRCPND: longword absolute $4A000000;
|
|
INTMOD: longword absolute $4A000004;
|
|
INTMSK: longword absolute $4A000008;
|
|
PRIORITY: longword absolute $4A00000C;
|
|
INTPND: longword absolute $4A000010;
|
|
INTOFFSET: longword absolute $4A000014;
|
|
SUBSRCPND: longword absolute $4A000018;
|
|
INTSUBMSK: longword absolute $4A00001C;
|
|
|
|
type
|
|
TDMA = packed record
|
|
DISRC,
|
|
DISRCC,
|
|
DIDST,
|
|
DIDSTC,
|
|
DCON,
|
|
DSTAT,
|
|
DCSRC,
|
|
DCDST,
|
|
DMASKTRIG: longword;
|
|
end;
|
|
|
|
var
|
|
{ DMA }
|
|
DMA0: TDMA absolute $4B000000;
|
|
DMA1: TDMA absolute $4B000040;
|
|
DMA2: TDMA absolute $4B000080;
|
|
DMA3: TDMA absolute $4B0000C0;
|
|
|
|
{ Clock and power }
|
|
LOCKTIME: longword absolute $4C000000;
|
|
MPLLCON: longword absolute $4C000004;
|
|
UPLLCON: longword absolute $4C000008;
|
|
CLKCON: longword absolute $4C00000C;
|
|
CLKSLOW: longword absolute $4C000010;
|
|
CLKDIVN: longword absolute $4C000014;
|
|
CAMDIVN: longword absolute $4C000018;
|
|
|
|
{ LCD Controller }
|
|
LCDCON1: longword absolute $4D000000;
|
|
LCDCON2: longword absolute $4D000004;
|
|
LCDCON3: longword absolute $4D000008;
|
|
LCDCON4: longword absolute $4D00000C;
|
|
LCDCON5: longword absolute $4D000010;
|
|
LCDSADDR1: longword absolute $4D000014;
|
|
LCDSADDR2: longword absolute $4D000018;
|
|
LCDSADDR3: longword absolute $4D00001C;
|
|
REDLUT: longword absolute $4D000020;
|
|
GREENLUT: longword absolute $4D000024;
|
|
BLUELUT: longword absolute $4D000028;
|
|
DITHMODE: longword absolute $4D00004C;
|
|
TPAL: longword absolute $4D000050;
|
|
LCDINTPND: longword absolute $4D000054;
|
|
LCDSRCPND: longword absolute $4D000058;
|
|
LCDINTMSK: longword absolute $4D00005C;
|
|
TCONSEL: longword absolute $4D000060;
|
|
|
|
{ NAND Flash }
|
|
NFCONF: longword absolute $4E000000;
|
|
NFCONT: longword absolute $4E000004;
|
|
NFCMD: longword absolute $4E000008;
|
|
NFADDR: longword absolute $4E00000C;
|
|
NFDATA: longword absolute $4E000010;
|
|
NFECC0: longword absolute $4E000014;
|
|
NFECC1: longword absolute $4E000018;
|
|
NFSECC: longword absolute $4E00001C;
|
|
NFSTAT: longword absolute $4E000020;
|
|
NFESTAT0: longword absolute $4E000024;
|
|
NFESTAT1: longword absolute $4E000028;
|
|
NFMECC0: longword absolute $4E00002C;
|
|
NFMECC1: longword absolute $4E000030;
|
|
NFSECC2: longword absolute $4E000034;
|
|
NFSBLK: longword absolute $4E000038;
|
|
NFEBLK: longword absolute $4E00003C;
|
|
|
|
type
|
|
TUART = packed record
|
|
ULCON,
|
|
UCON,
|
|
UFCON,
|
|
UMCON,
|
|
UTRSTAT,
|
|
UERSTAT,
|
|
UFSTAT,
|
|
UMSTAT,
|
|
UTXH,
|
|
URXH,
|
|
UBRDIV: longword;
|
|
end;
|
|
var
|
|
{ UART }
|
|
UART0: TUART absolute $50000000;
|
|
UART1: TUART absolute $50004000;
|
|
UART2: TUART absolute $50008000;
|
|
|
|
type
|
|
TPWMTimer = packed record
|
|
TCNTB,
|
|
TCMPB,
|
|
TCNTO: longword;
|
|
end;
|
|
var
|
|
{ PWM Timer }
|
|
TCFG0: longword absolute $51000000;
|
|
TCFG1: longword absolute $51000004;
|
|
TCON: longword absolute $51000008;
|
|
PWMTimer: array[0..4] of TPWMTimer absolute $5100000C;
|
|
|
|
{ USB Device }
|
|
FUNC_ADDR_REG: byte absolute $52000140;
|
|
PWR_REG: byte absolute $52000144;
|
|
EP_INT_REG: byte absolute $52000148;
|
|
USB_INT_REG: byte absolute $52000158;
|
|
EP_INT_EN_REG: byte absolute $5200015C;
|
|
USB_INT_EN_REG: byte absolute $5200016C;
|
|
FRAME_NUM1_REG: byte absolute $52000170;
|
|
FRAME_NUM2_REG: byte absolute $52000174;
|
|
INDEX_REG: byte absolute $52000178;
|
|
EP0_CSR: byte absolute $52000184;
|
|
IN_CSR1_REG: byte absolute $52000184;
|
|
IN_CSR2_REG: byte absolute $52000188;
|
|
MAXP_REG: byte absolute $52000180;
|
|
OUT_CSR1_REG: byte absolute $52000190;
|
|
OUT_CSR2_REG: byte absolute $52000194;
|
|
OUT_FIFO_CNT1_REG: byte absolute $52000198;
|
|
OUT_FIFO_CNT2_REG: byte absolute $5200019C;
|
|
EP0_FIFO: byte absolute $520001C0;
|
|
EP1_FIFO: byte absolute $520001C4;
|
|
EP2_FIFO: byte absolute $520001C8;
|
|
EP3_FIFO: byte absolute $520001CC;
|
|
EP4_FIFO: byte absolute $520001D0;
|
|
EP1_DMA_CON: byte absolute $52000200;
|
|
EP1_DMA_UNIT: byte absolute $52000204;
|
|
EP1_DMA_FIFO: byte absolute $52000208;
|
|
EP1_DMA_TTC_L: byte absolute $5200020C;
|
|
EP1_DMA_TTC_M: byte absolute $52000210;
|
|
EP1_DMA_TTC_H: byte absolute $52000214;
|
|
EP2_DMA_CON: byte absolute $52000218;
|
|
EP2_DMA_UNIT: byte absolute $5200021C;
|
|
EP2_DMA_FIFO: byte absolute $52000220;
|
|
EP2_DMA_TTC_L: byte absolute $52000224;
|
|
EP2_DMA_TTC_M: byte absolute $52000228;
|
|
EP2_DMA_TTC_H: byte absolute $5200022C;
|
|
EP3_DMA_CON: byte absolute $52000240;
|
|
EP3_DMA_UNIT: byte absolute $52000244;
|
|
EP3_DMA_FIFO: byte absolute $52000248;
|
|
EP3_DMA_TTC_L: byte absolute $5200024C;
|
|
EP3_DMA_TTC_M: byte absolute $52000250;
|
|
EP3_DMA_TTC_H: byte absolute $52000254;
|
|
EP4_DMA_CON: byte absolute $52000258;
|
|
EP4_DMA_UNIT: byte absolute $5200025C;
|
|
EP4_DMA_FIFO: byte absolute $52000260;
|
|
EP4_DMA_TTC_L: byte absolute $52000264;
|
|
EP4_DMA_TTC_M: byte absolute $52000268;
|
|
EP4_DMA_TTC_H: byte absolute $5200026C;
|
|
|
|
{ Watchdog timer }
|
|
WTCON: longword absolute $53000000;
|
|
WTDAT: longword absolute $53000004;
|
|
WTCNT: longword absolute $53000008;
|
|
|
|
{ I2C }
|
|
IICCON: longword absolute $54000000;
|
|
IICSTAT: longword absolute $54000004;
|
|
IICADD: longword absolute $54000008;
|
|
IICDS: longword absolute $5400000C;
|
|
IICLC: longword absolute $54000010;
|
|
|
|
{ I2S }
|
|
IISCON: longword absolute $55000000;
|
|
IISMOD: longword absolute $55000004;
|
|
IISPSR: longword absolute $55000008;
|
|
IISFCON: longword absolute $5500000C;
|
|
IISFIFO: longword absolute $55000010;
|
|
|
|
type
|
|
TGPIO = packed record
|
|
CON,
|
|
DAT,
|
|
DN: longword;
|
|
end;
|
|
var
|
|
{ GPIO }
|
|
GPA: TGPIO absolute $56000000;
|
|
GPB: TGPIO absolute $56000010;
|
|
GPC: TGPIO absolute $56000020;
|
|
GPD: TGPIO absolute $56000030;
|
|
GPE: TGPIO absolute $56000040;
|
|
GPF: TGPIO absolute $56000050;
|
|
GPG: TGPIO absolute $56000060;
|
|
GPH: TGPIO absolute $56000070;
|
|
GPJ: TGPIO absolute $560000D0;
|
|
MISCCR: longword absolute $56000080;
|
|
DCLKCON: longword absolute $56000084;
|
|
EXTINT0: longword absolute $56000088;
|
|
EXTINT1: longword absolute $5600008C;
|
|
EXTINT2: longword absolute $56000090;
|
|
EINTFLT0: longword absolute $56000094;
|
|
EINTFLT1: longword absolute $56000098;
|
|
EINTFLT2: longword absolute $5600009C;
|
|
EINTFLT3: longword absolute $560000A0;
|
|
EINTMASK: longword absolute $560000A4;
|
|
EINTPEND: longword absolute $560000A8;
|
|
GSTATUS0: longword absolute $560000AC;
|
|
GSTATUS1: longword absolute $560000B0;
|
|
GSTATUS2: longword absolute $560000B4;
|
|
GSTATUS3: longword absolute $560000B8;
|
|
GSTATUS4: longword absolute $560000BC;
|
|
MSLCON: longword absolute $560000CC;
|
|
|
|
{ RTC }
|
|
RTCCON: byte absolute $57000040;
|
|
TICNT: byte absolute $57000044;
|
|
RTCALM: byte absolute $57000050;
|
|
ALMSEC: byte absolute $57000054;
|
|
ALMMIN: byte absolute $57000058;
|
|
ALMHOUR: byte absolute $5700005C;
|
|
ALMDATE: byte absolute $57000060;
|
|
ALMMON: byte absolute $57000064;
|
|
ALMYEAR: byte absolute $57000068;
|
|
BCDSEC: byte absolute $57000070;
|
|
BCDMIN: byte absolute $57000074;
|
|
BCDHOUR: byte absolute $57000078;
|
|
BCDDATE: byte absolute $5700007C;
|
|
BCDDAY: byte absolute $57000080;
|
|
BCDMON: byte absolute $57000084;
|
|
BCDYEAR: byte absolute $57000088;
|
|
RTCLBAT: byte absolute $5700006C;
|
|
|
|
{ AD converter }
|
|
ADCCON: longword absolute $58000000;
|
|
ADCTSC: longword absolute $58000004;
|
|
ADCDLY: longword absolute $58000008;
|
|
ADCDAT0: longword absolute $5800000C;
|
|
ADCDAT1: longword absolute $58000010;
|
|
ADCUPDN: longword absolute $58000014;
|
|
|
|
type
|
|
TSPI = packed record
|
|
SPCON,
|
|
SPSTA,
|
|
SPPIN,
|
|
SPPRE,
|
|
SPTDAT,
|
|
SPRDAT: longword;
|
|
end;
|
|
var
|
|
{ SPI }
|
|
SPI0: TSPI absolute $59000000;
|
|
SPI1: TSPI absolute $59000020;
|
|
|
|
{ SD Interface }
|
|
SDICON: longword absolute $5A000000;
|
|
SDIPRE: longword absolute $5A000004;
|
|
SDICARG: longword absolute $5A000008;
|
|
SDICCON: longword absolute $5A00000C;
|
|
SDICSTA: longword absolute $5A000010;
|
|
SDIRSP0: longword absolute $5A000014;
|
|
SDIRSP1: longword absolute $5A000018;
|
|
SDIRSP2: longword absolute $5A00001C;
|
|
SDIRSP3: longword absolute $5A000020;
|
|
SDIDTIMER: longword absolute $5A000024;
|
|
SDIBSIZE: longword absolute $5A000028;
|
|
SDIDCON: longword absolute $5A00002C;
|
|
SDIDCNT: longword absolute $5A000030;
|
|
SDIDSTA: longword absolute $5A000034;
|
|
SDIFSTA: longword absolute $5A000038;
|
|
SDIIMSK: longword absolute $5A00003C;
|
|
SDIDAT: byte absolute $5A000040;
|
|
|
|
implementation
|
|
|
|
procedure UndefinedInstrHandler; external name 'UndefinedInstrHandler';
|
|
procedure SWIHandler; external name 'SWIHandler';
|
|
procedure PrefetchAbortHandler; external name 'PrefetchAbortHandler';
|
|
procedure DataAbortHandler; external name 'DataAbortHandler';
|
|
procedure IRQHandler; external name 'IRQHandler';
|
|
procedure FIQHandler; external name 'FIQHandler';
|
|
|
|
procedure DefaultExceptionHandler; assembler; nostackframe;
|
|
asm
|
|
.Lloop:
|
|
b .Lloop
|
|
end;
|
|
|
|
procedure PASCALMAIN; external name 'PASCALMAIN';
|
|
|
|
procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
|
|
asm
|
|
.Lhalt:
|
|
b .Lhalt
|
|
end;
|
|
|
|
var
|
|
_data: record end; external name '_data';
|
|
_edata: record end; external name '_edata';
|
|
_etext: record end; external name '_etext';
|
|
_bss_start: record end; external name '_bss_start';
|
|
_bss_end: record end; external name '_bss_end';
|
|
_stack_top: record end; external name '_stack_top';
|
|
|
|
procedure _FPC_start; assembler; nostackframe;
|
|
label
|
|
_start;
|
|
asm
|
|
.init
|
|
.align 16
|
|
.globl _start
|
|
b _start
|
|
ldr pc, .LUndefined_Addr // Undefined Instruction vector
|
|
ldr pc, .LSWI_Addr // Software Interrupt vector
|
|
ldr pc, .LPrefetch_Addr // Prefetch abort vector
|
|
ldr pc, .LAbort_Addr // Data abort vector
|
|
nop // reserved
|
|
ldr pc, .LIRQ_Addr // Interrupt Request (IRQ) vector
|
|
ldr pc, .LFIQ_Addr // Fast interrupt request (FIQ) vector
|
|
|
|
.LUndefined_Addr:
|
|
.long UndefinedInstrHandler
|
|
.LSWI_Addr:
|
|
.long SWIHandler
|
|
.LPrefetch_Addr:
|
|
.long PrefetchAbortHandler
|
|
.LAbort_Addr:
|
|
.long DataAbortHandler
|
|
.LIRQ_Addr:
|
|
.long IRQHandler
|
|
.LFIQ_Addr:
|
|
.long FIQHandler
|
|
|
|
.weak UndefinedInstrHandler
|
|
.weak SWIHandler
|
|
.weak PrefetchAbortHandler
|
|
.weak DataAbortHandler
|
|
.weak IRQHandler
|
|
.weak FIQHandler
|
|
|
|
.set UndefinedInstrHandler, DefaultExceptionHandler
|
|
.set SWIHandler, DefaultExceptionHandler
|
|
.set PrefetchAbortHandler, DefaultExceptionHandler
|
|
.set DataAbortHandler, DefaultExceptionHandler
|
|
.set IRQHandler, DefaultExceptionHandler
|
|
.set FIQHandler, DefaultExceptionHandler
|
|
|
|
_start:
|
|
(*
|
|
Set absolute stack top
|
|
|
|
stack is already set by bootloader
|
|
but if this point is entered by any
|
|
other means than reset, the stack pointer
|
|
needs to be set explicity
|
|
*)
|
|
ldr r0,.L_stack_top
|
|
|
|
(*
|
|
Setting up SP for the different CPU modes.
|
|
Change mode before setting each one
|
|
move back again to Supervisor mode
|
|
Each interrupt has its own link
|
|
register, stack pointer and program
|
|
counter The stack pointers must be
|
|
initialized for interrupts to be
|
|
used later.
|
|
*)
|
|
msr cpsr_c, #0xdb // switch to Undefined Instruction Mode
|
|
mov sp, r0
|
|
sub r0, r0, #0x10
|
|
|
|
msr cpsr_c, #0xd7 // switch to Abort Mode
|
|
mov sp, r0
|
|
sub r0, r0, #0x10
|
|
|
|
msr CPSR_c, #0xd1 // switch to FIQ Mode
|
|
mov sp, r0
|
|
sub r0, r0, #0x80
|
|
|
|
msr CPSR_c, #0xd2 // switch to IRQ Mode
|
|
mov sp, r0
|
|
sub r0, r0, #0x80
|
|
|
|
msr CPSR_c, #0xd3 // switch to Supervisor Mode
|
|
mov sp, r0
|
|
sub r0, r0, #0x80
|
|
|
|
msr CPSR_c, #0x1f // switch to System Mode, interrupts enabled
|
|
mov sp, r0
|
|
|
|
// copy initialized data from flash to ram
|
|
ldr r1,.L_etext
|
|
ldr r2,.L_data
|
|
ldr r3,.L_edata
|
|
.Lcopyloop:
|
|
cmp r2,r3
|
|
ldrls r0,[r1],#4
|
|
strls r0,[r2],#4
|
|
bls .Lcopyloop
|
|
|
|
// clear onboard ram
|
|
ldr r1,.L_bss_start
|
|
ldr r2,.L_bss_end
|
|
mov r0,#0
|
|
.Lzeroloop:
|
|
cmp r1,r2
|
|
strls r0,[r1],#4
|
|
bls .Lzeroloop
|
|
|
|
bl PASCALMAIN
|
|
bl _FPC_haltproc
|
|
.L_bss_start:
|
|
.long _bss_start
|
|
.L_bss_end:
|
|
.long _bss_end
|
|
.L_etext:
|
|
.long _etext
|
|
.L_data:
|
|
.long _data
|
|
.L_edata:
|
|
.long _edata
|
|
.L_stack_top:
|
|
.long _stack_top
|
|
.text
|
|
end;
|
|
|
|
end.
|
|
|
|
end.
|