Browse Source

o add arm lpc2148 helloword
o opencd config for mac

david 15 years ago
parent
commit
45548384d4

+ 60 - 0
poc/lpc2148_blinky/Makefile

@@ -0,0 +1,60 @@
+#preferences for cross development
+
+TOOLCHAIN=arm-elf-
+CC=$(TOOLCHAIN)gcc
+AS=$(TOOLCHAIN)as
+LD=$(TOOLCHAIN)ld
+OBJCOPY=$(TOOLCHAIN)objcopy
+
+#flags
+
+CFLAGS = -mcpu=arm7tdmi -g -nostartfiles -nostdlib 
+ASFLAGS = 
+#ASFLAGS = --D_ASSEMBLY_
+
+BASENAME = main
+
+ELFFILE = $(BASENAME).elf
+BINARY = $(BASENAME).bin
+SREC = $(BASENAME).srec
+HEX = $(BASENAME).hex
+
+#LSCRIPT = lpc2103.ld
+LSCRIPT = lpc2148-ram.ld 
+
+
+#target
+TARGETS = $(ELFFILE) $(BINARY) $(SREC) $(HEX)
+
+OBJS = crt.o main.o startup.o console.o 
+
+all:$(TARGETS)
+
+
+$(ELFFILE): $(OBJS) Makefile
+	$(LD) -o $(ELFFILE) $(OBJS) -T $(LSCRIPT) \
+	-Map $(BASENAME).map
+
+
+$(BINARY): $(ELFFILE)
+	$(OBJCOPY) -O binary -S $(ELFFILE) $(BINARY)
+
+
+$(SREC): $(ELFFILE)
+	$(OBJCOPY) -O srec -S $(ELFFILE) $(SREC)
+
+$(HEX): $(ELFFILE)
+	$(OBJCOPY) -O ihex -S $(ELFFILE) $(HEX)
+
+
+upload:
+	lpc21isp  $(HEX) /dev/ttyUSB0 115200 12000 
+
+clean:
+	rm -f *.o $(TARGETS)
+
+#arm-elf-gcc -c main.c -o main.o   
+#sh-2.05b$ ls
+#lpc2103.h  main.c  main.elf  main.o
+#sh-2.05b$ arm-elf-ld -o main.elf main.o -Map main.map
+

+ 60 - 0
poc/lpc2148_blinky/Makefile.ram

@@ -0,0 +1,60 @@
+#preferences for cross development
+
+TOOLCHAIN=arm-elf-
+CC=$(TOOLCHAIN)gcc
+AS=$(TOOLCHAIN)as
+LD=$(TOOLCHAIN)ld
+OBJCOPY=$(TOOLCHAIN)objcopy
+
+#flags
+
+CFLAGS = -mcpu=arm7tdmi -g -nostartfiles -nostdlib 
+ASFLAGS = 
+#ASFLAGS = --D_ASSEMBLY_
+
+BASENAME = main
+
+ELFFILE = $(BASENAME).elf
+BINARY = $(BASENAME).bin
+SREC = $(BASENAME).srec
+HEX = $(BASENAME).hex
+
+#LSCRIPT = lpc2103.ld
+LSCRIPT = lpc2148-ram.ld 
+
+
+#target
+TARGETS = $(ELFFILE) $(BINARY) $(SREC) $(HEX)
+
+OBJS = crt.o main.o startup.o console.o 
+
+all:$(TARGETS)
+
+
+$(ELFFILE): $(OBJS) Makefile
+	$(LD) -o $(ELFFILE) $(OBJS) -T $(LSCRIPT) \
+	-Map $(BASENAME).map
+
+
+$(BINARY): $(ELFFILE)
+	$(OBJCOPY) -O binary -S $(ELFFILE) $(BINARY)
+
+
+$(SREC): $(ELFFILE)
+	$(OBJCOPY) -O srec -S $(ELFFILE) $(SREC)
+
+$(HEX): $(ELFFILE)
+	$(OBJCOPY) -O ihex -S $(ELFFILE) $(HEX)
+
+
+upload:
+	lpc21isp  $(HEX) /dev/ttyUSB0 115200 12000 
+
+clean:
+	rm -f *.o $(TARGETS)
+
+#arm-elf-gcc -c main.c -o main.o   
+#sh-2.05b$ ls
+#lpc2103.h  main.c  main.elf  main.o
+#sh-2.05b$ arm-elf-ld -o main.elf main.o -Map main.map
+

