Many changes from 2018
[owSlave2.git] / common / OWRomFunctions.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 \r
35 .macro cjmp val,addr\r
36         cpi r_rwbyte,\val\r
37         breq \addr\r
38 .endm\r
39 .macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx\r
40         cpi r_rwbyte,\val\r
41         brne 1f\r
42         rjmp \addr\r
43 1:\r
44 .endm\r
45 \r
46 .macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt\r
47         cpi r_rwbyte,\val\r
48         brne 1f\r
49         ldi r_mode,\mod\r
50         rjmp handle_end\r
51 1:\r
52 .endm\r
53 \r
54 \r
55 \r
56 \r
57 #define OW_SLEEP 0\r
58 #define OW_READ_ROM_COMMAND 1\r
59 #define OW_MATCHROM 2\r
60 #define OW_SEARCHROMS 3  ;next send two bit\r
61 #define OW_SEARCHROMR 4  ; next resive master answer\r
62 #define OW_READROM 5\r
63 #define OW_READ_COMMAND 6\r
64 #define OW_FWCONFIGINFO 7\r
65 \r
66 \r
67 #ifdef _CHANGEABLE_ID_\r
68 #define OW_WRITE_NEWID 8\r
69 #define OW_READ_NEWID 9\r
70 #define OW_SET_NEWID 10\r
71 #define OW_FIRST_COMMAND 11\r
72 .comm newid,8\r
73 \r
74        \r
75 .macro CHANGE_ID_COMMANDS\r
76         cset 0x75,OW_WRITE_NEWID\r
77         cljmp 0xA7,hrc_set_readid\r
78         cljmp 0x79,hrc_set_setid\r
79 .endm\r
80 \r
81 \r
82 #else\r
83 #define OW_FIRST_COMMAND 8\r
84 #endif\r
85 \r
86 #ifndef _DIS_FLASH_\r
87 ; test auf run flasher command 0x88 in h_readcommand\r
88 .macro FLASH_COMMANDS\r
89         cpi r_rwbyte,0x88\r
90         brne 1f\r
91         rjmp hrc_jmp_flasher\r
92 1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...\r
93         sts flashmarker,r_temp\r
94 .endm\r
95 #endif\r
96 \r
97 .macro FW_CONFIG_INFO\r
98         cljmp 0x85,hrc_fw_configinfo\r
99 .endm\r
100 \r
101 \r
102 #ifdef _CHANGEABLE_ID_\r
103 ; lesen der ID aus dem EEPROM beim Start\r
104 read_EEPROM_ID:  \r
105         push r_bytep\r
106         push r_rwbyte//r_temp2 and Z is not in gnu C save area\r
107         ldi r_temp2,lo8(E2END)\r
108         ldi zh,hi8(E2END)\r
109         subi r_temp2,7\r
110         out _SFR_IO_ADDR(EEARH), zh\r
111         ldi r_bytep,0\r
112         ldi  zl,lo8(owid)       \r
113     ldi  zh,hi8(owid)\r
114 read_EEPROM_ID_loop:\r
115         sbic _SFR_IO_ADDR(EECR), EEPE\r
116         rjmp read_EEPROM_ID_loop\r
117         out _SFR_IO_ADDR(EEARL),r_temp2\r
118         sbi _SFR_IO_ADDR(EECR), EERE\r
119         in r_rwbyte,_SFR_IO_ADDR(EEDR)\r
120         cpi r_rwbyte,0xFF\r
121         breq read_EEPROM_ID_end\r
122         st Z+,r_rwbyte\r
123         inc r_bytep\r
124         inc r_temp2\r
125         cpi r_bytep,8\r
126         brne read_EEPROM_ID_loop\r
127 read_EEPROM_ID_end:\r
128         pop r_rwbyte\r
129         pop r_bytep\r
130         ret\r
131 #endif\r
132 \r
133 \r
134 \r
135 \r
136 \r
137 \r
138 handle_stable: \r
139                 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten\r
140                 rjmp h_readromcommand \r
141                 rjmp h_matchrom \r
142                 rjmp h_searchroms \r
143                 rjmp h_searchromr\r
144                 rjmp h_readrom\r
145                 rjmp h_readcommand \r
146                 rjmp h_fwconfiginfo\r
147 #ifdef _CHANGEABLE_ID_\r
148                 rjmp h_writeid\r
149                 rjmp h_readid\r
150                 rjmp h_setid\r
151 #endif\r
152                 COMMAND_TABLE\r
153 \r
154 \r
155 \r
156 h_readromcommand:\r
157         clr r_bytep\r
158         cset 0x55,OW_MATCHROM \r
159         cjmp 0xF0,hrc_set_searchrom\r
160         cjmp 0xCC,hrc_start_read_command ;skip rom\r
161         cjmp 0x33,hrc_set_read_rom\r
162         cjmp 0xEC,hrc_set_alarm_search\r
163         \r
164         rjmp handle_end_sleep\r
165 \r
166 #ifndef _DIS_FLASH_\r
167 ;sprung zum flasher\r
168 hrc_jmp_flasher:\r
169         lds r_temp,flashmarker\r
170         cpi r_temp,2\r
171         brne hrc_jmp_flasher_inc\r
172         JMP_FLASHER\r
173 hrc_jmp_flasher_inc:\r
174         inc r_temp\r
175         sts flashmarker,r_temp\r
176         rjmp handle_end_sleep\r
177 #endif\r
178 \r
179 \r
180 hrc_set_searchrom:      \r
181         lds r_rwbyte,owid ;erstes Byte lesen\r
182         rjmp h_searchrom_next_bit\r
183 \r
184 \r
185 \r
186 hrc_start_read_command: ;Skip rom und Matchrom ok...\r
187         ldi r_mode,OW_READ_COMMAND\r
188         CRCInit1\r
189         rjmp handle_end\r
190 \r
191 hrc_set_read_rom:\r
192         ldi r_mode,OW_READROM\r
193         ldi r_sendflag,1\r
194         rjmp h_readrom\r
195 \r
196 hrc_set_alarm_search:\r
197         lds r_temp,alarmflag\r
198         tst r_temp\r
199         brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom\r
200         ; sonst tue nichts\r
201         rjmp handle_end_sleep\r
202 \r
203 \r
204 hrc_fw_configinfo:\r
205         ldi r_mode,OW_FWCONFIGINFO\r
206         ldi r_sendflag,1\r
207         CRCInit2\r
208         rjmp h_fwconfiginfo\r
209 \r
210 \r
211 ;---------------------------------------------------\r
212 ;   MATCH ROM\r
213 ;---------------------------------------------------\r
214         \r
215 \r
216 h_matchrom:\r
217         configZ owid,r_bytep\r
218         ld r_temp,Z\r
219         cp r_temp,r_rwbyte\r
220         breq hmr_next_byte\r
221         rjmp handle_end_sleep\r
222 \r
223 hmr_next_byte:\r
224         cpi r_bytep,7\r
225         breq hrc_start_read_command ;Starten von Read Command\r
226         rjmp handle_end_inc\r
227 \r
228 \r
229 \r
230 ;---------------------------------------------------\r
231 ;   SEARCH ROM\r
232 ;---------------------------------------------------\r
233 \r
234 \r
235 h_searchrom_next_bit:  ;Setup next Bit of ID\r
236         sts srbyte,r_rwbyte ;erstes Byte speichern von der Aufrufenden Ebene\r
237         mov r_temp2,r_rwbyte\r
238         com r_rwbyte ; negieren\r
239         ror r_temp2 ; erstes unnegiertes bit in Carry\r
240         rol r_rwbyte ;und dann als erstes bit in r_rwbyte\r
241         ldi r_sendflag,1\r
242         ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr \r
243         ldi r_mode,OW_SEARCHROMR\r
244         rjmp handle_end_no_bcount\r
245 \r
246 \r
247 \r
248 h_searchroms:  ; Modus Send zwei bit\r
249         clr r_temp\r
250         sbrc r_rwbyte,7 ; bit gesetz (1 empfangen)\r
251         ldi r_temp,1\r
252         lds r_bcount,srbyte ;r_bcount wird am ende gesetzt\r
253         eor r_temp,r_bcount\r
254         sbrs r_temp,0\r
255         rjmp h_searchroms_next ; Vergleich des letzen gelesenen bits mit der id\r
256         ;Ungleich....\r
257         ;goto sleep\r
258         ;clr r_sendflag\r
259         ; ist ja auf lesen\r
260         rjmp handle_end_sleep\r
261 h_searchroms_next: ; Setup next bit\r
262         inc r_bytep  ; zaehler der Bits erhoehen\r
263         sbrc r_bytep,6 ; 64 bit erreicht \r
264         rjmp h_searchrom_end_ok ;alles ok auf Command warten\r
265         mov r_temp,r_bytep \r
266         andi r_temp,0x07\r
267         brne h_searchroms_next_bit  ; bit zwischen 0 und 8\r
268         mov r_bcount,r_bytep  ; next Byte lesen\r
269         lsr r_bcount    \r
270         lsr r_bcount\r
271         lsr r_bcount\r
272 \r
273         configZ owid,r_bcount\r
274         ld r_rwbyte,Z\r
275         sts srbyte,r_rwbyte ;#################### Doppelung ist schon in h_searchrom_next_bit\r
276         rjmp h_searchrom_next_bit\r
277                 \r
278 h_searchroms_next_bit: ;next Bit lesen\r
279         ;sts srbytep,r_bcount\r
280         lds r_rwbyte,srbyte\r
281         lsr r_rwbyte ;aktuelles byte weiterschieben r_rwbyte hier zweckefrei verwendet\r
282         rjmp h_searchrom_next_bit  ;algemeine routine zum vorbereiten\r
283 h_searchrom_end_ok:\r
284         clr r_sendflag\r
285         rjmp hrc_start_read_command\r
286 \r
287 h_searchromr:\r
288         clr r_sendflag\r
289         ldi r_mode,OW_SEARCHROMS\r
290         ldi r_bcount,0\r
291         rjmp handle_end_no_bcount\r
292 \r
293 \r
294 ;---------------------------------------------------\r
295 ;   READ ROM\r
296 ;---------------------------------------------------\r
297 \r
298 h_readrom:\r
299         cpi  r_bytep,8\r
300         breq h_readrom_all\r
301         configZ owid,r_bytep\r
302         ld   r_rwbyte,Z\r
303         rjmp handle_end_inc\r
304 h_readrom_all:\r
305         rjmp handle_end_sleep\r
306 \r
307 \r
308 ;---------------------------------------------------\r
309 ;   FW_CONFIG_INFO\r
310 ;---------------------------------------------------\r
311 \r
312 h_fwconfiginfo:\r
313         cpi  r_bytep,24\r
314         breq h_fwconfiginfo_crc\r
315 #if defined(_CRC8_)  || defined( _CRC8_16_) \r
316         cpi  r_bytep,25\r
317         breq h_fwconfiginfo_all\r
318 #elif defined _CRC16_\r
319         cpi  r_bytep,26\r
320         breq h_fwconfiginfo_all\r
321 #else\r
322         cpi  r_bytep,25\r
323         breq h_fwconfiginfo_all\r
324 #warning No CRC known code implemented\r
325 #endif\r
326 h_fwconfiginfo_end:\r
327         configZ config_info,r_bytep\r
328         ld   r_rwbyte,Z\r
329         rjmp handle_end_inc\r
330 h_fwconfiginfo_crc:\r
331 #ifdef _CRC8_\r
332         lds r_rwbyte,crc\r
333         rjmp handle_end_inc\r
334 #elif defined _CRC16_\r
335         lds r_temp,crc\r
336         com r_temp\r
337         sts config_info+24,r_temp\r
338         lds r_temp,crc+1\r
339         com r_temp\r
340         sts config_info+25,r_temp\r
341         rjmp h_fwconfiginfo_end\r
342 #endif\r
343 h_fwconfiginfo_all:\r
344         rjmp handle_end_sleep\r
345 \r
346 \r
347 ;---------------------------------------------------\r
348 ;   CHANGE ROM FUNCTIONS\r
349 ;---------------------------------------------------\r
350 \r
351 \r
352 #ifdef _CHANGEABLE_ID_\r
353 \r
354 h_writeid:\r
355         configZ newid,r_bytep\r
356         st   Z,r_rwbyte\r
357         cpi  r_bytep,7\r
358         breq h_writeid_all\r
359         rjmp handle_end_inc\r
360 h_writeid_all:\r
361         rjmp handle_end_sleep\r
362 \r
363 \r
364 hrc_set_readid:\r
365         ldi r_mode,OW_READ_NEWID\r
366         ldi r_sendflag,1\r
367 h_readid:\r
368         cpi  r_bytep,8\r
369         breq h_readid_all\r
370         configZ newid,r_bytep\r
371         ld   r_rwbyte,Z\r
372         rjmp handle_end_inc\r
373 h_readid_all:\r
374         clr  r_sendflag\r
375         rjmp handle_end_sleep\r
376 \r
377 hrc_set_setid:\r
378         ldi r_mode,OW_SET_NEWID\r
379         ;ldi r_bytep,1 ;start to write in 2\r
380         rjmp handle_end_inc ;set r_bytep to 1!!!\r
381 \r
382 h_setid:\r
383         configZ owid,r_bytep\r
384         ld r_temp,Z\r
385         cp r_rwbyte,r_temp\r
386         brne h_setid_bad_code_all\r
387         cpi r_bytep,1\r
388         breq h_setid_set2\r
389         cpi r_bytep,5 \r
390         breq h_setid_set3\r
391         cpi r_bytep,6\r
392         breq h_setid_copy_id\r
393         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren\r
394 h_setid_set2:\r
395         ldi r_temp,3\r
396         add r_bytep,r_temp\r
397 h_setid_set3:\r
398         inc r_bytep\r
399         rjmp handle_end\r
400 h_setid_copy_id:\r
401         ldi r_temp2,lo8(E2END)\r
402         ldi zh,hi8(E2END)\r
403         ldi r_temp,7\r
404         sub r_temp2,r_temp\r
405         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist\r
406         ;sbc zh\r
407         out _SFR_IO_ADDR(EEARH),zh\r
408         ldi zl,lo8(newid)\r
409         ldi zh,hi8(newid)\r
410         ldi r_bytep,0\r
411 h_setid_EEPROM_write:\r
412         sbic _SFR_IO_ADDR(EECR), EEPE   \r
413         rjmp h_setid_EEPROM_write\r
414         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
415         out _SFR_IO_ADDR(EECR), r_temp\r
416         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.\r
417         out _SFR_IO_ADDR(EEARL),r_temp2\r
418         ld  r_rwbyte,Z+\r
419         out _SFR_IO_ADDR(EEDR), r_rwbyte\r
420         sbi _SFR_IO_ADDR(EECR), EEMPE\r
421         sbi _SFR_IO_ADDR(EECR), EEPE\r
422         inc r_bytep\r
423         inc r_temp2\r
424         cpi r_bytep,8\r
425         brne h_setid_EEPROM_write\r
426         rcall read_EEPROM_ID\r
427 h_setid_bad_code_all:\r
428         rjmp handle_end_sleep\r
429 \r
430 \r
431 \r
432 #endif\r
433 \r
434 \r
435 spause:\r
436         nop\r
437         nop\r
438         nop\r
439         nop\r
440         ret\r
441 \r
442 \r
443 .global OWINIT\r
444 OWINIT:\r
445         push r_temp\r
446 #ifndef _DIS_FLASH_\r
447         CHECK_BOOTLOADER_PIN \r
448 #endif\r
449         HW_INIT  //Microcontroller specific\r
450         CHIP_INIT //1-Wire device specific\r
451 #ifdef _CHANGEABLE_ID_\r
452         rcall read_EEPROM_ID\r
453 #endif\r
454         ldi r_temp,0\r
455         sts mode,r_temp\r
456         sts bcount,r_temp\r
457         sts alarmflag,r_temp\r
458         RESETZEROMARKER\r
459         pop r_temp\r
460         ret\r
461 \r
462 \r
463 .global EXTERN_SLEEP\r
464 EXTERN_SLEEP:\r
465         cli\r
466         push r_temp\r
467         ldi r_temp,0\r
468         sts mode,r_temp ;SLEEP\r
469         sts gcontrol,r_temp\r
470         sts sendflag,r_temp\r
471         sts bcount,r_temp\r
472         RESETZEROMARKER\r
473         pop r_temp\r
474         sei\r
475         ret