memtest-spi.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/python3
  2. import binascii
  3. import random
  4. import sys
  5. from memtest import WishboneInterface, MemoryTester, HDMIOutput
  6. from memtest import QSPIController
  7. # ----------------------------------------------------------------------------
  8. # Main
  9. # ----------------------------------------------------------------------------
  10. def hexdump(x):
  11. return binascii.b2a_hex(x).decode('utf-8')
  12. def RAM_ADDR_CS(cs, addr):
  13. return (cs << 30) | addr
  14. def main(argv0, port='/dev/ttyUSB1', filename=None):
  15. # Connect to board
  16. wb = WishboneInterface(port)
  17. # Devices on the bus
  18. flash = QSPIController(wb, 0x00000, cs=0)
  19. psram = QSPIController(wb, 0x00000, cs=1)
  20. memtest = MemoryTester(wb, 0x10000)
  21. hdmi = HDMIOutput(wb, 0x20000)
  22. # Make sure to disable DMA
  23. hdmi.disable()
  24. wb.aux_csr(0)
  25. # Read chip IDs
  26. print("[+] ID read")
  27. print(" Flash: " + hexdump(flash.spi_xfer(b'\x9f', rx_len=3)))
  28. print(" PSRAM: " + hexdump(psram.spi_xfer(b'\x9f', dummy_len=3, rx_len=8)))
  29. # Enable PSRAM QPI
  30. psram.spi_xfer(b'\x35')
  31. # Manual page read/write test
  32. if True:
  33. print("[+] Manual page read/write test")
  34. # Write a random page
  35. data = bytes([random.randint(0,255) for i in range(256)])
  36. psram.qpi_xfer(b'\x02\x01\x00\x00', data)
  37. # Read it back
  38. rdata = psram.qpi_xfer(b'\xeb\x01\x00\x00', dummy_len=3, rx_len=256)
  39. # Results
  40. if data != rdata:
  41. print("[!] Failed")
  42. print(" Orig: " + hexdump(data))
  43. print(" Read: " + hexdump(rdata))
  44. print(" Diff: " + hexdump(bytes([a^b for a,b in zip(data,rdata) ])))
  45. else:
  46. print("[.] OK")
  47. # What mode ?
  48. if filename is None:
  49. # Run memtest on PSRAM
  50. print("[+] Testing PSRAM")
  51. good = memtest.run(RAM_ADDR_CS(1, 0), 1<<21)
  52. if good:
  53. print("[.] All good !")
  54. else:
  55. print("[!] Errors found !")
  56. # Disable QPI
  57. psram.qpi_xfer(b'\xf5')
  58. else:
  59. # Load data file
  60. print("[+] Uploading image data")
  61. img = open(filename, 'rb').read()
  62. img = bytearray([(a << 4) | b for a, b in zip(img[0::2], img[1::2])])
  63. memtest.load_data(RAM_ADDR_CS(1, 0), img)
  64. print("[+] Uploading palette")
  65. try:
  66. # Palette data from file
  67. def to_col(d):
  68. return (
  69. (((d[2] + 0x08) >> 4) << 8) |
  70. (((d[1] + 0x08) >> 4) << 4) |
  71. (((d[0] + 0x08) >> 4) << 0) |
  72. 0
  73. )
  74. with open(filename + '.pal', 'rb') as fh:
  75. pal = [to_col(fh.read(3)) for i in range(16)]
  76. for i in range(4*16):
  77. hdmi.pal_write(i, pal[i&15])
  78. except:
  79. # 1:1 palette
  80. for i in range(4*16):
  81. hdmi.pal_write(i, i&15)
  82. # Start DMA
  83. print("[+] Starting DMA")
  84. wb.aux_csr(1)
  85. hdmi.enable(RAM_ADDR_CS(1, 0), 64)
  86. # Done
  87. return 0
  88. if __name__ == '__main__':
  89. sys.exit(main(*sys.argv) or 0)