-
Notifications
You must be signed in to change notification settings - Fork 2
/
bin.py
118 lines (99 loc) · 4.07 KB
/
bin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# This file is part of stm32loader.
#
# stm32loader is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 3, or (at your option) any later
# version.
#
# stm32loader is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with stm32loader; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
import sys, getopt
from bootloader import CommandInterface
# the pages that contains the code, pages 62~255 are protected by storing the 64 bits address.
# before downloading the code, pages 0~61 should be erased first.
WRPxPages = [i for i in range( 0, 62)]
class BootLoaderJobs():
chip_ids = {
0x412: "STM32 Low-density",
0x410: "STM32 Medium-density",
0x414: "STM32 High-density",
0x420: "STM32 Medium-density value line",
0x428: "STM32 High-density value line",
0x430: "STM32 XL-density",
0x416: "STM32 Medium-density ultralow power line",
0x411: "STM32F2xx",
0x413: "STM32F4xx",
}
def __init__(self,port,baund = 115200, address = 0x08000000):
self.port = port
self.baund = baund
self.address = address
self.cmd = CommandInterface()
def initialChip(self):
self.cmd.open(self.port, self.baund)
print "Open port" + self.port + ", baud " + str(self.baund)
self.cmd.initChip()
# turn of debugging information
def turnOffDebugging(self):
self.cmd.quiet()
# this function will download the target file to the device at 0x8000000 and verify.
def downloadJob(self,binFile):
status = False # True instead of success, False instead of Failed
print "Erase memory first. Erasing..."
self.cmd.cmdEraseMemory(WRPxPages)
print "Waiting for writing..."
data = map(lambda c: ord(c), file(binFile, 'rb').read())
self.cmd.writeMemory(self.address, data)
print "\nEndOfWrite. Waiting for verifying..."
verify = self.cmd.readMemory(self.address, len(data))
if(data == verify):
print "\nVerification OK!"
print "Download on port " + self.port + " successfully! :)"
status = True
else:
print "\nVerification FAILED!"
print str(len(data)) + ' vs ' + str(len(verify))
for i in xrange(0, len(data)):
if data[i] != verify[i]:
print hex(i) + ': ' + hex(data[i]) + ' vs ' + hex(verify[i])
return status
def getChipInformation(self):
bootversion = self.cmd.cmdGet()
print "Bootloader version " + str(bootversion)
chipId = self.cmd.cmdGetID()
print "Chip id: 0x" + str(chipId) + " " + self.chip_ids.get(chipId, "Unknown")
def releasePort(self):
self.cmd.releaseChip()
self.cmd.sp.close()
if __name__ == "__main__":
serialPort = "COM6"
# get options and arguments
try:
opts, args = getopt.getopt(sys.argv[1:], "p:h")
except getopt.GetoptError, err:
# print help information and exit:
print str(err) # will print something like "option -a not recognized"
sys.exit(2)
# filter options
for option,value in opts:
if option == '-p':
serialPort = str(value)
elif option == '-h':
print ""
print " example: bin.py -p 'port' file.bin "
print " Note: The 'port' represents your serial port. default value is COM6"
sys.exit(0)
else:
assert False, "can't handled the option"
sys.exit(2)
# create an bootloader jobs object
bljobs = BootLoaderJobs(serialPort)
bljobs.initialChip()
bljobs.downloadJob(args[0])
bljobs.releasePort()