add formel 18
[owPython.git] / owflash.py
1 #!/usr/bin/python\r
2 # Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de\r
3 # All rights reserved. \r
4\r
5 # Redistribution and use in source and binary forms, with or without \r
6 # modification, are permitted provided that the following conditions are \r
7 # met: \r
8\r
9 #  * Redistributions of source code must retain the above copyright \r
10 #    notice, this list of conditions and the following disclaimer. \r
11 #  * Redistributions in binary form must reproduce the above copyright \r
12 #    notice, this list of conditions and the following disclaimer in the \r
13 #    documentation and/or other materials provided with the \r
14 #    distribution. \r
15 #  * All advertising materials mentioning features or use of this \r
16 #    software must display the following acknowledgement: This product \r
17 #    includes software developed by tm3d.de and its contributors. \r
18 #  * Neither the name of tm3d.de nor the names of its contributors may \r
19 #    be used to endorse or promote products derived from this software \r
20 #    without specific prior written permission. \r
21\r
22 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
23 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
24 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR \r
25 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
26 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
27 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
28 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r
29 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY \r
30 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
31 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
32 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
33 \r
34 \r
35 \r
36 \r
37 import time\r
38 import subprocess\r
39 import sys\r
40 \r
41 def owcom(dev,send,rc):\r
42         res=[]\r
43         try:\r
44                 f=open("/sys/bus/w1/devices/%s/rw" %(dev),"r+b",0)\r
45         except IOError:\r
46                 l=subprocess.check_output("rmmod w1_therm",shell=True)\r
47                 f=open("/sys/bus/w1/devices/%s/rw" %(dev),"r+b",0)\r
48         f.write("".join(map(chr, send)))\r
49         if (rc!=0):\r
50                 res=map(ord,f.read(rc))\r
51         f.close()\r
52         return res\r
53                 \r
54 \r
55                 \r
56 \r
57 def crc8(arr):\r
58         lscrc=0x0;\r
59         for v in arr:\r
60                 bit=1;\r
61                 while bit<256:\r
62                         if (v&bit)==bit:\r
63                                 lb=1\r
64                         else:\r
65                                 lb=0\r
66                         if (lscrc&1)!=lb:\r
67                                 lscrc=(lscrc>>1)^0x8c \r
68                         else:\r
69                                 lscrc=(lscrc>>1)\r
70                         bit=bit*2\r
71         return lscrc\r
72         \r
73 def testnr(s):\r
74         for c in s.lower()[:]:\r
75                 if not((c) in ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','-']):\r
76                         return False\r
77         return True\r
78  \r
79 def addid(id,val):\r
80         for i in range(7):\r
81                 id[i+1]=id[i+1]+val\r
82                 if id[i+1]>254:\r
83                         id[i+1]=id[i+1]-254\r
84                         val=1\r
85                 else:\r
86                         return id\r
87         return id\r
88 #\r
89 \r
90 \r
91 if len(sys.argv)<2:\r
92         print "A hex-File is needed! \n"\r
93         print "sudo python owflash.py test.hex"\r
94         exit(0)\r
95         \r
96 \r
97 \r
98 \r
99 #start search\r
100 f=open("/sys/bus/w1/devices/w1_bus_master1/w1_master_search","r+b",0)\r
101 f.write("-1")\r
102 f.close()       \r
103 \r
104 \r
105 \r
106 print "Open Hex File ...",\r
107 fi=open(sys.argv[1],"r")\r
108 data=[]\r
109 for l in fi.readlines():\r
110         sys.stdout.write(".")\r
111         sys.stdout.flush()\r
112         bc=int(l[1:3],16)\r
113         fw=int(l[3:7],16)\r
114         ty=int(l[7:9],16)\r
115         chsm=bc+(fw>>8)+(fw&0xFF)+ty\r
116         for i in range(bc):\r
117                 p=9+(i*2)\r
118                 d=int(l[p:p+2],16)\r
119                 chsm=(chsm+d)&0xFF\r
120                 data.append(d)\r
121         chsm=(chsm+int(l[9+bc*2:11+bc*2],16))&0xFF\r
122         if (chsm!=0):\r
123                 print "Error Checksum...."\r
124                 exit()\r
125         #print bc,fw,ty,chsm\r
126 fi.close()\r
127 print\r
128 \r
129 l=subprocess.check_output("ls /sys/bus/w1/devices/", shell=True)\r
130 dc=0\r
131 dl=[]\r
132 for g in  (l.split("\n")):\r
133         if len(g)>2:\r
134                 if testnr(g[0:2]):\r
135                         dl.append(g)\r
136                         dc=dc+1\r
137                         print dc,") ",g\r
138 if dc==0:\r
139         print "No 1-Wire Device found"\r
140         exit(0)\r
141 n=int(raw_input("No. of Device: "))\r
142 n=n-1\r
143 if (n>dc-1)or(n<0):\r
144                 exit(0)\r
145 s=dl[n]\r
146 if (s!="a3-55aa55aa55aa"):\r
147         sys.stdout.write('Go to Flashmode....')\r
148         sys.stdout.flush()\r
149         owcom(s,[0x88],0)\r
150         owcom(s,[0x88],0)\r
151         owcom(s,[0x88],0)\r
152         for i in range (20):\r
153                 l=subprocess.check_output("ls /sys/bus/w1/devices/", shell=True)\r
154                 dc=0\r
155                 dl=[]\r
156                 sys.stdout.write(".")\r
157                 sys.stdout.flush()\r
158                 for g in  (l.split("\n")):\r
159                         if (g[0:15]=="a3-55aa55aa55aa"):\r
160                                 break\r
161                 if (g[0:15]!="a3-55aa55aa55aa"):\r
162                         time.sleep(1)\r
163         if (g[0:15]=="a3-55aa55aa55aa"):\r
164                 print "found"\r
165         else:\r
166                 print "ERROR Enter Flashmode!" \r
167                 exit()\r
168         f=open("/sys/bus/w1/devices/w1_bus_master1/w1_master_remove","r+b",0)\r
169         f.write(s)\r
170         f.close()\r
171         time.sleep(5)\r
172 \r
173 #stop search\r
174 print("Disable Device Search (Wait 15s)")\r
175 f=open("/sys/bus/w1/devices/w1_bus_master1/w1_master_search","r+b",0)\r
176 f.write("0")\r
177 f.close()       \r
178 time.sleep(15)\r
179 \r
180 s="a3-55aa55aa55aa"\r
181 prog=data\r
182 l=len(prog)\r
183 if (l>7551):\r
184         print "Code to big  ... Max 7552 Byte (118 Pages)"\r
185         exit()\r
186 pages= l/64\r
187 for i in range(64-(l%64)):\r
188         #print i\r
189         prog.append(0xFF)\r
190 pages= len(prog)/64\r
191 if (pages>118):\r
192         print "Code to big  ... Max 7552 Byte (118 Pages)"\r
193         exit()\r
194 \r
195 \r
196 print "Programm Page (of ", pages,")"\r
197         \r
198 for i in range(pages):\r
199         sys.stdout.write("%i " % (i+1) )\r
200         sys.stdout.flush()\r
201 \r
202         h=i*64;\r
203         hl=h&0xFF\r
204         hh=h>>8\r
205         #print hh, hl\r
206         mem=[hl,hh]+prog[h:h+64]\r
207         erroc=0\r
208         while (1):\r
209                 owcom(s,[0x0F]+mem,0) \r
210                 rmem=owcom(s,[0xAA],66)\r
211                 if (rmem!=mem):\r
212                         print rmem\r
213                         erroc=erroc+1\r
214                         if erroc>5:\r
215                                 print "WRITING ERROR ... "\r
216                                 exit()\r
217                         continue\r
218                 owcom(s,[0x55],0)       \r
219                 time.sleep(0.05)\r
220                 owcom(s,[0xB8,hl,hh],0)\r
221                 time.sleep(0.05)\r
222                 rmem=owcom(s,[0xAA],66)\r
223                 if (rmem!=mem):\r
224                         print "error in flash"\r
225                         print mem\r
226                         print rmem\r
227                         erroc=erroc+1\r
228                         if erroc>5:\r
229                                 print "WRITING ERROR ... "\r
230                                 exit()\r
231                         continue\r
232                 #for v in rmem:\r
233                 #       print "%02X " % (v),\r
234                 break\r
235 print "\nReset AVR"\r
236 owcom(s,[0x89],0)\r
237 time.sleep(1)\r
238 f=open("/sys/bus/w1/devices/w1_bus_master1/w1_master_remove","r+b",0)\r
239 f.write("a3-55aa55aa55aa")\r
240 f.close()       \r
241 \r
242 print("Enable Device Search")\r
243 f=open("/sys/bus/w1/devices/w1_bus_master1/w1_master_search","r+b",0)\r
244 f.write("-1")\r
245 f.close()       \r
246         \r
247         \r
248 \r
249 \r
250 \r
251 \r
252 #mem=[0x00,0x2]\r
253 #for i in range (64):\r
254 #       mem.append(i)\r
255 #owcom(s,[0x0F]+mem,0)\r
256 #rmem=owcom(s,[0xAA],70)\r
257 #print rmem\r
258 #owcom(s,[0x55],0)\r
259 #time.sleep(0.05)\r
260 #owcom(s,[0xB8,0x00,0x02],0)\r
261 #time.sleep(0.05)\r
262 #rmem=owcom(s,[0xAA],70)\r
263 #print rmem\r
264 #for v in rmem:\r
265 #       print "%02X " % (v)\r
266                 \r
267 \r
268                 \r