浏览代码

+ support for lpc1768 by David Welch

git-svn-id: trunk@18927 -
florian 14 年之前
父节点
当前提交
0781ac1f82
共有 6 个文件被更改,包括 206 次插入12 次删除
  1. 1 0
      .gitattributes
  2. 11 0
      compiler/arm/cpuinfo.pas
  3. 25 8
      compiler/systems/t_embed.pas
  4. 5 2
      rtl/embedded/Makefile
  5. 4 2
      rtl/embedded/Makefile.fpc
  6. 160 0
      rtl/embedded/arm/lpc1768.pp

+ 1 - 0
.gitattributes

@@ -7012,6 +7012,7 @@ rtl/embedded/Makefile.fpc svneol=native#text/plain
 rtl/embedded/arm/at91sam7x256.pp svneol=native#text/plain
 rtl/embedded/arm/lm3fury.pp svneol=native#text/pascal
 rtl/embedded/arm/lm3tempest.pp svneol=native#text/pascal
+rtl/embedded/arm/lpc1768.pp svneol=native#text/pascal
 rtl/embedded/arm/lpc21x4.pp svneol=native#text/plain
 rtl/embedded/arm/stm32f103.pp svneol=native#text/plain
 rtl/embedded/avr/atmega128.pp svneol=native#text/plain

+ 11 - 0
compiler/arm/cpuinfo.pas

@@ -65,6 +65,7 @@ Type
       ct_lpc2114,
       ct_lpc2124,
       ct_lpc2194,
+      ct_lpc1768,
 
       { ATMEL }
       ct_at91sam7s256,
@@ -242,6 +243,16 @@ Const
         sramsize:$00004000
     	),
 
+        (
+    	controllertypestr:'LPC1768';
+        controllerunitstr:'LPC1768';
+        interruptvectors:12;
+    	flashbase:$00000000;
+        flashsize:$00040000;
+        srambase:$10000000;
+        sramsize:$00008000
+    	),
+
         (
     	controllertypestr:'AT91SAM7S256';
         controllerunitstr:'AT91SAM7x256';

+ 25 - 8
compiler/systems/t_embed.pas

@@ -224,6 +224,7 @@ begin
       ct_lpc2114,
       ct_lpc2124,
       ct_lpc2194,
+      ct_lpc1768,
       ct_at91sam7s256,
       ct_at91sam7se256,
       ct_at91sam7x256,
@@ -312,17 +313,19 @@ begin
               Add('ENTRY(_START)');
               Add('MEMORY');
               Add('{');
-
-              LinkStr := '    flash : ORIGIN = 0x' + IntToHex(flashbase,8)
-                + ', LENGTH = ' + IntToStr(flashsize div 1024)+'K';
-              Add(LinkStr);
+              if flashsize<>0 then
+                begin
+                  LinkStr := '    flash : ORIGIN = 0x' + IntToHex(flashbase,8)
+                    + ', LENGTH = 0x' + IntToHex(flashsize,8);
+                  Add(LinkStr);
+                end;
 
               LinkStr := '    ram : ORIGIN = 0x' + IntToHex(srambase,8)
-              	+ ', LENGTH = ' + IntToStr(sramsize div 1024)+'K';
+              	+ ', LENGTH = 0x' + IntToHex(sramsize,8);
               Add(LinkStr);
 
               Add('}');
-              Add('_stack_top = 0x' + IntToHex(sramsize+srambase-4,8) + ';');
+              Add('_stack_top = 0x' + IntToHex(sramsize+srambase,8) + ';');
             end;
         end
     else
@@ -342,14 +345,28 @@ begin
       Add('    *(.rodata, .rodata.*)');
       Add('    *(.comment)');
       Add('    _etext = .;');
-      Add('    } >flash');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('    } >flash');
+        end
+      else
+        begin
+          Add('    } >ram');
+        end;
       Add('    .data :');
       Add('    {');
       Add('    _data = .;');
       Add('    *(.data, .data.*)');
       Add('    KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
       Add('    _edata = .;');
-      Add('    } >ram AT >flash');
+      if embedded_controllers[current_settings.controllertype].flashsize<>0 then
+        begin
+          Add('    } >ram AT >flash');
+        end
+      else
+        begin
+          Add('    } >ram');
+        end;
       Add('    .bss :');
       Add('    {');
       Add('    _bss_start = .;');

+ 5 - 2
rtl/embedded/Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/08/27]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/08/28]
 #
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded mipsel-linux
@@ -315,11 +315,14 @@ CPU_UNITS=
 SYSINIT_UNITS=
 ifeq ($(ARCH),arm)
 ifeq ($(SUBARCH),armv7m)
