1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
;;
;; 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_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
|