summaryrefslogtreecommitdiff
path: root/firmware/usbstack
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-03-02 00:15:02 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-03-02 00:15:02 +0000
commitf18d20ee36f8a23e0f37fd342cf186e3b6a91408 (patch)
treed5917d19491bc5fa80c61ea440279c4ed168c91f /firmware/usbstack
parent5f1e1a5e5efd9051c9aeda5a8cd671e523bac6e9 (diff)
downloadrockbox-f18d20ee36f8a23e0f37fd342cf186e3b6a91408.tar.gz
rockbox-f18d20ee36f8a23e0f37fd342cf186e3b6a91408.zip
Only show the usb screen once a real usb connection is established. In case other threads are slow in acknowledging the SYS_USB_CONNECTED message, tell the OS that the disk is not ready yet (the OS interprets this as "spinning up")
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16471 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack')
-rw-r--r--firmware/usbstack/usb_core.c4
-rw-r--r--firmware/usbstack/usb_storage.c42
2 files changed, 40 insertions, 6 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index aa0f06e4f6..f40d76bee0 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -460,6 +460,10 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
460{ 460{
461 if(usb_state == DEFAULT) { 461 if(usb_state == DEFAULT) {
462 set_serial_descriptor(); 462 set_serial_descriptor();
463#ifdef USB_STORAGE
464 if(usb_core_storage_enabled)
465 usb_request_exclusive_ata();
466#endif
463 } 467 }
464 468
465#ifdef USB_BENCHMARK 469#ifdef USB_BENCHMARK
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 73464cf608..bde774e5f0 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -80,6 +80,8 @@
80#define ASC_LBA_OUT_OF_RANGE 0x21 80#define ASC_LBA_OUT_OF_RANGE 0x21
81#define ASC_WRITE_ERROR 0x0C 81#define ASC_WRITE_ERROR 0x0C
82#define ASC_READ_ERROR 0x11 82#define ASC_READ_ERROR 0x11
83#define ASC_NOT_READY 0x04
84#define ASCQ_BECOMING_READY 0x01
83 85
84#define SCSI_FORMAT_CAPACITY_FORMATTED_MEDIA 0x02000000 86#define SCSI_FORMAT_CAPACITY_FORMATTED_MEDIA 0x02000000
85 87
@@ -207,6 +209,7 @@ static struct {
207 unsigned char sense_key; 209 unsigned char sense_key;
208 unsigned char information; 210 unsigned char information;
209 unsigned char asc; 211 unsigned char asc;
212 unsigned char ascq;
210} cur_sense_data; 213} cur_sense_data;
211 214
212static void handle_scsi(struct command_block_wrapper* cbw); 215static void handle_scsi(struct command_block_wrapper* cbw);
@@ -228,10 +231,6 @@ static enum {
228/* called by usb_code_init() */ 231/* called by usb_code_init() */
229void usb_storage_init(void) 232void usb_storage_init(void)
230{ 233{
231 size_t bufsize;
232 unsigned char * audio_buffer = audio_get_buffer(false,&bufsize);
233 /* TODO : check if bufsize is at least 32K ? */
234 tb.transfer_buffer = (void *)UNCACHED_ADDR((unsigned int)(audio_buffer + 31) & 0xffffffe0);
235 logf("usb_storage_init done"); 234 logf("usb_storage_init done");
236} 235}
237 236
@@ -270,6 +269,7 @@ void usb_storage_transfer_complete(bool in,int status,int length)
270 send_csw(UMS_STATUS_FAIL); 269 send_csw(UMS_STATUS_FAIL);
271 cur_sense_data.sense_key=SENSE_MEDIUM_ERROR; 270 cur_sense_data.sense_key=SENSE_MEDIUM_ERROR;
272 cur_sense_data.asc=ASC_WRITE_ERROR; 271 cur_sense_data.asc=ASC_WRITE_ERROR;
272 cur_sense_data.ascq=0;
273 break; 273 break;
274 } 274 }
275 275
@@ -291,6 +291,7 @@ void usb_storage_transfer_complete(bool in,int status,int length)
291 cur_sense_data.sense_key=0; 291 cur_sense_data.sense_key=0;
292 cur_sense_data.information=0; 292 cur_sense_data.information=0;
293 cur_sense_data.asc=0; 293 cur_sense_data.asc=0;
294 cur_sense_data.ascq=0;
294 } 295 }
295 break; 296 break;
296 case WAITING_FOR_COMMAND: 297 case WAITING_FOR_COMMAND:
@@ -329,6 +330,7 @@ void usb_storage_transfer_complete(bool in,int status,int length)
329 cur_sense_data.sense_key=0; 330 cur_sense_data.sense_key=0;
330 cur_sense_data.information=0; 331 cur_sense_data.information=0;
331 cur_sense_data.asc=0; 332 cur_sense_data.asc=0;
333 cur_sense_data.ascq=0;
332 } 334 }
333 break; 335 break;
334 case SENDING_BLOCKS: 336 case SENDING_BLOCKS:
@@ -351,6 +353,7 @@ void usb_storage_transfer_complete(bool in,int status,int length)
351 cur_sense_data.sense_key=0; 353 cur_sense_data.sense_key=0;
352 cur_sense_data.information=0; 354 cur_sense_data.information=0;
353 cur_sense_data.asc=0; 355 cur_sense_data.asc=0;
356 cur_sense_data.ascq=0;
354 } 357 }
355 break; 358 break;
356 } 359 }
@@ -390,13 +393,20 @@ bool usb_storage_control_request(struct usb_ctrlrequest* req)
390 handled = true; 393 handled = true;
391 break; 394 break;
392 395
393 case USB_REQ_SET_CONFIGURATION: 396 case USB_REQ_SET_CONFIGURATION: {
397 size_t bufsize;
398 unsigned char * audio_buffer;
394 logf("ums: set config"); 399 logf("ums: set config");
395 /* prime rx endpoint. We only need room for commands */ 400 /* prime rx endpoint. We only need room for commands */
396 state = WAITING_FOR_COMMAND; 401 state = WAITING_FOR_COMMAND;
402
403 /* TODO : check if bufsize is at least 32K ? */
404 audio_buffer = audio_get_buffer(false,&bufsize);
405 tb.transfer_buffer = (void *)UNCACHED_ADDR((unsigned int)(audio_buffer + 31) & 0xffffffe0);
397 usb_drv_recv(EP_MASS_STORAGE, tb.transfer_buffer, 1024); 406 usb_drv_recv(EP_MASS_STORAGE, tb.transfer_buffer, 1024);
398 handled = true; 407 handled = true;
399 break; 408 break;
409 }
400 } 410 }
401 411
402 return handled; 412 return handled;
@@ -409,6 +419,7 @@ static void send_and_read_next(void)
409 send_csw(UMS_STATUS_FAIL); 419 send_csw(UMS_STATUS_FAIL);
410 cur_sense_data.sense_key=SENSE_MEDIUM_ERROR; 420 cur_sense_data.sense_key=SENSE_MEDIUM_ERROR;
411 cur_sense_data.asc=ASC_READ_ERROR; 421 cur_sense_data.asc=ASC_READ_ERROR;
422 cur_sense_data.ascq=0;
412 return; 423 return;
413 } 424 }
414 send_block_data(current_cmd.data[current_cmd.data_select], 425 send_block_data(current_cmd.data[current_cmd.data_select],
@@ -472,6 +483,13 @@ static void handle_scsi(struct command_block_wrapper* cbw)
472 switch (cbw->command_block[0]) { 483 switch (cbw->command_block[0]) {
473 case SCSI_TEST_UNIT_READY: 484 case SCSI_TEST_UNIT_READY:
474 logf("scsi test_unit_ready %d",lun); 485 logf("scsi test_unit_ready %d",lun);
486 if(!usb_exclusive_ata()) {
487 send_csw(UMS_STATUS_FAIL);
488 cur_sense_data.sense_key=SENSE_NOT_READY;
489 cur_sense_data.asc=ASC_NOT_READY;
490 cur_sense_data.ascq=ASCQ_BECOMING_READY;
491 break;
492 }
475 if(lun_present) { 493 if(lun_present) {
476 send_csw(UMS_STATUS_GOOD); 494 send_csw(UMS_STATUS_GOOD);
477 } 495 }
@@ -479,6 +497,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
479 send_csw(UMS_STATUS_FAIL); 497 send_csw(UMS_STATUS_FAIL);
480 cur_sense_data.sense_key=SENSE_NOT_READY; 498 cur_sense_data.sense_key=SENSE_NOT_READY;
481 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; 499 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT;
500 cur_sense_data.ascq=0;
482 } 501 }
483 break; 502 break;
484 503
@@ -516,7 +535,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
516 tb.sense_data->AdditionalSenseLength=10; 535 tb.sense_data->AdditionalSenseLength=10;
517 tb.sense_data->CommandSpecificInformation=0; 536 tb.sense_data->CommandSpecificInformation=0;
518 tb.sense_data->AdditionalSenseCode=cur_sense_data.asc; 537 tb.sense_data->AdditionalSenseCode=cur_sense_data.asc;
519 tb.sense_data->AdditionalSenseCodeQualifier=0; 538 tb.sense_data->AdditionalSenseCodeQualifier=cur_sense_data.ascq;
520 tb.sense_data->FieldReplaceableUnitCode=0; 539 tb.sense_data->FieldReplaceableUnitCode=0;
521 tb.sense_data->SKSV=0; 540 tb.sense_data->SKSV=0;
522 tb.sense_data->SenseKeySpecific=0; 541 tb.sense_data->SenseKeySpecific=0;
@@ -531,6 +550,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
531 send_csw(UMS_STATUS_FAIL); 550 send_csw(UMS_STATUS_FAIL);
532 cur_sense_data.sense_key=SENSE_NOT_READY; 551 cur_sense_data.sense_key=SENSE_NOT_READY;
533 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; 552 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT;
553 cur_sense_data.ascq=0;
534 break; 554 break;
535 } 555 }
536 /*unsigned char pc = (cbw->command_block[2] & 0xc0) >>6;*/ 556 /*unsigned char pc = (cbw->command_block[2] & 0xc0) >>6;*/
@@ -563,6 +583,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
563 send_csw(UMS_STATUS_FAIL); 583 send_csw(UMS_STATUS_FAIL);
564 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; 584 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST;
565 cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD; 585 cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD;
586 cur_sense_data.ascq=0;
566 break; 587 break;
567 } 588 }
568 break; 589 break;
@@ -573,6 +594,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
573 send_csw(UMS_STATUS_FAIL); 594 send_csw(UMS_STATUS_FAIL);
574 cur_sense_data.sense_key=SENSE_NOT_READY; 595 cur_sense_data.sense_key=SENSE_NOT_READY;
575 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; 596 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT;
597 cur_sense_data.ascq=0;
576 break; 598 break;
577 } 599 }
578 /*unsigned char pc = (cbw->command_block[2] & 0xc0) >>6;*/ 600 /*unsigned char pc = (cbw->command_block[2] & 0xc0) >>6;*/
@@ -608,6 +630,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
608 send_csw(UMS_STATUS_FAIL); 630 send_csw(UMS_STATUS_FAIL);
609 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; 631 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST;
610 cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD; 632 cur_sense_data.asc=ASC_INVALID_FIELD_IN_CBD;
633 cur_sense_data.ascq=0;
611 break; 634 break;
612 } 635 }
613 break; 636 break;
@@ -641,6 +664,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
641 send_csw(UMS_STATUS_FAIL); 664 send_csw(UMS_STATUS_FAIL);
642 cur_sense_data.sense_key=SENSE_NOT_READY; 665 cur_sense_data.sense_key=SENSE_NOT_READY;
643 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; 666 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT;
667 cur_sense_data.ascq=0;
644 } 668 }
645 break; 669 break;
646 } 670 }
@@ -660,6 +684,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
660 send_csw(UMS_STATUS_FAIL); 684 send_csw(UMS_STATUS_FAIL);
661 cur_sense_data.sense_key=SENSE_NOT_READY; 685 cur_sense_data.sense_key=SENSE_NOT_READY;
662 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; 686 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT;
687 cur_sense_data.ascq=0;
663 } 688 }
664 break; 689 break;
665 } 690 }
@@ -671,6 +696,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
671 send_csw(UMS_STATUS_FAIL); 696 send_csw(UMS_STATUS_FAIL);
672 cur_sense_data.sense_key=SENSE_NOT_READY; 697 cur_sense_data.sense_key=SENSE_NOT_READY;
673 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; 698 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT;
699 cur_sense_data.ascq=0;
674 break; 700 break;
675 } 701 }
676 current_cmd.data[0] = tb.transfer_buffer; 702 current_cmd.data[0] = tb.transfer_buffer;
@@ -692,6 +718,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
692 send_csw(UMS_STATUS_FAIL); 718 send_csw(UMS_STATUS_FAIL);
693 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; 719 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST;
694 cur_sense_data.asc=ASC_LBA_OUT_OF_RANGE; 720 cur_sense_data.asc=ASC_LBA_OUT_OF_RANGE;
721 cur_sense_data.ascq=0;
695 } 722 }
696 else { 723 else {
697 current_cmd.last_result = ata_read_sectors(IF_MV2(current_cmd.lun,) current_cmd.sector, 724 current_cmd.last_result = ata_read_sectors(IF_MV2(current_cmd.lun,) current_cmd.sector,
@@ -708,6 +735,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
708 send_csw(UMS_STATUS_FAIL); 735 send_csw(UMS_STATUS_FAIL);
709 cur_sense_data.sense_key=SENSE_NOT_READY; 736 cur_sense_data.sense_key=SENSE_NOT_READY;
710 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT; 737 cur_sense_data.asc=ASC_MEDIUM_NOT_PRESENT;
738 cur_sense_data.ascq=0;
711 break; 739 break;
712 } 740 }
713 current_cmd.data[0] = tb.transfer_buffer; 741 current_cmd.data[0] = tb.transfer_buffer;
@@ -727,6 +755,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
727 send_csw(UMS_STATUS_FAIL); 755 send_csw(UMS_STATUS_FAIL);
728 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; 756 cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST;
729 cur_sense_data.asc=ASC_LBA_OUT_OF_RANGE; 757 cur_sense_data.asc=ASC_LBA_OUT_OF_RANGE;
758 cur_sense_data.ascq=0;
730 } 759 }
731 else { 760 else {
732 receive_block_data(current_cmd.data[0], 761 receive_block_data(current_cmd.data[0],
@@ -776,6 +805,7 @@ static void send_csw(int status)
776 cur_sense_data.sense_key=0; 805 cur_sense_data.sense_key=0;
777 cur_sense_data.information=0; 806 cur_sense_data.information=0;
778 cur_sense_data.asc=0; 807 cur_sense_data.asc=0;
808 cur_sense_data.ascq=0;
779 } 809 }
780} 810}
781 811