changeset 200:cc6594a7fc7a

target-utils/flash-boot-test: added UART init, needed for mode 1
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 01 May 2017 20:02:49 +0000
parents 5515360e2f61
children 59de85ae94a7
files target-utils/flash-boot-test/Makefile target-utils/flash-boot-test/main.c target-utils/flash-boot-test/uartinit.S
diffstat 3 files changed, 56 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/target-utils/flash-boot-test/Makefile	Sun Apr 30 17:45:21 2017 +0000
+++ b/target-utils/flash-boot-test/Makefile	Mon May 01 20:02:49 2017 +0000
@@ -4,7 +4,7 @@
 LD=	arm-elf-ld
 OBJCOPY=arm-elf-objcopy
 
-OBJS=	vectors.o crt0.o cmdtab.o main.o mygetchar.o uartbase.o
+OBJS=	vectors.o crt0.o cmdtab.o main.o mygetchar.o uartbase.o uartinit.o
 LIBS=	../libcommon/libcommon.a ../libprintf/libprintf.a ../libbase/libbase.a \
 	../libc/libc.a
 LIBGCC=	`${CC} -print-file-name=libgcc.a`
--- a/target-utils/flash-boot-test/main.c	Sun Apr 30 17:45:21 2017 +0000
+++ b/target-utils/flash-boot-test/main.c	Mon May 01 20:02:49 2017 +0000
@@ -4,8 +4,10 @@
 
 main()
 {
-	printf("\nFlash boot test program running (mode %u)\n",
-		_Magic_words[0]);
+	/* 13 MHz to the peripherals */
+	*(volatile u16 *)0xFFFFFD02 |= 0x40;
+	uart_init();
+	printf("Flash boot test program running (mode %u)\n", _Magic_words[0]);
 	for (;;) {
 		putchar('=');
 		if (command_entry())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/flash-boot-test/uartinit.S	Mon May 01 20:02:49 2017 +0000
@@ -0,0 +1,51 @@
+/*
+ * The UART initialization code in this assembly module has been lifted
+ * from the disassembly of the Calypso boot ROM, and slightly adapted
+ * for our needs.
+ */
+
+	.text
+	.code	32
+	.globl	uart_init
+
+uart_init:
+	stmfd	sp!, {r4-r11,lr}
+@ prepare UART init values
+	mov	r11, #3
+	mov	r5, #0
+	mov	r10, #7		@ baud rate divisor for 115200 baud
+	mov	r9, #0x80
+	mov	r7, #0xbf
+	mov	r4, #7
+@ UART base address
+	ldr	r6, =uart_base
+	ldr	r12, [r6]
+	add	r3, r12, #8
+@ R3 points to register 8 (MDR1)
+@ write 07 into it: reset mode
+	strb	r4, [r3]
+	add	r0, r12, #3
+@ R0 points to register 3 (LCR)
+@ write BF into it: map in the extended registers
+	strb	r7, [r0]
+	add	r1, r12, #2
+@ R1 points to register 2: EFR under current mapping
+@ set bit 4: enable enhanced functions
+	ldrb	r8, [r1]
+	orr	r8, r8, #0x10
+	strb	r8, [r1]
+@ write 80 into LCR: map in the baud rate divisor registers
+	strb	r9, [r0]
+@ reg 2 (pointed to by R1) is now IIR/FCR
+@ write 07 into FCR: FIFOs enabled and cleared, no DMA
+	strb	r4, [r1]
+@ write BF into LCR again
+	strb	r7, [r0]
+@ load baud rate divisor
+	strb	r10, [r12]
+	strb	r5, [r12, #1]
+@ write 03 into LCR: restore normal registers, 8N1
+	strb	r11, [r0]
+@ write 00 into MDR1: plain UART mode
+	strb	r5, [r3]
+	ldmfd	sp!, {r4-r11,pc}