Browse Source

Fix output for scsi buffers

Per Mårtensson 3 years ago
parent
commit
cee57f8558
2 changed files with 20 additions and 13 deletions
  1. 9 8
      sw/src/gpio.cpp
  2. 11 5
      sw/src/main.cpp

+ 9 - 8
sw/src/gpio.cpp

@@ -30,15 +30,16 @@ bool gpioInit(void){
     pinMode(BOARD_SCSI_SEL, INPUT_PULLUP);
 
     // Output port
-    pinMode(BOARD_SCSI_MSG, OUTPUT_OPEN_DRAIN);
-    pinMode(BOARD_SCSI_CD, OUTPUT_OPEN_DRAIN);
-    pinMode(BOARD_SCSI_REQ, OUTPUT_OPEN_DRAIN);
-    pinMode(BOARD_SCSI_IO, OUTPUT_OPEN_DRAIN);
+    pinMode(BOARD_SCSI_MSG, OUTPUT);
+    pinMode(BOARD_SCSI_CD, OUTPUT);
+    pinMode(BOARD_SCSI_REQ, OUTPUT);
+    pinMode(BOARD_SCSI_IO, OUTPUT);
 
     // Control SCSI drivers
-    pinMode(BOARD_SCSI_DTD, OUTPUT_OPEN_DRAIN);
-    pinMode(BOARD_SCSI_IND, OUTPUT_OPEN_DRAIN);
-    pinMode(BOARD_SCSI_TAD, OUTPUT_OPEN_DRAIN);
-    pinMode(BOARD_TRANS_OE, OUTPUT_OPEN_DRAIN);
+    pinMode(BOARD_SCSI_DTD, OUTPUT);
+    pinMode(BOARD_SCSI_IND, OUTPUT);
+    pinMode(BOARD_SCSI_TAD, OUTPUT);
+    pinMode(BOARD_TRANS_OE, OUTPUT);
+    digitalWrite(BOARD_TRANS_OE, HIGH);
 }
   

+ 11 - 5
sw/src/main.cpp

@@ -84,10 +84,10 @@ static const uint32_t scsiDbInputOutputAnd_PEREG = 0b000000000000000000111111111
 
 
 // Put DB and DP in output mode
-#define SCSI_DB_OUTPUT() { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG) | scsiDbOutputRegOr_PDREG; PEREG->MODER = (PEREG->MODER & scsiDbInputOutputAnd_PEREG) | scsiDbOutputRegOr_PEREG; }
+#define SCSI_DB_OUTPUT() { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG) | scsiDbOutputRegOr_PDREG; PEREG->MODER = (PEREG->MODER & scsiDbInputOutputAnd_PEREG) | scsiDbOutputRegOr_PEREG; SCSI_OUTPUT_OUT() ;}
 
 // Put DB and DP in input mode
-#define SCSI_DB_INPUT()  { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG); PEREG->MODER = (PEREG->MODER & scsiDbInputOutputAnd_PEREG); }
+#define SCSI_DB_INPUT()  { PDREG->MODER = (PDREG->MODER & scsiDbInputOutputAnd_PDREG); PEREG->MODER = (PEREG->MODER & scsiDbInputOutputAnd_PEREG); SCSI_OUTPUT_IN();}
 
 
 // BSY,REQ,MSG,CD,IO Turn off output, BSY is the last input
@@ -231,6 +231,7 @@ inline byte readIO(void)
 
   
 #if READ_PARITY_CHECK
+  //BLACKSASI NEED TO BE FIXED
   if((db_bsrr[bret]^ret)&1)  // TODO fix parity calculation
     m_sts |= 0x01; // parity error
 #endif
@@ -299,7 +300,8 @@ bool hddimageOpen(HDDIMG *h,const char *image_name,int id,int lun,int blocksize)
  */
 void setup()
 {
-
+  gpioInit();
+  
 #if DEBUG > 0
   Serial.begin(19200);
   delay(3000);
@@ -308,7 +310,7 @@ void setup()
 
 #endif
 
-  gpioInit();
+
 
   //Default turn termination off
   TERMINATION_HIGH();
@@ -454,6 +456,9 @@ Should not be used due to buffers
   }
 
   finalizeFileLog();
+
+  // Turn on output
+  SCSI_OUTPUT_ENABLE() ;
   //LED_OFF();
   //Occurs when the RST pin state changes from HIGH to LOW
   attachInterrupt(BOARD_SCSI_RST, onBusReset, FALLING);
@@ -526,7 +531,8 @@ inline void writeHandshake(byte d)
   while(!m_isBusReset && !SCSI_IN(vACK));
   
   // ACK.Fall to REQ.Raise delay 500ns(typ.) (DTC-510B)
-  uint32_t bsrrCall = ((db_bsrr[0xff] & 0xFFBFFFFF) | 0x00000040); //BLACKSASI CHECK
+   //BLACKSASI NEED TO BE FIXED !!!!
+  uint32_t bsrrCall = ((db_bsrr[0xff] & 0xFFBFFFFF) | 0x00000040);
   GPIOB->regs->BSRR = bsrrCall;  // DB=0xFF , SCSI_OUT(vREQ,inactive)
   
   // REQ.Raise to DB hold time 0ns