Rename Files of different Devices
[owSlave2.git] / common / OWRomFunctionsDual.s
1 // Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de
2 // All rights reserved. 
3 // 
4 // Redistribution and use in source and binary forms, with or without 
5 // modification, are permitted provided that the following conditions are 
6 // met: 
7 // 
8 //  * Redistributions of source code must retain the above copyright 
9 //    notice, this list of conditions and the following disclaimer. 
10 //  * Redistributions in binary form must reproduce the above copyright 
11 //    notice, this list of conditions and the following disclaimer in the 
12 //    documentation and/or other materials provided with the 
13 //    distribution. 
14 //  * All advertising materials mentioning features or use of this 
15 //    software must display the following acknowledgement: This product 
16 //    includes software developed by tm3d.de and its contributors. 
17 //  * Neither the name of tm3d.de nor the names of its contributors may 
18 //    be used to endorse or promote products derived from this software 
19 //    without specific prior written permission. 
20 // 
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
32
33
34
35 .macro cjmp val,addr
36         cpi r_rwbyte,\val
37         breq \addr
38 .endm
39 .macro cljmp val,addr; Weiter sprung, wenn das ziel zu weit entfernt fuer brxx
40         cpi r_rwbyte,\val
41         brne 1f
42         rjmp \addr
43 1:
44 .endm
45
46 .macro cset val,mod ;Nur der Mode wird gesetzt. Abkuerzung da oft nur das noch bleibt
47         cpi r_rwbyte,\val
48         brne 1f
49         ldi r_mode,\mod
50         rjmp handle_end
51 1:
52 .endm
53
54
55
56
57 #define OW_SLEEP 0
58 #define OW_READ_ROM_COMMAND 1
59 #define OW_MATCHROM 2
60 #define OW_SEARCHROMS 3  ;next send two bit
61 #define OW_SEARCHROMR 4  ; next resive master answer
62 #define OW_READ_COMMAND1 5
63 #define OW_READ_COMMAND2 6
64 #define OW_FWCONFIGINFO1 7
65 #define OW_FWCONFIGINFO2 8
66
67
68 #ifdef _CHANGEABLE_ID_
69 #define OW_WRITE_NEWID 9
70 #define OW_READ_NEWID 10
71 #define OW_SET_NEWID 11
72 #define OW_FIRST_COMMAND 12
73 .comm newid,8
74 .comm idtable,64
75        
76 .macro CHANGE_ID_COMMANDS
77         cset 0x75,OW_WRITE_NEWID
78         cljmp 0xA7,hrc_set_readid
79         cljmp 0x79,hrc_set_setid
80 .endm
81
82
83 #else
84 #define OW_FIRST_COMMAND 9
85 #endif
86
87 #ifndef _DIS_FLASH_
88 ; test auf run flasher command 0x88 in h_readcommand
89 .macro FLASH_COMMANDS
90         cpi r_rwbyte,0x88
91         brne 1f
92         rjmp hrc_jmp_flasher
93 1: ldi r_temp,0 ;Anderes Kommando flashmarker zuruecksetzen...
94         sts flashmarker,r_temp
95 .endm
96 #endif
97
98
99 .macro FW_CONFIG_INFO1
100         cljmp 0x85,hrc_fw_configinfo1
101 .endm
102 .macro FW_CONFIG_INFO2
103         cljmp 0x85,hrc_fw_configinfo2
104 .endm
105
106 #ifdef _CHANGEABLE_ID_
107 ; lesen der ID aus dem EEPROM beim Start
108 read_EEPROM_ID1:  
109         ldi r_temp2,lo8(E2END)
110         ldi zh,hi8(E2END)
111         subi r_temp2,7
112         out _SFR_IO_ADDR(EEARH), zh
113         ldi r_bytep,0
114         ldi  zl,lo8(owid1)       
115     ldi  zh,hi8(owid1)
116         rjmp read_EEPROM_ID_loop
117 read_EEPROM_ID2:  
118         ldi r_temp2,lo8(E2END)
119         ldi zh,hi8(E2END)
120         subi r_temp2,15
121         out _SFR_IO_ADDR(EEARH), zh
122         ldi r_bytep,0
123         ldi  zl,lo8(owid2)       
124     ldi  zh,hi8(owid2)
125 read_EEPROM_ID_loop:
126         sbic _SFR_IO_ADDR(EECR), EEPE
127         rjmp read_EEPROM_ID_loop
128         out _SFR_IO_ADDR(EEARL),r_temp2
129         sbi _SFR_IO_ADDR(EECR), EERE
130         in r_rwbyte,_SFR_IO_ADDR(EEDR)
131         cpi r_rwbyte,0xFF
132         breq read_EEPROM_ID_end
133         st Z+,r_rwbyte
134         inc r_bytep
135         inc r_temp2
136         cpi r_bytep,8
137         brne read_EEPROM_ID_loop
138 read_EEPROM_ID_end:
139         ret
140 #endif
141
142
143
144
145
146
147
148 handle_stable: 
149                 rjmp handle_end_no_bcount // sleep eventuell reset, nichts tun und auf Timeout warten
150                 rjmp h_readromcommand 
151                 rjmp h_matchrom 
152                 rjmp h_searchroms 
153                 rjmp h_searchromr
154                 rjmp h_readcommand1 
155                 rjmp h_readcommand2
156                 rjmp h_fwconfiginfo1
157                 rjmp h_fwconfiginfo2
158 #ifdef _CHANGEABLE_ID_
159                 rjmp h_writeid
160                 rjmp h_readid
161                 rjmp h_setid
162 #endif
163                 COMMAND_TABLE
164
165
166
167 h_readromcommand:
168         clr r_bytep
169         cjmp 0x55,hrc_set_matchrom
170         cjmp 0xF0,hrc_set_searchrom
171         cjmp 0xEC,hrc_set_alarm_search
172         
173         rjmp handle_end_sleep
174
175 #ifndef _DIS_FLASH_
176 ;sprung zum flasher
177 hrc_jmp_flasher:
178         lds r_temp,flashmarker
179         cpi r_temp,2
180         brne hrc_jmp_flasher_inc
181         ldi r_temp,0xE0
182         push r_temp
183         ldi r_temp,0x0E
184         push r_temp
185         ret ; Direkter Sprung zum Bootloader
186 hrc_jmp_flasher_inc:
187         inc r_temp
188         sts flashmarker,r_temp
189         rjmp handle_end_sleep
190 #endif
191
192 hrc_set_matchrom:
193         ldi r_temp,3
194         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil
195         ldi r_mode,OW_MATCHROM
196         rjmp handle_end
197
198
199
200 hrc_set_searchrom:      
201         ldi r_temp,3
202         sts srbyte,r_temp ; Beide geraete nehmen an searchrom teil
203         configZ idtable,r_bytep
204         rjmp h_searchrom_next_bit
205
206 hrc_start_read_command: ;Skip rom und Matchrom ok...
207         lds r_temp,srbyte
208         cpi r_temp,1
209         breq hrc_start_read_command1
210         cpi r_temp,2
211         breq hrc_start_read_command2
212         rjmp handle_end_sleep
213         CRCInit1
214 hrc_start_read_command1:
215         ldi r_mode,OW_READ_COMMAND1
216         rjmp handle_end
217 hrc_start_read_command2:
218         ldi r_mode,OW_READ_COMMAND2
219         rjmp handle_end
220
221
222 hrc_set_alarm_search:
223         lds r_temp,alarmflag
224         tst r_temp
225         brne hrc_set_searchrom ;alarm flag nicht 0 also gehe zu searchrom
226         ; sonst tue nichts
227         rjmp handle_end_sleep
228
229 hrc_fw_configinfo1:
230         ldi r_mode,OW_FWCONFIGINFO1
231         ldi r_sendflag,1
232         rjmp h_fwconfiginfo1
233
234 hrc_fw_configinfo2:
235         ldi r_mode,OW_FWCONFIGINFO2
236         ldi r_sendflag,1
237         rjmp h_fwconfiginfo2
238
239
240 ;---------------------------------------------------
241 ;   MATCH ROM
242 ;---------------------------------------------------
243         
244
245 h_matchrom:
246         lds r_bcount,srbyte
247         sbrs r_bcount,0 ;ueberspringe wenn bit 1 =0 also geraet 1 nich mehr im rennen
248         rjmp h_matchrom_id2
249         configZ owid1,r_bytep
250         ld r_temp2,Z
251         cp r_temp2,r_rwbyte
252         breq h_matchrom_id2
253         cbr r_bcount,1 ; loesche geraet
254         breq h_matchrom_sleep
255 h_matchrom_id2:
256         configZ owid2,r_bytep
257         ld r_temp2,Z
258         cp r_temp2,r_rwbyte
259         breq hmr_next_byte
260         cbr r_bcount,2 ; loesche geraet
261         breq h_matchrom_sleep
262
263 hmr_next_byte:
264         sts srbyte,r_bcount
265         cpi r_bytep,7
266         breq hrc_start_read_command ;Starten von Read Command
267         rjmp handle_end_inc
268
269 h_matchrom_sleep:
270         sts srbyte,r_bcount
271         rjmp handle_end_sleep
272
273
274 ;---------------------------------------------------
275 ;   SEARCH ROM
276 ;---------------------------------------------------
277
278
279 h_searchrom_next_bit:  ;Setup next Bit of ID
280         ld r_temp2,Z
281         lds r_temp,srbyte  ;srbyte ist ein zeiger auf die bits fuer ein bit im Table
282 h_searchrom_next_bit_l2:
283         cpi r_temp,3
284         breq h_searchrom_next_bit_l1
285         lsr r_temp2
286         lsr r_temp2
287         inc r_temp
288         rjmp h_searchrom_next_bit_l2
289 h_searchrom_next_bit_l1:
290         lsr r_temp2
291         rol r_rwbyte  ; negiertes bit in rwbyte
292         lsr r_temp2
293         rol r_rwbyte  ; bit in rwbyte
294         ldi r_sendflag,1
295         ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr 
296         ldi r_mode,OW_SEARCHROMR
297         rjmp handle_end_no_bcount
298
299
300
301 h_searchroms:  ; Modus Send zwei bit
302         configZ idtable,r_bytep
303         ld r_temp2,Z+
304         lds r_temp,srbyte
305         cpi r_temp,3
306         breq h_searchroms_idd
307         cpi r_temp,1
308         breq h_searchroms_id1
309         cpi r_temp,2
310         breq h_searchroms_id2
311         rjmp handle_end_sleep ; zur Sicherheit.....
312 h_searchroms_idd:
313         andi r_rwbyte,0x80
314         breq h_searchroms_idd_zero
315         ; Master send 1
316         sbrc r_temp2,0 ;springe wenn nicht beide bits 0 (id 1 negiert und id 2 negiert)
317         rjmp handle_end_sleep ;
318         sbrc r_temp2,4  ;id1 set? then skip
319         cbr r_temp,1  ; loesche bit 1 in srbyte
320         sbrc r_temp2,2 ; springe wenn id 2 gesetzt ist
321         cbr r_temp,2 ;  loesche bit 2 in srbyte 
322         sts srbyte,r_temp
323         rjmp h_searchroms_idX_end
324 h_searchroms_idd_zero:
325         sbrc r_temp2,1 ;springe wenn nicht beide 1 (id 1  und id 2 )
326         rjmp handle_end_sleep ;beide 1 gehe schlafen
327         sbrs r_temp2,4  ;id1 0? then skip
328         cbr r_temp,1  ; loesche bit 1 in srbyte
329         sbrs r_temp2,2 ; springe wenn id 2  null ist
330         cbr r_temp,2  ; loesche bit 2 in srbyte
331         sts srbyte,r_temp
332         rjmp h_searchroms_idX_end
333 h_searchroms_id1:
334         andi r_rwbyte,0x80
335         breq h_searchroms_id1_zero
336         ; Master send 1
337         sbrs r_temp2,5  ;id1 set? then skip
338         rjmp handle_end_sleep ;
339         rjmp h_searchroms_idX_end
340 h_searchroms_id1_zero:          
341         sbrs r_temp2,4  ;id1 set? then skip
342         rjmp handle_end_sleep ;
343         rjmp h_searchroms_idX_end
344 h_searchroms_id2:
345         andi r_rwbyte,0x80
346         breq h_searchroms_id2_zero
347         ; Master send 1
348         sbrs r_temp2,3  ;id1 set? then skip
349         rjmp handle_end_sleep ;
350         rjmp h_searchroms_idX_end
351 h_searchroms_id2_zero:          
352         sbrs r_temp2,2  ;id1 set? then skip
353         rjmp handle_end_sleep ;
354         rjmp h_searchroms_idX_end
355 h_searchroms_idX_end:
356         lds r_temp,srbyte
357         tst r_temp
358         brne h_searchroms_idX_end1
359         rjmp handle_end_sleep
360 h_searchroms_idX_end1:
361         inc r_bytep
362         cpi r_bytep,64
363         breq h_searchrom_end_ok  ;unterschied nur das letzt bit wird wohl nie vorkommen
364         rjmp h_searchrom_next_bit
365
366 h_searchrom_end_ok:
367         clr r_sendflag
368         rjmp hrc_start_read_command
369
370 h_searchromr:  ; stelle um auf empfangen
371         clr r_sendflag
372         ldi r_mode,OW_SEARCHROMS
373         ldi r_bcount,0  ;gehe nach einem bit zu SEARCHROMS
374         rjmp handle_end_no_bcount
375
376
377 ;---------------------------------------------------
378 ;   FW_CONFIG_INFO
379 ;---------------------------------------------------
380
381 h_fwconfiginfo1:
382         configZ config_info1,r_bytep
383         rjmp h_fwconfiginfo_go
384 h_fwconfiginfo2:
385         configZ config_info2,r_bytep
386
387 h_fwconfiginfo_go:
388         cpi  r_bytep,16
389         breq h_fwconfiginfo_crc
390 #ifdef _CRC8_
391         cpi  r_bytep,17
392         breq h_fwconfiginfo_all
393 #elif defined _CRC16_
394         cpi  r_bytep,17
395         breq h_fwconfiginfo_crc2
396         cpi  r_bytep,18
397         breq h_fwconfiginfo_all
398 #else
399         cpi  r_bytep,16
400         breq h_fwconfiginfo_all
401 #warning No CRC known code implemented
402 #endif
403         ld   r_rwbyte,Z
404         rjmp handle_end_inc
405 h_fwconfiginfo_crc:
406         lds r_rwbyte,crc
407         rjmp handle_end
408 h_fwconfiginfo_crc2:
409         lds r_rwbyte,crc+1
410         rjmp handle_end
411 h_fwconfiginfo_all:
412         rjmp handle_end_sleep
413
414
415 ;---------------------------------------------------
416 ;   CHANGE ROM FUNCTIONS
417 ;---------------------------------------------------
418
419
420 #ifdef _CHANGEABLE_ID_
421
422 h_writeid:
423         configZ newid,r_bytep
424         st   Z,r_rwbyte
425         cpi  r_bytep,7
426         breq h_writeid_all
427         rjmp handle_end_inc
428 h_writeid_all:
429         rjmp handle_end_sleep
430
431
432 hrc_set_readid:
433         ldi r_mode,OW_READ_NEWID
434         ldi r_sendflag,1
435 h_readid:
436         cpi  r_bytep,8
437         breq h_readid_all
438         configZ newid,r_bytep
439         ld   r_rwbyte,Z
440         rjmp handle_end_inc
441 h_readid_all:
442         clr  r_sendflag
443         rjmp handle_end_sleep
444
445 hrc_set_setid:
446         ldi r_mode,OW_SET_NEWID
447         ;ldi r_bytep,1 ;start to write in 2
448         rjmp handle_end_inc ;set r_bytep to 1!!!
449
450 h_setid:
451         lds r_bcount,srbyte
452         cpi r_bcount,2
453         breq h_setid2
454 h_setid1:
455         configZ owid1,r_bytep
456         rjmp h_setido
457 h_setid2:
458         configZ owid2,r_bytep
459 h_setido:
460         ld r_temp,Z
461         cp r_rwbyte,r_temp
462         brne h_setid_bad_code_all
463         cpi r_bytep,1
464         breq h_setid_set2
465         cpi r_bytep,5 
466         breq h_setid_set3
467         cpi r_bytep,6
468         breq h_setid_copy_id
469         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren
470 h_setid_set2:
471         ldi r_temp,3
472         add r_bytep,r_temp
473 h_setid_set3:
474         inc r_bytep
475         rjmp handle_end
476 h_setid_copy_id:
477         ldi r_temp2,lo8(E2END)
478         ldi zh,hi8(E2END)
479         ldi r_temp,7
480         sbrc r_bcount,1
481         ldi r_temp,15
482         sub r_temp2,r_temp
483         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist
484         ;sbc zh
485         out _SFR_IO_ADDR(EEARH),zh
486         ldi zl,lo8(newid)
487         ldi zh,hi8(newid)
488         ldi r_bytep,0
489 h_setid_EEPROM_write:
490         sbic _SFR_IO_ADDR(EECR), EEPE   
491         rjmp h_setid_EEPROM_write
492         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)
493         out _SFR_IO_ADDR(EECR), r_temp
494         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.
495         out _SFR_IO_ADDR(EEARL),r_temp2
496         ld  r_rwbyte,Z+
497         out _SFR_IO_ADDR(EEDR), r_rwbyte
498         sbi _SFR_IO_ADDR(EECR), EEMPE
499         sbi _SFR_IO_ADDR(EECR), EEPE
500         inc r_bytep
501         inc r_temp2
502         cpi r_bytep,8
503         brne h_setid_EEPROM_write
504         //rcall read_EEPROM_ID1
505         //rcall read_EEPROM_ID2
506         push r_idm1
507         push r_idm2
508         push r_idn1
509         push r_idn2
510         push xl
511         push xh
512         push yl
513         push yh
514         rcall init_idtable
515         pop yh
516         pop yl
517         pop xh
518         pop xl
519         pop r_idn2
520         pop r_idn1
521         pop r_idm2
522         pop r_idm1
523 h_setid_bad_code_all:
524         rjmp handle_end_sleep
525
526
527
528 #endif
529
530
531 spause:
532         nop
533         nop
534         nop
535         nop
536         ret
537
538
539 .global OWINIT
540 OWINIT:
541 #ifndef _DIS_FLASH_
542 ; check for bootloader jumper
543         ;vor allen anderen Registerconfigs
544         
545         ldi r_temp,(1<<PUD) ;enable pullup 
546         out _SFR_IO_ADDR(MCUCR) ,r_temp
547         sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5
548         sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4
549         rcall spause
550         sbis _SFR_IO_ADDR(PINA),PINA5
551         rjmp owinit_botest_end  ;PinA5 nicht auf 1
552         sbis _SFR_IO_ADDR(PINA),PINA4
553         rjmp owinit_botest_end ;PinA4 nicht auf 1
554         cbi _SFR_IO_ADDR(PORTA),PINA4 
555         sbi _SFR_IO_ADDR(DDRA),PINA4  ;PINA4 AUSGANG und 0
556         rcall spause
557         sbic _SFR_IO_ADDR(PINA),PINA5 
558         rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden
559         cbi _SFR_IO_ADDR(DDRA),PINA4
560         ldi r_temp,0xE0
561         push r_temp
562         ldi r_temp,0x0E
563         push r_temp
564         ret ; Direkter Sprung zum Bootloader*/
565 owinit_botest_end:
566 #endif
567         HW_INIT  //Microcontroller specific
568         CHIP_INIT //1-Wire device specific
569 #ifdef _CHANGEABLE_ID_
570 init_idtable:
571         rcall read_EEPROM_ID1
572         rcall read_EEPROM_ID2
573 #endif
574         ldi r_bytep,8
575         ldi r_temp,0
576         ldi  zl,lo8(idtable)
577     ldi  zh,hi8(idtable)
578         ldi  xl,lo8(owid1)
579         ldi  xh,hi8(owid1)
580         ldi      yl,lo8(owid2)
581         ldi  yh,hi8(owid2)
582 owinit_odgen1:
583         ld r_idm1,X+
584         ld r_idm2,Y+
585         mov r_idn1,r_idm1
586         com r_idn1
587         mov r_idn2,r_idm2
588         com r_idn2
589         ldi r_bcount,8
590         mov r_temp,r_idm1
591         and r_temp,r_idm2
592         mov r_temp2,r_idn1
593         and r_temp2,r_idn2
594 owinit_odgen2:
595         ldi r_mode,0
596         lsr r_idm1
597         rol r_mode  ;6. Bit id1 
598         lsr r_idn1  
599         rol r_mode ; 5. Bit id1negiert
600         lsr r_idm2
601         rol r_mode  ;;4. Bit id2 
602         lsr r_idn2  
603         rol r_mode  ;3. Bit id2 negiert
604         lsr r_temp 
605         rol r_mode ;zweites bit  id1 und id2
606         lsr r_temp2
607         rol r_mode   ;erstes bit id1 negiert und id2  negiert
608         st  Z+,r_mode
609         dec r_bcount
610         brne owinit_odgen2
611         dec r_bytep
612         brne owinit_odgen1
613
614
615         ldi r_temp,0
616         sts mode,r_temp
617         sts bcount,r_temp
618         sts alarmflag,r_temp
619         RESETZEROMARKER
620         ret