/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,
// set pin 25 to IN
ldr r1, =GPIO_DIRCLR
lsl r0, #1
str r0,
// set PINCNF to pull up
ldr r1, =GPIO_PINCNF24
mov r2, #0xc
ldr r0,
orr r0, r2
str r0,
// set PINCNF to pull up
ldr r1, =GPIO_PINCNF25
ldr r0,
orr r0, r2
str r0,
// set CONFIG to 0
ldr r1, =UART_CONFIG
mov r0, #0
str r0,
// set BAUDRATE to 115200
ldr r1, =UART_BAUDRATE
ldr r0, =0x01D7E000
str r0,
// set PSELTXD
ldr r1, =UART_PSELTXD
mov r0, #24
str r0,
// set PSELRXD
ldr r1, =UART_PSELRXD
mov r0, #25
str r0,
// enable UART
ldr r1, =UART_ENABLE
mov r0, #4
str r0,
// set STARTTX
ldr r1, =UART_STARTTX
mov r0, #1
str r0,
// set STARTRX
ldr r1, =UART_STARTRX
mov r0, #1
str r0,
// clear RXDRDY
ldr r1, =UART_RXDRDY
mov r0, #0
str r0,
// 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,
cmp r0, #0
beq 1b
// clear RXDRDY
mov r0, #0
str r0,
// read character from RXD
ldr r1, =UART_RXD
ldr r0,
bx lr
.global _platform_putch
.type _platform_putch, %function
_platform_putch:
// transmit character through UART_TXD
ldr r1, =UART_TXD
str r0,
// wait for UART_TXDRDY to be set
ldr r1, =UART_TXDRDY
1: ldr r2,
cmp r2, #1
bne 1b
bx lr