diff options
author | Christian Pointner <equinox@mur.at> | 2013-07-10 03:57:48 +0000 |
---|---|---|
committer | Christian Pointner <equinox@mur.at> | 2013-07-10 03:57:48 +0000 |
commit | 297ac49867b750bfeeeca3a354619c527468cc41 (patch) | |
tree | 25a2964671a5fa0a273dc56c5b9ac30ec0e28d17 /software/pic.bootloader/generic-mainloop.inc | |
parent | fixed comment (diff) |
added bootloader for IHU
git-svn-id: https://svn.spreadspace.org/mur.sat@807 7de4ea59-55d0-425e-a1af-a3118ea81d4c
Diffstat (limited to 'software/pic.bootloader/generic-mainloop.inc')
-rw-r--r-- | software/pic.bootloader/generic-mainloop.inc | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/software/pic.bootloader/generic-mainloop.inc b/software/pic.bootloader/generic-mainloop.inc new file mode 100644 index 0000000..1e93648 --- /dev/null +++ b/software/pic.bootloader/generic-mainloop.inc @@ -0,0 +1,174 @@ + ;; + ;; spreadspace pic utils + ;; + ;; + ;; Copyright (C) 2011 Christian Pointner <equinox@spreadspace.org> + ;; + ;; This file is part of spreadspace pic utils. + ;; + ;; spreadspace pic utils is free software: you can redistribute it and/or modify + ;; it under the terms of the GNU General Public License as published by + ;; the Free Software Foundation, either version 3 of the License, or + ;; any later version. + ;; + ;; spreadspace pic utils is distributed in the hope that it will be useful, + ;; but WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ;; GNU General Public License for more details. + ;; + ;; You should have received a copy of the GNU General Public License + ;; along with spreadspace pic utils. If not, see <http://www.gnu.org/licenses/>. + ;; + +wait_new_cmd + movlw combuff + movwf FSR + clrf combuff + clrf current_cmdlen + clrf flags + +wait_cmd + call com_rx_byte + movwf INDF ; process received byte + incf FSR,f + btfss F_CMD_STARTED + goto wait_cmd_len + movf current_cmdlen,f + btfsc STATUS,Z + goto new_cmd + decfsz current_cmdlen,f + goto wait_cmd + goto exec_cmd + +wait_cmd_len ; command code received, now wait for length + bsf F_CMD_STARTED + goto wait_cmd + +new_cmd ; got new command code and length -> check it + movf combuff,w + sublw CMD_MAX + btfss STATUS,C + goto invalid_cmd + movlw CMD_MIN_LEN ; check for minimum command len + subwf combuff + .1,w + btfss STATUS,C + goto invalid_cmd + movlw .2 ; 2 bytes already received + subwf combuff + .1,w + movwf current_cmdlen + goto wait_cmd + +exec_cmd ; command is complete -> check csum + movlw combuff + movwf FSR + movf combuff + .1,w + movwf cnt + clrf csum +exec_cmd_check_csum + movf INDF,w + xorwf csum,f + incf FSR,f + decfsz cnt,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 + goto cmd_boot ; boot + goto HOOK_CMD_RESET ; reset + goto HOOK_CMD_R_FLASH ; read flash segment + goto HOOK_CMD_W_FLASH ; write flash segment + goto HOOK_CMD_R_EEPROM ; read eeprom + goto HOOK_CMD_W_EEPROM ; write eeprom + goto HOOK_CMD_R_CONFIG ; read config + goto HOOK_CMD_R_CONFIG ; write config + + ;; ** generic error messages ******* +invalid_cmd ; received command code is not known or len is bogus + movlw E_INV_CMD + call ack_cmd + goto wait_new_cmd + +csum_error ; received command has an invalid check sum + movlw E_BAD_CSUM + call ack_cmd + goto wait_new_cmd + +address_invalid ; received command uses invalid address (i.e. not aligned to 16bytes) + movlw E_ADDR_INVALID + call ack_cmd + goto wait_new_cmd + +address_prohibited ; received command uses prohibited address (i.e. FLASH < 0x100) + movlw E_ADDR_PROHIB + call ack_cmd + goto wait_new_cmd + + ;; ** generic command handlers ************ + ;; ** identify ******* +cmd_identify + clrf csum + movf combuff,w + call com_tx_byte + + movlw .19 + call com_tx_byte + + movlw E_OK + call com_tx_byte + + movlw VERSION_MIN + call com_tx_byte + movlw VERSION_MAJ + call com_tx_byte + + movlw NAME_0 + call com_tx_byte + movlw NAME_1 + call com_tx_byte + movlw NAME_2 + call com_tx_byte + + movlw DEVID_L + call com_tx_byte + movlw DEVID_H + call com_tx_byte + + movlw FLASH_SIZE_L + call com_tx_byte + movlw FLASH_SIZE_H + call com_tx_byte + movlw FSS + call com_tx_byte + + movlw EEPROM_SIZE_L + call com_tx_byte + movlw EEPROM_SIZE_H + call com_tx_byte + movlw MESS + call com_tx_byte + + movlw SUPPORTED_L + call com_tx_byte + movlw SUPPORTED_H + call com_tx_byte + + movf csum,w + call com_tx_byte + goto wait_new_cmd + + ;; ** boot ******* +cmd_boot + movlw E_OK + call ack_cmd + goto USERVECT + + ;; ** not implemented commands ******* +cmd_not_impl + movlw E_NOT_IMPL + call ack_cmd + goto wait_new_cmd |