Change init order. Unpopulated reader slots will report zero or Error for capacity.

This commit is contained in:
Andrew J. Kroll 2013-04-04 18:38:49 -04:00
parent 7dc1c97fe0
commit 6b7194bde8
2 changed files with 35 additions and 27 deletions

View file

@ -30,7 +30,7 @@ bLastUsbError(0) {
epInfo[i].maxPktSize = (i) ? 0 : 8; epInfo[i].maxPktSize = (i) ? 0 : 8;
epInfo[i].epAttribs = 0; epInfo[i].epAttribs = 0;
if (!i) //if (!i)
epInfo[i].bmNakPower = USB_NAK_MAX_POWER; epInfo[i].bmNakPower = USB_NAK_MAX_POWER;
} }
if (pUsb) if (pUsb)
@ -52,7 +52,7 @@ uint8_t BulkOnly::Init(uint8_t parent, uint8_t port, bool lowspeed) {
epInfo[i].maxPktSize = (i) ? 0 : 8; epInfo[i].maxPktSize = (i) ? 0 : 8;
epInfo[i].epAttribs = 0; epInfo[i].epAttribs = 0;
if (!i) //if (!i)
epInfo[i].bmNakPower = USB_NAK_MAX_POWER; epInfo[i].bmNakPower = USB_NAK_MAX_POWER;
} }
@ -184,24 +184,6 @@ uint8_t BulkOnly::Init(uint8_t parent, uint8_t port, bool lowspeed) {
uint8_t count = 0; uint8_t count = 0;
MediaCTL(lun, 0x01); MediaCTL(lun, 0x01);
while (rcode = TestUnitReady(lun)) {
if (rcode == MASS_ERR_NO_MEDIA)
break;
if (rcode == MASS_ERR_DEVICE_DISCONNECTED)
goto Fail;
if (!count)
Notify(PSTR("Not ready...\r\n"), 0x80);
if (count == 0xff)
break;
delay(100);
count++;
}
if (count == 0xff)
continue;
rcode = 0; rcode = 0;
InquiryResponse response; InquiryResponse response;
@ -226,6 +208,24 @@ uint8_t BulkOnly::Init(uint8_t parent, uint8_t port, bool lowspeed) {
rcode = 255; rcode = 255;
goto FailInvalidSectorSize; goto FailInvalidSectorSize;
} }
while (rcode = TestUnitReady(lun)) {
if (rcode == MASS_ERR_NO_MEDIA)
break;
if (rcode == MASS_ERR_DEVICE_DISCONNECTED)
goto Fail;
if (!count)
Notify(PSTR("Not ready...\r\n"), 0x80);
if (count == 0xff)
break;
delay(100);
count++;
}
if (count == 0xff)
continue;
} }
rcode = 0; rcode = 0;
@ -260,14 +260,14 @@ uint8_t BulkOnly::Init(uint8_t parent, uint8_t port, bool lowspeed) {
} }
Notify(PSTR("==========\r\n"), 0x80); Notify(PSTR("==========\r\n"), 0x80);
} }
/*
if (TestUnitReady(bTheLUN)) { if (TestUnitReady(bTheLUN)) {
Notify(PSTR("Unit not ready\r\n"), 0x80); Notify(PSTR("Unit not ready\r\n"), 0x80);
rcode = MASS_ERR_UNIT_NOT_READY; rcode = MASS_ERR_UNIT_NOT_READY;
//goto FailOnInit; //goto FailOnInit;
} }
*/
rcode = OnInit(); rcode = OnInit();
if (rcode) if (rcode)
@ -492,7 +492,7 @@ uint8_t BulkOnly::Inquiry(uint8_t lun, uint16_t bsize, uint8_t *buf) {
Notify(PSTR("---------\r\n"), 0x80); Notify(PSTR("---------\r\n"), 0x80);
CommandBlockWrapper cbw; CommandBlockWrapper cbw;
SetCurLUN(lun);
cbw.dCBWSignature = MASS_CBW_SIGNATURE; cbw.dCBWSignature = MASS_CBW_SIGNATURE;
cbw.dCBWTag = ++dCBWTag; cbw.dCBWTag = ++dCBWTag;
cbw.dCBWDataTransferLength = bsize; cbw.dCBWDataTransferLength = bsize;
@ -514,6 +514,7 @@ uint8_t BulkOnly::RequestSense(uint8_t lun, uint16_t size, uint8_t *buf) {
Notify(PSTR("----------------\r\n"), 0x80); Notify(PSTR("----------------\r\n"), 0x80);
CommandBlockWrapper cbw; CommandBlockWrapper cbw;
SetCurLUN(lun);
cbw.dCBWSignature = MASS_CBW_SIGNATURE; cbw.dCBWSignature = MASS_CBW_SIGNATURE;
cbw.dCBWTag = ++dCBWTag; cbw.dCBWTag = ++dCBWTag;
@ -528,7 +529,7 @@ uint8_t BulkOnly::RequestSense(uint8_t lun, uint16_t size, uint8_t *buf) {
cbw.CBWCB[0] = SCSI_CMD_REQUEST_SENSE; cbw.CBWCB[0] = SCSI_CMD_REQUEST_SENSE;
cbw.CBWCB[4] = size; cbw.CBWCB[4] = size;
return HandleSCSIError(Transaction(&cbw, size, buf, 0)); return Transaction(&cbw, size, buf, 0);
} }
uint8_t BulkOnly::ReadCapacity(uint8_t lun, uint16_t bsize, uint8_t *buf) { uint8_t BulkOnly::ReadCapacity(uint8_t lun, uint16_t bsize, uint8_t *buf) {
@ -537,6 +538,7 @@ uint8_t BulkOnly::ReadCapacity(uint8_t lun, uint16_t bsize, uint8_t *buf) {
CommandBlockWrapper cbw; CommandBlockWrapper cbw;
SetCurLUN(lun);
cbw.dCBWSignature = MASS_CBW_SIGNATURE; cbw.dCBWSignature = MASS_CBW_SIGNATURE;
cbw.dCBWTag = ++dCBWTag; cbw.dCBWTag = ++dCBWTag;
cbw.dCBWDataTransferLength = bsize; cbw.dCBWDataTransferLength = bsize;
@ -554,6 +556,7 @@ uint8_t BulkOnly::ReadCapacity(uint8_t lun, uint16_t bsize, uint8_t *buf) {
} }
uint8_t BulkOnly::TestUnitReady(uint8_t lun) { uint8_t BulkOnly::TestUnitReady(uint8_t lun) {
SetCurLUN(lun);
if (!bAddress) // || !bPollEnable) if (!bAddress) // || !bPollEnable)
return MASS_ERR_UNIT_NOT_READY; return MASS_ERR_UNIT_NOT_READY;
@ -579,6 +582,7 @@ uint8_t BulkOnly::TestUnitReady(uint8_t lun) {
/* Media control: 0x00 Stop Motor, 0x01 Start Motor, 0x02 Eject Media, 0x03 Load Media */ /* Media control: 0x00 Stop Motor, 0x01 Start Motor, 0x02 Eject Media, 0x03 Load Media */
uint8_t BulkOnly::MediaCTL(uint8_t lun, uint8_t ctl) { uint8_t BulkOnly::MediaCTL(uint8_t lun, uint8_t ctl) {
SetCurLUN(lun);
uint8_t rcode = MASS_ERR_UNIT_NOT_READY; uint8_t rcode = MASS_ERR_UNIT_NOT_READY;
if (bAddress) { if (bAddress) {
CommandBlockWrapper cbw; CommandBlockWrapper cbw;
@ -605,6 +609,7 @@ uint8_t BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t block
Notify(PSTR("\r\nRead\r\n"), 0x80); Notify(PSTR("\r\nRead\r\n"), 0x80);
Notify(PSTR("---------\r\n"), 0x80); Notify(PSTR("---------\r\n"), 0x80);
SetCurLUN(lun);
CommandBlockWrapper cbw; CommandBlockWrapper cbw;
cbw.dCBWSignature = MASS_CBW_SIGNATURE; cbw.dCBWSignature = MASS_CBW_SIGNATURE;
@ -662,6 +667,7 @@ uint8_t BulkOnly::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t bloc
//MediaCTL(lun, 0x01); //MediaCTL(lun, 0x01);
CommandBlockWrapper cbw; CommandBlockWrapper cbw;
SetCurLUN(lun);
cbw.dCBWSignature = MASS_CBW_SIGNATURE; cbw.dCBWSignature = MASS_CBW_SIGNATURE;
cbw.dCBWTag = ++dCBWTag; cbw.dCBWTag = ++dCBWTag;
cbw.dCBWDataTransferLength = ((uint32_t)bsize * blocks); cbw.dCBWDataTransferLength = ((uint32_t)bsize * blocks);
@ -687,6 +693,7 @@ uint8_t BulkOnly::ModeSense(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpa
Notify(PSTR("------------\r\n"), 0x80); Notify(PSTR("------------\r\n"), 0x80);
CommandBlockWrapper cbw; CommandBlockWrapper cbw;
SetCurLUN(lun);
cbw.dCBWSignature = MASS_CBW_SIGNATURE; cbw.dCBWSignature = MASS_CBW_SIGNATURE;
cbw.dCBWTag = ++dCBWTag; cbw.dCBWTag = ++dCBWTag;

View file

@ -207,7 +207,8 @@ protected:
uint8_t bLastUsbError; // Last USB error uint8_t bLastUsbError; // Last USB error
uint8_t bMaxLUN; // Max LUN uint8_t bMaxLUN; // Max LUN
uint8_t bTheLUN; // Active LUN uint8_t bTheLUN; // Active LUN
// TO-ADD:
// uint32_t CurrentCapacity; // use this to check for media changes.
protected: protected:
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr); void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);