summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2013-07-08 01:34:47 +0000
committerChristian Pointner <equinox@spreadspace.org>2013-07-08 01:34:47 +0000
commit5d5e1d2f9a24ecfea7e1b8a1690da8533cf37f89 (patch)
tree057e7b6d8ce8c8aa507146b2c2e45bbab796bfd4
parentcleaned up code (seperated into generic and specific part) (diff)
moved 16f887 specific commands to include
git-svn-id: https://svn.spreadspace.org/pic/trunk@58 a09c6847-51d9-44de-8ef2-e725cf50f3c7
-rw-r--r--bootloader/bootloader.asm98
-rw-r--r--bootloader/cmds-16f887.inc117
2 files changed, 119 insertions, 96 deletions
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 <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