-CPU_UNITS=lm3fury lm3tempest stm32f103 # thumb2_bare 
+CPU_UNITS=lm3fury lm3tempest stm32f103 lpc1768 # thumb2_bare 
 endif
 ifeq ($(SUBARCH),armv4t)
 CPU_UNITS=lpc21x4 at91sam7x256
 endif
+ifeq ($(SUBARCH),armv4)
+CPU_UNITS=lpc21x4 at91sam7x256
+endif
 endif
 ifeq ($(ARCH),avr)
 CPU_UNITS=atmega128

+ 4 - 2
rtl/embedded/Makefile.fpc

@@ -49,12 +49,14 @@ SYSINIT_UNITS=
 
 ifeq ($(ARCH),arm)
 ifeq ($(SUBARCH),armv7m)
-CPU_UNITS=lm3fury lm3tempest stm32f103 # thumb2_bare 
+CPU_UNITS=lm3fury lm3tempest stm32f103 lpc1768 # thumb2_bare 
 endif
-
 ifeq ($(SUBARCH),armv4t)
 CPU_UNITS=lpc21x4 at91sam7x256
 endif
+ifeq ($(SUBARCH),armv4)
+CPU_UNITS=lpc21x4 at91sam7x256
+endif
 endif
 
 ifeq ($(ARCH),avr)

+ 160 - 0
rtl/embedded/arm/lpc1768.pp

@@ -0,0 +1,160 @@
+
+unit lpc1768;
+
+{$goto on}
+{$define lpc1768}
+
+interface
+
+var
+    STCTRL   : DWord absolute $E000E010;
+    STRELOAD : DWord absolute $E000E014;
+    STCURR   : DWord absolute $E000E018;
+
+    FIO1DIR2 : Byte  absolute $2009C022;
+    FIO1SET2 : Byte  absolute $2009C03A;
+    FIO1CLR2 : Byte  absolute $2009C03E;
+
+    SCS      : DWord absolute $400FC1A0;
+    CLKSRCSEL: DWord absolute $400FC10C;
+    PLL0FEED : DWord absolute $400FC08C;
+    PLL0CON  : DWord absolute $400FC080;
+    PLL0CFG  : DWord absolute $400FC084;
+    PLL0STAT : DWord absolute $400FC088;
+    CCLKCFG  : DWord absolute $400FC104;
+
+implementation
+
+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 PASCALMAIN; external name 'PASCALMAIN';
+
+procedure _FPC_haltproc; assembler; nostackframe; public name '_haltproc';
+asm
+.Lhalt:
+    b .Lhalt
+end;
+
+procedure _FPC_start; assembler; nostackframe;
+label _start;
+asm
+    .init
+    .balign 16
+
+    .long _stack_top            // stack top address
+    .long _start+1              // 1 Reset
+    .long .LDefaultHandler+1    // 2 NMI
+    .long .LDefaultHandler+1    // 3 HardFault
+    .long .LDefaultHandler+1    // 4 MemManage
+    .long .LDefaultHandler+1    // 5 BusFault
+    .long .LDefaultHandler+1    // 6 UsageFault
+    .long .LDefaultHandler+1    // 7 RESERVED
+    .long .LDefaultHandler+1    // 8 RESERVED
+    .long .LDefaultHandler+1    // 9 RESERVED
+    .long .LDefaultHandler+1    // 10 RESERVED
+    .long .LDefaultHandler+1    // 11 SVCall
+    .long .LDefaultHandler+1    // 12 Debug Monitor
+    .long .LDefaultHandler+1    // 13 RESERVED
+    .long .LDefaultHandler+1    // 14 PendSV
+    .long .LDefaultHandler+1    // 15 SysTick
+    .long .LDefaultHandler+1    // 16 External Interrupt(0)
+    .long .LDefaultHandler+1    // 17 External Interrupt(1)
+    .long .LDefaultHandler+1    // 18 External Interrupt(2)
+    .long .LDefaultHandler+1    // 19 ...
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+    .long .LDefaultHandler+1
+
+    .globl _start
+    .text
+_start:
+
+    // Copy initialized data to ram
+    ldr r1,.L_etext
+    ldr r2,.L_data
+    ldr r3,.L_edata
+.Lcopyloop:
+    cmp r2,r3
+    ittt ls
+    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
+    itt ls
+    strls r0,[r1],#4
+    bls .Lzeroloop
+
+    b PASCALMAIN
+    b _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
+.LDefaultHandlerAddr:
+    .long .LDefaultHandler
+    // default irq handler just returns
+.LDefaultHandler:
+    mov pc,r14
+end;
+
+end.
+
+