diff options
| author | Frank Gevaerts <frank@gevaerts.be> | 2008-03-03 22:53:25 +0000 |
|---|---|---|
| committer | Frank Gevaerts <frank@gevaerts.be> | 2008-03-03 22:53:25 +0000 |
| commit | 6cfa9090029163db72eb0b50a96cfcf1e663f208 (patch) | |
| tree | 89f6a1064b8e1c657bacc30fc005c7781cae74e0 /firmware/usbstack | |
| parent | 81d3a02928083b54560709488ad81911494d3796 (diff) | |
| download | rockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.zip rockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.tar.gz rockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.tar.bz2 rockbox-6cfa9090029163db72eb0b50a96cfcf1e663f208.tar.xz | |
handle START_STOP_UNIT eject command, to make TEST_UNIT_READY return false once the OS ejects
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16503 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack')
| -rw-r--r-- | firmware/usbstack/usb_storage.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c index 9fae7fc..b526d7b 100644 --- a/firmware/usbstack/usb_storage.c +++ b/firmware/usbstack/usb_storage.c @@ -219,6 +219,7 @@ static void send_block_data(void *data,int size); static void receive_block_data(void *data,int size); static void identify2inquiry(int lun); static void send_and_read_next(void); +static bool ejected[NUM_VOLUMES]; static enum { WAITING_FOR_COMMAND, @@ -231,6 +232,9 @@ static enum { /* called by usb_code_init() */ void usb_storage_init(void) { + int i; + for(i=0;i<NUM_VOLUMES;i++) + ejected[i]=false; logf("usb_storage_init done"); } @@ -473,6 +477,9 @@ static void handle_scsi(struct command_block_wrapper* cbw) block_count = (identify[61] << 16 | identify[60]); #endif + if(ejected[lun]) + lun_present = false; + #ifdef MAX_LOG_SECTOR_SIZE block_size_mult = disk_sector_multiplier; #endif @@ -634,6 +641,14 @@ static void handle_scsi(struct command_block_wrapper* cbw) case SCSI_START_STOP_UNIT: logf("scsi start_stop unit %d",lun); + if((cbw->command_block[4] & 0xf0) == 0) /* Process start and eject bits */ + { + if((cbw->command_block[4] & 0x01) == 0 && + (cbw->command_block[4] & 0x02) != 0) /* Stop and eject */ + { + ejected[lun]=true; + } + } send_csw(UMS_STATUS_GOOD); break; |