Many changes from 2018
[owSlave2.git] / common / OWDS2423.S
1 // Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
2 // All rights reserved. \r
3 // \r
4 // Redistribution and use in source and binary forms, with or without \r
5 // modification, are permitted provided that the following conditions are \r
6 // met: \r
7 // \r
8 //  * Redistributions of source code must retain the above copyright \r
9 //    notice, this list of conditions and the following disclaimer. \r
10 //  * Redistributions in binary form must reproduce the above copyright \r
11 //    notice, this list of conditions and the following disclaimer in the \r
12 //    documentation and/or other materials provided with the \r
13 //    distribution. \r
14 //  * All advertising materials mentioning features or use of this \r
15 //    software must display the following acknowledgement: This product \r
16 //    includes software developed by tm3d.de and its contributors. \r
17 //  * Neither the name of tm3d.de nor the names of its contributors may \r
18 //    be used to endorse or promote products derived from this software \r
19 //    without specific prior written permission. \r
20 // \r
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \r
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \r
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
32 \r
33 //#define __4MHZ__\r
34 #define _CHANGEABLE_ID_\r
35 #define _ZERO_POLLING_\r
36 //#define _DB_\r
37 #include "../common/OWConfig.s"\r
38 #include "../common/OWCRC16.s"\r
39 \r
40 .extern pack,45\r
41 .extern counters,16\r
42 \r
43 .macro CHIP_INIT        \r
44 .endm\r
45 \r
46 .macro COMMAND_TABLE\r
47                 rjmp h_writescratchpad\r
48                 rjmp h_writescratchpad_crc\r
49                 rjmp h_readscratchpad\r
50                 rjmp h_copyscratchpad\r
51                 rjmp h_readmemory_addr\r
52                 rjmp h_readmemory\r
53                 rjmp h_readmemorycounter_addr\r
54                 rjmp h_readmemorycounter\r
55                 rjmp h_readmemorycounter_ex\r
56 .endm\r
57 \r
58 #include "../common/OWRomFunctions.s"\r
59 #include "../common/OWTimerInterrupt.s"\r
60 \r
61 \r
62 \r
63 ; Ab hier Geraeteabhaenging\r
64 #define OW_WRITE_SCRATCHPAD OW_FIRST_COMMAND+0\r
65 #define OW_WRITE_SCRATCHPAD_CRC OW_FIRST_COMMAND+1\r
66 #define OW_READ_SCRATCHPAD OW_FIRST_COMMAND+2\r
67 #define OW_COPY_SCRATCHPAD OW_FIRST_COMMAND+3\r
68 #define OW_READ_MEMORY_ADDR OW_FIRST_COMMAND+4\r
69 #define OW_READ_MEMORY OW_FIRST_COMMAND+5\r
70 #define OW_READ_MEMORYCOUNTER_ADDR OW_FIRST_COMMAND+6\r
71 #define OW_READ_MEMORYCOUNTER OW_FIRST_COMMAND+7\r
72 #define OW_READ_MEMORYCOUNTER_EX OW_FIRST_COMMAND+8\r
73 \r
74 ;---------------------------------------------------\r
75 ;       READ COMMAND and start operation\r
76 ;---------------------------------------------------\r
77 \r
78 \r
79 h_readcommand:\r
80         clr r_bytep\r
81 #ifndef _DIS_FLASH_\r
82         FLASH_COMMANDS ; muss zu erst sein....\r
83 #endif\r
84         cset 0x0F,OW_WRITE_SCRATCHPAD\r
85         cjmp 0xAA,hrc_set_readscratchpad\r
86         cset 0x5A,OW_COPY_SCRATCHPAD\r
87         cset 0xF0,OW_READ_MEMORY_ADDR\r
88         cset 0xA5,OW_READ_MEMORYCOUNTER_ADDR\r
89         FW_CONFIG_INFO\r
90 #ifdef _CHANGEABLE_ID_\r
91         CHANGE_ID_COMMANDS\r
92 #endif\r
93         ldi r_mode,OW_SLEEP\r
94         rjmp handle_end\r
95 \r
96 hrc_set_readscratchpad:\r
97         ldi r_mode,OW_READ_SCRATCHPAD\r
98         ldi r_sendflag,1\r
99         rjmp h_readscratchpad\r
100 \r
101 h_writescratchpad:\r
102         configZ pack,r_bytep\r
103         inc  r_bytep\r
104         st   Z,r_rwbyte\r
105         cpi  r_bytep,2\r
106         breq h_writescratchpad_block\r
107         brsh h_writescratchpad_set_eoffset ;;33\r
108         rjmp handle_end  ;handle_end zu weit entfernt fuer br...\r
109 h_writescratchpad_set_eoffset:\r
110         cpi  r_bytep,35\r
111         breq h_writescratchpad_setcrc\r
112         mov r_temp,r_bytep\r
113         subi r_temp,4\r
114         sts pack+2,r_temp ;AA und PF cleared\r
115         rjmp handle_end\r
116 ;Start writeing to 32 Byte Block ; skip status byte     \r
117 h_writescratchpad_block:\r
118         lds r_temp,pack ; Adresse low byte\r
119         andi r_temp,0x1F ;32 byte\r
120         add r_bytep,r_temp ;Zur angegebenen Startadresse springen\r
121         ;ori r_temp,0x20 ; Set PF flag\r
122         sts pack+2,r_temp  ;E4:E0 vorher setzen\r
123         ; Byte 3 ueberspringen\r
124         rjmp handle_end_inc\r
125 \r
126 h_writescratchpad_setcrc:\r
127         ;copy crc to pack\r
128         lds r_temp,crc\r
129         com r_temp\r
130         sts pack+43,r_temp\r
131         lds r_temp,crc+1\r
132         com r_temp ; invertieren , komischer name.....\r
133         sts pack+44,r_temp\r
134         ldi  r_mode,OW_WRITE_SCRATCHPAD_CRC\r
135         ldi r_sendflag,1\r
136         ldi r_bytep,43\r
137 h_writescratchpad_crc:\r
138         cpi r_bytep,45\r
139         breq h_writescratchpad_crc_end\r
140         configZ pack,r_bytep\r
141         ld r_rwbyte,Z\r
142         rjmp handle_end_inc\r
143 h_writescratchpad_crc_end:\r
144         rjmp handle_end_sleep\r
145         \r
146         \r
147 h_readscratchpad:\r
148         cpi r_bytep,35\r
149         breq h_readscratchpad_end\r
150         cpi r_bytep,3\r
151         brne h_readscratchpad_read_byte\r
152 h_readscratchpad_set_offset:\r
153         lds r_temp,pack\r
154         andi r_temp,0x1F\r
155         ldi r_temp2,3\r
156         add r_temp,r_temp2\r
157         mov r_bytep,r_temp\r
158 h_readscratchpad_read_byte:\r
159         configZ pack,r_bytep\r
160         ld r_rwbyte,Z\r
161         rjmp handle_end_inc\r
162 h_readscratchpad_end:\r
163         rjmp handle_end_sleep\r
164 \r
165 \r
166 \r
167 h_copyscratchpad:\r
168         cpi  r_bytep,3\r
169         brsh h_copyscratchpad_ok\r
170         configZ pack,r_bytep\r
171         inc  r_bytep\r
172         ld   r_temp,Z\r
173         cp r_temp,r_rwbyte\r
174         brne h_copyscratchpad_nok\r
175         cpi  r_bytep,3\r
176         breq h_copyscratchpad_ok\r
177         ldi  r_bcount,1 \r
178         rjmp handle_end\r
179 h_copyscratchpad_ok:\r
180         ldi r_rwbyte,0xAA\r
181         ldi r_sendflag,1\r
182         rjmp handle_end\r
183 h_copyscratchpad_nok:\r
184         lds r_temp,pack+3\r
185         andi r_temp,~0x80\r
186         sts pack+3,r_temp\r
187         rjmp handle_end_sleep\r
188 \r
189 \r
190 h_readmemory_addr:\r
191         cpi r_bytep,0\r
192         brne h_readmrmory_addr_byte1\r
193         sts pack,r_rwbyte\r
194         rjmp handle_end_inc\r
195 h_readmrmory_addr_byte1:\r
196         sts pack+1,r_rwbyte\r
197         ldi r_mode,OW_READ_MEMORY\r
198         ldi r_sendflag,1\r
199         clr r_bytep\r
200         rjmp h_readmemory2\r
201 h_readmemory:\r
202         lds r_bytep,pack\r
203         lds r_temp2,pack+1\r
204         inc r_bytep\r
205         clr r_temp\r
206         adc r_temp2,r_temp\r
207         sbrc r_temp2,1\r
208         rjmp h_readmemory_end\r
209         sts pack+1,r_temp\r
210         sts pack,r_bytep\r
211 h_readmemory2:\r
212         lds r_bytep,pack\r
213         andi r_bytep,0x1F\r
214         configZ pack+3,r_bytep\r
215         ld   r_rwbyte,Z\r
216         rjmp handle_end\r
217 h_readmemory_end:\r
218         rjmp handle_end_sleep\r
219 \r
220 \r
221 \r
222 \r
223 \r
224 \r
225 \r
226 \r
227 h_readmemorycounter_addr:\r
228         cpi r_bytep,0\r
229         brne h_readmrmorycounter_addr_byte1\r
230         sts pack,r_rwbyte\r
231         inc r_bytep\r
232         ;ldi r_bcount,1\r
233         rjmp handle_end\r
234 h_readmrmorycounter_addr_byte1:\r
235         sts pack+1,r_rwbyte\r
236         ldi r_mode,OW_READ_MEMORYCOUNTER\r
237         ;ldi r_bcount,1 \r
238         ldi r_sendflag,1\r
239         clr r_bytep\r
240         rjmp h_readmemorycounter2\r
241 h_readmemorycounter:\r
242         lds r_bytep,pack\r
243         lds r_temp2,pack+1\r
244         ldi r_temp,1  ;inc leider kein c flag\r
245         add r_bytep,r_temp\r
246         clr r_temp\r
247         adc r_temp2,r_temp\r
248         mov r_temp,r_bytep\r
249         andi r_temp,0x1F\r
250         breq h_readmemorycounter_next\r
251         sts pack+1,r_temp2\r
252         sts pack,r_bytep\r
253 h_readmemorycounter2:  ;Lesen von dem worauf die erstenzwei bytes zeigen\r
254         lds r_bytep,pack\r
255         andi r_bytep,0x1F\r
256         configZ pack+3,r_bytep\r
257         ld   r_rwbyte,Z\r
258         ;ldi r_bcount,1\r
259         rjmp handle_end\r
260 //h_readmemorycounter_end:\r
261 //      ldi  r_mode,OW_SLEEP\r
262 //      clr r_sendflag\r
263 //      rjmp handle_end\r
264 h_readmemorycounter_next:  ; rest lesen\r
265         ldi  r_mode,OW_READ_MEMORYCOUNTER_EX\r
266         ldi r_bytep,34\r
267         lds r_temp2,pack\r
268         lds r_temp,pack+1\r
269         //lsr r_temp\r
270         //ror r_temp2\r
271 \r
272         lsl r_temp2\r
273         rol r_temp\r
274         cpi r_temp,3\r
275         brne h_readmemorycounter_cFF\r
276         andi r_temp2,0xC0\r
277         swap r_temp2\r
278 \r
279         ;cpi r_temp,0xE0\r
280 \r
281         configZ counters,r_temp2\r
282         ld r_temp,Z+\r
283         sts pack+35,r_temp      \r
284         ld r_temp,Z+\r
285         sts pack+36,r_temp      \r
286         ld r_temp,Z+\r
287         sts pack+37,r_temp      \r
288         ld r_temp,Z+\r
289         sts pack+38,r_temp      \r
290         rjmp h_readmemorycounter_ex\r
291 h_readmemorycounter_cFF:\r
292         ldi r_temp,0xFF\r
293         sts pack+35,r_temp      \r
294         sts pack+36,r_temp      \r
295         sts pack+37,r_temp      \r
296         sts pack+38,r_temp      \r
297 \r
298 h_readmemorycounter_ex:\r
299         inc r_bytep\r
300         cpi r_bytep,45\r
301         breq h_readmemorycounter_ex_end\r
302         cpi r_bytep,43\r
303         brne h_readmemorycounter_ex2\r
304         lds r_temp,crc\r
305         com r_temp\r
306         sts pack+43,r_temp\r
307         lds r_temp,crc+1\r
308         com r_temp\r
309         sts pack+44,r_temp\r
310 h_readmemorycounter_ex2:\r
311         ;ldi r_bcount,1\r
312         configZ pack,r_bytep\r
313         ld   r_rwbyte,Z\r
314         rjmp handle_end\r
315 h_readmemorycounter_ex_end:\r
316         lds r_bytep,pack\r
317         lds r_temp2,pack+1\r
318         ldi r_temp,1  ;inc leider kein c flag\r
319         add r_bytep,r_temp\r
320         clr r_temp\r
321         adc r_temp2,r_temp\r
322         sbrc r_temp2,1 ;am ene von allem \r
323         rjmp h_readmemorycounter_ex_sleep\r
324         CRCInit1\r
325         ldi  r_mode,OW_READ_MEMORYCOUNTER\r
326         sts pack+1,r_temp2\r
327         sts pack,r_bytep\r
328         rjmp h_readmemorycounter2\r
329 h_readmemorycounter_ex_sleep:\r
330         ldi r_mode,OW_SLEEP\r
331         clr r_sendflag\r
332         rjmp handle_end\r
333 \r
334 \r
335 \r
336         \r
337 \r
338 #include "../common/OWPinInterrupt.s"\r
339 .end