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