/platform-nrf51822.s
.equ UART_BASE,    0x40002000
.equ UART_STARTRX, UART_BASE + 0x000
.equ UART_STARTTX, UART_BASE + 0x008
.equ UART_RXDRDY,  UART_BASE + 0x108
.equ UART_TXDRDY,  UART_BASE + 0x11C
.equ UART_ENABLE,  UART_BASE + 0x500
.equ UART_PSELTXD, UART_BASE + 0x50C
.equ UART_PSELRXD, UART_BASE + 0x514
.equ UART_RXD,     UART_BASE + 0x518
.equ UART_TXD,     UART_BASE + 0x51C
.equ UART_BAUDRATE,UART_BASE + 0x524
.equ UART_CONFIG,  UART_BASE + 0x56C

.equ GPIO_DIRSET,   0x50000518
.equ GPIO_DIRCLR,   0x5000051C
.equ GPIO_PINCNF24, 0x50000760
.equ GPIO_PINCNF25, 0x50000764

.global _platform_serial_init
.type _platform_serial_init, %function
_platform_serial_init:
	// set pin 24 to OUT
	ldr r1, =GPIO_DIRSET
	mov r0, #1
	lsl r0, #24
	str r0, [r1]
	// set pin 25 to IN
	ldr r1, =GPIO_DIRCLR
	lsl r0, #1
	str r0, [r1]
	// set PINCNF[24] to pull up
	ldr r1, =GPIO_PINCNF24
	mov r2, #0xc
	ldr r0, [r1]
	orr r0, r2
	str r0, [r1]
	// set PINCNF[25] to pull up
	ldr r1, =GPIO_PINCNF25
	ldr r0, [r1]
	orr r0, r2
	str r0, [r1]
	// set CONFIG to 0
	ldr r1, =UART_CONFIG
	mov r0, #0
	str r0, [r1]
	// set BAUDRATE to 115200
	ldr r1, =UART_BAUDRATE
	ldr r0, =0x01D7E000
	str r0, [r1]
	// set PSELTXD
	ldr r1, =UART_PSELTXD
	mov r0, #24
	str r0, [r1]
	// set PSELRXD
	ldr r1, =UART_PSELRXD
	mov r0, #25
	str r0, [r1]
	// enable UART
	ldr r1, =UART_ENABLE
	mov r0, #4
	str r0, [r1]
	// set STARTTX
	ldr r1, =UART_STARTTX
	mov r0, #1
	str r0, [r1]
	// set STARTRX
	ldr r1, =UART_STARTRX
	mov r0, #1
	str r0, [r1]
	// clear RXDRDY
	ldr r1, =UART_RXDRDY
	mov r0, #0
	str r0, [r1]
	// and return
	bx lr

.global _platform_getch
.type _platform_getch, %function
_platform_getch:
	// wait for RXDRDY to be high
	ldr r1, =UART_RXDRDY
1:	ldr r0, [r1]
	cmp r0, #0
	beq 1b
	// clear RXDRDY
	mov r0, #0
	str r0, [r1]
	// read character from RXD
	ldr r1, =UART_RXD
	ldr r0, [r1]
	bx lr

.global _platform_putch
.type _platform_putch, %function
_platform_putch:
	// transmit character through UART_TXD
	ldr r1, =UART_TXD
	str r0, [r1]
	// wait for UART_TXDRDY to be set
	ldr r1, =UART_TXDRDY
1:	ldr r2, [r1]
	cmp r2, #1
	bne 1b
	bx lr