~vdupras/duskos

60e4ee7f21884d0e396f8991252ea034c3f4878d — Virgil Dupras 1 year, 2 months ago 4d28f51
rpi: make kernel code slightly smarter
3 files changed, 17 insertions(+), 18 deletions(-)

M fs/asm/arm.fs
M fs/doc/asm/arm.txt
M fs/xcomp/arm/rpi/kernel.fs
M fs/asm/arm.fs => fs/asm/arm.fs +1 -1
@@ 44,7 44,7 @@
  #? if abort" invalid immediate value" then or $02000000 or ;

\ Single Data Transfer (LDR, STR)
$e4000000 const str)         $e4100000 const ldr)
$e5000000 const str)         $e5100000 const ldr)

: pre) $01000000 or ;
: post) $feffffff and ;

M fs/doc/asm/arm.txt => fs/doc/asm/arm.txt +2 -2
@@ 67,7 67,7 @@ words:
    -i)   op n -- op  Subtract offset "n" from rn)
    +r)   op r -- op  Add offset in register "r" to rn)
    -r)   op r -- op  Subtract offset in register "r" from rn)
    pre)  op -- op    Add offset before transfer
    post) op -- op    Add offset after transfer (default)
    pre)  op -- op    Add offset before transfer (default)
    post) op -- op    Add offset after transfer
    8b)   op -- op    Load/Store operation is 8-bit
    !)    op -- op    Write effective address back to rn)

M fs/xcomp/arm/rpi/kernel.fs => fs/xcomp/arm/rpi/kernel.fs +14 -15
@@ 31,35 31,34 @@ mov) r0 rd) MMIO_BASE i) ,) \ r0 = MMIO_BASE
add) r0 rd) r0 rn) GPIO_BASE i) ,) \ r0 = GPIO_BASE
add) r2 rd) r0 rn) UART0_BASE i) ,) \ r2 = UART0_BASE
\ Disable UART0
add) r3 rd) r2 rn) UART0_CR i) ,) mov) r1 rd) 0 i) ,) str) r1 rd) r3 rn) ,)
mov) r1 rd) 0 i) ,) str) r1 rd) r2 rn) UART0_CR +i) ,)
\ Disable pull up/down for all GPIO pins & delay for 150 cycles.
add) r3 rd) r0 rn) GPPUD i) ,) mov) r1 rd) 0 i) ,) str) r1 rd) r3 rn) ,)
( r1=0 ) str) r1 rd) r0 rn) GPPUD +i) ,)
\ TODO: add delay
\ Disable pull up/down for pin 14,15 & delay for 150 cycles.
add) r3 rd) r0 rn) GPPUDCLK0 i) ,) mov) r1 rd) $c000 i) ,) str) r1 rd) r3 rn) ,)
mov) r1 rd) $c000 i) ,) str) r1 rd) r0 rn) GPPUDCLK0 +i) ,)
\ TODO: add delay
\ Write 0 to GPPUDCLK0 to make it take effect.
add) r3 rd) r0 rn) GPPUDCLK0 i) ,) mov) r1 rd) 0 i) ,) str) r1 rd) r3 rn) ,)
mov) r1 rd) 0 i) ,) str) r1 rd) r0 rn) GPPUDCLK0 +i) ,)
\ Clear pending interrupts.
add) r3 rd) r2 rn) UART0_ICR i) ,) mov) r1 rd) $700 i) ,)
add) r1 rd) r1 rn) $ff i) ,)       str) r1 rd) r3 rn) ,)
mov) r1 rd) $700 i) ,) add) r1 rd) r1 rn) $ff i) ,)
str) r1 rd) r2 rn) UART0_ICR +i) ,)
\ Set integer & fractional part of baud rate.
\ Divider = UART_CLOCK/(16 * Baud)
\ Fraction part register = (Fractional part * 64) + 0.5
\ Baud = 115200.
\ Divider = 3000000 / (16 * 115200) = 1.627 = ~1.
add) r3 rd) r2 rn) UART0_IBRD i) ,) mov) r1 rd) 1 i) ,) str) r1 rd) r3 rn) ,)
mov) r1 rd) 1 i) ,) str) r1 rd) r2 rn) UART0_IBRD +i) ,)
\ Fractional part register = (.627 * 64) + 0.5 = 40.6 = ~40.
add) r3 rd) r2 rn) UART0_FBRD i) ,) mov) r1 rd) 40 i) ,) str) r1 rd) r3 rn) ,)
mov) r1 rd) 40 i) ,) str) r1 rd) r2 rn) UART0_FBRD +i) ,)
\ Enable FIFO & 8 bit data transmission (1 stop bit, no parity).
add) r3 rd) r2 rn) UART0_LCRH i) ,) mov) r1 rd) $70 i) ,) str) r1 rd) r3 rn) ,)
mov) r1 rd) $70 i) ,) str) r1 rd) r2 rn) UART0_LCRH +i) ,)
\ Mask all interrupts.
add) r3 rd) r2 rn) UART0_IMSC i) ,) mov) r1 rd) $700 i) ,)
add) r1 rd) r1 rn) $f2 i) ,)       str) r1 rd) r3 rn) ,)
mov) r1 rd) $700 i) ,) add) r1 rd) r1 rn) $f2 i) ,)
str) r1 rd) r2 rn) UART0_IMSC +i) ,)
\ Enable UART0, receive & transfer part of UART.
add) r3 rd) r2 rn) UART0_CR i) ,) mov) r1 rd) $300 i) ,)
add) r1 rd) r1 rn) $01 i) ,)       str) r1 rd) r3 rn) ,)
mov) r1 rd) $300 i) ,) add) r1 rd) r1 rn) $01 i) ,)
str) r1 rd) r2 rn) UART0_CR +i) ,)


add) r3 rd) r2 rn) UART0_DR i) ,) mov) r1 rd) 'X' i) ,) str) r1 rd) r3 rn) ,)
mov) r1 rd) 'X' i) ,) str) r1 rd) r2 rn) UART0_DR +i) ,)
$eafffffe , \ hardcoded "b -2"