aboutsummaryrefslogtreecommitdiff
path: root/j1demo/firmware/loader.fs
diff options
context:
space:
mode:
authorDimitri Sokolyuk <ds@doozer.de>2017-05-23 17:06:09 +0200
committerDimitri Sokolyuk <ds@doozer.de>2017-05-23 17:06:09 +0200
commit6f86ce7057dd7cd1b491e8f09501258822d2ea74 (patch)
treeb3bfa11f0f72d0e1ca7c84d948af20b7494dd26b /j1demo/firmware/loader.fs
Import j1demo
Diffstat (limited to 'j1demo/firmware/loader.fs')
-rw-r--r--j1demo/firmware/loader.fs114
1 files changed, 114 insertions, 0 deletions
diff --git a/j1demo/firmware/loader.fs b/j1demo/firmware/loader.fs
new file mode 100644
index 0000000..d4ae725
--- /dev/null
+++ b/j1demo/firmware/loader.fs
@@ -0,0 +1,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
+;