Remove tools - Create extra repository
[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 \r
34 #define _CHANGEABLE_ID_\r
35 #define _ZERO_POLLING_\r
36 #include "../common/OWConfig.s"\r
37 #include "../common/OWCRC16.s"\r
38 \r
39 .extern pack,45\r
40 .extern counters,8\r
41 \r
42 .macro CHIP_INIT        \r
43 .endm\r
44 \r
45 .macro COMMAND_TABLE\r
46                 rjmp h_writescratchpad\r
47                 rjmp h_writescratchpad_crc\r
48                 rjmp h_readscratchpad\r
49                 rjmp h_copyscratchpad\r
50                 rjmp h_readmemory_addr\r
51                 rjmp h_readmemory\r
52                 rjmp h_readmemorycounter_addr\r
53                 rjmp h_readmemorycounter\r
54                 rjmp h_readmemorycounter_ex\r
55 .endm\r
56 \r
57 #include "../common/OWRomFunctions.s"\r
58 #include "../common/OWTimerInterrupt.s"\r
59 \r
60 \r
61 \r
62 ; Ab hier Geraeteabhaenging\r
63 #define OW_WRITE_SCRATCHPAD OW_FIRST_COMMAND+0\r
64 #define OW_WRITE_SCRATCHPAD_CRC OW_FIRST_COMMAND+1\r
65 #define OW_READ_SCRATCHPAD OW_FIRST_COMMAND+2\r
66 #define OW_COPY_SCRATCHPAD OW_FIRST_COMMAND+3\r
67 #define OW_READ_MEMORY_ADDR OW_FIRST_COMMAND+4\r
68 #define OW_READ_MEMORY OW_FIRST_COMMAND+5\r
69 #define OW_READ_MEMORYCOUNTER_ADDR OW_FIRST_COMMAND+6\r
70 #define OW_READ_MEMORYCOUNTER OW_FIRST_COMMAND+7\r
71 #define OW_READ_MEMORYCOUNTER_EX OW_FIRST_COMMAND+8\r
72 \r
73 ;---------------------------------------------------\r
74 ;       READ COMMAND and start operation\r
75 ;---------------------------------------------------\r
76 \r
77 \r
78 h_readcommand:\r
79         clr r_bytep\r
80 #ifndef _DIS_FLASH_\r
81         FLASH_COMMANDS ; muss zu erst sein....\r
82 #endif\r
83         cset 0x0F,OW_WRITE_SCRATCHPAD\r
84         cjmp 0xAA,hrc_set_readscratchpad\r
85         cset 0x5A,OW_COPY_SCRATCHPAD\r
86         cset 0xF0,OW_READ_MEMORY_ADDR\r
87         cset 0xA5,OW_READ_MEMORYCOUNTER_ADDR\r
88         FW_CONFIG_INFO\r
89 #ifdef _CHANGEABLE_ID_\r
90         CHANGE_ID_COMMANDS\r
91 #endif\r
92         ldi r_mode,OW_SLEEP\r
93         rjmp handle_end\r
94 \r
95 hrc_set_readscratchpad:\r
96         ldi r_mode,OW_READ_SCRATCHPAD\r
97         ldi r_sendflag,1\r
98         rjmp h_readscratchpad\r
99 \r
100 h_writescratchpad:\r
101         configZ pack,r_bytep\r
102         inc  r_bytep\r
103         st   Z,r_rwbyte\r
104         cpi  r_bytep,2\r
105         breq h_writescratchpad_block\r
106         brsh h_writescratchpad_set_eoffset ;;33\r
107         rjmp handle_end  ;handle_end zu weit entfernt fuer br...\r
108 h_writescratchpad_set_eoffset:\r
109         cpi  r_bytep,35\r
110         breq h_writescratchpad_setcrc\r
111         mov r_temp,r_bytep\r
112         subi r_temp,4\r
113         sts pack+2,r_temp ;AA und PF cleared\r
114         rjmp handle_end\r
115 ;Start writeing to 32 Byte Block ; skip status byte     \r
116 h_writescratchpad_block:\r
117         lds r_temp,pack ; Adresse low byte\r
118         andi r_temp,0x1F ;32 byte\r
119         add r_bytep,r_temp ;Zur angegebenen Startadresse springen\r
120         ;ori r_temp,0x20 ; Set PF flag\r
121         sts pack+2,r_temp  ;E4:E0 vorher setzen\r
122         ; Byte 3 ueberspringen\r
123         rjmp handle_end_inc\r
124 \r
125 h_writescratchpad_setcrc:\r
126         ;copy crc to pack\r
127         lds r_temp,crc\r
128         com r_temp\r
129         sts pack+43,r_temp\r
130         lds r_temp,crc+1\r
131         com r_temp ; invertieren , komischer name.....\r
132         sts pack+44,r_temp\r
133         ldi  r_mode,OW_WRITE_SCRATCHPAD_CRC\r
134         ldi r_sendflag,1\r
135         ldi r_bytep,43\r
136 h_writescratchpad_crc:\r
137         cpi r_bytep,45\r
138         breq h_writescratchpad_crc_end\r
139         configZ pack,r_bytep\r
140         ld r_rwbyte,Z\r
141         rjmp handle_end_inc\r
142 h_writescratchpad_crc_end:\r
143         rjmp handle_end_sleep\r
144         \r
145         \r
146 h_readscratchpad:\r
147         cpi r_bytep,35\r
148         breq h_readscratchpad_end\r
149         cpi r_bytep,3\r
150         brne h_readscratchpad_read_byte\r
151 h_readscratchpad_set_offset:\r
152         lds r_temp,pack\r
153         andi r_temp,0x1F\r
154         ldi r_temp2,3\r
155         add r_temp,r_temp2\r
156         mov r_bytep,r_temp\r
157 h_readscratchpad_read_byte:\r
158         configZ pack,r_bytep\r
159         ld r_rwbyte,Z\r
160         rjmp handle_end_inc\r
161 h_readscratchpad_end:\r
162         rjmp handle_end_sleep\r
163 \r
164 \r
165 \r
166 h_copyscratchpad:\r
167         cpi  r_bytep,3\r
168         brsh h_copyscratchpad_ok\r
169         configZ pack,r_bytep\r
170         inc  r_bytep\r
171         ld   r_temp,Z\r
172         cp r_temp,r_rwbyte\r
173         brne h_copyscratchpad_nok\r
174         cpi  r_bytep,3\r
175         breq h_copyscratchpad_ok\r
176         ldi  r_bcount,1 \r
177         rjmp handle_end\r
178 h_copyscratchpad_ok:\r
179         ldi r_rwbyte,0xAA\r
180         ldi r_sendflag,1\r
181         rjmp handle_end\r
182 h_copyscratchpad_nok:\r
183         lds r_temp,pack+3\r
184         andi r_temp,~0x80\r
185         sts pack+3,r_temp\r
186         rjmp handle_end_sleep\r
187 \r
188 \r
189 h_readmemory_addr:\r
190         cpi r_bytep,0\r
191         brne h_readmrmory_addr_byte1\r
192         sts pack,r_rwbyte\r
193         rjmp handle_end_inc\r
194 h_readmrmory_addr_byte1:\r
195         sts pack+1,r_rwbyte\r
196         ldi r_mode,OW_READ_MEMORY\r
197         ldi r_sendflag,1\r
198         clr r_bytep\r
199         rjmp h_readmemory2\r
200 h_readmemory:\r
201         lds r_bytep,pack\r
202         lds r_temp2,pack+1\r
203         inc r_bytep\r
204         clr r_temp\r
205         adc r_temp2,r_temp\r
206         sbrc r_temp2,1\r
207         rjmp h_readmemory_end\r
208         sts pack+1,r_temp\r
209         sts pack,r_bytep\r
210 h_readmemory2:\r
211         lds r_bytep,pack\r
212         andi r_bytep,0x1F\r
213         configZ pack+3,r_bytep\r
214         ld   r_rwbyte,Z\r
215         rjmp handle_end\r
216 h_readmemory_end:\r
217         rjmp handle_end_sleep\r
218 \r
219 \r
220 \r
221 \r
222 \r
223 \r
224 \r
225 \r
226 h_readmemorycounter_addr:\r
227         cpi r_bytep,0\r
228         brne h_readmrmorycounter_addr_byte1\r
229         sts pack,r_rwbyte\r
230         inc r_bytep\r
231         ;ldi r_bcount,1\r
232         rjmp handle_end\r
233 h_readmrmorycounter_addr_byte1:\r
234         sts pack+1,r_rwbyte\r
235         ldi r_mode,OW_READ_MEMORYCOUNTER\r
236         ;ldi r_bcount,1 \r
237         ldi r_sendflag,1\r
238         clr r_bytep\r
239         rjmp h_readmemorycounter2\r
240 h_readmemorycounter:\r
241         lds r_bytep,pack\r
242         lds r_temp2,pack+1\r
243         ldi r_temp,1  ;inc leider kein c flag\r
244         add r_bytep,r_temp\r
245         clr r_temp\r
246         adc r_temp2,r_temp\r
247         mov r_temp,r_bytep\r
248         andi r_temp,0x1F\r
249         breq h_readmemorycounter_next\r
250         sts pack+1,r_temp2\r
251         sts pack,r_bytep\r
252 h_readmemorycounter2:  ;Lesen von dem worauf die erstenzwei bytes zeigen\r
253         lds r_bytep,pack\r
254         andi r_bytep,0x1F\r
255         configZ pack+3,r_bytep\r
256         ld   r_rwbyte,Z\r
257         ;ldi r_bcount,1\r
258         rjmp handle_end\r
259 //h_readmemorycounter_end:\r
260 //      ldi  r_mode,OW_SLEEP\r
261 //      clr r_sendflag\r
262 //      rjmp handle_end\r
263 h_readmemorycounter_next:  ; rest lesen\r
264         ldi  r_mode,OW_READ_MEMORYCOUNTER_EX\r
265         ldi r_bytep,34\r
266         lds r_temp2,pack\r
267         lds r_temp,pack+1\r
268         //lsr r_temp\r
269         //ror r_temp2\r
270 \r
271         lsl r_temp2\r
272         rol r_temp\r
273         cpi r_temp,3\r
274         brne h_readmemorycounter_cFF\r
275         andi r_temp2,0xC0\r
276         swap r_temp2\r
277 \r
278         ;cpi r_temp,0xE0\r
279 \r
280         configZ counters,r_temp2\r
281         ld r_temp,Z+\r
282         sts pack+35,r_temp      \r
283         ld r_temp,Z+\r
284         sts pack+36,r_temp      \r
285         ld r_temp,Z+\r
286         sts pack+37,r_temp      \r
287         ld r_temp,Z+\r
288         sts pack+38,r_temp      \r
289         rjmp h_readmemorycounter_ex\r
290 h_readmemorycounter_cFF:\r
291         ldi r_temp,0xFF\r
292         sts pack+35,r_temp      \r
293         sts pack+36,r_temp      \r
294         sts pack+37,r_temp      \r
295         sts pack+38,r_temp      \r
296 \r
297 h_readmemorycounter_ex:\r
298         inc r_bytep\r
299         cpi r_bytep,45\r
300         breq h_readmemorycounter_ex_end\r
301         cpi r_bytep,43\r
302         brne h_readmemorycounter_ex2\r
303         lds r_temp,crc\r
304         com r_temp\r
305         sts pack+43,r_temp\r
306         lds r_temp,crc+1\r
307         com r_temp\r
308         sts pack+44,r_temp\r
309 h_readmemorycounter_ex2:\r
310         ;ldi r_bcount,1\r
311         configZ pack,r_bytep\r
312         ld   r_rwbyte,Z\r
313         rjmp handle_end\r
314 h_readmemorycounter_ex_end:\r
315         lds r_bytep,pack\r
316         lds r_temp2,pack+1\r
317         ldi r_temp,1  ;inc leider kein c flag\r
318         add r_bytep,r_temp\r
319         clr r_temp\r
320         adc r_temp2,r_temp\r
321         sbrc r_temp2,1 ;am ene von allem \r
322         rjmp h_readmemorycounter_ex_sleep\r
323         CRCInit1\r
324         ldi  r_mode,OW_READ_MEMORYCOUNTER\r
325         sts pack+1,r_temp2\r
326         sts pack,r_bytep\r
327         rjmp h_readmemorycounter2\r
328 h_readmemorycounter_ex_sleep:\r
329         ldi r_mode,OW_SLEEP\r
330         clr r_sendflag\r
331         rjmp handle_end\r
332 \r
333 \r
334 \r
335         \r
336 \r
337 #include "../common/OWPinInterrupt.s"\r
338 .end