Linux Git
[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         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,24\r
318         breq h_fwconfiginfo_crc\r
319 #ifdef _CRC8_\r
320         cpi  r_bytep,25\r
321         breq h_fwconfiginfo_all\r
322 #elif defined _CRC16_\r
323         cpi  r_bytep,26\r
324         breq h_fwconfiginfo_all\r
325 #else\r
326         cpi  r_bytep,25\r
327         breq h_fwconfiginfo_all\r
328 #warning No CRC known code implemented\r
329 #endif\r
330 h_fwconfiginfo_end:\r
331         configZ config_info,r_bytep\r
332         ld   r_rwbyte,Z\r
333         rjmp handle_end_inc\r
334 h_fwconfiginfo_crc:\r
335 #ifdef _CRC8_\r
336         lds r_rwbyte,crc\r
337         rjmp handle_end_inc\r
338 #elif defined _CRC16_\r
339         lds r_temp,crc\r
340         com r_temp\r
341         sts config_info+24,r_temp\r
342         lds r_temp,crc+1\r
343         com r_temp\r
344         sts config_info+25,r_temp\r
345         rjmp h_fwconfiginfo_end\r
346 #endif\r
347 h_fwconfiginfo_all:\r
348         rjmp handle_end_sleep\r
349 \r
350 \r
351 ;---------------------------------------------------\r
352 ;   CHANGE ROM FUNCTIONS\r
353 ;---------------------------------------------------\r
354 \r
355 \r
356 #ifdef _CHANGEABLE_ID_\r
357 \r
358 h_writeid:\r
359         configZ newid,r_bytep\r
360         st   Z,r_rwbyte\r
361         cpi  r_bytep,7\r
362         breq h_writeid_all\r
363         rjmp handle_end_inc\r
364 h_writeid_all:\r
365         rjmp handle_end_sleep\r
366 \r
367 \r
368 hrc_set_readid:\r
369         ldi r_mode,OW_READ_NEWID\r
370         ldi r_sendflag,1\r
371 h_readid:\r
372         cpi  r_bytep,8\r
373         breq h_readid_all\r
374         configZ newid,r_bytep\r
375         ld   r_rwbyte,Z\r
376         rjmp handle_end_inc\r
377 h_readid_all:\r
378         clr  r_sendflag\r
379         rjmp handle_end_sleep\r
380 \r
381 hrc_set_setid:\r
382         ldi r_mode,OW_SET_NEWID\r
383         ;ldi r_bytep,1 ;start to write in 2\r
384         rjmp handle_end_inc ;set r_bytep to 1!!!\r
385 \r
386 h_setid:\r
387         configZ owid,r_bytep\r
388         ld r_temp,Z\r
389         cp r_rwbyte,r_temp\r
390         brne h_setid_bad_code_all\r
391         cpi r_bytep,1\r
392         breq h_setid_set2\r
393         cpi r_bytep,5 \r
394         breq h_setid_set3\r
395         cpi r_bytep,6\r
396         breq h_setid_copy_id\r
397         rjmp h_setid_bad_code_all ;sollte eigentlich nicht passieren\r
398 h_setid_set2:\r
399         ldi r_temp,3\r
400         add r_bytep,r_temp\r
401 h_setid_set3:\r
402         inc r_bytep\r
403         rjmp handle_end\r
404 h_setid_copy_id:\r
405         ldi r_temp2,lo8(E2END)\r
406         ldi zh,hi8(E2END)\r
407         ldi r_temp,7\r
408         sub r_temp2,r_temp\r
409         ;ldi r_temp,0 ;kommt nicht vor das ein E2ROM genau n*256+(0 bis 7) byte gross ist\r
410         ;sbc zh\r
411         out _SFR_IO_ADDR(EEARH),zh\r
412         ldi zl,lo8(newid)\r
413         ldi zh,hi8(newid)\r
414         ldi r_bytep,0\r
415 h_setid_EEPROM_write:\r
416         sbic _SFR_IO_ADDR(EECR), EEPE   \r
417         rjmp h_setid_EEPROM_write\r
418         ldi r_temp, (0<<EEPM1)|(0<<EEPM0)\r
419         out _SFR_IO_ADDR(EECR), r_temp\r
420         ;nur adresse L schreiben H bleibt aus oben genannten grund gleich.\r
421         out _SFR_IO_ADDR(EEARL),r_temp2\r
422         ld  r_rwbyte,Z+\r
423         out _SFR_IO_ADDR(EEDR), r_rwbyte\r
424         sbi _SFR_IO_ADDR(EECR), EEMPE\r
425         sbi _SFR_IO_ADDR(EECR), EEPE\r
426         inc r_bytep\r
427         inc r_temp2\r
428         cpi r_bytep,8\r
429         brne h_setid_EEPROM_write\r
430         rcall read_EEPROM_ID\r
431 h_setid_bad_code_all:\r
432         rjmp handle_end_sleep\r
433 \r
434 \r
435 \r
436 #endif\r
437 \r
438 \r
439 spause:\r
440         nop\r
441         nop\r
442         nop\r
443         nop\r
444         ret\r
445 \r
446 \r
447 .global OWINIT\r
448 OWINIT:\r
449 #ifndef _DIS_FLASH_\r
450 ; check for bootloader jumper\r
451         ;vor allen anderen Registerconfigs\r
452         push r_temp\r
453         ldi r_temp,(1<<PUD) ;enable pullup \r
454         out _SFR_IO_ADDR(MCUCR) ,r_temp\r
455         sbi _SFR_IO_ADDR(PORTA),PINA5 ;internal pullup on PINA5\r
456         sbi _SFR_IO_ADDR(PORTA),PINA4 ;internal pullup on PINA4\r
457         rcall spause\r
458         sbis _SFR_IO_ADDR(PINA),PINA5\r
459         rjmp owinit_botest_end  ;PinA5 nicht auf 1\r
460         sbis _SFR_IO_ADDR(PINA),PINA4\r
461         rjmp owinit_botest_end ;PinA4 nicht auf 1\r
462         cbi _SFR_IO_ADDR(PORTA),PINA4 \r
463         sbi _SFR_IO_ADDR(DDRA),PINA4  ;PINA4 AUSGANG und 0\r
464         rcall spause\r
465         sbic _SFR_IO_ADDR(PINA),PINA5 \r
466         rjmp owinit_botest_end ;PINA5 nicht 0.... nicht verbunden\r
467         cbi _SFR_IO_ADDR(DDRA),PINA4\r
468         ldi r_temp,0xC0\r
469         push r_temp\r
470         ldi r_temp,0x0E\r
471         push r_temp\r
472         ret ; Direkter Sprung zum Bootloader*/\r
473 owinit_botest_end:\r
474 #endif\r
475         HW_INIT  //Microcontroller specific\r
476         CHIP_INIT //1-Wire device specific\r
477 #ifdef _CHANGEABLE_ID_\r
478         rcall read_EEPROM_ID\r
479 #endif\r
480         ldi r_temp,0\r
481         sts mode,r_temp\r
482         sts bcount,r_temp\r
483         sts alarmflag,r_temp\r
484         RESETZEROMARKER\r
485         pop r_temp\r
486         ret\r
487 \r
488 \r
489 .global EXTERN_SLEEP\r
490 EXTERN_SLEEP:\r
491         cli\r
492         push r_temp\r
493         ldi r_temp,0\r
494         sts mode,r_temp ;SLEEP\r
495         sts gcontrol,r_temp\r
496         sts sendflag,r_temp\r
497         sts bcount,r_temp\r
498         RESETZEROMARKER\r
499         pop r_temp\r
500         sei\r
501         ret