summaryrefslogtreecommitdiff
path: root/software/pic.bootloader/cmds-16f1847.inc
diff options
context:
space:
mode:
Diffstat (limited to 'software/pic.bootloader/cmds-16f1847.inc')
-rw-r--r--software/pic.bootloader/cmds-16f1847.inc167
1 files changed, 167 insertions, 0 deletions
diff --git a/software/pic.bootloader/cmds-16f1847.inc b/software/pic.bootloader/cmds-16f1847.inc
new file mode 100644
index 0000000..bed54b9
--- /dev/null
+++ b/software/pic.bootloader/cmds-16f1847.inc
@@ -0,0 +1,167 @@
+ ;;
+ ;; spreadspace pic utils
+ ;;
+ ;;
+ ;; Copyright (C) 2011-2013 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/>.
+ ;;
+
+ ;; flash read --------
+cmd_reset
+ movlw E_OK
+ call ack_cmd
+ movlb .3
+cmd_resset_wait_ack
+ btfss TXSTA,TRMT
+ goto cmd_resset_wait_ack
+ reset
+
+ ;; flash read --------
+cmd_r_flash
+ movlw FSS ; initialize EEADR:EEADRH and FSR
+ movwf cnt
+ movlb .3
+ movlw combuff + .2
+ movwf FSR
+ movf INDF,w
+ movwf EEADRL
+ incf FSR,f
+ movf INDF,w
+ movwf EEADRH
+read_flash_segment_loop
+ bcf EECON1,CFGS ; perform the actual read
+ bsf EECON1,EEPGD
+ bsf EECON1,RD
+ nop
+ nop
+ movf EEDATL,w ; load code word from EEDAT:EEDATH to combuff
+ movwf INDF
+ incf FSR,f
+ movf EEDATH,w
+ movwf INDF
+ incf FSR,f
+ incfsz EEADRL,f ; increment flash address
+ goto read_flash_segment_next
+ incf EEADRH,f
+read_flash_segment_next
+ decfsz cnt,f
+ goto read_flash_segment_loop
+ movlb .0
+ clrf combuff + .2 ; = E_OK
+ movlw .1 + .2*FSS ; bytes to send
+ call send_answer
+ goto wait_new_cmd
+
+ ;; flash write --------
+cmd_w_flash
+ movlw .2 ; if addr[15:8] < 2 -> boot loader section
+ subwf combuff + .3,w
+ btfss STATUS,C
+ goto address_prohibited
+ movlw FLASH_BOUNDARY ; addr on boundary?
+ andwf combuff + .2,w
+ btfss STATUS,Z
+ goto address_invalid
+ movlw FSS ; initialize EEADR:EEADRH and FSR
+ movwf cnt
+ movlb .3
+ movlw combuff + .2
+ movwf FSR
+ movf INDF,w
+ movwf EEADRL
+ incf FSR,f
+ movf INDF,w
+ movwf EEADRH
+ bcf EECON1,CFGS
+ bsf EECON1,EEPGD
+ bsf EECON1,WREN
+
+write_flash_segment_loop
+ incf FSR,f ; load code word into EEDAT:EEDATH
+ movf INDF,w
+ movwf EEDATL
+ incf FSR,f
+ movf INDF,w
+ movwf EEDATH
+
+ bsf EECON1,FREE ; erase row before writing
+ movlw H'55'
+ movwf EECON2
+ movlw H'AA'
+ movwf EECON2
+ bsf EECON1,WR
+ nop
+ nop
+ bcf EECON1,FREE ; now start the acutal write sequence
+ movf EEADRL,w
+ andlw FLASH_BOUNDARY
+ xorlw FLASH_BOUNDARY
+ btfss STATUS,Z
+ bsf EECON1,LWLO
+ btfsc STATUS,Z
+ bcf EECON1,LWLO
+ movlw H'55'
+ movwf EECON2
+ movlw H'AA'
+ movwf EECON2
+ bsf EECON1,WR
+ nop
+ nop
+ incfsz EEADRL,f ; increment flash address
+ goto write_flash_segment_next
+ incf EEADRH,f
+write_flash_segment_next
+ decfsz cnt,f
+ goto write_flash_segment_loop
+
+ bcf EECON1,WREN
+ movlw E_OK ; check if a write error occured
+ btfsc EECON1,WRERR
+ movlw E_FLASH_WERR
+ movlb .0
+ movwf combuff + .2 ; = E_OK or write error
+ movlw .1 ; bytes to send
+ call send_answer
+ goto wait_new_cmd
+
+ ;; read config --------
+cmd_r_config
+ movf combuff + .2,w
+ sublw CFG - .1
+ btfss STATUS,C
+ goto address_invalid
+ movf combuff + .2,w
+ movlb .3
+ addlw CONFIG_OFFSET
+ movwf EEADRL
+ clrf EEADRH
+ bsf EECON1,CFGS
+ bsf EECON1,RD
+ nop
+ nop
+ movf EEDATL,w
+ movlb .0
+ movwf combuff + .3
+ movlb .3
+ movf EEDATH,w
+ movlb .0
+ movwf combuff + .4
+ movlw E_OK
+ movwf combuff + .2 ; = E_OK
+ movlw .3 ; bytes to send
+ call send_answer
+ goto wait_new_cmd