diff options
Diffstat (limited to 'software/pic.bootloader/cmds-16f1847.inc')
-rw-r--r-- | software/pic.bootloader/cmds-16f1847.inc | 167 |
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 |