swapforth

Форк
0
/
shell.py 
148 строк · 3.8 Кб
1
import sys
2
import time
3
import struct
4
import array
5

6
sys.path.append("../shell")
7
import swapforth
8

9
class FT900Bootloader:
10
    def __init__(self, ser):
11
        self.ser = ser
12
        # self.verbose = True
13
        self.cumcrc = 0
14

15
    cellsize = 4
16

17
    def rd1(self):
18
        """ Return the last incoming character, if any """
19
        n = self.ser.inWaiting()
20
        if n:
21
            r = self.ser.read(n)
22
            return r[-1]
23
        else:
24
            return None
25

26
    def waitprompt(self):
27
        # Might already be at the bootloader prompt
28
        if self.rd1() == '>':
29
            return
30

31
        # Might be at prompt already, or halted. Send ' '
32
        self.ser.write(' ')
33
        self.ser.flush()
34
        time.sleep(0.001)
35
        if self.rd1() == '>':
36
            return
37

38
        # Is somewhere else, request manual reset
39
        print "Please press RESET on target board"
40
        while True:
41
            s = self.ser.read(1)
42
            print repr(s)
43
            if s == ">":
44
                break
45
        print "OK, device reset"
46

47
    def confirm(self):
48
        self.ser.write("C")
49
        return struct.unpack("I", self.ser.read(4))[0]
50

51
    def version(self):
52
        self.ser.write("V")
53
        return struct.unpack("I", self.ser.read(4))[0]
54

55
    def pmcrc32(self, a, sz):
56
        t0 = time.time()
57
        self.ser.write("Q" + struct.pack("II", a, sz))
58
        (r, ) = struct.unpack("I", self.ser.read(4))
59
        if self.verbose:
60
            t = time.time() - t0
61
            self.cumcrc += t
62
            print 'crc', sz, t, self.cumcrc
63
        return r
64

65
    def flashcrc32(self, a, sz):
66
        t0 = time.time()
67
        self.ser.write("G" + struct.pack("II", a, sz))
68
        (r, ) = struct.unpack("I", self.ser.read(4))
69
        if self.verbose:
70
            t = time.time() - t0
71
            self.cumcrc += t
72
            print 'crc', sz, t, self.cumcrc
73
        return r
74

75
    def ex(self, ):
76
        self.ser.write("R")
77
        self.ser.flush()
78

79
    def setspeed(self, s):
80
        if hasattr(self.ser, 'setBaudrate'):
81
            self.ser.write("S" + struct.pack("I", s))
82
            self.ser.flush()
83
            time.sleep(.001)
84
            self.ser.setBaudrate(s)
85
            self.ser.flushInput()
86
            self.ser.flushOutput()
87

88
    def loadprogram(self, program):
89
        pstr = program.tostring()
90
        self.ser.write("P" + struct.pack("II", 0, len(pstr)))
91
        self.ser.write(pstr)
92

93
    def flash(self, addr, s):
94
        self.ser.write('F' + struct.pack("II", addr, len(s)) + s)
95
        (answer, ) = struct.unpack("I", self.ser.read(4))
96
        assert answer == 0xf1a54ed
97

98
    def hardboot(self, ):
99
        self.ser.write("H")
100
        self.ser.flush()
101

102
class TetheredFT900(swapforth.TetheredTarget):
103

104
    def boot(self, bootfile = None):
105
        ser = self.ser
106
        speed = 921600
107
        bl = FT900Bootloader(ser)
108
        ser.setDTR(1)
109
        ser.setRTS(1)
110
        ser.setDTR(0)
111
        ser.setRTS(0)
112
        bl.waitprompt()
113

114
        time.sleep(.001)
115
        ser.flushInput()
116

117
        if bl.confirm() != 0xf70a0d13:
118
            print 'CONFIRM command failed'
119
            sys.exit(1)
120
        bl.setspeed(speed)
121

122
        if bl.confirm() != 0xf70a0d13:
123
            print 'High-speed CONFIRM command failed'
124
            sys.exit(1)
125
        if bootfile is not None:
126
            program = array.array('I', open(bootfile).read())
127
            bl.loadprogram(program)
128
        bl.ex()
129

130
        time.sleep(.05)
131
        while True:
132
            n = ser.inWaiting()
133
            if not n:
134
                break
135
            ser.read(n)
136

137
        ser.write("true tethered !\r\n")
138
        while ser.read(1) != chr(30):
139
            pass
140

141
    def interrupt(self):
142
        self.ser.write(chr(3))
143
        self.ser.flush()
144
        while self.ser.read(1) != chr(30):
145
            pass
146

147
if __name__ == '__main__':
148
    swapforth.main(TetheredFT900)
149

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.