summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bootloader/bootloader.asm104
1 files changed, 91 insertions, 13 deletions
diff --git a/bootloader/bootloader.asm b/bootloader/bootloader.asm
index eacc30b..c99f337 100644
--- a/bootloader/bootloader.asm
+++ b/bootloader/bootloader.asm
@@ -29,32 +29,110 @@
;; -------------------------------------
;; DEFINES
-#define BOOTPIN PORTC,7
-USERVECT EQU H'100'
-ISRVECT EQU USERVECT + H'4'
+#define BOOTPIN PORTC,7
+USERVECT EQU H'100'
+ISRVECT EQU USERVECT + H'4'
+FSS EQU 8
+
+E_OK EQU 0
+E_INV_CMD EQU 1
+E_BAD_CSUM EQU 2
+E_NOT_IMPL EQU 3
+E_FLASH_WERR EQU 4
+E_ADDR_INVALID EQU 5
+E_ADDR_PROHIB EQU 6
+
+CMD_IDENTIFY EQU 'i'
+CMD_BOOT EQU 'b'
+CMD_RESET EQU 'r'
+CMD_R_FLASH EQU 'f'
+CMD_W_FLASH EQU 'F'
+CMD_R_EEPROM EQU 'e'
+CMD_W_EEPROM EQU 'E'
+CMD_R_CONFIG EQU 'c'
+CMD_W_CONFIG EQU 'C'
+
;; -------------------------------------
;; Boot test
- org 0
- btfsc BOOTPIN
- goto USERVECT
- goto boot
- org 4
+ org 0
+ btfsc BOOTPIN
+ goto USERVECT
+ goto boot
;; -------------------------------------
;; goto user ISR
+ org 4
isr
- goto ISRVECT
+ goto ISRVECT
;; -------------------------------------
- ;; Bootloader
+ ;; Bootloader (Subroutines)
+uart_tx_byte
+ btfss PIR1,TXIF
+ goto uart_tx_byte
+ movwf TXREG
+ return
+
+ ;; -------------------------------------
+ ;; Bootloader (init)
boot
- goto USERVECT
+ ;; bank 3
+ bsf STATUS,RP0
+ bsf STATUS,RP1
+ ;; movlw b'00001000' ; TX non-inverted, 16bit Baudrate, no auto baud detect
+ movlw b'00011000' ; TX inverted, 16bit Baudrate, no auto baud detect
+ movwf BAUDCTL
+
+ ;; bank 1
+ bcf STATUS,RP1
+ movlw b'00100100' ; Baudrate = High Speed, async mode, transmit enabled, 8bit
+ movwf TXSTA
+ movlw .34 ; Baudrate = 57600 (@ 8MHz) -> -0,79 % Error
+ ;; movlw .51 ; Baudrate = 38400 (@ 8MHz) -> -0,002 % Error
+ ;; movlw .103 ; Baudrate = 19200 (@ 8MHz) -> 0,16 % Error
+ movwf SPBRG
+ clrf SPBRGH
+
+ ;; bank 0
+ bcf STATUS,RP0
+ movlw b'10010000' ; enable Serial Port, 8bit, enable continues receive, disable address detection
+ movwf RCSTA
+
+
+wait_cmd
+ btfsc PIR1,RCIF
+ goto uart_rx_byte
+ btfss RCSTA,OERR
+ goto uart_rx_oe
+ goto wait_cmd
+
+uart_rx_oe
+ bcf RCSTA,CREN
+ bsf RCSTA,CREN
+ goto wait_cmd
+
+uart_rx_byte
+ btfsc RCSTA,FERR
+ goto uart_rx_fe
+ movf RCREG,w ; TODO: check parity??
+ movwf TMP ; TODO: move to input string
+ ;; TODO: check if command is finished and jump
+ ;; to 'exec_cmd'
+ return
+
+uart_rx_fe
+ movf RCREG,w
+ goto wait_cmd
+
+exec_cmd
+ ;; TODO: execute received command
+ goto USERVECT
;; -------------------------------------
;; dummy user code
- org USERVECT
- goto USERVECT
+ org USERVECT
+ goto USERVECT
;; -------------------------------------
;; END