;; ;; spreadspace pic utils ;; ;; ;; Copyright (C) 2011-2013 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 incf EEADR,f ; increment flash address (no need to increment EEADRH -> flash bondaries!) decfsz cnt,f goto write_flash_segment_loop bsf STATUS,RP0 movlw E_OK ; check if a write error occured btfsc EECON1,WRERR movlw E_FLASH_WERR bcf STATUS,RP1 bcf STATUS,RP0 movwf combuff + .2 ; = E_OK or Write Error movlw .1 ; bytes to send call send_answer goto wait_new_cmd