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