Rename Files of different Devices
[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,0xE0
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         rjmp h_fwconfiginfo
206
207
208 ;---------------------------------------------------
209 ;   MATCH ROM
210 ;---------------------------------------------------
211         
212
213 h_matchrom:
214         configZ owid,r_bytep
215         ld r_temp,Z
216         cp r_temp,r_rwbyte
217         breq hmr_next_byte
218         rjmp handle_end_sleep
219
220 hmr_next_byte:
221         cpi r_bytep,7
222         breq hrc_start_read_command ;Starten von Read Command
223         rjmp handle_end_inc
224
225
226
227 ;---------------------------------------------------
228 ;   SEARCH ROM
229 ;---------------------------------------------------
230
231
232 h_searchrom_next_bit:  ;Setup next Bit of ID
233         sts srbyte,r_rwbyte ;erstes Byte speichern von der Aufrufenden Ebene
234         mov r_temp2,r_rwbyte
235         com r_rwbyte ; negieren
236         ror r_temp2 ; erstes unnegiertes bit in Carry
237         rol r_rwbyte ;und dann als erstes bit in r_rwbyte
238         ldi r_sendflag,1
239         ldi r_bcount,0x40 ; zwei bits sensden dann zu Searchromr 
240         ldi r_mode,OW_SEARCHROMR
241         rjmp handle_end_no_bcount
242
243
244
245 h_searchroms:  ; Modus Send zwei bit
246         clr r_temp
247         sbrc r_rwbyte,7 ; bit gesetz (1 empfangen)
248         ldi r_temp,1
249         lds r_bcount,srbyte ;r_bcount wird am ende gesetzt
250         eor r_temp,r_bcount
251         sbrs r_temp,0
252         rjmp h_searchroms_next ; Vergleich des letzen gelesenen bits mit der id
253         ;Ungleich....
254         ;goto sleep
255         ;clr r_sendflag
256         ; ist ja auf lesen
257         rjmp handle_end_sleep
258 h_searchroms_next: ; Setup next bit
259         inc r_bytep  ; zaehler der Bits erhoehen
260         sbrc r_bytep,6 ; 64 bit erreicht 
261         rjmp h_searchrom_end_ok ;alles ok auf Command warten
262         mov r_temp,r_bytep 
263         andi r_temp,0x07
264         brne h_searchroms_next_bit  ; bit zwischen 0 und 8
265         mov r_bcount,r_bytep  ; next Byte lesen
266         lsr r_bcount    
267         lsr r_bcount
268         lsr r_bcount
269
270         configZ owid,r_bcount
271         ld r_rwbyte,Z
272         sts srbyte,r_rwbyte
273         rjmp h_searchrom_next_bit
274                 
275 h_searchroms_next_bit: ;next Bit lesen
276         ;sts srbytep,r_bcount
277         lds r_rwbyte,srbyte
278         lsr r_rwbyte ;aktuelles byte weiterschieben r_rwbyte hier zweckefrei verwendet
279         rjmp h_searchrom_next_bit  ;algemeine routine zum vorbereiten
280 h_searchrom_end_ok:
281         clr r_sendflag
282         rjmp hrc_start_read_command
283
284 h_searchromr:
285         clr r_sendflag
286         ldi r_mode,OW_SEARCHROMS
287         ldi r_bcount,0
288         rjmp handle_end_no_bcount
289
290
291 ;---------------------------------------------------
292 ;   READ ROM
293 ;---------------------------------------------------
294
295 h_readrom:
296         cpi  r_bytep,8
297         breq h_readrom_all
298         configZ owid,r_bytep
299         ld   r_rwbyte,Z
300         rjmp handle_end_inc
301 h_readrom_all:
302         rjmp handle_end_sleep
303
304
305 ;---------------------------------------------------
306 ;   FW_CONFIG_INFO
307 ;---------------------------------------------------
308
309 h_fwconfiginfo:
310         cpi  r_bytep,16
311         breq h_fwconfiginfo_crc
312 #ifdef _CRC8_
313         cpi  r_bytep,17
314         breq h_fwconfiginfo_all
315 #elif defined _CRC16_
316         cpi  r_bytep,17
317         breq h_fwconfiginfo_crc2
318         cpi  r_bytep,18
319         breq h_fwconfiginfo_all
320 #else
321         cpi  r_bytep,16
322         breq h_fwconfiginfo_all
323 #warning No CRC known code implemented
324 #endif
325         configZ config_info,r_bytep
326         ld   r_rwbyte,Z
327         rjmp handle_end_inc
328 h_fwconfiginfo_crc:
329         lds r_rwbyte,crc
330         rjmp handle_end_inc
331 h_fwconfiginfo_crc2:
332         lds r_rwbyte,crc+1
333         rjmp handle_end_inc
334 h_fwconfiginfo_all:
335         rjmp handle_end_sleep
336
337
338 ;---------------------------------------------------
339 ;   CHANGE ROM FUNCTIONS
340 ;---------------------------------------------------
341
342
343 #ifdef _CHANGEABLE_ID_
344
345 h_writeid:
346         configZ newid,r_bytep
347         st   Z,r_rwbyte
348         cpi  r_bytep,7
349         breq h_writeid_all
350         rjmp handle_end_inc
351 h_writeid_all:
352         rjmp handle_end_sleep
353
354
355 hrc_set_readid:
356         ldi r_mode,OW_READ_NEWID
357         ldi r_sendflag,1
358 h_readid:
359         cpi  r_bytep,8
360         breq h_readid_all
361         configZ newid,r_bytep
362         ld   r_rwbyte,Z
363         rjmp handle_end_inc
364 h_readid_all:
365         clr  r_sendflag
366         rjmp handle_end_sleep
367
368 hrc_set_setid:
369         ldi r_mode,OW_SET_NEWID
370         ;ldi r_bytep,1 ;start to write in 2
371         rjmp handle_end_inc ;set r_bytep to 1!!!
372
373 h_setid:
374         configZ owid,r_bytep
375         ld r_temp,Z
376         cp r_rwbyte,r_temp
377         brne h_setid_bad_code_all
378         cpi r_bytep,1
379         breq h_setid_set2
380         cpi r_bytep,5 
381         breq h_setid_set3
382         cpi r_bytep,6
383         breq h_setid_copy_id
384         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren
385 h_setid_set2:
386         ldi r_temp,3
387         add r_bytep,r_temp
388 h_setid_set3:
389         inc r_bytep
390         rjmp handle_end
391 h_setid_copy_id:
392         ldi r_temp2,lo8(E2END)
393         ldi zh,hi8(E2END)
394         ldi r_temp,7
395         sub r_temp2,r_temp
396         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist
397         ;sbc zh
398         out _SFR_IO_ADDR(EEARH),zh
399         ldi zl,lo8(newid)
400         ldi zh,hi8(newid)
401         ldi r_bytep,0
402 h_setid_EEPROM_write:
403         sbic _SFR_IO_ADDR(EECR), EEPE   
404         rjmp h_setid_EEPROM_write
405         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)
406         out _SFR_IO_ADDR(EECR), r_temp
407         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.
408         out _SFR_IO_ADDR(EEARL),r_temp2
409         ld  r_rwbyte,Z+
410         out _SFR_IO_ADDR(EEDR), r_rwbyte
411         sbi _SFR_IO_ADDR(EECR), EEMPE
412         sbi _SFR_IO_ADDR(EECR), EEPE
413         inc r_bytep
414         inc r_temp2
415         cpi r_bytep,8
416         brne h_setid_EEPROM_write
417         rcall read_EEPROM_ID
418 h_setid_bad_code_all:
419         rjmp handle_end_sleep
420
421
422
423 #endif
424
425
426 spause:
427         nop
428         nop
429         nop
430         nop
431         ret
432
433
434 .global OWINIT
435 OWINIT:
436 #ifndef _DIS_FLASH_
437 ; check for bootloader jumper
438         ;vor allen anderen Registerconfigs
439         
440         ldi r_temp,(1<<PUD) ;enable pullup 
441         out _SFR_IO_ADDR(MCUCR) ,r_temp
442         sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5
443         sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4
444         rcall spause
445         sbis _SFR_IO_ADDR(PINA),PINA5
446         rjmp owinit_botest_end  ;PinA5 nicht auf 1
447         sbis _SFR_IO_ADDR(PINA),PINA4
448         rjmp owinit_botest_end ;PinA4 nicht auf 1
449         cbi _SFR_IO_ADDR(PORTA),PINA4 
450         sbi _SFR_IO_ADDR(DDRA),PINA4  ;PINA4 AUSGANG und 0
451         rcall spause
452         sbic _SFR_IO_ADDR(PINA),PINA5 
453         rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden
454         cbi _SFR_IO_ADDR(DDRA),PINA4
455         ldi r_temp,0xE0
456         push r_temp
457         ldi r_temp,0x0E
458         push r_temp
459         ret ; Direkter Sprung zum Bootloader*/
460 owinit_botest_end:
461 #endif
462         HW_INIT  //Microcontroller specific
463         CHIP_INIT //1-Wire device specific
464 #ifdef _CHANGEABLE_ID_
465         rcall read_EEPROM_ID
466 #endif
467         ldi r_temp,0
468         sts mode,r_temp
469         sts bcount,r_temp
470         sts alarmflag,r_temp
471         RESETZEROMARKER
472         ret