Browse Source

More fixes

Per Mårtensson 2 năm trước cách đây
mục cha
commit
05fa53ec32
7 tập tin đã thay đổi với 133 bổ sung159 xóa
  1. 29 40
      sw/include/blacksasi.h
  2. 2 2
      sw/include/scsi.h
  3. 5 4
      sw/platformio.ini
  4. 0 29
      sw/src/config.cpp
  5. 18 16
      sw/src/gpio.cpp
  6. 55 44
      sw/src/main.cpp
  7. 24 24
      sw/src/sdcard.cpp

+ 29 - 40
sw/include/blacksasi.h

@@ -70,10 +70,10 @@
 #define isHigh(XX) ((XX) == high)
 #define isLow(XX) ((XX) != high)
 
-#define TR_INPUT 0
-#define TR_OUTPUT 1
-#define DB_INPUT 1
-#define DB_OUTPUT 0
+#define TR_INPUT 1
+#define TR_OUTPUT 0
+#define DB_INPUT 0
+#define DB_OUTPUT 1
 
 // GPIO register port
 #define PAREG GPIOA->regs
@@ -88,25 +88,15 @@
 #define TERMINATION_OFF()       GPIOREG(BOARD_SCSI_TERM_HIGH)->BSRR = (1 << BOARD_SCSI_TERM_HIGH % 16) | (1 << BOARD_SCSI_TERM_LOW % 16);
 
 // Enable SCSI buffers
-#define SCSI_OUTPUT_ENABLE()    GPIOREG(BOARD_TRANS_OE)->BSRR = (1 << (BOARD_TRANS_OE % 16)) << 16;
-#define SCSI_OUTPUT_DISABLE()   GPIOREG(BOARD_TRANS_OE)->BSRR = (1 << (BOARD_TRANS_OE % 16));
+#define SCSI_OUTPUT_DISABLE()    GPIOREG(BOARD_TRANS_OE)->BSRR = (1 << (BOARD_TRANS_OE & 15)) << 16;
+#define SCSI_OUTPUT_ENABLE()   GPIOREG(BOARD_TRANS_OE)->BSRR = (1 << (BOARD_TRANS_OE  & 15));
 
 // SCSI Data Direction
-#define SCSI_DATABUS_IN()       GPIOREG(BOARD_SCSI_DTD)->BSRR = (1 << (BOARD_SCSI_DTD % 16)) << 16; 
-#define SCSI_DATABUS_OUT()      GPIOREG(BOARD_SCSI_DTD)->BSRR = (1 << (BOARD_SCSI_DTD % 16))
+#define SCSI_DATABUS_OUT()       GPIOREG(BOARD_SCSI_DTD)->BSRR = (1 << (BOARD_SCSI_DTD & 15)) << 16; 
+#define SCSI_DATABUS_IN()      GPIOREG(BOARD_SCSI_DTD)->BSRR = (1 << (BOARD_SCSI_DTD  & 15))
 
-// SCSI IND Direction
-#define SCSI_IND_IN()           GPIOREG(BOARD_SCSI_IND)->BSRR = (1 << (BOARD_SCSI_IND % 16));
-#define SCSI_IND_OUT()          GPIOREG(BOARD_SCSI_IND)->BSRR = (1 << (BOARD_SCSI_IND % 16)) << 16;
 
-//SCSI Data and IND Direction
-#define SCSI_DATABUS_IND_IN()   GPIOREG(BOARD_SCSI_DTD)->BSRR = ((1 << (BOARD_SCSI_DTD % 16)) << 16) | (1 << (BOARD_SCSI_IND % 16));
-#define SCSI_DATABUS_IND_OUT()  GPIOREG(BOARD_SCSI_DTD)->BSRR = ((1 << (BOARD_SCSI_IND % 16)) << 16) | (1 << (BOARD_SCSI_DTD % 16));
 
-// SCSI TAD Direction
-
-#define SCSI_TAD_IN()           GPIOREG(BOARD_SCSI_TAD)->BSRR = (1 << (BOARD_SCSI_TAD % 16));
-#define SCSI_TAD_OUT()          GPIOREG(BOARD_SCSI_TAD)->BSRR = (1 << (BOARD_SCSI_TAD % 16)) << 16;
 
 // Virtual pin (Arduio compatibility is slow, so make it MCU-dependent)
 #define PA(BIT)       (BIT)
@@ -116,8 +106,8 @@
 #define PE(BIT)       (BIT + 64)
 
 // Virtual pin decoding
