#!/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 # # # 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 # print pack("C*", 0x00, 0x09, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x01); # # "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. # @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 # # "e" section in bitstream file, with the length in bytes. # print pack("aN", "e", 2*@seq); # # the actual bitstream # print pack("n*", @seq);