diff --git a/src/raspberrypi/.vscode/settings.json b/src/raspberrypi/.vscode/settings.json index 5ba85824..9dd7c2c5 100644 --- a/src/raspberrypi/.vscode/settings.json +++ b/src/raspberrypi/.vscode/settings.json @@ -9,6 +9,8 @@ "ratio": "cpp", "tuple": "cpp", "type_traits": "cpp", - "utility": "cpp" + "utility": "cpp", + "string_view": "cpp", + "regex": "cpp" } } \ No newline at end of file diff --git a/src/raspberrypi/controllers/sasidev_ctrl.cpp b/src/raspberrypi/controllers/sasidev_ctrl.cpp index 243a2cc3..b54c3082 100644 --- a/src/raspberrypi/controllers/sasidev_ctrl.cpp +++ b/src/raspberrypi/controllers/sasidev_ctrl.cpp @@ -1033,6 +1033,7 @@ void SASIDEV::Receive() // If result is false, move to the status phase if (!result) { + LOGWARN("%s invalid result received", __PRETTY_FUNCTION__); Error(); return; } @@ -1119,9 +1120,16 @@ bool SASIDEV::XferOut(bool cont) { ASSERT(ctrl.phase == BUS::dataout); + + // Logical Unit DWORD lun = GetEffectiveLun(); + if(ctrl.cmd[0] == SASIDEV::eCmdUnknownPowerViewCC) + { + lun = 0; + } if (!ctrl.unit[lun]) { + LOGWARN("%s Invalid LUN %d - %02X", __PRETTY_FUNCTION__, (int)lun, ctrl.cmd[0]); return false; } Disk *device = ctrl.unit[lun]; @@ -1199,6 +1207,7 @@ bool SASIDEV::XferOut(bool cont) case SASIDEV::eCmdUnknownPowerViewCB: case SASIDEV::eCmdUnknownPowerViewCC: LOGWARN("Finished receiving a Powerview Command ($%02X) in %s", (WORD)ctrl.cmd[0] , __PRETTY_FUNCTION__) + return true; break; case SASIDEV::eCmdSetMcastAddr: LOGTRACE("%s Done with DaynaPort Set Multicast Address", __PRETTY_FUNCTION__); diff --git a/src/raspberrypi/controllers/scsidev_ctrl.cpp b/src/raspberrypi/controllers/scsidev_ctrl.cpp index 49281133..c714eaff 100644 --- a/src/raspberrypi/controllers/scsidev_ctrl.cpp +++ b/src/raspberrypi/controllers/scsidev_ctrl.cpp @@ -229,7 +229,8 @@ void SCSIDEV::Execute() int lun = GetEffectiveLun(); if (!ctrl.unit[lun]) { - if ((SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdInquiry && (SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdRequestSense) { + if ((SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdInquiry && (SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdRequestSense && (SCSIDEV::scsi_command)ctrl.cmd[0] != eCmdUnknownPowerViewCC) + { LOGDEBUG("Invalid LUN %d for ID %d", lun, GetSCSIID()); Error(ERROR_CODES::sense_key::ILLEGAL_REQUEST, ERROR_CODES::asc::INVALID_LUN); diff --git a/src/raspberrypi/devices/scsi_powerview.cpp b/src/raspberrypi/devices/scsi_powerview.cpp index 685e0fc4..89e47b68 100644 --- a/src/raspberrypi/devices/scsi_powerview.cpp +++ b/src/raspberrypi/devices/scsi_powerview.cpp @@ -54,17 +54,15 @@ const BYTE SCSIPowerView::m_inquiry_response[] = { SCSIPowerView::SCSIPowerView() : Disk("SCPV") { - AddCommand(SCSIDEV::eCmdUnknownPowerViewC8, "Unknown PowerViewC8", &SCSIPowerView::UnknownCommandC9); + AddCommand(SCSIDEV::eCmdUnknownPowerViewC8, "Unknown PowerViewC8", &SCSIPowerView::UnknownCommandC8); AddCommand(SCSIDEV::eCmdUnknownPowerViewC9, "Unknown PowerViewC9", &SCSIPowerView::UnknownCommandC9); - AddCommand(SCSIDEV::eCmdUnknownPowerViewCA, "Unknown PowerViewCA", &SCSIPowerView::UnknownCommandC9); - AddCommand(SCSIDEV::eCmdUnknownPowerViewCB, "Unknown PowerViewCB", &SCSIPowerView::UnknownCommandC9); - AddCommand(SCSIDEV::eCmdUnknownPowerViewCC, "Unknown PowerViewCC", &SCSIPowerView::UnknownCommandC9); + AddCommand(SCSIDEV::eCmdUnknownPowerViewCA, "Unknown PowerViewCA", &SCSIPowerView::UnknownCommandCA); + AddCommand(SCSIDEV::eCmdUnknownPowerViewCB, "Unknown PowerViewCB", &SCSIPowerView::UnknownCommandCB); + AddCommand(SCSIDEV::eCmdUnknownPowerViewCC, "Unknown PowerViewCC", &SCSIPowerView::UnknownCommandCC); -struct fb_var_screeninfo fbinfo; + struct fb_var_screeninfo fbinfo; struct fb_fix_screeninfo fbfixinfo; - // disk.id = MAKEID('S', 'C', 'V', 'D'); - // create lookup table for (int i = 0; i < 256; i++) { unsigned char b = i; @@ -150,31 +148,35 @@ void SCSIPowerView::dump_command(SASIDEV *controller){ } -// //--------------------------------------------------------------------------- -// // -// // Unknown Command C8 -// // -// //--------------------------------------------------------------------------- -// void SCSIPowerView::UnknownCommandC8(SASIDEV *controller) -// { +//--------------------------------------------------------------------------- +// +// Unknown Command C8 +// +//--------------------------------------------------------------------------- +void SCSIPowerView::UnknownCommandC8(SASIDEV *controller) +{ -// // Set transfer amount -// ctrl->length = ctrl->cmd[6]; -// LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length); -// dump_command(controller); + // Set transfer amount + ctrl->length = ctrl->cmd[6]; + LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length); + dump_command(controller); -// if (ctrl->length <= 0) { -// // Failure (Error) -// controller->Error(); -// return; -// } + if (ctrl->length <= 0) { + // Failure (Error) + controller->Error(); + return; + } -// // Set next block -// ctrl->blocks = 1; -// ctrl->next = 1; + ctrl->buffer[0] = 0x01; + ctrl->buffer[1] = 0x09; + ctrl->buffer[2] = 0x08; -// controller->DataOut(); -// } + // Set next block + ctrl->blocks = 1; + ctrl->next = 1; + + controller->DataIn(); +} //--------------------------------------------------------------------------- @@ -189,7 +191,7 @@ void SCSIPowerView::UnknownCommandC9(SASIDEV *controller) ctrl->length = ctrl->cmd[6]; LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length); dump_command(controller); - LOGWARN("Controller: %08X ctrl: %08X", (DWORD)controller->GetCtrl(), (DWORD)ctrl); + // LOGWARN("Controller: %08X ctrl: %08X", (DWORD)controller->GetCtrl(), (DWORD)ctrl); // if (ctrl->length <= 0) { // // Failure (Error) // controller->Error(); @@ -222,7 +224,7 @@ void SCSIPowerView::UnknownCommandCA(SASIDEV *controller) // Set transfer amount ctrl->length = ctrl->cmd[6]; LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length); -dump_command(controller); + dump_command(controller); if (ctrl->length <= 0) { // Failure (Error) controller->Error(); @@ -247,8 +249,9 @@ void SCSIPowerView::UnknownCommandCB(SASIDEV *controller) // Set transfer amount ctrl->length = ctrl->cmd[6]; + ctrl->length = ctrl->length * 4; LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length); -dump_command(controller); + dump_command(controller); if (ctrl->length <= 0) { // Failure (Error) controller->Error(); @@ -272,9 +275,10 @@ void SCSIPowerView::UnknownCommandCC(SASIDEV *controller) { // Set transfer amount - ctrl->length = ctrl->cmd[6]; + // ctrl->length = ctrl->cmd[6]; + ctrl->length = 0x8bb; LOGWARN("%s Message Length %d", __PRETTY_FUNCTION__, (int)ctrl->length); -dump_command(controller); + dump_command(controller); if (ctrl->length <= 0) { // Failure (Error) controller->Error(); diff --git a/src/raspberrypi/gpiobus.cpp b/src/raspberrypi/gpiobus.cpp index 10a6f985..ecd987ba 100644 --- a/src/raspberrypi/gpiobus.cpp +++ b/src/raspberrypi/gpiobus.cpp @@ -1563,7 +1563,23 @@ int GPIOBUS::GetCommandByteCount(BYTE opcode) { } else if (opcode >= 0x20 && opcode <= 0x7D) { return 10; - } else { + } + else if(opcode == 0xC8){ + return 8; + } + else if(opcode == 0xC9){ + return 8; + } + else if(opcode == 0xCA){ + return 11; + } + else if(opcode == 0xCB){ + return 6; + } + else if(opcode == 0xCC){ + return 4; + } + else { return 6; } }