-#define GPIOREG(VPIN)     ((VPIN) >= 16 ? ((VPIN) >= 32 ? ((VPIN) >= 48 ? ((VPIN) >= 48 ? PEREG : PDREG) : PCREG) : PBREG) : PAREG)
-#define BITMASK(VPIN)     (1 << ((VPIN % 16) & 15))
+#define GPIOREG(VPIN)     ((VPIN) >= 16 ? ((VPIN) >= 32 ? ((VPIN) >= 48 ? ((VPIN) >= 64 ? PEREG : PDREG) : PCREG) : PBREG) : PAREG)
+#define BITMASK(VPIN)     (1 << ((VPIN) & 15))
 
 
 #define vATN       PB(14)     // SCSI:ATN
@@ -138,7 +128,7 @@
 #define SCSI_OUT(VPIN,ACTIVE) { GPIOREG(VPIN)->BSRR = BITMASK(VPIN) << ((ACTIVE) ? 16 : 0); }
 
 // SCSI input pin check (inactive=0,active=1)
-#define SCSI_IN(VPIN) ((~GPIOREG(VPIN)->IDR >> ((VPIN % 16) & 15)) & 1)
+#define SCSI_IN(VPIN) ((~GPIOREG(VPIN)->IDR >> ((VPIN) & 15)) & 1)
 
 // HDDiamge file
 #define HDIMG_ID_POS  2                 // Position to embed ID number
@@ -237,46 +227,43 @@ enum SCSI_DEVICE_TYPE
 #define SCSI_PHASE_MESSAGEOUT SCSIPHASEMASK(active, active, inactive)
 #define SCSI_PHASE_MESSAGEIN SCSIPHASEMASK(active, active, active)
 
-#define SCSI_PHASE_CHANGE(MASK) { PBREG->BSRR = (MASK); }
+#define SCSI_PHASE_CHANGE(MASK) { PEREG->BSRR = (MASK); }
 //BLACKSASI clean this up and use defines
 // Data pins
 //                                                         5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 
-static const uint32_t scsiDbOutputRegOr_PDREG         = 0b00000000000000000101010101010101;
+static const uint32_t scsiDbOutputRegOr_PDREG         = 0b00000000000000010101010101010101;
 static const uint32_t scsiDbInputOutputAnd_PDREG      = 0b00000000000000000000000000000000;
-static const uint32_t scsiDbInputOutputPullAnd_PDREG  = 0b00000000000000000101010101010101;
+static const uint32_t scsiDbInputOutputPullAnd_PDREG  = 0b00000000000000010101010101010101;
 // Control pins
 //                                                         5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 
-static const uint32_t scsiDbOutputRegOr_PEREG         = 0b00000000000000000000000000000001;
-static const uint32_t scsiDbInputOutputAnd_PEREG      = 0b00000000000000000011111111110000;
 static const uint32_t scsiDbInputOutputPullAnd_PEREG  = 0b00000000000000000001010101010001;
 
 // Put DB and DP in output mode and control buffers
-#define SCSI_DB_OUTPUT() { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG) | scsiDbOutputRegOr_PDREG; PEREG->MODER = (PEREG->MODER & scsiDbInputOutputAnd_PEREG) | scsiDbOutputRegOr_PEREG; SCSI_DATABUS_OUT() ;}
+#define SCSI_DB_OUTPUT() { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG) | scsiDbOutputRegOr_PDREG;  SCSI_DATABUS_OUT() ;}
 
 // Put DB and DP in input mode and control buffers
-#define SCSI_DB_INPUT()  { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG); PEREG->MODER = (PEREG->MODER & scsiDbInputOutputAnd_PEREG); SCSI_DATABUS_IN();}
+#define SCSI_DB_INPUT()  { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG); SCSI_DATABUS_IN();}
 #define SCSI_SET_PULL()  { PDREG->PUPDR |= scsiDbInputOutputPullAnd_PDREG; PEREG->PUPDR |= scsiDbInputOutputPullAnd_PEREG; }
 
 // Transceiver control definitions
-#define TRANSCEIVER_IO_SET(VPIN,TR_INPUT) { GPIOREG(VPIN)->BSRR = BITMASK(VPIN) << ((TR_INPUT) ? 16 : 0); }
-
+#define TRANSCEIVER_IO_SET(VPIN,TRX_INPUT) { GPIOREG(VPIN)->BSRR = BITMASK(VPIN) << ((TRX_INPUT) ? 16 : 0); }
+#define PTY(V)   (1^((V)^((V)>>1)^((V)>>2)^((V)>>3)^((V)>>4)^((V)>>5)^((V)>>6)^((V)>>7))&1)
 
 //                                                      5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 
