Fix to the PIO read state machine (write still needs fixes)
--HG-- extra : convert_revision : 2e8afcfe3448d921b26ebb76e65c0b237339e9b1
This commit is contained in:
parent
74c494a4eb
commit
7c70a16c04
1 changed files with 27 additions and 14 deletions
|
@ -655,7 +655,7 @@ IdeDisk::startCommand()
|
||||||
|
|
||||||
// Supported PIO data-in commands
|
// Supported PIO data-in commands
|
||||||
case WIN_IDENTIFY:
|
case WIN_IDENTIFY:
|
||||||
cmdBytesLeft = drqBytesLeft = sizeof(struct hd_driveid);
|
cmdBytesLeft = sizeof(struct hd_driveid);
|
||||||
devState = Prepare_Data_In;
|
devState = Prepare_Data_In;
|
||||||
action = ACT_DATA_READY;
|
action = ACT_DATA_READY;
|
||||||
break;
|
break;
|
||||||
|
@ -670,9 +670,9 @@ IdeDisk::startCommand()
|
||||||
else
|
else
|
||||||
cmdBytesLeft = (cmdReg.sec_count * SectorSize);
|
cmdBytesLeft = (cmdReg.sec_count * SectorSize);
|
||||||
|
|
||||||
drqBytesLeft = SectorSize;
|
|
||||||
curSector = getLBABase();
|
curSector = getLBABase();
|
||||||
|
|
||||||
|
/** @todo make this a scheduled event to simulate disk delay */
|
||||||
devState = Prepare_Data_In;
|
devState = Prepare_Data_In;
|
||||||
action = ACT_DATA_READY;
|
action = ACT_DATA_READY;
|
||||||
break;
|
break;
|
||||||
|
@ -688,7 +688,6 @@ IdeDisk::startCommand()
|
||||||
else
|
else
|
||||||
cmdBytesLeft = (cmdReg.sec_count * SectorSize);
|
cmdBytesLeft = (cmdReg.sec_count * SectorSize);
|
||||||
|
|
||||||
drqBytesLeft = SectorSize;
|
|
||||||
curSector = getLBABase();
|
curSector = getLBABase();
|
||||||
|
|
||||||
devState = Prepare_Data_Out;
|
devState = Prepare_Data_Out;
|
||||||
|
@ -707,7 +706,6 @@ IdeDisk::startCommand()
|
||||||
else
|
else
|
||||||
cmdBytesLeft = (cmdReg.sec_count * SectorSize);
|
cmdBytesLeft = (cmdReg.sec_count * SectorSize);
|
||||||
|
|
||||||
drqBytesLeft = SectorSize;
|
|
||||||
curSector = getLBABase();
|
curSector = getLBABase();
|
||||||
|
|
||||||
devState = Prepare_Data_Dma;
|
devState = Prepare_Data_Dma;
|
||||||
|
@ -831,17 +829,24 @@ IdeDisk::updateState(DevAction_t action)
|
||||||
// set the DRQ bit
|
// set the DRQ bit
|
||||||
cmdReg.status |= STATUS_DRQ_BIT;
|
cmdReg.status |= STATUS_DRQ_BIT;
|
||||||
|
|
||||||
|
// copy the data into the data buffer
|
||||||
|
if (curCommand == WIN_IDENTIFY) {
|
||||||
|
// Reset the drqBytes for this block
|
||||||
|
drqBytesLeft = sizeof(struct hd_driveid);
|
||||||
|
|
||||||
|
memcpy((void *)dataBuffer, (void *)&driveID,
|
||||||
|
sizeof(struct hd_driveid));
|
||||||
|
} else {
|
||||||
|
// Reset the drqBytes for this block
|
||||||
|
drqBytesLeft = SectorSize;
|
||||||
|
|
||||||
|
readDisk(curSector++, dataBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
// put the first two bytes into the data register
|
// put the first two bytes into the data register
|
||||||
memcpy((void *)&cmdReg.data0, (void *)dataBuffer,
|
memcpy((void *)&cmdReg.data0, (void *)dataBuffer,
|
||||||
sizeof(uint16_t));
|
sizeof(uint16_t));
|
||||||
|
|
||||||
// copy the data into the data buffer
|
|
||||||
if (curCommand == WIN_IDENTIFY)
|
|
||||||
memcpy((void *)dataBuffer, (void *)&driveID,
|
|
||||||
sizeof(struct hd_driveid));
|
|
||||||
else
|
|
||||||
readDisk(curSector++, dataBuffer);
|
|
||||||
|
|
||||||
if (!isIENSet()) {
|
if (!isIENSet()) {
|
||||||
devState = Data_Ready_INTRQ_In;
|
devState = Data_Ready_INTRQ_In;
|
||||||
intrPost();
|
intrPost();
|
||||||
|
@ -867,9 +872,10 @@ IdeDisk::updateState(DevAction_t action)
|
||||||
cmdBytesLeft -= 2;
|
cmdBytesLeft -= 2;
|
||||||
|
|
||||||
// copy next short into data registers
|
// copy next short into data registers
|
||||||
memcpy((void *)&cmdReg.data0,
|
if (drqBytesLeft)
|
||||||
(void *)&dataBuffer[SectorSize - drqBytesLeft],
|
memcpy((void *)&cmdReg.data0,
|
||||||
sizeof(uint16_t));
|
(void *)&dataBuffer[SectorSize - drqBytesLeft],
|
||||||
|
sizeof(uint16_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drqBytesLeft == 0) {
|
if (drqBytesLeft == 0) {
|
||||||
|
@ -879,7 +885,14 @@ IdeDisk::updateState(DevAction_t action)
|
||||||
devState = Device_Idle_S;
|
devState = Device_Idle_S;
|
||||||
} else {
|
} else {
|
||||||
devState = Prepare_Data_In;
|
devState = Prepare_Data_In;
|
||||||
|
// set the BSY_BIT
|
||||||
cmdReg.status |= STATUS_BSY_BIT;
|
cmdReg.status |= STATUS_BSY_BIT;
|
||||||
|
// clear the DRQ_BIT
|
||||||
|
cmdReg.status &= ~STATUS_DRQ_BIT;
|
||||||
|
|
||||||
|
/** @todo change this to a scheduled event to simulate
|
||||||
|
disk delay */
|
||||||
|
updateState(ACT_DATA_READY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue