#27 Added skeleton code for Arbitration and Reselection phases

This commit is contained in:
akuker
2020-09-24 21:11:52 -05:00
parent 5c05e00c40
commit 01b0fb0f35
4 changed files with 134 additions and 7 deletions

View File

@@ -80,11 +80,9 @@ BUS::phase_t FASTCALL SCSIDEV::Process()
// Get bus information
ctrl.bus->Aquire();
// Reset
// Check to see if the reset signal was asserted
if (ctrl.bus->GetRST()) {
#if defined(DISK_LOG)
Log(Log::Normal, "RESET信号受信");
#endif // DISK_LOG
LOGWARN("RESET signal received!");
// Reset the controller
Reset();
@@ -192,6 +190,53 @@ void FASTCALL SCSIDEV::BusFree()
}
}
//---------------------------------------------------------------------------
//
// Arbitration Phase
//
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::Arbitration()
{
// TODO: See https://www.staff.uni-mainz.de/tacke/scsi/SCSI2-06.html
// DWORD id;
ASSERT(this);
// // Phase change
// if (ctrl.phase != BUS::reselection) {
// // invalid if IDs do not match
// id = 1 << ctrl.id;
// if ((ctrl.bus->GetDAT() & id) == 0) {
// return;
// }
// // End if there is no valid unit
// if (!HasUnit()) {
// return;
// }
// LOGDEBUG("Reselection phase ID=%d (with device)", ctrl.id);
// // Phase setting
// ctrl.phase = BUS::selection;
// // Raise BSY and respond
// ctrl.bus->SetBSY(TRUE);
// return;
// }
// // Reselection completed
// if (!ctrl.bus->GetSEL() && ctrl.bus->GetBSY()) {
// // Message out phase if ATN=1, otherwise command phase
// if (ctrl.bus->GetATN()) {
// MsgOut();
// } else {
// Command();
// }
// }
}
//---------------------------------------------------------------------------
//
// Selection Phase
@@ -240,6 +285,53 @@ void FASTCALL SCSIDEV::Selection()
}
}
//---------------------------------------------------------------------------
//
// Reselection Phase
//
//---------------------------------------------------------------------------
void FASTCALL SCSIDEV::Reselection()
{
// DWORD id;
ASSERT(this);
// // Phase change
// if (ctrl.phase != BUS::reselection) {
// // invalid if IDs do not match
// id = 1 << ctrl.id;
// if ((ctrl.bus->GetDAT() & id) == 0) {
// return;
// }
// // End if there is no valid unit
// if (!HasUnit()) {
// return;
// }
// LOGDEBUG("Reselection phase ID=%d (with device)", ctrl.id);
// // Phase setting
// ctrl.phase = BUS::selection;
// // Raise BSY and respond
// ctrl.bus->SetBSY(TRUE);
// return;
// }
// // Reselection completed
// if (!ctrl.bus->GetSEL() && ctrl.bus->GetBSY()) {
// // Message out phase if ATN=1, otherwise command phase
// if (ctrl.bus->GetATN()) {
// MsgOut();
// } else {
// Command();
// }
// }
}
//---------------------------------------------------------------------------
//
// Execution Phase
@@ -2090,25 +2182,56 @@ BOOL FASTCALL SCSIDEV::XferMsg(DWORD msg)
//
//---------------------------------------------------------------------------
BOOL FASTCALL SCSIDEV::TransferPacketToHost(int packet_len){
//*****************************
// BUS FREE PHASE
//*****************************
// We should already be in bus free phase when we enter this function
//*****************************
// ARBITRATION PHASE
//*****************************
// Aquire the bus
// ctrl.bus->Aquire();
// ctrl.bus->SetIO();
// if (bus->GetBUSY()) {
// #if !defined(BAREMETAL)
// usleep(0);
// #endif // !BAREMETAL
// continue;
// }
// #endif // USE_SEL_EVENT_ENABLE
//*****************************
// Reselection
//*****************************
//*****************************
// Message OUT (expect a "NO OPERATION")
// IF we get a DISCONNECT message, abort sending the message
// Transition to MESSAGE IN and send a DISCONNECT
// then go to BUS FREE
//*****************************
//*****************************
// DATA IN
// ... send the packet
//*****************************
//*****************************
// MESSAGE OUT (expect a "NO OPERATION")
//*****************************
//*****************************
// If more packets, go back to DATA IN
//*****************************
//*****************************
// Else
// MESSAGE IN (sends DISCONNECT)
//*****************************
//*****************************
// BUS FREE
//*****************************
BusFree();
}

View File

@@ -108,8 +108,12 @@ private:
// Phase
void FASTCALL BusFree();
// Bus free phase
void FASTCALL Arbitration();
// Arbitration phase
void FASTCALL Selection();
// Selection phase
void FASTCALL Reselection();
// Reselection phase
void FASTCALL Execute();
// Execution phase
void FASTCALL MsgOut();

View File

@@ -485,7 +485,7 @@ int FASTCALL SCSINuvolink::ReceivePacket()
if (memcmp(packet_buf, mac_addr, 6) != 0) {
if (memcmp(packet_buf, bcast_addr, 6) != 0) {
packet_len = 0;
return;
return -1;
}
}
@@ -493,7 +493,7 @@ int FASTCALL SCSINuvolink::ReceivePacket()
if (packet_len > 2048) {
LOGDEBUG("Packet size was too big. Dropping it");
packet_len = 0;
return;
return -1;
}
// TransferPacket(packet_len, packet_buff);

View File

@@ -24,7 +24,7 @@
//---------------------------------------------------------------------------
//
// 変数宣言
// Variable Declaration
//
//---------------------------------------------------------------------------
GPIOBUS bus; // Bus