-static const uint32_t SCSI_TARGET_PORTD_AND        = 0b11111111111111111100111111111111;
-static const uint32_t SCSI_TARGET_PORTD_OR         = 0b00000000000000000001000000000000;
+static const uint32_t SCSI_TARGET_PORTB_AND        = 0b11001111111111110000111111111111;
+static const uint32_t SCSI_TARGET_PORTB_OR         = 0b00010000000000000101000000000000;
 
 //                                                      5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 
-static const uint32_t SCSI_TARGET_PORTE_AND        = 0b11111111111111111100000110000011;
+static const uint32_t SCSI_TARGET_PORTE_AND        = 0b11111111111111111100000011000011;
 static const uint32_t SCSI_TARGET_PORTE_OR         = 0b00000000000000000001010100010000;
 
 // Turn on the output only for BSY
-#define SCSI_BSY_ACTIVE()      { PEREG->MODER = (PEREG->MODER & SCSI_TARGET_PORTE_AND) | SCSI_TARGET_PORTE_OR; PDREG->MODER = (PDREG->MODER & SCSI_TARGET_PORTD_AND) | SCSI_TARGET_PORTD_OR; SCSI_OUT(vBSY, active) }
-
+//#define SCSI_BSY_ACTIVE()      { PEREG->MODER = (PEREG->MODER & SCSI_TARGET_PORTE_AND) | SCSI_TARGET_PORTE_OR; PDREG->MODER = (PDREG->MODER & SCSI_TARGET_PORTD_AND) | SCSI_TARGET_PORTD_OR; SCSI_OUT(vBSY, active) }
+#define SCSI_BSY_ACTIVE()      { pinMode(BOARD_SCSI_BSY, OUTPUT); SCSI_OUT(vBSY,  active) }
 // BSY,REQ,MSG,CD,IO Turn off output, BSY is the last input
-#define SCSI_TARGET_INACTIVE() { PEREG->MODER = (PEREG->MODER & SCSI_TARGET_PORTE_AND); PDREG->MODER = (PDREG->MODER & SCSI_TARGET_PORTD_AND); TRANSCEIVER_IO_SET(vTAD,TR_INPUT); }
-
-#define SCSI_TARGET_ACTIVE()   { PEREG->MODER = (PEREG->MODER & SCSI_TARGET_PORTE_AND) | SCSI_TARGET_PORTE_OR; PDREG->MODER = (PDREG->MODER & SCSI_TARGET_PORTD_AND) | SCSI_TARGET_PORTD_OR; }
+#define SCSI_TARGET_INACTIVE() { PEREG->MODER = (PEREG->MODER & SCSI_TARGET_PORTE_AND); PBREG->MODER = (PBREG->MODER & SCSI_TARGET_PORTB_AND); TRANSCEIVER_IO_SET(vTAD,TR_INPUT); }
 
+#define SCSI_TARGET_ACTIVE()   { PEREG->MODER = (PEREG->MODER & SCSI_TARGET_PORTE_AND) | SCSI_TARGET_PORTE_OR; PBREG->MODER = (PBREG->MODER & SCSI_TARGET_PORTB_AND) | SCSI_TARGET_PORTB_OR; }
 
 
 // HDDimage file
