getvir.pl 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/usr/bin/perl
  2. use strict;
  3. use integer;
  4. our %consts;
  5. require '../iodevs.conf';
  6. my $ramaddr = $consts{'SDRAM_ADDR'};
  7. my $flashcmd = 0xabc80046;
  8. my $flashpfx = 0xabc80fed;
  9. my $maxdatalen = 16 << 20;
  10. my($rptfile, $binfile, $svffile) = @ARGV;
  11. open(my $in, '<', $rptfile)
  12. or die "$0: $rptfile: $!\n";
  13. my @vjif;
  14. while (defined(my $l = <$in>)) {
  15. my @lf = split(/\s*\;\s*/, $l);
  16. if ($lf[8] =~ /\|vjtag\:vjtag\|/) {
  17. @vjif = @lf;
  18. }
  19. }
  20. close($in);
  21. # [0] - blank
  22. # [1] - instance index
  23. # [2] - auto index
  24. # [3] - index changed
  25. # [4] - IR width
  26. # [5] - VIR base address
  27. # [6] - USER1 DR length
  28. # [7] - VIR capture command
  29. # [8] - hierarchial entity name
  30. my $virbits = $vjif[6];
  31. my $virbase = hex $vjif[5];
  32. my $vircap = hex $vjif[7];
  33. open(my $bin, '<', $binfile)
  34. or die "$0: $binfile: $!\n";
  35. binmode($bin);
  36. my $bindata;
  37. my $binlen = read($bin, $bindata, $maxdatalen);
  38. close($bin);
  39. open(my $svf, '>', $svffile)
  40. or die "$0: $svffile: $!\n";
  41. sub print_bitstring($$$) {
  42. my($svf, $len, $data) = @_;
  43. my $lenbytes = ($len+7) >> 3;
  44. if (length($data) < $lenbytes) {
  45. $data = ("\0" x ($len - $lenbytes)) . $data;
  46. }
  47. my $b = -1 - (length($data)-$lenbytes);
  48. my $bytes = 0;
  49. while ($len > 7) {
  50. printf $svf "%02X", unpack("C", substr($data, $b--, 1));
  51. if (!(++$bytes & 63)) {
  52. print $svf "\n\t";
  53. }
  54. $len -= 8;
  55. }
  56. if ($len) {
  57. my $lb = unpack("C", substr($data, $b--, 1));
  58. $lb &= (1 << $len)-1;
  59. printf $svf "%0".(($len+3)>>2)."X", $lb;
  60. }
  61. }
  62. sub virt_sir($$) {
  63. my($svf, $cmd) = @_;
  64. print $svf "SIR 10 TDI (00E);\n";
  65. printf $svf "SDR %d TDI (", $virbits;
  66. print_bitstring($svf, $virbits, pack("V", $virbase | $cmd));
  67. print $svf ");\n";
  68. print $svf "SIR 10 TDI (00C);\n";
  69. }
  70. # Set address command
  71. my $ramaddr = 0x40000000;
  72. virt_sir($svf, 0x12);
  73. printf $svf "SDR 32 TDI (%08X);\n", $ramaddr;
  74. # Write data to SDRAM
  75. virt_sir($svf, 0x16);
  76. $bindata = pack("V", $flashpfx) . $bindata;
  77. my $binbits = length($bindata) << 3;
  78. printf $svf "SDR %d\n TDI (", $binbits;
  79. print_bitstring($svf, $binbits, $bindata);
  80. print $svf ");\n";
  81. # Trigger flash command to firmware
  82. virt_sir($svf, 0x1a);
  83. printf $svf "SDR 32 TDI (%08X);\n", $flashcmd;
  84. # Idle JTAG
  85. print $svf "SIR 10 TDI (3FF);\n";
  86. print $svf "STATE IDLE;\n";