;; ;; 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_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 ;; 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 g;; 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 movlw E_NOT_IMPL call ack_cmd 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 movlw E_NOT_IMPL call ack_cmd goto wait_new_cmd