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/cmds-16f887.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/cmds-16f887.inc')
-rw-r--r-- | software/pic.bootloader/cmds-16f887.inc | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/software/pic.bootloader/cmds-16f887.inc b/software/pic.bootloader/cmds-16f887.inc new file mode 100644 index 0000000..144150e --- /dev/null +++ b/software/pic.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 |