From 82c90d70279c9522520f864daa72156fdacf38b1 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 7 Jul 2013 02:46:24 +0000 Subject: bootloader now checks csum git-svn-id: https://svn.spreadspace.org/pic/trunk@47 a09c6847-51d9-44de-8ef2-e725cf50f3c7 --- bootloader/bootloader.asm | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'bootloader/bootloader.asm') diff --git a/bootloader/bootloader.asm b/bootloader/bootloader.asm index ff23d61..6df5906 100644 --- a/bootloader/bootloader.asm +++ b/bootloader/bootloader.asm @@ -66,6 +66,7 @@ CMD_R_CONFIG EQU .8 CMD_W_CONFIG EQU .9 CMD_MAX EQU .9 +CMD_MIN_LEN EQU .3 ;; Variables combuff EQU H'0020' @@ -75,7 +76,7 @@ current_cmdlen EQU H'0070' csum EQU H'0071' flags EQU H'007D' -#define F_NEW_CMD flags,0 +#define F_CMD_STARTED flags,0 cnt2 EQU H'007E' cnt1 EQU H'007F' @@ -186,7 +187,7 @@ uart_rx_byte ; process received command movf RCREG,w movwf INDF incf FSR,f - btfss F_NEW_CMD + btfss F_CMD_STARTED goto wait_cmd_len movf current_cmdlen,f btfsc STATUS,Z @@ -200,7 +201,7 @@ uart_rx_fe ; recover from framing error goto wait_new_cmd wait_cmd_len - bsf F_NEW_CMD + bsf F_CMD_STARTED goto wait_cmd new_cmd ; got new command code @@ -208,13 +209,15 @@ new_cmd ; got new command code sublw CMD_MAX btfss STATUS,C goto invalid_cmd - decfsz combuff + .1,w - goto load_cmdlen + movlw CMD_MIN_LEN ; check for minimum command len + subwf combuff + .1,w + btfss STATUS,C goto invalid_cmd -load_cmdlen + movlw .2 ; 2 bytes already received + subwf combuff + .1,w movwf current_cmdlen - decfsz current_cmdlen,f goto wait_cmd + invalid_cmd ; received command code is not known or len is bogus movlw E_INV_CMD movwf combuff + .2 @@ -222,9 +225,23 @@ invalid_cmd ; received command code is not known or len is bogus call send_answer goto wait_new_cmd -exec_cmd ; command is correct and complete - ;; TODO: check csum - movf combuff,w ; dispatch commands +exec_cmd ; command is complete -> check csum + movlw combuff + movwf FSR + movf combuff + .1,w + movwf cnt1 + clrf csum +exec_cmd_check_csum + movf INDF,w + xorwf csum,f + incf FSR,f + decfsz cnt1,f + goto exec_cmd_check_csum + movf csum,f + btfss STATUS,Z + goto csum_error + + movf combuff,w ; command is correct and complete -> dispatch addwf PCL,f goto wait_new_cmd goto cmd_identify ; identify @@ -237,6 +254,13 @@ exec_cmd ; command is correct and complete goto cmd_not_impl ; read config goto cmd_not_impl ; write config +csum_error ; received command has an invalid check sum + movlw E_BAD_CSUM + movwf combuff + .2 + movlw .1 + call send_answer + goto wait_new_cmd + ;; ** Command Handlers ******************** ;; ** identify ******* cmd_identify -- cgit v1.2.3