+ 39 - 0
poc/lpc2148_blinky/blink2148.tmproj

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>documents</key>
+	<array>
+		<dict>
+			<key>expanded</key>
+			<true/>
+			<key>name</key>
+			<string>blink2148</string>
+			<key>regexFolderFilter</key>
+			<string>!.*/(\.[^/]*|CVS|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
+			<key>sourceDirectory</key>
+			<string></string>
+		</dict>
+	</array>
+	<key>fileHierarchyDrawerWidth</key>
+	<integer>200</integer>
+	<key>metaData</key>
+	<dict/>
+	<key>showFileHierarchyDrawer</key>
+	<false/>
+	<key>showFileHierarchyPanel</key>
+	<true/>
+	<key>treeState</key>
+	<dict>
+		<key>blink2148</key>
+		<dict>
+			<key>isExpanded</key>
+			<true/>
+			<key>subItems</key>
+			<dict/>
+		</dict>
+	</dict>
+	<key>windowFrame</key>
+	<string>{{25, 61}, {1169, 813}}</string>
+</dict>
+</plist>

+ 55 - 0
poc/lpc2148_blinky/console.c

@@ -0,0 +1,55 @@
+/*
+	Simple console input/output, over serial port #0
+
+	Partially copied from Jim Lynch's tutorial
+*/
+
+#include "console.h"
+
+#define PINSEL0		*(volatile unsigned int *)0xE002C000
+
+#define U0THR		*(volatile unsigned int *)0xE000C000
+#define U0RBR		*(volatile unsigned int *)0xE000C000
+#define U0DLL		*(volatile unsigned int *)0xE000C000
+#define U0DLM		*(volatile unsigned int *)0xE000C004
+#define U0FCR		*(volatile unsigned int *)0xE000C008
+#define U0LCR		*(volatile unsigned int *)0xE000C00C
+#define U0LSR		*(volatile unsigned int *)0xE000C014
+
+/* Initialize Serial Interface       */
+void ConsoleInit(int iDivider)
+{
+    PINSEL0 = (PINSEL0 & ~0x0000000F) | 0x00000005;     /* Enable RxD0 and TxD0              */
+    U0LCR = 0x83;               /* 8 bits, no Parity, 1 Stop bit     */
+    U0DLL = iDivider & 0xFF;    /* set divider / baud rate */
+    U0DLM = iDivider >> 8;
+    U0LCR = 0x03;               /* DLAB = 0                          */
+
+    // enable FIFO
+    U0FCR = 1;
+}
+
+/* Write character to Serial Port    */
+int putchar(int ch)
+{
+    if (ch == '\n') {
+        while (!(U0LSR & 0x20));
+        U0THR = '\r';
+    }
+    while (!(U0LSR & 0x20));
+    U0THR = ch;
+    return ch;
+}
+int getchar(void)
+{                               /* Read character from Serial Port   */
+    while (!(U0LSR & 0x01));
+    return (U0RBR);
+}
+int puts(char *s)
+{
+    while (*s) {
+        putchar(*s++);
+    }
+    //putchar('\n');
+    return 1;
+}

+ 3 - 0
poc/lpc2148_blinky/console.h

@@ -0,0 +1,3 @@
+void ConsoleInit(int iDivider);
+int putchar(int c);
+int puts(char *s);

+ 110 - 0
poc/lpc2148_blinky/crt.s

@@ -0,0 +1,110 @@
+/* ***************************************************************************************************************
+
+	crt.s						STARTUP  ASSEMBLY  CODE 
+								-----------------------
+
+
+	Module includes the interrupt vectors and start-up code.
+
+  *************************************************************************************************************** */
+
+/* Stack Sizes */
+.set  UND_STACK_SIZE, 0x00000040		/* stack for "undefined instruction" interrupts is 4 bytes  */
+.set  ABT_STACK_SIZE, 0x00000040		/* stack for "abort" interrupts is 4 bytes                  */
+.set  FIQ_STACK_SIZE, 0x00000040		/* stack for "FIQ" interrupts  is 4 bytes         			*/
+.set  IRQ_STACK_SIZE, 0X00000040		/* stack for "IRQ" normal interrupts is 4 bytes    			*/
+.set  SVC_STACK_SIZE, 0x00000400		/* stack for "SVC" supervisor mode is 4 bytes  				*/
+
+
+
+/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs (program status registers) */
+.set  MODE_USR, 0x10            		/* Normal User Mode 										*/
+.set  MODE_FIQ, 0x11            		/* FIQ Processing Fast Interrupts Mode 						*/
+.set  MODE_IRQ, 0x12            		/* IRQ Processing Standard Interrupts Mode 					*/
+.set  MODE_SVC, 0x13            		/* Supervisor Processing Software Interrupts Mode 			*/
+.set  MODE_ABT, 0x17            		/* Abort Processing memory Faults Mode 						*/
+.set  MODE_UND, 0x1B            		/* Undefined Processing Undefined Instructions Mode 		*/
+.set  MODE_SYS, 0x1F            		/* System Running Priviledged Operating System Tasks  Mode	*/
+
+.set  I_BIT, 0x80               		/* when I bit is set, IRQ is disabled (program status registers) */
+.set  F_BIT, 0x40               		/* when F bit is set, FIQ is disabled (program status registers) */
+
+
+.text
+.arm
+
+.global	Reset_Handler
+.global _startup
+.func   _startup
+
+_startup:
+
+# Exception Vectors
+
+_vectors:       ldr     PC, Reset_Addr         
+                ldr     PC, Undef_Addr
+                ldr     PC, SWI_Addr
+                ldr     PC, PAbt_Addr
+                ldr     PC, DAbt_Addr
+                nop							/* Reserved Vector (holds Philips ISP checksum) */
+                ldr     PC, [PC,#-0xFF0]	/* see page 71 of "Insiders Guide to the Philips ARM7-Based Microcontrollers" by Trevor Martin  */
+                ldr     PC, FIQ_Addr
+
+Reset_Addr:     .word   Reset_Handler		/* defined in this module below  */
+Undef_Addr:     .word   UNDEF_Routine		/* defined in main.c  */
+SWI_Addr:       .word   SWI_Routine			/* defined in main.c  */
+PAbt_Addr:      .word   UNDEF_Routine		/* defined in main.c  */
+DAbt_Addr:      .word   UNDEF_Routine		/* defined in main.c  */
+IRQ_Addr:       .word   IRQ_Routine			/* defined in main.c  */
+FIQ_Addr:       .word   FIQ_Routine			/* defined in main.c  */
+                .word   0					/* rounds the vectors and ISR addresses to 64 bytes total  */
+
+
+# Reset Handler
+
+Reset_Handler:  
+
+				/* Setup a stack for each mode - note that this only sets up a usable stack
+				for User mode.   Also each mode is setup with interrupts initially disabled. */
+    			  
+    			ldr   r0, =_stack_end
+    			msr   CPSR_c, #MODE_UND|I_BIT|F_BIT 	/* Undefined Instruction Mode  */
+    			mov   sp, r0
+    			sub   r0, r0, #UND_STACK_SIZE
+    			msr   CPSR_c, #MODE_ABT|I_BIT|F_BIT 	/* Abort Mode */
+    			mov   sp, r0
+    			sub   r0, r0, #ABT_STACK_SIZE
+    			msr   CPSR_c, #MODE_FIQ|I_BIT|F_BIT 	/* FIQ Mode */
+    			mov   sp, r0	
+   				sub   r0, r0, #FIQ_STACK_SIZE
+    			msr   CPSR_c, #MODE_IRQ|I_BIT|F_BIT 	/* IRQ Mode */
+    			mov   sp, r0
+    			sub   r0, r0, #IRQ_STACK_SIZE
+    			msr   CPSR_c, #MODE_SVC|I_BIT|F_BIT 	/* Supervisor Mode */
+    			mov   sp, r0
+    			sub   r0, r0, #SVC_STACK_SIZE
+    			msr   CPSR_c, #MODE_SYS|I_BIT|F_BIT 	/* User Mode */
+    			mov   sp, r0
+
+				/* copy .data section (Copy from ROM to RAM) */
+                ldr     R1, =_etext
+                ldr     R2, =_data
+                ldr     R3, =_edata
+1:        		cmp     R2, R3
+                ldrlo   R0, [R1], #4
+                strlo   R0, [R2], #4
+                blo     1b
+
+				/* Clear .bss section (Zero init)  */
+                mov     R0, #0
+                ldr     R1, =_bss_start
+                ldr     R2, =_bss_end
+2:				cmp     R1, R2
+                strlo   R0, [R1], #4
+                blo     2b
+
+				/* Enter the C code  */
+                b       main
+
+.endfunc
+.end

+ 197 - 0
poc/lpc2148_blinky/lpc2148-ram.ld

@@ -0,0 +1,197 @@
+/* ****************************************************************************************************** */
+/*   demo2148_blink_flash.cmd				LINKER  SCRIPT                                                */
+/*                                                                                                        */
+/*                                                                                                        */
+/*   The Linker Script defines how the code and data emitted by the GNU C compiler and assembler are  	  */
+/*   to be loaded into memory (code goes into FLASH, variables go into RAM).                 			  */
+/*                                                                                                        */
+/*   Any symbols defined in the Linker Script are automatically global and available to the rest of the   */
+/*   program.                                                                                             */
+/*                                                                                                        */
+/*   To force the linker to use this LINKER SCRIPT, just add the -T demo2148_blink_flash.cmd directive    */
+/*   to the linker flags in the makefile.                                                                 */
+/*                                                                                                        */
+/*   			LFLAGS  =  -Map main.map -nostartfiles -T demo2148_blink_flash.cmd                        */
+/*                                                                                                        */
+/*                                                                                                        */
+/*   The Philips boot loader supports the ISP (In System Programming) via the serial port and the IAP     */
+/*   (In Application Programming) for flash programming from within your application.                     */
+/*                                                                                                        */
+/*   The boot loader uses RAM memory and we MUST NOT load variables or code in these areas.               */
+/*                                                                                                        */
+/*   RAM used by boot loader:  0x40000120 - 0x400001FF  (223 bytes) for ISP variables                     */
+/*                             0x40007FE0 - 0x4000FFFF  (32 bytes)  for ISP and IAP variables             */
+/*                             0x40007EE0 - 0x40007FE0  (256 bytes) stack for ISP and IAP                 */
+/*                                                                                                        */
+/*                                                                                                        */
+/*                              MEMORY MAP                                                                */
+/*                      |                                 |0x40008000                                     */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |     variables and stack         |0x40007FFF                                     */
+/*         ram_isp_high |     for Philips boot loader     |                                               */
+/*            .         |     32 + 256 = 288 bytes        |                                               */
+/*            .         |                                 |                                     		  */
+/*            .         |   Do not put anything here      |0x40007EE0                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    UDF Stack  4 bytes           |0x40007EDC  <---------- _stack_end             */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    ABT Stack  4 bytes           |0x40007ED8                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    FIQ Stack  4 bytes           |0x40007ED4                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    IRQ Stack  4 bytes           |0x40007ED0                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    SVC Stack  4 bytes           |0x40007ECC                                     */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |                                 |0x40007EC8 			                          */
+/*            .         |     stack area for user program |                                               */
+/*            .         |               |                 |                                               */
+/*            .         |               |                 |                                               */
+/*            .         |               |                 |                                               */
+/*            .         |               V                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |          free ram               |                                               */
+/*           ram        |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |.................................|0x40000234 <---------- _bss_end                */
+/*            .         |                                 |                                               */
+/*            .         |  .bss   uninitialized variables |                                               */
+/*            .         |.................................|0x40000218 <---------- _bss_start, _edata      */
+/*            .         |                                 |                                               */
+/*            .         |  .data  initialized variables   |                                               */
+/*            .         |                                 |0x40000200 <---------- _data                   */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |     variables used by           |0x400001FF                                     */
+/*         ram_isp_low  |     Philips boot loader         |                                               */
+/*            .         |           223 bytes             |0x40000120                                     */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |                                 |0x4000011F                                     */
+/*         ram_vectors  |          free ram               |                                               */
+/*            .         |---------------------------------|0x40000040                                     */
+/*            .         |                                 |0x4000003F                                     */
+/*            .         |  Interrupt Vectors (re-mapped)  |                                               */
+/*            .         |          64 bytes               |0x40000000                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |                                 |                                               */
+/*                                                                                                        */
+/*                                                                                                        */
+/*                                                                                                        */
+/*                      |                                 |                                               */
+/*           .--------> |---------------------------------|                                               */
+/*           .          |                                 |0x0001FFFF                                     */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |       unused flash eprom        |                                               */
+/*           .          |                                 |                                               */
+/*           .          |.................................|0x0000032c                                     */
+/*           .          |                                 |                                               */
+/*           .          |      copy of .data area         |                                               */
+/*         flash        |                                 |                                               */
+/*           .          |---------------------------------|0x00000314 <----------- _etext                 */
+/*           .          |                                 |                                               */
+/*           .          |                                 |0x00000180  main                               */
+/*           .          |                                 |0x00000278  feed                               */
+/*           .          |         main()                  |0x000002c4  FIQ_Routine                        */
+/*           .          |                                 |0x000002d8  SWI_Routine                        */
+/*           .          |                                 |0x000002ec  UNDEF_Routine	                  */
+/*           .          |                                 |0x000002b0  IRQ_routine                        */
+/*           .          |---------------------------------|0x000001cc  initialize                         */
+/*           .          |                                 |0x000000D4                                     */
+/*           .          |         Startup Code            |                                               */
+/*           .          |         (assembler)             |                                               */
+/*           .          |                                 |                                               */
+/*           .          |---------------------------------|0x00000040 Reset_Handler                       */
+/*           .          |                                 |0x0000003F                                     */
+/*           .          | Interrupt Vector Table (unused) |                                               */
+/*           .          |          64 bytes               |                                               */
+/*           .--------->|---------------------------------|0x00000000 _startup                            *
+/*                                                                                                        */
+/*                                                                                                        */
+/*    The easy way to prevent the linker from loading anything into a memory area is to define            */
+/*    a MEMORY region for it and then avoid assigning any .text, .data or .bss sections into it.          */
+/*                                                                                                        */
+/*                                                                                                        */
+/*             MEMORY                                                                                     */
+/*             {                                                                                          */
+/*                ram_isp_low(A)  : ORIGIN = 0x40000120, LENGTH = 223                                     */
+/*                                                                                                        */
+/*             }                                                                                          */
+/*                                                                                                        */
+/*                                                                                                        */
+/*  Author:  James P. Lynch                                                                               */
+/*                                                                                                        */
+/* ****************************************************************************************************** */
+
+
+/* identify the Entry Point  */
+
+ENTRY(_startup)
+
+
+
+/* specify the LPC2148 memory areas  */
+
+MEMORY 
+{
+	flash     			: ORIGIN = 0,          LENGTH = 512K	/* FLASH ROM                            	*/	
+	ram_isp_low(A)		: ORIGIN = 0x40000120, LENGTH = 223		/* variables used by Philips ISP bootloader	*/		 
+	ram   				: ORIGIN = 0x40000200, LENGTH = 32513   /* free RAM area							*/
+	ram_isp_high(A)		: ORIGIN = 0x40007FE0, LENGTH = 32		/* variables used by Philips ISP bootloader	*/
+	ram_usb_dma			: ORIGIN = 0x7FD00000, LENGTH = 8192    /* on-chip USB DMA RAM area (not used)      */
+}
+
+
+
+/* define a global symbol _stack_end  */
+
+_stack_end = 0x40007EDC;
+
+
+
+/* now define the output sections  */
+
+SECTIONS 
+{
+	. = 0;								/* set location counter to address zero  */
+	
+	startup : { *(.startup)} >ram		/* the startup code goes into FLASH */
+	
+	
+
+	.text :								/* collect all sections that should go into FLASH after startup  */ 
+	{
+		*(.text)						/* all .text sections (code)  */
+		*(.rodata)						/* all .rodata sections (constants, strings, etc.)  */
+		*(.rodata*)						/* all .rodata* sections (constants, strings, etc.)  */
+		*(.glue_7)						/* all .glue_7 sections  (no idea what these are) */
+		*(.glue_7t)						/* all .glue_7t sections (no idea what these are) */
+		_etext = .;						/* define a global symbol _etext just after the last code byte */
+	} >ram								/* put all the above into FLASH */
+	
+
+	
+
+	.data :								/* collect all initialized .data sections that go into RAM  */ 
+	{
+		_data = .;						/* create a global symbol marking the start of the .data section  */
+		*(.data)						/* all .data sections  */
+		_edata = .;						/* define a global symbol marking the end of the .data section  */
+	} >ram AT >ram						/* put all the above into RAM (but load the LMA copy into FLASH) */
+
+	.bss :								/* collect all uninitialized .bss sections that go into RAM  */
+	{
+		_bss_start = .;					/* define a global symbol marking the start of the .bss section */
+		*(.bss)							/* all .bss sections  */
+	} >ram								/* put all the above in RAM (it will be cleared in the startup code */
+
+	. = ALIGN(4);						/* advance location counter to the next 32-bit boundary */
+	_bss_end = . ;						/* define a global symbol marking the end of the .bss section */
+}
+	_end = .;							/* define a global symbol marking the end of application RAM */
+	

+ 197 - 0
poc/lpc2148_blinky/lpc2148-rom.ld

@@ -0,0 +1,197 @@
+/* ****************************************************************************************************** */
+/*   demo2148_blink_flash.cmd				LINKER  SCRIPT                                                */
+/*                                                                                                        */
+/*                                                                                                        */
+/*   The Linker Script defines how the code and data emitted by the GNU C compiler and assembler are  	  */
+/*   to be loaded into memory (code goes into FLASH, variables go into RAM).                 			  */
+/*                                                                                                        */
+/*   Any symbols defined in the Linker Script are automatically global and available to the rest of the   */
+/*   program.                                                                                             */
+/*                                                                                                        */
+/*   To force the linker to use this LINKER SCRIPT, just add the -T demo2148_blink_flash.cmd directive    */
+/*   to the linker flags in the makefile.                                                                 */
+/*                                                                                                        */
+/*   			LFLAGS  =  -Map main.map -nostartfiles -T demo2148_blink_flash.cmd                        */
+/*                                                                                                        */
+/*                                                                                                        */
+/*   The Philips boot loader supports the ISP (In System Programming) via the serial port and the IAP     */
+/*   (In Application Programming) for flash programming from within your application.                     */
+/*                                                                                                        */
+/*   The boot loader uses RAM memory and we MUST NOT load variables or code in these areas.               */
+/*                                                                                                        */
+/*   RAM used by boot loader:  0x40000120 - 0x400001FF  (223 bytes) for ISP variables                     */
+/*                             0x40007FE0 - 0x4000FFFF  (32 bytes)  for ISP and IAP variables             */
+/*                             0x40007EE0 - 0x40007FE0  (256 bytes) stack for ISP and IAP                 */
+/*                                                                                                        */
+/*                                                                                                        */
+/*                              MEMORY MAP                                                                */
+/*                      |                                 |0x40008000                                     */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |     variables and stack         |0x40007FFF                                     */
+/*         ram_isp_high |     for Philips boot loader     |                                               */
+/*            .         |     32 + 256 = 288 bytes        |                                               */
+/*            .         |                                 |                                     		  */
+/*            .         |   Do not put anything here      |0x40007EE0                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    UDF Stack  4 bytes           |0x40007EDC  <---------- _stack_end             */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    ABT Stack  4 bytes           |0x40007ED8                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    FIQ Stack  4 bytes           |0x40007ED4                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    IRQ Stack  4 bytes           |0x40007ED0                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |    SVC Stack  4 bytes           |0x40007ECC                                     */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |                                 |0x40007EC8 			                          */
+/*            .         |     stack area for user program |                                               */
+/*            .         |               |                 |                                               */
+/*            .         |               |                 |                                               */
+/*            .         |               |                 |                                               */
+/*            .         |               V                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |          free ram               |                                               */
+/*           ram        |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |                                 |                                               */
+/*            .         |.................................|0x40000234 <---------- _bss_end                */
+/*            .         |                                 |                                               */
+/*            .         |  .bss   uninitialized variables |                                               */
+/*            .         |.................................|0x40000218 <---------- _bss_start, _edata      */
+/*            .         |                                 |                                               */
+/*            .         |  .data  initialized variables   |                                               */
+/*            .         |                                 |0x40000200 <---------- _data                   */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |     variables used by           |0x400001FF                                     */
+/*         ram_isp_low  |     Philips boot loader         |                                               */
+/*            .         |           223 bytes             |0x40000120                                     */
+/*            .-------->|---------------------------------|                                               */
+/*            .         |                                 |0x4000011F                                     */
+/*         ram_vectors  |          free ram               |                                               */
+/*            .         |---------------------------------|0x40000040                                     */
+/*            .         |                                 |0x4000003F                                     */
+/*            .         |  Interrupt Vectors (re-mapped)  |                                               */
+/*            .         |          64 bytes               |0x40000000                                     */
+/*            .-------->|---------------------------------|                                               */
+/*                      |                                 |                                               */
+/*                                                                                                        */
+/*                                                                                                        */
+/*                                                                                                        */
+/*                      |                                 |                                               */
+/*           .--------> |---------------------------------|                                               */
+/*           .          |                                 |0x0001FFFF                                     */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |                                 |                                               */
+/*           .          |       unused flash eprom        |                                               */
+/*           .          |                                 |                                               */
+/*           .          |.................................|0x0000032c                                     */
+/*           .          |                                 |                                               */
+/*           .          |      copy of .data area         |                                               */
+/*         flash        |                                 |                                               */
+/*           .          |---------------------------------|0x00000314 <----------- _etext                 */
+/*           .          |                                 |                                               */
+/*           .          |                                 |0x00000180  main                               */
+/*           .          |                                 |0x00000278  feed                               */
+/*           .          |         main()                  |0x000002c4  FIQ_Routine                        */
+/*           .          |                                 |0x000002d8  SWI_Routine                        */
+/*           .          |                                 |0x000002ec  UNDEF_Routine	                  */
+/*           .          |                                 |0x000002b0  IRQ_routine                        */
+/*           .          |---------------------------------|0x000001cc  initialize                         */
+/*           .          |                                 |0x000000D4                                     */
+/*           .          |         Startup Code            |                                               */
+/*           .          |         (assembler)             |                                               */
+/*           .          |                                 |                                               */
+/*           .          |---------------------------------|0x00000040 Reset_Handler                       */
+/*           .          |                                 |0x0000003F                                     */
+/*           .          | Interrupt Vector Table (unused) |                                               */
+/*           .          |          64 bytes               |                                               */
+/*           .--------->|---------------------------------|0x00000000 _startup                            *
+/*                                                                                                        */
+/*                                                                                                        */
+/*    The easy way to prevent the linker from loading anything into a memory area is to define            */
+/*    a MEMORY region for it and then avoid assigning any .text, .data or .bss sections into it.          */
+/*                                                                                                        */
+/*                                                                                                        */
+/*             MEMORY                                                                                     */
+/*             {                                                                                          */
+/*                ram_isp_low(A)  : ORIGIN = 0x40000120, LENGTH = 223                                     */
+/*                                                                                                        */
+/*             }                                                                                          */
+/*                                                                                                        */
+/*                                                                                                        */
+/*  Author:  James P. Lynch                                                                               */
+/*                                                                                                        */
+/* ****************************************************************************************************** */
+
+
+/* identify the Entry Point  */
+
+ENTRY(_startup)
+
+
+
+/* specify the LPC2148 memory areas  */
+
+MEMORY 
+{
+	flash     			: ORIGIN = 0,          LENGTH = 512K	/* FLASH ROM                            	*/	
+	ram_isp_low(A)		: ORIGIN = 0x40000120, LENGTH = 223		/* variables used by Philips ISP bootloader	*/		 
+	ram   				: ORIGIN = 0x40000200, LENGTH = 32513   /* free RAM area							*/
+	ram_isp_high(A)		: ORIGIN = 0x40007FE0, LENGTH = 32		/* variables used by Philips ISP bootloader	*/
+	ram_usb_dma			: ORIGIN = 0x7FD00000, LENGTH = 8192    /* on-chip USB DMA RAM area (not used)      */
+}
+
+
+
+/* define a global symbol _stack_end  */
+
+_stack_end = 0x40007EDC;
+
+
+
+/* now define the output sections  */
+
+SECTIONS 
+{
+	. = 0;								/* set location counter to address zero  */
+	
+	startup : { *(.startup)} >flash		/* the startup code goes into FLASH */
+	
+	
+
+	.text :								/* collect all sections that should go into FLASH after startup  */ 
+	{
+		*(.text)						/* all .text sections (code)  */
+		*(.rodata)						/* all .rodata sections (constants, strings, etc.)  */
+		*(.rodata*)						/* all .rodata* sections (constants, strings, etc.)  */
+		*(.glue_7)						/* all .glue_7 sections  (no idea what these are) */
+		*(.glue_7t)						/* all .glue_7t sections (no idea what these are) */
+		_etext = .;						/* define a global symbol _etext just after the last code byte */
+	} >flash							/* put all the above into FLASH */
+	
+
+	
+
+	.data :								/* collect all initialized .data sections that go into RAM  */ 
+	{
+		_data = .;						/* create a global symbol marking the start of the .data section  */
+		*(.data)						/* all .data sections  */
+		_edata = .;						/* define a global symbol marking the end of the .data section  */
+	} >ram AT >flash					/* put all the above into RAM (but load the LMA copy into FLASH) */
+
+	.bss :								/* collect all uninitialized .bss sections that go into RAM  */
+	{
+		_bss_start = .;					/* define a global symbol marking the start of the .bss section */
+		*(.bss)							/* all .bss sections  */
+	} >ram								/* put all the above in RAM (it will be cleared in the startup code */
+
+	. = ALIGN(4);						/* advance location counter to the next 32-bit boundary */
+	_bss_end = . ;						/* define a global symbol marking the end of the .bss section */
+}
+	_end = .;							/* define a global symbol marking the end of application RAM */
+	

+ 364 - 0
poc/lpc2148_blinky/lpc214x.h

@@ -0,0 +1,364 @@
+/***********************************************************************/
+/*  This file is part of the uVision/ARM development tools             */
+/*  Copyright KEIL ELEKTRONIK GmbH 2002-2005                           */
+/***********************************************************************/
+/*                                                                     */
+/*  LPC214X.H:  Header file for Philips LPC2141/42/44/46/48            */
+/*                                                                     */
+/***********************************************************************/
+
+#ifndef __LPC214x_H
+#define __LPC214x_H
+
+/* Vectored Interrupt Controller (VIC) */
+#define VICIRQStatus    (*((volatile unsigned long *) 0xFFFFF000))
+#define VICFIQStatus    (*((volatile unsigned long *) 0xFFFFF004))
+#define VICRawIntr      (*((volatile unsigned long *) 0xFFFFF008))
+#define VICIntSelect    (*((volatile unsigned long *) 0xFFFFF00C))
+#define VICIntEnable    (*((volatile unsigned long *) 0xFFFFF010))
+#define VICIntEnClr     (*((volatile unsigned long *) 0xFFFFF014))
+#define VICSoftInt      (*((volatile unsigned long *) 0xFFFFF018))
+#define VICSoftIntClr   (*((volatile unsigned long *) 0xFFFFF01C))
+#define VICProtection   (*((volatile unsigned long *) 0xFFFFF020))
+#define VICVectAddr     (*((volatile unsigned long *) 0xFFFFF030))
+#define VICDefVectAddr  (*((volatile unsigned long *) 0xFFFFF034))
+#define VICVectAddr0    (*((volatile unsigned long *) 0xFFFFF100))
+#define VICVectAddr1    (*((volatile unsigned long *) 0xFFFFF104))
+#define VICVectAddr2    (*((volatile unsigned long *) 0xFFFFF108))
+#define VICVectAddr3    (*((volatile unsigned long *) 0xFFFFF10C))
+#define VICVectAddr4    (*((volatile unsigned long *) 0xFFFFF110))
+#define VICVectAddr5    (*((volatile unsigned long *) 0xFFFFF114))
+#define VICVectAddr6    (*((volatile unsigned long *) 0xFFFFF118))
+#define VICVectAddr7    (*((volatile unsigned long *) 0xFFFFF11C))
+#define VICVectAddr8    (*((volatile unsigned long *) 0xFFFFF120))
+#define VICVectAddr9    (*((volatile unsigned long *) 0xFFFFF124))
+#define VICVectAddr10   (*((volatile unsigned long *) 0xFFFFF128))
+#define VICVectAddr11   (*((volatile unsigned long *) 0xFFFFF12C))
+#define VICVectAddr12   (*((volatile unsigned long *) 0xFFFFF130))
+#define VICVectAddr13   (*((volatile unsigned long *) 0xFFFFF134))
+#define VICVectAddr14   (*((volatile unsigned long *) 0xFFFFF138))
+#define VICVectAddr15   (*((volatile unsigned long *) 0xFFFFF13C))
+#define VICVectCntl0    (*((volatile unsigned long *) 0xFFFFF200))
+#define VICVectCntl1    (*((volatile unsigned long *) 0xFFFFF204))
+#define VICVectCntl2    (*((volatile unsigned long *) 0xFFFFF208))
+#define VICVectCntl3    (*((volatile unsigned long *) 0xFFFFF20C))
+#define VICVectCntl4    (*((volatile unsigned long *) 0xFFFFF210))
+#define VICVectCntl5    (*((volatile unsigned long *) 0xFFFFF214))
+#define VICVectCntl6    (*((volatile unsigned long *) 0xFFFFF218))
+#define VICVectCntl7    (*((volatile unsigned long *) 0xFFFFF21C))
+#define VICVectCntl8    (*((volatile unsigned long *) 0xFFFFF220))
+#define VICVectCntl9    (*((volatile unsigned long *) 0xFFFFF224))
+#define VICVectCntl10   (*((volatile unsigned long *) 0xFFFFF228))
+#define VICVectCntl11   (*((volatile unsigned long *) 0xFFFFF22C))
+#define VICVectCntl12   (*((volatile unsigned long *) 0xFFFFF230))
+#define VICVectCntl13   (*((volatile unsigned long *) 0xFFFFF234))
+#define VICVectCntl14   (*((volatile unsigned long *) 0xFFFFF238))
+#define VICVectCntl15   (*((volatile unsigned long *) 0xFFFFF23C))
+
+/* Pin Connect Block */
+#define PINSEL0         (*((volatile unsigned long *) 0xE002C000))
+#define PINSEL1         (*((volatile unsigned long *) 0xE002C004))
+#define PINSEL2         (*((volatile unsigned long *) 0xE002C014))
+
+/* General Purpose Input/Output (GPIO) */
+#define IOPIN0          (*((volatile unsigned long *) 0xE0028000))
+#define IOSET0          (*((volatile unsigned long *) 0xE0028004))
+#define IODIR0          (*((volatile unsigned long *) 0xE0028008))
+#define IOCLR0          (*((volatile unsigned long *) 0xE002800C))
+#define IOPIN1          (*((volatile unsigned long *) 0xE0028010))
+#define IOSET1          (*((volatile unsigned long *) 0xE0028014))
+#define IODIR1          (*((volatile unsigned long *) 0xE0028018))
+#define IOCLR1          (*((volatile unsigned long *) 0xE002801C))
+#define IO0PIN          (*((volatile unsigned long *) 0xE0028000))
+#define IO0SET          (*((volatile unsigned long *) 0xE0028004))
+#define IO0DIR          (*((volatile unsigned long *) 0xE0028008))
+#define IO0CLR          (*((volatile unsigned long *) 0xE002800C))
+#define IO1PIN          (*((volatile unsigned long *) 0xE0028010))
+#define IO1SET          (*((volatile unsigned long *) 0xE0028014))
+#define IO1DIR          (*((volatile unsigned long *) 0xE0028018))
+#define IO1CLR          (*((volatile unsigned long *) 0xE002801C))
+#define FIO0DIR         (*((volatile unsigned long *) 0x3FFFC000))
+#define FIO0MASK        (*((volatile unsigned long *) 0x3FFFC010))
+#define FIO0PIN         (*((volatile unsigned long *) 0x3FFFC014))
+#define FIO0SET         (*((volatile unsigned long *) 0x3FFFC018))
+#define FIO0CLR         (*((volatile unsigned long *) 0x3FFFC01C))
+#define FIO1DIR         (*((volatile unsigned long *) 0x3FFFC020))
+#define FIO1MASK        (*((volatile unsigned long *) 0x3FFFC030))
+#define FIO1PIN         (*((volatile unsigned long *) 0x3FFFC034))
+#define FIO1SET         (*((volatile unsigned long *) 0x3FFFC038))
+#define FIO1CLR         (*((volatile unsigned long *) 0x3FFFC03C))
+
+/* Memory Accelerator Module (MAM) */
+#define MAMCR           (*((volatile unsigned char *) 0xE01FC000))
+#define MAMTIM          (*((volatile unsigned char *) 0xE01FC004))
+#define MEMMAP          (*((volatile unsigned char *) 0xE01FC040))
+
+/* Phase Locked Loop 0 (PLL0) */
+#define PLL0CON         (*((volatile unsigned char *) 0xE01FC080))
+#define PLL0CFG         (*((volatile unsigned char *) 0xE01FC084))
+#define PLL0STAT        (*((volatile unsigned short*) 0xE01FC088))
+#define PLL0FEED        (*((volatile unsigned char *) 0xE01FC08C))
+
+/* Phase Locked Loop 1 (PLL1) */
+#define PLL1CON         (*((volatile unsigned char *) 0xE01FC0A0))
+#define PLL1CFG         (*((volatile unsigned char *) 0xE01FC0A4))
+#define PLL1STAT        (*((volatile unsigned short*) 0xE01FC0A8))
+#define PLL1FEED        (*((volatile unsigned char *) 0xE01FC0AC))
+
+/* VPB Divider */
+#define VPBDIV          (*((volatile unsigned char *) 0xE01FC100))
+
+/* Power Control */
+#define PCON            (*((volatile unsigned char *) 0xE01FC0C0))
+#define PCONP           (*((volatile unsigned long *) 0xE01FC0C4))
+
+/* External Interrupts */
+#define EXTINT          (*((volatile unsigned char *) 0xE01FC140))
+#define INTWAKE         (*((volatile unsigned short*) 0xE01FC144))
+#define EXTMODE         (*((volatile unsigned char *) 0xE01FC148))
+#define EXTPOLAR        (*((volatile unsigned char *) 0xE01FC14C))
+
+/* Reset */
+#define RSID            (*((volatile unsigned char *) 0xE01FC180))
+
+/* Code Security / Debugging */
+#define CSPR            (*((volatile unsigned char *) 0xE01FC184))
+
+/* System Control Miscellaneous */
+#define SCS             (*((volatile unsigned long *) 0xE01FC1A0))
+
+/* Timer 0 */
+#define T0IR            (*((volatile unsigned long *) 0xE0004000))
+#define T0TCR           (*((volatile unsigned long *) 0xE0004004))
+#define T0TC            (*((volatile unsigned long *) 0xE0004008))
+#define T0PR            (*((volatile unsigned long *) 0xE000400C))
+#define T0PC            (*((volatile unsigned long *) 0xE0004010))
+#define T0MCR           (*((volatile unsigned long *) 0xE0004014))
+#define T0MR0           (*((volatile unsigned long *) 0xE0004018))
+#define T0MR1           (*((volatile unsigned long *) 0xE000401C))
+#define T0MR2           (*((volatile unsigned long *) 0xE0004020))
+#define T0MR3           (*((volatile unsigned long *) 0xE0004024))
+#define T0CCR           (*((volatile unsigned long *) 0xE0004028))
+#define T0CR0           (*((volatile unsigned long *) 0xE000402C))
+#define T0CR1           (*((volatile unsigned long *) 0xE0004030))
+#define T0CR2           (*((volatile unsigned long *) 0xE0004034))
+#define T0CR3           (*((volatile unsigned long *) 0xE0004038))
+#define T0EMR           (*((volatile unsigned long *) 0xE000403C))
+#define T0CTCR          (*((volatile unsigned long *) 0xE0004070))
+
+/* Timer 1 */
+#define T1IR            (*((volatile unsigned long *) 0xE0008000))
+#define T1TCR           (*((volatile unsigned long *) 0xE0008004))
+#define T1TC            (*((volatile unsigned long *) 0xE0008008))
+#define T1PR            (*((volatile unsigned long *) 0xE000800C))
+#define T1PC            (*((volatile unsigned long *) 0xE0008010))
+#define T1MCR           (*((volatile unsigned long *) 0xE0008014))
+#define T1MR0           (*((volatile unsigned long *) 0xE0008018))
+#define T1MR1           (*((volatile unsigned long *) 0xE000801C))
+#define T1MR2           (*((volatile unsigned long *) 0xE0008020))
+#define T1MR3           (*((volatile unsigned long *) 0xE0008024))
+#define T1CCR           (*((volatile unsigned long *) 0xE0008028))
+#define T1CR0           (*((volatile unsigned long *) 0xE000802C))
+#define T1CR1           (*((volatile unsigned long *) 0xE0008030))
+#define T1CR2           (*((volatile unsigned long *) 0xE0008034))
+#define T1CR3           (*((volatile unsigned long *) 0xE0008038))
+#define T1EMR           (*((volatile unsigned long *) 0xE000803C))
+#define T1CTCR          (*((volatile unsigned long *) 0xE0008070))
+
+/* Pulse Width Modulator (PWM) */
+#define PWMIR           (*((volatile unsigned long *) 0xE0014000))
+#define PWMTCR          (*((volatile unsigned long *) 0xE0014004))
+#define PWMTC           (*((volatile unsigned long *) 0xE0014008))
+#define PWMPR           (*((volatile unsigned long *) 0xE001400C))
+#define PWMPC           (*((volatile unsigned long *) 0xE0014010))
+#define PWMMCR          (*((volatile unsigned long *) 0xE0014014))
+#define PWMMR0          (*((volatile unsigned long *) 0xE0014018))
+#define PWMMR1          (*((volatile unsigned long *) 0xE001401C))
+#define PWMMR2          (*((volatile unsigned long *) 0xE0014020))
+#define PWMMR3          (*((volatile unsigned long *) 0xE0014024))
+#define PWMMR4          (*((volatile unsigned long *) 0xE0014040))
+#define PWMMR5          (*((volatile unsigned long *) 0xE0014044))
+#define PWMMR6          (*((volatile unsigned long *) 0xE0014048))
+#define PWMPCR          (*((volatile unsigned long *) 0xE001404C))
+#define PWMLER          (*((volatile unsigned long *) 0xE0014050))
+
+/* Universal Asynchronous Receiver Transmitter 0 (UART0) */
+#define U0RBR           (*((volatile unsigned char *) 0xE000C000))
+#define U0THR           (*((volatile unsigned char *) 0xE000C000))
+#define U0IER           (*((volatile unsigned long *) 0xE000C004))
+#define U0IIR           (*((volatile unsigned long *) 0xE000C008))
+#define U0FCR           (*((volatile unsigned char *) 0xE000C008))
+#define U0LCR           (*((volatile unsigned char *) 0xE000C00C))
+#define U0MCR           (*((volatile unsigned char *) 0xE000C010))
+#define U0LSR           (*((volatile unsigned char *) 0xE000C014))
+#define U0MSR           (*((volatile unsigned char *) 0xE000C018))
+#define U0SCR           (*((volatile unsigned char *) 0xE000C01C))
+#define U0DLL           (*((volatile unsigned char *) 0xE000C000))
+#define U0DLM           (*((volatile unsigned char *) 0xE000C004))
+#define U0ACR           (*((volatile unsigned long *) 0xE000C020))
+#define U0FDR           (*((volatile unsigned long *) 0xE000C028))
+#define U0TER           (*((volatile unsigned char *) 0xE000C030))
+
+/* Universal Asynchronous Receiver Transmitter 1 (UART1) */
+#define U1RBR           (*((volatile unsigned char *) 0xE0010000))
+#define U1THR           (*((volatile unsigned char *) 0xE0010000))
+#define U1IER           (*((volatile unsigned long *) 0xE0010004))
+#define U1IIR           (*((volatile unsigned long *) 0xE0010008))
+#define U1FCR           (*((volatile unsigned char *) 0xE0010008))
+#define U1LCR           (*((volatile unsigned char *) 0xE001000C))
+#define U1MCR           (*((volatile unsigned char *) 0xE0010010))
+#define U1LSR           (*((volatile unsigned char *) 0xE0010014))
+#define U1MSR           (*((volatile unsigned char *) 0xE0010018))
+#define U1SCR           (*((volatile unsigned char *) 0xE001001C))
+#define U1DLL           (*((volatile unsigned char *) 0xE0010000))
+#define U1DLM           (*((volatile unsigned char *) 0xE0010004))
+#define U1ACR           (*((volatile unsigned long *) 0xE0010020))
+#define U1FDR           (*((volatile unsigned long *) 0xE0010028))
+#define U1TER           (*((volatile unsigned char *) 0xE0010030))
+
+/* I2C Interface 0 */
+#define I2C0CONSET      (*((volatile unsigned char *) 0xE001C000))
+#define I2C0STAT        (*((volatile unsigned char *) 0xE001C004))
+#define I2C0DAT         (*((volatile unsigned char *) 0xE001C008))
+#define I2C0ADR         (*((volatile unsigned char *) 0xE001C00C))
+#define I2C0SCLH        (*((volatile unsigned short*) 0xE001C010))
+#define I2C0SCLL        (*((volatile unsigned short*) 0xE001C014))
+#define I2C0CONCLR      (*((volatile unsigned char *) 0xE001C018))
+
+/* I2C Interface 1 */
+#define I2C1CONSET      (*((volatile unsigned char *) 0xE005C000))
+#define I2C1STAT        (*((volatile unsigned char *) 0xE005C004))
+#define I2C1DAT         (*((volatile unsigned char *) 0xE005C008))
+#define I2C1ADR         (*((volatile unsigned char *) 0xE005C00C))
+#define I2C1SCLH        (*((volatile unsigned short*) 0xE005C010))
+#define I2C1SCLL        (*((volatile unsigned short*) 0xE005C014))
+#define I2C1CONCLR      (*((volatile unsigned char *) 0xE005C018))
+
+/* SPI0 (Serial Peripheral Interface 0) */
+#define S0SPCR          (*((volatile unsigned short*) 0xE0020000))
+#define S0SPSR          (*((volatile unsigned char *) 0xE0020004))
+#define S0SPDR          (*((volatile unsigned short*) 0xE0020008))
+#define S0SPCCR         (*((volatile unsigned char *) 0xE002000C))
+#define S0SPINT         (*((volatile unsigned char *) 0xE002001C))
+
+/* SSP Controller (SPI1) */
+#define SSPCR0          (*((volatile unsigned short*) 0xE0068000))
+#define SSPCR1          (*((volatile unsigned char *) 0xE0068004))
+#define SSPDR           (*((volatile unsigned short*) 0xE0068008))
+#define SSPSR           (*((volatile unsigned char *) 0xE006800C))
+#define SSPCPSR         (*((volatile unsigned char *) 0xE0068010))
+#define SSPIMSC         (*((volatile unsigned char *) 0xE0068014))
+#define SSPRIS          (*((volatile unsigned char *) 0xE0068018))
+#define SSPMIS          (*((volatile unsigned char *) 0xE006801C))
+#define SSPICR          (*((volatile unsigned char *) 0xE0068020))
+
+/* Real Time Clock */
+#define ILR             (*((volatile unsigned char *) 0xE0024000))
+#define CTC             (*((volatile unsigned short*) 0xE0024004))
+#define CCR             (*((volatile unsigned char *) 0xE0024008))
+#define CIIR            (*((volatile unsigned char *) 0xE002400C))
+#define AMR             (*((volatile unsigned char *) 0xE0024010))
+#define CTIME0          (*((volatile unsigned long *) 0xE0024014))
+#define CTIME1          (*((volatile unsigned long *) 0xE0024018))
+#define CTIME2          (*((volatile unsigned long *) 0xE002401C))
+#define SEC             (*((volatile unsigned char *) 0xE0024020))
+#define MIN             (*((volatile unsigned char *) 0xE0024024))
+#define HOUR            (*((volatile unsigned char *) 0xE0024028))
+#define DOM             (*((volatile unsigned char *) 0xE002402C))
+#define DOW             (*((volatile unsigned char *) 0xE0024030))
+#define DOY             (*((volatile unsigned short*) 0xE0024034))
+#define MONTH           (*((volatile unsigned char *) 0xE0024038))
+#define YEAR            (*((volatile unsigned short*) 0xE002403C))
+#define ALSEC           (*((volatile unsigned char *) 0xE0024060))
+#define ALMIN           (*((volatile unsigned char *) 0xE0024064))
+#define ALHOUR          (*((volatile unsigned char *) 0xE0024068))
+#define ALDOM           (*((volatile unsigned char *) 0xE002406C))
+#define ALDOW           (*((volatile unsigned char *) 0xE0024070))
+#define ALDOY           (*((volatile unsigned short*) 0xE0024074))
+#define ALMON           (*((volatile unsigned char *) 0xE0024078))
+#define ALYEAR          (*((volatile unsigned short*) 0xE002407C))
+#define PREINT          (*((volatile unsigned short*) 0xE0024080))
+#define PREFRAC         (*((volatile unsigned short*) 0xE0024084))
+
+/* A/D Converter 0 (AD0) */
+#define AD0CR           (*((volatile unsigned long *) 0xE0034000))
+#define AD0GDR          (*((volatile unsigned long *) 0xE0034004))
+#define AD0STAT         (*((volatile unsigned long *) 0xE0034030))
+#define AD0INTEN        (*((volatile unsigned long *) 0xE003400C))
+#define AD0DR0          (*((volatile unsigned long *) 0xE0034010))
+#define AD0DR1          (*((volatile unsigned long *) 0xE0034014))
+#define AD0DR2          (*((volatile unsigned long *) 0xE0034018))
+#define AD0DR3          (*((volatile unsigned long *) 0xE003401C))
+#define AD0DR4          (*((volatile unsigned long *) 0xE0034020))
+#define AD0DR5          (*((volatile unsigned long *) 0xE0034024))
+#define AD0DR6          (*((volatile unsigned long *) 0xE0034028))
+#define AD0DR7          (*((volatile unsigned long *) 0xE003402C))
+
+/* A/D Converter 1 (AD1) */
+#define AD1CR           (*((volatile unsigned long *) 0xE0060000))
+#define AD1GDR          (*((volatile unsigned long *) 0xE0060004))
+#define AD1STAT         (*((volatile unsigned long *) 0xE0060030))
+#define AD1INTEN        (*((volatile unsigned long *) 0xE006000C))
+#define AD1DR0          (*((volatile unsigned long *) 0xE0060010))
+#define AD1DR1          (*((volatile unsigned long *) 0xE0060014))
+#define AD1DR2          (*((volatile unsigned long *) 0xE0060018))
+#define AD1DR3          (*((volatile unsigned long *) 0xE006001C))
+#define AD1DR4          (*((volatile unsigned long *) 0xE0060020))
+#define AD1DR5          (*((volatile unsigned long *) 0xE0060024))
+#define AD1DR6          (*((volatile unsigned long *) 0xE0060028))
+#define AD1DR7          (*((volatile unsigned long *) 0xE006002C))
+
+/* A/D Converter Global */
+#define ADGSR           (*((volatile unsigned long *) 0xE0034008))
+
+/* D/A Converter */
+#define DACR            (*((volatile unsigned long *) 0xE006C000))
+
+/* Watchdog */
+#define WDMOD           (*((volatile unsigned char *) 0xE0000000))
+#define WDTC            (*((volatile unsigned long *) 0xE0000004))
+#define WDFEED          (*((volatile unsigned char *) 0xE0000008))
+#define WDTV            (*((volatile unsigned long *) 0xE000000C))
+
+/* USB Controller */
+#define USBIntSt        (*((volatile unsigned long *) 0xE01FC1C0))
+#define USBDevIntSt     (*((volatile unsigned long *) 0xE0090000))
+#define USBDevIntEn     (*((volatile unsigned long *) 0xE0090004))
+#define USBDevIntClr    (*((volatile unsigned long *) 0xE0090008))
+#define USBDevIntSet    (*((volatile unsigned long *) 0xE009000C))
+#define USBDevIntPri    (*((volatile unsigned char *) 0xE009002C))
+#define USBEpIntSt      (*((volatile unsigned long *) 0xE0090030))
+#define USBEpIntEn      (*((volatile unsigned long *) 0xE0090034))
+#define USBEpIntClr     (*((volatile unsigned long *) 0xE0090038))
+#define USBEpIntSet     (*((volatile unsigned long *) 0xE009003C))
+#define USBEpIntPri     (*((volatile unsigned long *) 0xE0090040))
+#define USBReEp         (*((volatile unsigned long *) 0xE0090044))
+#define USBEpInd        (*((volatile unsigned long *) 0xE0090048))
+#define USBMaxPSize     (*((volatile unsigned long *) 0xE009004C))
+#define USBRxData       (*((volatile unsigned long *) 0xE0090018))
+#define USBRxPLen       (*((volatile unsigned long *) 0xE0090020))
+#define USBTxData       (*((volatile unsigned long *) 0xE009001C))
+#define USBTxPLen       (*((volatile unsigned long *) 0xE0090024))
+#define USBCtrl         (*((volatile unsigned long *) 0xE0090028))
+#define USBCmdCode      (*((volatile unsigned long *) 0xE0090010))
+#define USBCmdData      (*((volatile unsigned long *) 0xE0090014))
+#define USBDMARSt       (*((volatile unsigned long *) 0xE0090050))
+#define USBDMARClr      (*((volatile unsigned long *) 0xE0090054))
+#define USBDMARSet      (*((volatile unsigned long *) 0xE0090058))
+#define USBUDCAH        (*((volatile unsigned long *) 0xE0090080))
+#define USBEpDMASt      (*((volatile unsigned long *) 0xE0090084))
+#define USBEpDMAEn      (*((volatile unsigned long *) 0xE0090088))
+#define USBEpDMADis     (*((volatile unsigned long *) 0xE009008C))
+#define USBDMAIntSt     (*((volatile unsigned long *) 0xE0090090))
+#define USBDMAIntEn     (*((volatile unsigned long *) 0xE0090094))
+#define USBEoTIntSt     (*((volatile unsigned long *) 0xE00900A0))
+#define USBEoTIntClr    (*((volatile unsigned long *) 0xE00900A4))
+#define USBEoTIntSet    (*((volatile unsigned long *) 0xE00900A8))
+#define USBNDDRIntSt    (*((volatile unsigned long *) 0xE00900AC))
+#define USBNDDRIntClr   (*((volatile unsigned long *) 0xE00900B0))
+#define USBNDDRIntSet   (*((volatile unsigned long *) 0xE00900B4))
+#define USBSysErrIntSt  (*((volatile unsigned long *) 0xE00900B8))
+#define USBSysErrIntClr (*((volatile unsigned long *) 0xE00900BC))
+#define USBSysErrIntSet (*((volatile unsigned long *) 0xE00900C0))
+
+#endif  // __LPC214x_H

+ 37 - 0
poc/lpc2148_blinky/main.c

@@ -0,0 +1,37 @@
+#include "lpc214x.h"
+#include "startup.h"
+#include "console.h"
+
+#define BAUD_RATE 115200 
+
+
+void delay_ms (int count){
+    int i;
+    count *= 3000;
+    for (i = 0; i < count; i++) {
+        asm volatile ("nop");
+    }
+}
+
+int main(void)
+{
+    unsigned int i;
+    Initialize();
+    ConsoleInit(60000000 / (16 * BAUD_RATE));
+    puts("Init done\n");
+    IODIR0 |= 1 << 10;          // P0.10 is an output
+    IODIR0 |= 1 << 11;          // P0.10 is an output
+    IOSET0 = 1 << 10;           //LED off
+    IOSET0 = 1 << 11;           //LED off
+
+    while (1) {
+        delay_ms(1000);
+        IOSET0 = 1 << 10;       //LED off
+        IOCLR0 = 1 << 11;       //LED on
+        puts("led1: off  led2: on\n");
+        delay_ms(1000);
+        IOCLR0 = 1 << 10;       //LED on
+        IOSET0 = 1 << 11;       //LED off
+        puts("led1: on   led2: off\n");
+    }
+}

+ 35 - 0
poc/lpc2148_blinky/openocd_ftdi02.cfg

@@ -0,0 +1,35 @@
+#daemon configuration
+telnet_port 4444
+gdb_port 3333
+
+#interface
+interface ft2232
+ft2232_device_desc "Lockenkopf v.2 A"
+ft2232_layout usbjtag
+ft2232_vid_pid 0x0403 0x6010
+jtag_speed 3
+jtag_nsrst_delay 800
+jtag_ntrst_delay 800
+
+#use combined on interfaces or targets that can't set TRST/SRST separately
+reset_config trst_and_srst srst_pulls_trst
+
+#jtag scan chain
+#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
+jtag_device 4 0x1 0xf 0xe
+
+#target configuration
+daemon_startup reset
+
+#target <type> <startup mode>
+#target arm7tdmi <reset mode> <chainpos> <endianness> <variant>
+target arm7tdmi little run_and_halt 0 arm7tdmi-s_r4
+run_and_halt_time 0 30
+
+working_area 0 0x40000000 0x40000 nobackup
+
+#flash configur on
+#flash bank lpc2000  0x0 0x40000 0 0 lpc2000_v2 0 12000 calc_checksum
+#flash bank lpc2000 0x0 0x04000 0 0 lpc2000_v2 0 12000 calc_checksum
+flash bank lpc2000 0x0 0x40000 0 0 0 lpc2000_v2 12000 calc_checksum 
+

+ 4 - 0
poc/lpc2148_blinky/openocd_mac.sh

@@ -0,0 +1,4 @@
+#!/bin/sh
+set -x
+/Users/david/Devel/arch/openocd/bin/openocd_r520_mac -f /Users/david/Devel/arch/arm/openocd_ftdi02.cfg -d 0 
+

BIN
poc/lpc2148_blinky/pics/small_console.png


BIN
poc/lpc2148_blinky/pics/small_dsc01985.jpg


BIN
poc/lpc2148_blinky/pics/small_prog.png


+ 6 - 0
poc/lpc2148_blinky/run.ocd

@@ -0,0 +1,6 @@
+halt 
+wait_halt 
+sleep 10 
+poll 
+load_binary /home/david/devel/arch/arm/code/blink2148/main.bin 0x40000200
+resume 0x40000200

+ 115 - 0
poc/lpc2148_blinky/startup.c

@@ -0,0 +1,115 @@
+/*
+	Initialisation functions for exception handlers, PLL and MAM
+	
+	Partially copied from Jim Lynch's tutorial
+*/
+
+/**********************************************************
+                  Header files
+ **********************************************************/
+
+#include "startup.h"
+
+#define MAMCR		*(volatile unsigned int *)0xE01FC000
+#define MAMTIM		*(volatile unsigned int *)0xE01FC004
+
+#define PLLCON		*(volatile unsigned int *)0xE01FC080
+#define PLLCFG		*(volatile unsigned int *)0xE01FC084
+#define PLLSTAT		*(volatile unsigned int *)0xE01FC088
+#define PLLFEED		*(volatile unsigned int *)0xE01FC08C
+
+#define VPBDIV		*(volatile unsigned int *)0xE01FC100
+void IRQ_Routine(void) __attribute__ ((interrupt("IRQ")));
+void FIQ_Routine(void) __attribute__ ((interrupt("FIQ")));
+void SWI_Routine(void) __attribute__ ((interrupt("SWI")));
+void UNDEF_Routine(void) __attribute__ ((interrupt("UNDEF")));
+
+/*  Stubs for various interrupts (may be replaced later)  */
+/*  ----------------------------------------------------  */
+void IRQ_Routine(void)
+{
+    while (1);
+}
+void FIQ_Routine(void)
+{
+    while (1);
+}
+void SWI_Routine(void)
+{
+    while (1);
+}
+void UNDEF_Routine(void)
+{
+    while (1);
+}
+
+
+/**********************************************************
+                      Initialize
+**********************************************************/
+
+#define PLOCK 0x400
+static void feed(void)
+{
+    PLLFEED = 0xAA;
+    PLLFEED = 0x55;
+} void Initialize(void)
+{
+
+    //                              Setting the Phased Lock Loop (PLL)
+    //               ----------------------------------
+    //
+    // Olimex LPC-P2148 has a 12.0000 mhz crystal
+    //
+    // We'd like the LPC2148 to run at 60 mhz (has to be an even multiple of crystal)
+    // 
+    // According to the Philips LPC2148 manual:   M = cclk / Fosc   where:  M    = PLL multiplier (bits 0-4 of PLLCFG)
+    //                                                                                                                                              cclk = 60000000 hz
+    //                                                                                                                                              Fosc = 12000000 hz
+    //
+    // Solving:     M = 60000000 / 12000000 = 5           
+    //
+    //                      Note: M - 1 must be entered into bits 0-4 of PLLCFG (assign 4 to these bits)
+    //
+    //
+    // The Current Controlled Oscilator (CCO) must operate in the range 156 mhz to 320 mhz
+    //
+    // According to the Philips LPC2148 manual:     Fcco = cclk * 2 * P    where:   Fcco = CCO frequency 
+    //                                                                                                                                                      cclk = 60000000 hz
+    //                                                                                                                                                      P = PLL divisor (bits 5-6 of PLLCFG)
+    //
+    // Solving:     Fcco = 60000000 * 2 * P
+    //                      P = 2  (trial value)
+    //                      Fcco = 60000000 * 2 * 2
+    //                      Fcc0 = 240000000 hz    (good choice for P since it's within the 156 mhz to 320 mhz range)
+    //
+    // From Table 22 (page 34) of Philips LPC2148 manual    P = 2, PLLCFG bits 5-6 = 1  (assign 1 to these bits)
+    //
+    // Finally:      PLLCFG = 0  01  00100  =  0x24
+    //
+    // Final note: to load PLLCFG register, we must use the 0xAA followed 0x55 write sequence to the PLLFEED register
+    //             this is done in the short function feed() below
+    //
+
+    // Setting Multiplier and Divider values
+    PLLCFG = 0x24;
+    feed();
+
+    // Enabling the PLL */  
+    PLLCON = 0x1;
+    feed();
+
+    // Wait for the PLL to lock to set frequency
+    while (!(PLLSTAT & PLOCK));
+
+    // Connect the PLL as the clock source
+    PLLCON = 0x3;
+    feed();
+
+    // Enabling MAM and setting number of clocks used for Flash memory fetch
+    MAMTIM = 0x3;
+    MAMCR = 0x2;
+
+    // Setting peripheral Clock (pclk) to System Clock (cclk)
+    VPBDIV = 0x1;
+}

+ 1 - 0
poc/lpc2148_blinky/startup.h

@@ -0,0 +1 @@
+void Initialize(void);

+ 6 - 0
poc/lpc2148_blinky/upload.ocd

@@ -0,0 +1,6 @@
+halt 
+wait_halt 
+sleep 10 
+poll 
+load_binary /Users/david/Devel/arch/arm/code/blink2148/main.bin 0x40000200
+resume 0x40000200