From 5d5e1d2f9a24ecfea7e1b8a1690da8533cf37f89 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 8 Jul 2013 01:34:47 +0000 Subject: moved 16f887 specific commands to include git-svn-id: https://svn.spreadspace.org/pic/trunk@58 a09c6847-51d9-44de-8ef2-e725cf50f3c7 --- bootloader/bootloader.asm | 98 +------------------------------------ bootloader/cmds-16f887.inc | 117 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 96 deletions(-) create mode 100644 bootloader/cmds-16f887.inc (limited to 'bootloader') diff --git a/bootloader/bootloader.asm b/bootloader/bootloader.asm index 56d7eed..d0ad073 100644 --- a/bootloader/bootloader.asm +++ b/bootloader/bootloader.asm @@ -73,7 +73,7 @@ cnt EQU H'007F' ;; ------------------------------------- - ;; DEFINES (generic defines) + ;; DEFINES (defines) ;; ERROR codes E_OK EQU .0 E_INV_CMD EQU .1 @@ -356,101 +356,7 @@ cmd_not_impl ;; ------------------------------------- ;; chip specific commands - ;; 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 +#include "cmds-16f887.inc" ;; ------------------------------------- ;; ------------------------------------- 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 + ;; + ;; 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 . + ;; + + ;; 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 -- cgit v1.2.3