blacksasi.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #ifndef __BLACKSASI_H__
  2. #define __BLACKSASI_H__
  3. #include "sdcard.h"
  4. #include "gpio.h"
  5. #include "log.h"
  6. #include "config.h"
  7. #include "scsi.h"
  8. // Log File
  9. #define VERSION "0.xx-SNAPSHOT-BLACKSASI-2022-03-20-F4"
  10. #define LOG_FILENAME "LOG.txt"
  11. #define SPI_CLOCK SD_SCK_MHZ(50)
  12. #define DEBUG 1 // 0:No debug information output
  13. // 1: Debug information output to USB Serial
  14. // 2: Debug information output to LOG.txt (slow)
  15. #define SCSI_SELECT 0 // 0 for STANDARD
  16. // 1 for SHARP X1turbo
  17. // 2 for NEC PC98
  18. #define READ_SPEED_OPTIMIZE 1 // Faster reads
  19. #define WRITE_SPEED_OPTIMIZE 1 // Speeding up writes
  20. #define USE_DB2ID_TABLE 1 // Use table to get ID from SEL-DB
  21. // SCSI config
  22. #define NUM_SCSIID 7 // Maximum number of supported SCSI-IDs (The minimum is 0)
  23. #define NUM_SCSILUN 2 // Maximum number of LUNs supported (The minimum is 0)
  24. #define READ_PARITY_CHECK 0 // Perform read parity check (unverified)
  25. // HDD format
  26. #define MAX_BLOCKSIZE 2048 // Maximum BLOCK size
  27. #if DEBUG == 1
  28. #define serial Serial
  29. #define LOG(XX) serial.print(XX)
  30. #define LOGHEX(XX) serial.print(XX, HEX)
  31. #define LOGDEC(XX) serial.print(XX, DEC)
  32. #define LOGBIN(XX) serial.print(XX, BIN)
  33. #define LOGN(XX) serial.println(XX)
  34. #define LOGHEXN(XX) serial.println(XX, HEX)
  35. #define LOGDECN(XX) serial.println(XX, DEC)
  36. #define LOGBIN_N(XX) serial.println(XX, BIN)
  37. #elif DEBUG == 2
  38. #define LOG(XX) LOG_FILE.print(XX); LOG_FILE.sync();
  39. #define LOGHEX(XX) LOG_FILE.print(XX, HEX); LOG_FILE.sync();
  40. #define LOGDEC(XX) LOG_FILE.print(XX, DEC); LOG_FILE.sync();
  41. #define LOGBIN(XX) LOG_FILE.print(XX, BIN); LOG_FILE.sync();
  42. #define LOGN(XX) LOG_FILE.println(XX); LOG_FILE.sync();
  43. #define LOGHEXN(XX) LOG_FILE.println(XX, HEX); LOG_FILE.sync();
  44. #define LOGDECN(XX) LOG_FILE.println(XX, DEC); LOG_FILE.sync();
  45. #define LOGBIN_N(XX) LOG_FILE.println(XX, BIN); LOG_FILE.sync();
  46. #else
  47. #define LOG(XX) //serial.print(XX)
  48. #define LOGHEX(XX) //serial.print(XX, HEX)
  49. #define LOGDEC(XX) //serial.print(XX, DEC)
  50. #define LOGBIN(XX) //serial.print(XX, BIN)
  51. #define LOGN(XX) //serial.println(XX)
  52. #define LOGHEXN(XX) //serial.println(XX, HEX)
  53. #define LOGDECN(XX) //serial.println(XX, DEC)
  54. #define LOGBIN_N(XX) //serial.println(XX, BIN)
  55. #endif
  56. #define active 1
  57. #define inactive 0
  58. #define high 0
  59. #define low 1
  60. #define isHigh(XX) ((XX) == high)
  61. #define isLow(XX) ((XX) != high)
  62. // GPIO register port
  63. #define PAREG GPIOA->regs
  64. #define PBREG GPIOB->regs
  65. #define PCREG GPIOC->regs
  66. #define PDREG GPIOD->regs
  67. #define PEREG GPIOE->regs
  68. // Termination control (LOW is active)
  69. #define TERMINATION_HIGH() GPIOREG(BOARD_SCSI_TERM_HIGH)->BSRR = (1 << BOARD_SCSI_TERM_HIGH % 16) << 16 | (1 << BOARD_SCSI_TERM_LOW % 16);
  70. #define TERMINATION_LOW() GPIOREG(BOARD_SCSI_TERM_HIGH)->BSRR = (1 << BOARD_SCSI_TERM_LOW % 16) << 16 | (1 << BOARD_SCSI_TERM_HIGH % 16);
  71. #define TERMINATION_OFF() GPIOREG(BOARD_SCSI_TERM_HIGH)->BSRR = (1 << BOARD_SCSI_TERM_HIGH % 16) | (1 << BOARD_SCSI_TERM_LOW % 16);
  72. // Enable SCSI buffers
  73. #define SCSI_OUTPUT_ENABLE() GPIOREG(BOARD_TRANS_OE)->BSRR = (1 << (BOARD_TRANS_OE % 16)) << 16;
  74. #define SCSI_OUTPUT_DISABLE() GPIOREG(BOARD_TRANS_OE)->BSRR = (1 << (BOARD_TRANS_OE % 16));
  75. // SCSI Data Direction
  76. #define SCSI_DATABUS_IN() GPIOREG(BOARD_SCSI_DTD)->BSRR = (1 << (BOARD_SCSI_DTD % 16)) << 16;
  77. #define SCSI_DATABUS_OUT() GPIOREG(BOARD_SCSI_DTD)->BSRR = (1 << (BOARD_SCSI_DTD % 16))
  78. // SCSI IND Direction
  79. #define SCSI_IND_IN() GPIOREG(BOARD_SCSI_IND)->BSRR = (1 << (BOARD_SCSI_IND % 16));
  80. #define SCSI_IND_OUT() GPIOREG(BOARD_SCSI_IND)->BSRR = (1 << (BOARD_SCSI_IND % 16)) << 16;
  81. //SCSI Data and IND Direction
  82. #define SCSI_DATABUS_IND_IN() GPIOREG(BOARD_SCSI_DTD)->BSRR = ((1 << (BOARD_SCSI_DTD % 16)) << 16) | (1 << (BOARD_SCSI_IND % 16));
  83. #define SCSI_DATABUS_IND_OUT() GPIOREG(BOARD_SCSI_DTD)->BSRR = ((1 << (BOARD_SCSI_IND % 16)) << 16) | (1 << (BOARD_SCSI_DTD % 16));
  84. // SCSI TAD Direction
  85. #define SCSI_TAD_IN() GPIOREG(BOARD_SCSI_TAD)->BSRR = (1 << (BOARD_SCSI_TAD % 16));
  86. #define SCSI_TAD_OUT() GPIOREG(BOARD_SCSI_TAD)->BSRR = (1 << (BOARD_SCSI_TAD % 16)) << 16;
  87. // Virtual pin (Arduio compatibility is slow, so make it MCU-dependent)
  88. #define PA(BIT) (BIT)
  89. #define PB(BIT) (BIT + 16)
  90. #define PC(BIT) (BIT + 32)
  91. #define PD(BIT) (BIT + 48)
  92. #define PE(BIT) (BIT + 64)
  93. // Virtual pin decoding
  94. #define GPIOREG(VPIN) ((VPIN) >= 16 ? ((VPIN) >= 32 ? ((VPIN) >= 48 ? ((VPIN) >= 48 ? PEREG : PDREG) : PCREG) : PBREG) : PAREG)
  95. #define BITMASK(VPIN) (1 << ((VPIN % 16) & 15))
  96. #define vATN PB(14) // SCSI:ATN
  97. #define vBSY PB(6) // SCSI:BSY
  98. #define vACK PB(7) // SCSI:ACK
  99. #define vRST PA(15) // SCSI:RST
  100. #define vMSG PE(2) // SCSI:MSG
  101. #define vSEL PE(3) // SCSI:SEL
  102. #define vCD PE(4) // SCSI:C/D
  103. #define vREQ PE(5) // SCSI:REQ
  104. #define vIO PE(6) // SCSI:I/O
  105. #define vSD_CS PB(1) // SDCARD:CS
  106. #define vDTD PC(0) // SCSI:DTD
  107. #define vIND PC(1) // SCSI:IND
  108. #define vTAD PC(2) // SCSI:TAD
  109. #define vTRANS_OE PB(12) // SCSI:TRANS_OE
  110. // SCSI output pin control: active LOW (direct pin drive)
  111. #define SCSI_OUT(VPIN,ACTIVE) { GPIOREG(VPIN)->BSRR = BITMASK(VPIN) << ((ACTIVE) ? 16 : 0); }
  112. // SCSI input pin check (inactive=0,active=1)
  113. #define SCSI_IN(VPIN) ((~GPIOREG(VPIN)->IDR >> ((VPIN % 16) & 15)) & 1)
  114. // HDDiamge file
  115. #define HDIMG_ID_POS 2 // Position to embed ID number
  116. #define HDIMG_LUN_POS 3 // Position to embed LUN numbers
  117. #define HDIMG_BLK_POS 5 // Position to embed block size numbers
  118. #define MAX_FILE_PATH 32 // Maximum file name length
  119. // SCSI
  120. #define SCSI_INFO_BUF_SIZE 36
  121. #define SCSI_INFO_VENDOR_SIZE 9
  122. #define SCSI_INFO_PRODUCT_SIZE 17
  123. #define SCSI_INFO_VERSION_SIZE 5
  124. typedef struct hddimg_struct
  125. {
  126. FsFile m_file; // File object
  127. uint64_t m_fileSize; // File size
  128. size_t m_blocksize; // SCSI BLOCK size
  129. }HDDIMG;
  130. // Declare functions
  131. void onFalseInit(void);
  132. void onBusReset(void);
  133. void switchImage(void);
  134. void initFileLog(void);
  135. void finalizeFileLog(void);
  136. #endif // __BLACKSASI_H__