;; ;; 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_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