@@ -301,11 +288,13 @@ static uint32_t genBSRR(uint32_t data) {
   // positions[0] is for data bit 0, position[1] for data bit 1, etc
   // DB0, DB1, DB2, DB4, DB5, DB6, DB7 in order
   uint8_t positions[] = {0UL, 1UL, 2UL, 3UL, 4UL, 5UL, 6UL, 7UL};
-  uint8_t dbpPosition = 0UL;
-  int reqPosition = 6;
+  uint8_t dbpPosition = 8UL;
+  int reqPosition = 0;
   uint8_t bitsAsserted = 0;
+
  //PM2022 Fix this in better way since we now have the bits correct
   uint32_t output = 0x00000000;
+  //output |=(~data) | (data << 16);
   for (int i = 0; i < 8; i++) {
     if (data & (0x1 << masks[i])) {
       // There's a one in this bit position, BSRR reset

+ 2 - 2
sw/include/scsi.h

@@ -3,9 +3,9 @@
 #include "blacksasi.h"
 
 // Turn on the output only for BSY
-#define SCSI_BSY_ACTIVE()      { pinMode(BOARD_SCSI_BSY, OUTPUT_OPEN_DRAIN); SCSI_OUT(vBSY,  active) }
+//#define SCSI_BSY_ACTIVE()      { pinMode(BOARD_SCSI_BSY, OUTPUT_OPEN_DRAIN); SCSI_OUT(vBSY,  active) }
 // BSY,REQ,MSG,CD,IO Turn on the output (no change required for OD)
-#define SCSI_TARGET_ACTIVE()   { }
+//#define SCSI_TARGET_ACTIVE()   { }
 
 
 #endif // __BLACKSASI_SCSI_H__

+ 5 - 4
sw/platformio.ini

@@ -17,8 +17,8 @@ board.variants_dir = C:\Users\martenssonp\projects\BlackSASI\sw\variant\blacksas
 framework = arduino
 board_build.core = maple
 lib_deps =
-    greiman/SdFat@^2.2.0
-   bblanchon/ArduinoJson@^6.19.3
+  greiman/SdFat@^2.2.0
+  ;bblanchon/ArduinoJson @ ^6.19.3
 upload_protocol = stlink
 debug_tool = stlink
 ; Different gcc versions produce much different binaries in terms of speed.
@@ -29,8 +29,9 @@ debug_tool = stlink
 ; 1.80201.181220 ; 921kb/sec
 ; 1.90201.191206 ; 912kb/sec
 ; 1.90301.200702 ; default - 955kb/sec
-platform_packages = toolchain-gccarmnoneeabi@1.60301.0
-
+platform_packages = platformio/toolchain-gccarmnoneeabi@1.60301.0
+;toolchain-gccarmnoneeabi@1.60301.0
+;toolchain-gccarmnoneeabi@1.90301.200702
 build_unflags = 
     -Os
     -DARDUINO_ARCH_STM32F4

+ 0 - 29
sw/src/config.cpp

@@ -1,29 +0,0 @@
-#include <Arduino.h>
-#include "config.h"
-#include "sdcard.h"
-#include "ArduinoJson.h"
-extern SdFs SD;
-extern FsFile LOG_FILE;
-extern byte SCSI_INFO_BUF[SCSI_INFO_BUF_SIZE];
-// If config file exists, read the first three lines and copy the contents.
-// File must be well formed or you will get junk in the SCSI Vendor fields.
-void readSCSIDeviceConfig(uint8_t disc) {
-  StaticJsonDocument<2048> config;
-  FsFile config_file = SD.open("blacksasi.json", O_RDONLY);
-  if (!config_file.isOpen()) {
-    return;
-  }
-  
-  DeserializationError error = deserializeJson(config, config_file);
-  if (error){
-    Serial.println(F("Failed to read file"));
-    return;
-  }
-  String configx =config["config"];
-  Serial.println(configx);
-
-}
-uint32 readHWVersion(){
-    return((digitalRead(BOARD_REV_PIN0 ) == LOW) ) | ((digitalRead(BOARD_REV_PIN1 ) == LOW) ) << 1 | ((digitalRead(BOARD_REV_PIN2) == LOW) ) << 2;
-  
-}

+ 18 - 16
sw/src/gpio.cpp

@@ -18,6 +18,7 @@ bool gpioInit(void){
     pinMode(BOARD_REV_PIN2, INPUT_PULLDOWN);
     pinMode(BOARD_SCSI_TERM_HIGH, OUTPUT);
     pinMode(BOARD_SCSI_TERM_LOW, OUTPUT);
+    pinMode(BOARD_SCSI_DBX, OUTPUT);
     pinMode(BOARD_SCSI_TERM_POWER, INPUT); //Check if external termination power is provided
 
     attachInterrupt(BOARD_SDCARD_INSERT,sdCardInsert, CHANGE);
@@ -26,34 +27,35 @@ bool gpioInit(void){
     attachInterrupt(BOARD_SWITCH3_PIN,switchImage, CHANGE);
     attachInterrupt(BOARD_SWITCH4_PIN,switchImage, CHANGE);
 
-
-
     // Control SCSI drivers
     pinMode(BOARD_SCSI_DTD, OUTPUT);
     pinMode(BOARD_SCSI_IND, OUTPUT);
     pinMode(BOARD_SCSI_TAD, OUTPUT);
     pinMode(BOARD_TRANS_OE, OUTPUT);
-
+pinMode(PB8, OUTPUT);
+pinMode(PB9, OUTPUT);
+digitalWrite(PB8, LOW);
+digitalWrite(PB9, LOW);
     digitalWrite(BOARD_TRANS_OE, LOW);
-    SCSI_DB_INPUT()
-    TRANSCEIVER_IO_SET(vDTD,DB_INPUT);
-    SCSI_DB_INPUT()
-
+    SCSI_SET_PULL() ;
     TRANSCEIVER_IO_SET(vDTD,DB_INPUT);
     
     // Initiator port
-    pinMode(BOARD_SCSI_ATN, INPUT);
-    pinMode(BOARD_SCSI_BSY, INPUT);
-    pinMode(BOARD_SCSI_ACK, INPUT);
-    pinMode(BOARD_SCSI_RST, INPUT);
-    pinMode(BOARD_SCSI_SEL, INPUT);
+    pinMode(BOARD_SCSI_ATN, INPUT_PULLUP);
+    pinMode(BOARD_SCSI_BSY, INPUT_PULLUP);
+    pinMode(BOARD_SCSI_ACK, INPUT_PULLUP);
+    pinMode(BOARD_SCSI_RST, INPUT_PULLUP);
+    pinMode(BOARD_SCSI_SEL, INPUT_PULLUP);
     TRANSCEIVER_IO_SET(vIND,TR_INPUT);
 
     // Target port
-    pinMode(BOARD_SCSI_MSG, INPUT);
-    pinMode(BOARD_SCSI_CD, INPUT);
-    pinMode(BOARD_SCSI_REQ, INPUT);
-    pinMode(BOARD_SCSI_IO, INPUT);
+    pinMode(BOARD_SCSI_MSG, INPUT_PULLUP);
+    pinMode(BOARD_SCSI_CD, INPUT_PULLUP);
+    pinMode(BOARD_SCSI_REQ, INPUT_PULLUP);
+    pinMode(BOARD_SCSI_IO, INPUT_PULLUP);
     TRANSCEIVER_IO_SET(vTAD,TR_INPUT);
+
+    SCSI_DB_INPUT()
+    SCSI_TARGET_INACTIVE()
 }
   

+ 55 - 44
sw/src/main.cpp

@@ -124,7 +124,7 @@ inline byte readIO(void)
 {
   // Port input data register
   uint32_t ret = GPIOD->regs->IDR;
-  byte bret = (byte)~(((ret >> 8) & 0b11111111));
+  byte bret = (byte)~(((ret )));
 #if READ_PARITY_CHECK
   if((db_bsrr[bret]^ret)&1)  // TODO fix parity calculation
     m_sts |= 0x01; // parity error
@@ -283,6 +283,13 @@ void setup()
   for (unsigned i = 0; i <= 255; i++) {
     db_bsrr[i] = genBSRR(i);
   }
+    // Serial initialization
+#if DEBUG == 1
+  serial.begin(115200);
+  serial.flush();
+  // If using a USB->TTL monitor instead of USB serial monitor - you can uncomment this.
+  //while (!Serial);
+#endif
   gpioInit();
   // Default all SCSI command handlers to onUnimplemented
   for(unsigned i = 0; i < MAX_SCSI_COMMAND; i++)
@@ -348,12 +355,7 @@ void setup()
   default_optical.release = 0x20;
   memcpy(&default_optical.revision_date, "1995", 4);
 
-  // Serial initialization
-#if DEBUG == 1
-  serial.begin(115200);
-  // If using a USB->TTL monitor instead of USB serial monitor - you can uncomment this.
-  //while (!Serial);
-#endif
+
   delay(3000);
 
 
@@ -364,13 +366,13 @@ void setup()
   
 
   // Transceiver Pin Initialization
-  pinMode(BOARD_SCSI_TAD, OUTPUT);
-  pinMode(BOARD_SCSI_IND, OUTPUT);
-  pinMode(BOARD_SCSI_DTD, OUTPUT);
+  pinMode(BOARD_SCSI_TAD, OUTPUT_OPEN_DRAIN);
+  pinMode(BOARD_SCSI_IND, OUTPUT_OPEN_DRAIN);
+  pinMode(BOARD_SCSI_DTD, OUTPUT_OPEN_DRAIN);
   
   TRANSCEIVER_IO_SET(vIND,TR_INPUT);
   TRANSCEIVER_IO_SET(vTAD,TR_INPUT);
-
+  TERMINATION_LOW();
 
 
   
@@ -385,6 +387,7 @@ void setup()
   int mhz = 0;
   // Try each speed bucket a few times, and go way down for very old SD cards
   // Most will initialize immediately at the highest speed
+  
   int speedsToTry[] = {50, 49, 43, 42, 25, 24, 17, 16, 8, 7, 5, 4, 3, 1 };
   for (int i = 0; i < sizeof(speedsToTry); i++) {
     if(SD.begin(SdSpiConfig(SS, DEDICATED_SPI, SD_SCK_MHZ(speedsToTry[i])))) {
@@ -392,6 +395,7 @@ void setup()
       break;
     }
   }
+  
   LED1_OFF();
 
   if(mhz == 0) {
@@ -401,9 +405,7 @@ void setup()
     flashError(ERROR_NO_SDCARD);
   }
   initFileLog(mhz);
-  serial.println("YYYYY");
   readSDCardInfo();
-  serial.println("XXXX");
 
   //HD image file open
   scsi_id_mask = 0x00;
@@ -667,8 +669,8 @@ void enableResetJmp(void) {
  */
 inline byte readHandshake(void)
 {
-  SCSI_OUT(vREQ,active)
-  //SCSI_DB_INPUT()
+  
+  SCSI_OUT(vREQ,active);
   while( ! SCSI_IN(vACK));
   byte r = readIO();
   SCSI_OUT(vREQ,inactive)
@@ -682,20 +684,23 @@ inline byte readHandshake(void)
 inline void writeHandshake(byte d)
 {
   // This has a 400ns bus settle delay built in. Not optimal for multi-byte transfers.
-  GPIOD->regs->BSRR = db_bsrr[d]; // setup DB,DBP (160ns) //PM2022 need to add parity from PE
+  serial.flush();
+
+  GPIOD->regs->BSRR = db_bsrr[d]; // setup DB,DBP (160ns)
   TRANSCEIVER_IO_SET(vDTD,DB_OUTPUT)
-  SCSI_DB_OUTPUT() // (180ns)
+  TRANSCEIVER_IO_SET(vIND,TR_OUTPUT)
+
   // ACK.Fall to DB output delay 100ns(MAX)  (DTC-510B)
-  SCSI_OUT(vREQ,inactive) // setup wait (30ns)w
+  SCSI_OUT(vREQ,inactive) // setup wait (30ns)
   SCSI_OUT(vREQ,inactive) // setup wait (30ns)
   SCSI_OUT(vREQ,inactive) // setup wait (30ns)
   SCSI_OUT(vREQ,active)   // (30ns)
   //while(!SCSI_IN(vACK)) { if(m_isBusReset){ SCSI_DB_INPUT() return; }}
   while(!SCSI_IN(vACK));
   // ACK.Fall to REQ.Raise delay 500ns(typ.) (DTC-510B)
-  uint32_t bsrrCall = ((db_bsrr[0xff] & 0xFFDFFFFF) | 0x00000020);
+  uint32_t bsrrCall = (db_bsrr[0xff] );
   GPIOE->regs->BSRR = bsrrCall;  // DB=0xFF , SCSI_OUT(vREQ,inactive) //PM2022 should wirite data to bus
-  
+  SCSI_OUT(vREQ,inactive)
   // REQ.Raise to DB hold time 0ns
   SCSI_DB_INPUT() // (150ns)
   TRANSCEIVER_IO_SET(vDTD,DB_INPUT)
@@ -715,9 +720,9 @@ inline void writeHandshake(byte d)
  */
 
 void writeDataLoop(uint32_t blocksize, const byte* srcptr) {
-#define REQ_ON() (PBREG->BSRR = req_rst_bit);
+#define REQ_ON() (PEREG->BSRR = req_rst_bit);
 #define FETCH_BSRR_DB() (bsrr_val = bsrr_tbl[*srcptr++])
-#define REQ_OFF_DB_SET(BSRR_VAL) PBREG->BSRR = BSRR_VAL;
+#define REQ_OFF_DB_SET(BSRR_VAL) (PEREG->BSRR = req_bit);PDREG->BSRR = BSRR_VAL;
 #define WAIT_ACK_ACTIVE()   while((*port_b_idr>>(vACK&15)&1))
 #define WAIT_ACK_INACTIVE() while(!(*port_b_idr>>(vACK&15)&1))
 
@@ -727,6 +732,7 @@ void writeDataLoop(uint32_t blocksize, const byte* srcptr) {
   register uint32_t bsrr_val;                       // BSRR value to output (DB, DBP, REQ = ACTIVE)
 
   register uint32_t req_bit = BITMASK(vREQ);
+
   register uint32_t req_rst_bit = BITMASK(vREQ) << 16;
   register volatile uint32 *port_b_idr = &(GPIOB->regs->IDR);
 
@@ -740,6 +746,7 @@ void writeDataLoop(uint32_t blocksize, const byte* srcptr) {
   // Align the starts of the do/while and WAIT loops to an 8 byte prefetch.
 
   do{
+
     WAIT_ACK_INACTIVE();
     REQ_ON();
     // 4 cycles of work
@@ -779,14 +786,15 @@ void writeDataPhase(int len, const byte* p)
 void writeDataPhaseSD(SCSI_DEVICE *dev, uint32_t adds, uint32_t len)
 {
   LOG (" DI(SD) ");
+
   SCSI_PHASE_CHANGE(SCSI_PHASE_DATAIN);
   //Bus settle delay 400ns, file.seek() measured at over 1000ns.
   uint64_t pos = (uint64_t)adds * dev->m_rawblocksize;
-  dev->m_file->seekSet(pos);
+ dev->m_file->seekSet(pos);
 
   TRANSCEIVER_IO_SET(vDTD,DB_OUTPUT)
   SCSI_DB_OUTPUT()
-  
+
   for(uint32_t i = 0; i < len; i++) {
       // Asynchronous reads will make it faster ...
     m_resetJmp = false;
@@ -912,28 +920,23 @@ void MsgIn2(int msg)
  */
 void loop() 
 {
+
   // Reset all DB and Target pins, switch transceivers to input
   // Precaution against bugs or jumps which don't clean up properly
   SCSI_DB_INPUT();
   TRANSCEIVER_IO_SET(vDTD,DB_INPUT)
   SCSI_TARGET_INACTIVE();
-
+  TRANSCEIVER_IO_SET(vIND,TR_INPUT)
   // Reset target state bits (BSY, MSG, CD, REQ, IO)
 
-  GPIOE->regs->BSRR = 0x00000074; // MSG, CD, REQ, IO
-  GPIOB->regs->BSRR = 0x00000040; // BOARD_SCSI_BSY
-  TRANSCEIVER_IO_SET(vTAD,TR_INPUT)
-  TRANSCEIVER_IO_SET(vIND,TR_INPUT)
   LED3_ON();
 
   //int msg = 0;
   m_msg = 0;
   m_lun = 0xff;
   SCSI_DEVICE *dev = (SCSI_DEVICE *)0; // HDD image for current SCSI-ID, LUN
+
   do {
-    serial.print(SCSI_IN(vBSY));
-    serial.print(SCSI_IN(vSEL));
-    serial.println(SCSI_IN(vRST));
   } while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
   //do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
   // We're in ARBITRATION
@@ -942,24 +945,25 @@ void loop()
   //do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
   //LOG(" S:"); LOGHEX(readIO()); LOG(" ");
   // We're in SELECTION
-  
+
   byte scsiid = readIO() & scsi_id_mask;
+
   if(SCSI_IN(vIO) || (scsiid) == 0) {
     delayMicroseconds(1);
     return;
   }
   // We've been selected
-
+  SCSI_OUT(vATN,inactive);
+  SCSI_OUT(vACK,inactive);
   TRANSCEIVER_IO_SET(vTAD,TR_OUTPUT);
-  TRANSCEIVER_IO_SET(vIND,TR_OUTPUT);
+  LOGN("SELECTED");
+ 
   SCSI_TARGET_ACTIVE()  // (BSY), REQ, MSG, CD, IO output turned on
 
   // Set BSY to-when selected
   SCSI_BSY_ACTIVE();     // Turn only BSY output ON, ACTIVE
-
   // Wait until SEL becomes inactive
   while(isHigh(digitalRead(BOARD_SCSI_SEL))) {}
-  
   // Ask for a TARGET-ID to respond
   m_id = 31 - __builtin_clz(scsiid);
 
@@ -967,9 +971,9 @@ void loop()
   if (setjmp(m_resetJmpBuf) == 1) {
     LOGN("Reset, going to BusFree");
     goto BusFree;
-  }
-  enableResetJmp();
+  } 
   
+  enableResetJmp();
   // In SCSI-2 this is mandatory, but in SCSI-1 it's optional 
   if(isHigh(digitalRead(BOARD_SCSI_ATN))) {
     SCSI_PHASE_CHANGE(SCSI_PHASE_MESSAGEOUT);
@@ -1024,9 +1028,13 @@ void loop()
       }
     }
   }
-
   LOG("CMD:");
+
   SCSI_PHASE_CHANGE(SCSI_PHASE_COMMAND);
+  SCSI_BSY_ACTIVE(); 
+  TRANSCEIVER_IO_SET(vTAD,TR_INPUT);
+  TRANSCEIVER_IO_SET(vIND,TR_OUTPUT);
+
   // Bus settle delay 400ns. The following code was measured at 20ns before REQ asserted. Added another 380ns. STM32F103.
   asm("nop;nop;nop;nop;nop;nop;nop;nop");// This asm causes some code reodering, which adds 270ns, plus 8 nop cycles for an additional 110ns. STM32F103
   int len;
@@ -1055,6 +1063,7 @@ void loop()
     LOG(":");
     LOGHEX(cmd[i]);
   }
+
   // LUN confirmation
   // if it wasn't set in the IDENTIFY then grab it from the CDB
   if(m_lun > MAX_SCSILUN)
@@ -1069,7 +1078,7 @@ void loop()
   LOG(" ");
 
   // HDD Image selection
-  if(m_lun >= NUM_SCSILUN)
+  if(m_lun >= NUM_SCSILUN && 1==0)
   {
     m_sts = SCSI_STATUS_GOOD;
 
@@ -1113,7 +1122,6 @@ void loop()
 
     goto Status;
   }
-
   dev = &(scsi_device_list[m_id][m_lun]);
   if(!dev->m_file)
   {
@@ -1129,12 +1137,15 @@ void loop()
 
 Status:
   LOG(" STS:"); LOGHEX(m_sts);
-  SCSI_PHASE_CHANGE(SCSI_PHASE_STATUS);
+
+  //SCSI_PHASE_CHANGE(SCSI_PHASE_STATUS);
+  SCSI_OUT(vCD,inactive);
   // Bus settle delay 400ns built in to writeHandshake
   writeHandshake(m_sts);
 
   LOG(" MI:"); LOGHEX(m_msg);
-  SCSI_PHASE_CHANGE(SCSI_PHASE_MESSAGEIN);
+  //SCSI_PHASE_CHANGE(SCSI_PHASE_MESSAGEIN);
+  SCSI_OUT(vMSG,active);
   // Bus settle delay 400ns built in to writeHandshake
   writeHandshake(m_msg);
 

+ 24 - 24
sw/src/sdcard.cpp

@@ -9,27 +9,27 @@ void readSDCardInfo()
 
   if(SD.card()->readCID(&sd_cid))
   {
-    serial.print("Sd MID:");
-    serial.print(sd_cid.mid, 16);
-    serial.print(" OID:");
-    serial.print(sd_cid.oid[0]);
-    serial.println(sd_cid.oid[1]);
-
-    serial.print("Sd Name:");
-    serial.print(sd_cid.pnm[0]);
-    serial.print(sd_cid.pnm[1]);
-    serial.print(sd_cid.pnm[2]);
-    serial.print(sd_cid.pnm[3]);
-    serial.println(sd_cid.pnm[4]);
-
-    serial.print("Sd Date:");
-    serial.print(sd_cid.mdtMonth());
-
-    serial.println(sd_cid.mdtYear());
-
-    serial.print("Sd Serial:");
-    serial.println(sd_cid.psn());
-    serial.flush();
+    LOG("Sd MID:");
+    LOG(sd_cid.mid); //,16
+    LOG(" OID:");
+    LOG(sd_cid.oid[0]);
+    LOGN(sd_cid.oid[1]);
+
+    LOG("Sd Name:");
+    LOG(sd_cid.pnm[0]);
+    LOG(sd_cid.pnm[1]);
+    LOG(sd_cid.pnm[2]);
+    LOG(sd_cid.pnm[3]);
+    LOGN(sd_cid.pnm[4]);
+
+    LOG("Sd Date:");
+    LOG(sd_cid.mdtMonth());
+
+    LOGN(sd_cid.mdtYear());
+
+    LOG("Sd Serial:");
+    LOGN(sd_cid.psn());
+
   }
 }
 void readSDCardInfo2()
@@ -95,9 +95,9 @@ void switchImage(void){
                   digitalRead(BOARD_SWITCH3_PIN) << 2 |  
                   digitalRead(BOARD_SWITCH4_PIN) << 3)) & 0x0F;
     if ( oldimageSelect!=imageSelect){
-    serial.print("Image: ");
-    serial.println(imageSelect);
-    serial.flush();
+    LOG("Image: ");
+    LOGN(imageSelect);
+
     }