aboutsummaryrefslogtreecommitdiff
path: root/docs/j1demo/firmware/loader.fs
blob: d4ae725f1165f05c55a2319a627e1f323450a53e (plain)
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
( LOADER PROTOCOL                            JCB 09:16 11/11/10)

947 constant PORT

: response0 ( -- )
    ETH.IP.UDP.SOURCEPORT packet@ 
    PORT
    d# 2 ETH.IP.SRCIP mac-inoffset mac@n  
    net-my-ip
    2over arp-lookup
    ( dst-port src-port dst-ip src-ip *ethaddr )
    udp-header
    d# 0 mac-pkt-,
    ETH.IP.UDP.LOADER.SEQNO packet@ mac-pkt-,
;

: response1
    udp-wrapup mac-send
;

: respond
    response0
    response1
;

: ramread
    response0
    ETH.IP.UDP.LOADER.RAMREAD.ADDR packet@
    d# 128 bounds begin
        dup @ mac-pkt-,
        cell+
        2dup=
    until
    2drop
    response1
;

: ramwrite
    ETH.IP.UDP.LOADER.RAMWRITE.ADDR packet@ 
    d# 64 0do
        ETH.IP.UDP.LOADER.RAMWRITE.DATA i cells + packet@
        over !
        cell+
    loop
    drop
    respond
;

: reboot
    respond bootloader ;

: flashread
    response0
    ETH.IP.UDP.LOADER.FLASHREAD.ADDR packetd@ d2/
    flash-reset
    d# 64 0do
        2dup flash@
        mac-pkt-,
        d1+
    loop
    2drop
    response1
;

: flasherase
    respond flash-chiperase ;

: flashdone
    response0
    ETH.IP.UDP.LOADER.FLASHREAD.ADDR packetd@ d2/
    flash-erased mac-pkt-,
    response1
;

: flashwrite
    ETH.IP.UDP.LOADER.FLASHWRITE.ADDR packetd@ d2/
    d# 64 0do
        2dup
        ETH.IP.UDP.LOADER.FLASHWRITE.DATA i cells + packet@
        -rot flash!
        d1+
    loop
    2drop
    respond
;

: flashsectorerase
    ETH.IP.UDP.LOADER.FLASHWRITE.ADDR packetd@ d2/
    flash-sectorerase
    respond
;

jumptable opcodes
( 0 ) | ramread
( 1 ) | ramwrite
( 2 ) | reboot
( 3 ) | flashread
( 4 ) | flasherase
( 5 ) | flashdone
( 6 ) | flashwrite
( 7 ) | flashsectorerase

: loader-handler ( -- )
    IP_PROTO_UDP ip-isproto if
        ETH.IP.UDP.DESTPORT packet@ PORT =
        d# 2 ETH.IP.SRCIP mac-inoffset mac@n arp-lookup 0<> and if
            udp-checksum? if
                ETH.IP.UDP.LOADER.OPCODE packet@ 
                \ s" loader opcode=" type dup hex4 cr
                opcodes execute
            then
        then
    then
;