summaryrefslogtreecommitdiff
path: root/bootloader/cmds-16f887.inc
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader/cmds-16f887.inc')
-rw-r--r--bootloader/cmds-16f887.inc117
1 files changed, 117 insertions, 0 deletions
diff --git a/bootloader/cmds-16f887.inc b/bootloader/cmds-16f887.inc
new file mode 100644
index 0000000..144150e
--- /dev/null
+++ b/bootloader/cmds-16f887.inc
@@ -0,0 +1,117 @@
+ ;;
+ ;; 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/>.
+ ;;
+
+ ;; flash read --------
+cmd_r_flash
+ movlw FSS ; initialize EEADR:EEADRH and FSR
+ movwf cnt
+ movlw b'01011000'
+ movwf STATUS
+ movlw combuff + .2
+ movwf FSR
+ movf INDF,w
+ movwf EEADR
+ incf FSR,f
+ movf INDF,w
+ movwf EEADRH
+read_flash_segment_loop
+ bsf STATUS,RP0 ; perform the actual read
+ bsf EECON1,EEPGD
+ bsf EECON1,RD
+ nop
+ nop
+ bcf STATUS,RP0
+ movf EEDAT,w ; load code word from EEDAT:EEDATH to combuff
+ movwf INDF
+ incf FSR,f
+ movf EEDATH,w
+ movwf INDF
+ incf FSR,f
+ incfsz EEADR,f ; increment flash address
+ goto read_flash_segment_next
+ incf EEADRH,f
+read_flash_segment_next
+ decfsz cnt,f
+ goto read_flash_segment_loop
+ bcf STATUS,RP1
+ clrf combuff + .2 ; = E_OK
+ movlw .1 + .2*FSS ; bytes to send
+ call send_answer
+ goto wait_new_cmd
+
+ ;; flash write --------
+cmd_w_flash
+ movf combuff + .3,f ; if addr[15:8] == 0 -> boot loader section
+ btfsc STATUS,Z
+ 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
+ movlw b'01011000'
+ movwf STATUS
+ movlw combuff + .2
+ movwf FSR
+ movf INDF,w
+ movwf EEADR
+ incf FSR,f
+ movf INDF,w
+ movwf EEADRH
+
+write_flash_segment_loop
+ incf FSR,f ; load code word into EEDAT:EEDATH
+ movf INDF,w
+ movwf EEDAT
+ incf FSR,f
+ movf INDF,w
+ movwf EEDATH
+
+ bsf STATUS,RP0 ; now start the acutal write sequence
+ bsf EECON1,EEPGD
+ bsf EECON1,WREN
+ movlw H'55'
+ movwf EECON2
+ movlw H'AA'
+ movwf EECON2
+ bsf EECON1,WR
+ nop
+ nop
+ bcf EECON1,WREN
+ bcf STATUS,RP0
+ incfsz EEADR,f ; increment flash address
+ goto write_flash_segment_next
+ incf EEADRH,f
+write_flash_segment_next
+ decfsz cnt,f
+ goto write_flash_segment_loop
+ bsf STATUS,RP0
+ clrw ; check if a write error occured
+ btfsc EECON1,WRERR
+ movlw E_FLASH_WERR
+ bcf STATUS,RP1
+ bcf STATUS,RP0
+ movwf combuff + .2 ; = E_OK
+ movlw .1 ; bytes to send
+ call send_answer
+ goto wait_new_cmd