blacksasi.h 5.3 KB

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