mirror of
https://github.com/dkgrizzly/GreenSCSI.git
synced 2024-09-27 13:57:09 +00:00
Import checkBlockCommand from upstream
This commit is contained in:
parent
4f4a9b1a33
commit
7c51723a2b
43
src/disk.ino
43
src/disk.ino
@ -1,6 +1,31 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "scsi_defs.h"
|
#include "scsi_defs.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check that the image file is present and the block range is valid.
|
||||||
|
*/
|
||||||
|
byte checkBlockCommand(uint32_t adds, uint32_t len)
|
||||||
|
{
|
||||||
|
// Check that image file is present
|
||||||
|
if(!m_sel) {
|
||||||
|
return STATUS_CHECK;
|
||||||
|
}
|
||||||
|
if(!m_sel->m_file.isOpen()) {
|
||||||
|
m_sel->m_sense.m_key = NOT_READY; // Not ready
|
||||||
|
m_sel->m_sense.m_code = LUN_NOT_READY; // Logical Unit Not Ready, Manual Intervention Required
|
||||||
|
m_sel->m_sense.m_key_specific[0] = 0x03;
|
||||||
|
return STATUS_CHECK;
|
||||||
|
}
|
||||||
|
// Check block range is valid
|
||||||
|
uint32_t bc = m_sel->m_fileSize / m_sel->m_blocksize;
|
||||||
|
if (adds >= bc || (adds + len) > bc) {
|
||||||
|
m_sel->m_sense.m_key = 5; // Illegal request
|
||||||
|
m_sel->m_sense.m_code = INVALID_LBA; // Logical block address out of range
|
||||||
|
return STATUS_CHECK;
|
||||||
|
}
|
||||||
|
return 0x00;
|
||||||
|
}
|
||||||
|
|
||||||
void Read6CommandHandler() {
|
void Read6CommandHandler() {
|
||||||
LOG("[Read6]");
|
LOG("[Read6]");
|
||||||
m_sts |= onReadCommand((((uint32_t)m_cmd[1] & 0x1F) << 16) | ((uint32_t)m_cmd[2] << 8) | m_cmd[3], (m_cmd[4] == 0) ? 0x100 : m_cmd[4]);
|
m_sts |= onReadCommand((((uint32_t)m_cmd[1] & 0x1F) << 16) | ((uint32_t)m_cmd[2] << 8) | m_cmd[3], (m_cmd[4] == 0) ? 0x100 : m_cmd[4]);
|
||||||
@ -28,6 +53,14 @@ void ReadCapacityCommandHandler() {
|
|||||||
m_phase = PHASE_STATUSIN;
|
m_phase = PHASE_STATUSIN;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(!m_sel->m_file.isOpen()) {
|
||||||
|
m_sts |= STATUS_CHECK;
|
||||||
|
m_sel->m_sense.m_key = NOT_READY; // Not ready
|
||||||
|
m_sel->m_sense.m_code = LUN_NOT_READY; // Logical Unit Not Ready, Manual Intervention Required
|
||||||
|
m_sel->m_sense.m_key_specific[0] = 0x03;
|
||||||
|
m_phase = PHASE_STATUSIN;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t bl = m_sel->m_blocksize;
|
uint32_t bl = m_sel->m_blocksize;
|
||||||
uint32_t bc = m_sel->m_fileSize / bl;
|
uint32_t bc = m_sel->m_fileSize / bl;
|
||||||
@ -61,12 +94,15 @@ void Seek10CommandHandler() {
|
|||||||
*/
|
*/
|
||||||
uint8_t onReadCommand(uint32_t adds, uint32_t len)
|
uint8_t onReadCommand(uint32_t adds, uint32_t len)
|
||||||
{
|
{
|
||||||
|
uint8_t sts;
|
||||||
|
|
||||||
LOG("-R ");
|
LOG("-R ");
|
||||||
LOGHEX6(adds);
|
LOGHEX6(adds);
|
||||||
LOG(" ");
|
LOG(" ");
|
||||||
LOGHEX4N(len);
|
LOGHEX4N(len);
|
||||||
|
|
||||||
if(!m_sel) return 0x02; // Image file absent
|
sts = checkBlockCommand(adds, len);
|
||||||
|
if(sts) return sts;
|
||||||
|
|
||||||
LED_ON();
|
LED_ON();
|
||||||
writeDataPhaseSD(adds, len);
|
writeDataPhaseSD(adds, len);
|
||||||
@ -79,12 +115,15 @@ uint8_t onReadCommand(uint32_t adds, uint32_t len)
|
|||||||
*/
|
*/
|
||||||
uint8_t onWriteCommand(uint32_t adds, uint32_t len)
|
uint8_t onWriteCommand(uint32_t adds, uint32_t len)
|
||||||
{
|
{
|
||||||
|
uint8_t sts;
|
||||||
|
|
||||||
LOG("-W ");
|
LOG("-W ");
|
||||||
LOGHEX6(adds);
|
LOGHEX6(adds);
|
||||||
LOG(" ");
|
LOG(" ");
|
||||||
LOGHEX4N(len);
|
LOGHEX4N(len);
|
||||||
|
|
||||||
if(!m_sel) return 0x02; // Image file absent
|
sts = checkBlockCommand(adds, len);
|
||||||
|
if(sts) return sts;
|
||||||
|
|
||||||
LED_ON();
|
LED_ON();
|
||||||
readDataPhaseSD(adds, len);
|
readDataPhaseSD(adds, len);
|
||||||
|
Loading…
Reference in New Issue
Block a user