2011-09-06 17:37:01 +03:00
|
|
|
#!/usr/bin/perl
|
|
|
|
#
|
|
|
|
# mkboot - generate a bitstream (in .bit format) that boots an M1
|
|
|
|
# with the "regular" bitstream, using UrJTAG
|
|
|
|
#
|
|
|
|
# Hacked 2001 by Werner Almesberger
|
|
|
|
#
|
|
|
|
|
2011-09-06 18:29:31 +03:00
|
|
|
#
|
|
|
|
# bitstream file magic, copied from xilinx_bitstream.c:xlx_bitstream_load_bit
|
|
|
|
#
|
|
|
|
# here is the source:
|
|
|
|
# http://urjtag.git.sourceforge.net/git/gitweb.cgi?p=urjtag/urjtag;a=blob_plain;f=urjtag/src/pld/xilinx_bitstream.c;hb=HEAD
|
|
|
|
#
|
|
|
|
|
2011-09-06 17:37:01 +03:00
|
|
|
print pack("C*",
|
|
|
|
0x00, 0x09, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0,
|
|
|
|
0x0f, 0xf0, 0x00, 0x00, 0x01);
|
|
|
|
|
2011-09-06 18:29:31 +03:00
|
|
|
#
|
|
|
|
# "bitstream" according to Table 7-1 (page 126) of
|
|
|
|
# http://www.xilinx.com/support/documentation/user_guides/ug380.pdf
|
|
|
|
#
|
|
|
|
# and the M1 standby bitstream:
|
|
|
|
# https://github.com/milkymist/milkymist/blob/master/boards/milkymist-one/standby/standby.v#L205
|
|
|
|
#
|
|
|
|
# The 0xffff dummy and the 0x2000 NOP seem to be unnecessary in this case,
|
|
|
|
# so we omit them.
|
|
|
|
#
|
|
|
|
# To boot the rescue bitstream instead of the regular bitstream, change
|
|
|
|
# the value of GENERAL2 from 0x0037 to 0x0005.
|
|
|
|
#
|
|
|
|
|
2011-09-06 17:37:01 +03:00
|
|
|
@seq = (
|
|
|
|
# 0xffff, # DUMMY
|
|
|
|
0xaa99, # Sync(1)
|
|
|
|
0x5566, # Sync(2)
|
|
|
|
0x3261, # write GENERAL1
|
|
|
|
0x0000, # start address 15:0
|
|
|
|
0x3281, # write GENERAL2
|
|
|
|
0x0037, # start address 23:16
|
|
|
|
0x30a1, # write CMD
|
|
|
|
0x000e); # IPROG
|
|
|
|
# 0x2000); # NOP
|
|
|
|
|
2011-09-06 18:29:31 +03:00
|
|
|
#
|
|
|
|
# "e" section in bitstream file, with the length in bytes.
|
|
|
|
#
|
|
|
|
|
2011-09-06 17:37:01 +03:00
|
|
|
print pack("aN", "e", 2*@seq);
|
|
|
|
|
2011-09-06 18:29:31 +03:00
|
|
|
#
|
|
|
|
# the actual bitstream
|
|
|
|
#
|
|
|
|
|
2011-09-06 17:37:01 +03:00
|
|
|
print pack("n*", @seq);
|