Index: firmware/export/config-e200.h =================================================================== --- firmware/export/config-e200.h (revision 20324) +++ firmware/export/config-e200.h (working copy) @@ -175,8 +175,8 @@ /* enable these for the experimental usb stack */ #define HAVE_USBSTACK #define USE_ROCKBOX_USB -#define USB_VENDOR_ID 0x0781 -#define USB_PRODUCT_ID 0x7421 +#define USB_VENDOR_ID 0x05ac +#define USB_PRODUCT_ID 0x1205 /* Virtual LED (icon) */ #define CONFIG_LED LED_VIRTUAL Index: firmware/usbstack/usb_core.c =================================================================== --- firmware/usbstack/usb_core.c (revision 20324) +++ firmware/usbstack/usb_core.c (working copy) @@ -117,29 +117,26 @@ static const struct usb_string_descriptor __attribute__((aligned(2))) usb_string_iManufacturer = { - 24, + 12, USB_DT_STRING, - {'R','o','c','k','b','o','x','.','o','r','g'} + {'A','p','p','l','e'} }; static const struct usb_string_descriptor __attribute__((aligned(2))) usb_string_iProduct = { - 42, + 20, USB_DT_STRING, - {'R','o','c','k','b','o','x',' ', - 'm','e','d','i','a',' ', - 'p','l','a','y','e','r'} + {'i','P','o','d',' ','m','i','n', + 'i'} }; static struct usb_string_descriptor __attribute__((aligned(2))) usb_string_iSerial = { - 84, + 34, USB_DT_STRING, - {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', - '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0', - '0','0','0','0','0','0','0','0','0'} + {'0','0','0','A','2','7','0','0','1','4','1','2','C','E','B','8'} }; /* Generic for all targets */ @@ -429,13 +426,6 @@ static void usb_core_set_serial_function_id(void) { - int id = 0; - int i; - for(i=0;i\ +\ +\ +\ +AppleDRMVersion\ +\ +Minimum\ +0\ +Maximum\ +4\ +Format\ +2\ +\ +AudioCodecs\ +\ +AIFF\ +\ +Mono\ +\ +Stereo\ +\ +Multichannel\ +\ +MaximumSampleRate\ +48000\ +MaximumBitDepth\ +16\ +\ +MP3\ +\ +Mono\ +\ +Stereo\ +\ +MaximumSampleRate\ +48000\ +MaximumDataRate\ +320\ +\ +WAV\ +\ +Mono\ +\ +Stereo\ +\ +Multichannel\ +\ +MaximumSampleRate\ +96000\ +MaximumBitDepth\ +16\ +\ +AppleLossless\ +\ +Mono\ +\ +Stereo\ +\ +Multichannel\ +\ +MaximumBitDepth\ +32\ +MaximumBitDepthUntruncated\ +16\ +MaximumSampleRate\ +48000\ +AppleDRM\ +\ +\ +Audible\ +\ +Type1\ +\ +Type2\ +\ +Type3\ +\ +Type4\ +\ +\ +\ +BuildID\ +6.1.2\ +ConnectedBus\ +USB\ +MaxTransferSpeed\ +61440\ +FamilyID\ +6\ +FireWireGUID\ +000A2700157501F8\ +FireWireVersion\ +1.62\ +ImageSpecifications\ +\ +1019\ +\ +FormatId\ +1019\ +DisplayWidth\ +720\ +RenderWidth\ +640\ +RenderHeight\ +480\ +PixelFormat\ +32767579\ +Interlaced\ +\ +ColorAdjustment\ +1\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +\ +1015\ +\ +FormatId\ +1015\ +RenderWidth\ +130\ +RenderHeight\ +88\ +PixelFormat\ +4C353635\ +Interlaced\ +\ +ColorAdjustment\ +0\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +BackColor\ +00000000\ +\ +1024\ +\ +FormatId\ +1024\ +RenderWidth\ +320\ +RenderHeight\ +240\ +PixelFormat\ +4C353635\ +Interlaced\ +\ +ColorAdjustment\ +0\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +Rotation\ +0\ +\ +1036\ +\ +FormatId\ +1036\ +RenderWidth\ +50\ +RenderHeight\ +41\ +PixelFormat\ +4C353635\ +Interlaced\ +\ +ColorAdjustment\ +0\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +BackColor\ +00000000\ +\ +\ +AlbumArt\ +\ +1028\ +\ +FormatId\ +1028\ +RenderWidth\ +100\ +RenderHeight\ +100\ +PixelFormat\ +4C353635\ +Interlaced\ +\ +ColorAdjustment\ +0\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +BackColor\ +FFFFFFFF\ +\ +1029\ +\ +FormatId\ +1029\ +RenderWidth\ +200\ +RenderHeight\ +200\ +PixelFormat\ +4C353635\ +Interlaced\ +\ +ColorAdjustment\ +0\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +BackColor\ +FFFFFFFF\ +\ +\ +PodcastsSupported\ +\ +ChapterImageSpecs\ +\ +1028\ +\ +FormatId\ +1028\ +RenderWidth\ +100\ +RenderHeight\ +100\ +PixelFormat\ +4C353635\ +Interlaced\ +\ +ColorAdjustment\ +0\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +BackColor\ +FFFFFFFF\ +\ +1029\ +\ +FormatId\ +1029\ +RenderWidth\ +200\ +RenderHeight\ +200\ +PixelFormat\ +4C353635\ +Interlaced\ +\ +ColorAdjustment\ +0\ +GammaAdjustment\ +2.2\ +Crop\ +\ +AlignRowBytes\ +\ +BackColor\ +FFFFFFFF\ +\ +\ +MinITunesVersion\ +6.0\ +SerialNumber\ +XXXXXXXXXXX\ +UpdaterFamilyID\ +20\ +VisibleBuildID\ +1.4.1\ +64Bit\ +3\ +OEMID\ +0\ +OEMV\ +8\ +PowerInformation\ +\ +WillFlash\ +\ +USB\ +\ +FireWire\ +\ +\ +VoiceMemosSupported\ +\ +VoiceMemoFormats\ +\ +WAV\ +\ +MaximumSampleRate\ +44100\ +\ +\ +AutoRebootAfterFirmwareUpdate\ +\ +VolumeFormat\ +FAT32\ +VolumeInformation\ +\ +HFSPLUS\ +\ +SupportedFormat\ +\ +ConversionSupported\ +\ +CurrentFormat\ +\ +\ +FAT32\ +\ +SupportedFormat\ +\ +ConversionSupported\ +\ +CurrentFormat\ +\ +\ +\ +ForcedDiskMode\ +\ +BangFolder\ +\ +CorruptDataPartition\ +\ +CorruptFirmwarePartition\ +\ +CanFlashBacklight\ +\ +CanHibernate\ +\ +RAM\ +32\ +HotPlugState\ +0\ +vCardWithJPEGSupported\ +\ +VideoCodecs\ +\ +H.264\ +\ +AppleVideoDRM\ +\ +MaximumEncryptionPercentage\ +12.5\ +\ +AAC\ +\ +AppleDRM\ +\ +MaximumSampleRate\ +48000\ +MaximumBitRate\ +160\ +LC\ +\ +VariableBitRate\ +\ +Multichannel\ +\ +\ +\ +Profile\ +B\ +Level\ +13\ +MaximumPeakBitRate\ +768\ +MaximumResolution\ +76800\ +MinimumWidth\ +16\ +MinimumHeight\ +16\ +MaximumWidth\ +4800\ +MaximumHeight\ +4800\ +\ +MPEG4\ +\ +AppleVideoDRM\ +\ +MaximumEncryptionPercentage\ +12.5\ +\ +AAC\ +\ +AppleDRM\ +\ +MaximumSampleRate\ +48000\ +MaximumBitRate\ +160\ +LC\ +\ +VariableBitRate\ +\ +Multichannel\ +\ +\ +\ +Profile-Level-ID\ +3\ +MaximumAverageBitRate\ +2500\ +MaximumPeakBitRate\ +0\ +MaximumBufferSize\ +0\ +MaximumResolution\ +230400\ +MinimumWidth\ +16\ +MinimumHeight\ +16\ +MaximumWidth\ +14400\ +MaximumHeight\ +14400\ +\ +\ +\ +"; + #ifdef USB_USE_RAMDISK static unsigned char* ramdisk_buffer; #endif @@ -318,7 +770,7 @@ } } if(canrelease) { - logf("scsi release ata"); + /*logf("scsi release ata");*/ usb_release_exclusive_storage(); } } @@ -326,7 +778,7 @@ #ifdef HAVE_HOTSWAP void usb_storage_notify_hotswap(int volume,bool inserted) { - logf("notify %d",inserted); + /*logf("notify %d",inserted);*/ if(inserted && check_disk_present(IF_MV(volume))) { ejected[volume] = false; } @@ -342,7 +794,7 @@ /* called by usb_core_init() */ void usb_storage_init(void) { - logf("usb_storage_init done"); + /*logf("usb_storage_init done");*/ } int usb_storage_request_endpoints(struct usb_class_driver *drv) @@ -392,7 +844,7 @@ void usb_storage_init_connection(void) { - logf("ums: set config"); + /*logf("ums: set config");*/ /* prime rx endpoint. We only need room for commands */ state = WAITING_FOR_COMMAND; @@ -446,17 +898,17 @@ (void)ep; struct command_block_wrapper* cbw = (void*)tb.transfer_buffer; - //logf("transfer result %X %d", status, length); + /*logf("transfer result %X %d", status, length);*/ switch(state) { case RECEIVING_BLOCKS: if(dir==USB_DIR_IN) { - logf("IN received in RECEIVING"); + /*logf("IN received in RECEIVING");*/ } - logf("scsi write %d %d", cur_cmd.sector, cur_cmd.count); + /*logf("scsi write %d %d", cur_cmd.sector, cur_cmd.count);*/ if(status==0) { if((unsigned int)length!=(SECTOR_SIZE*cur_cmd.count) && (unsigned int)length!=BUFFER_SIZE) { - logf("unexpected length :%d",length); + /*logf("unexpected length :%d",length);*/ } unsigned int next_sector = cur_cmd.sector + @@ -504,7 +956,7 @@ } else { - logf("Transfer failed %X",status); + /*logf("Transfer failed %X",status);*/ send_csw(UMS_STATUS_FAIL); /* TODO fill in cur_sense_data */ cur_sense_data.sense_key=0; @@ -515,9 +967,9 @@ break; case WAITING_FOR_COMMAND: if(dir==USB_DIR_IN) { - logf("IN received in WAITING_FOR_COMMAND"); + /*logf("IN received in WAITING_FOR_COMMAND");*/ } - //logf("command received"); + /*logf("command received");*/ if(letoh32(cbw->signature) == CBW_SIGNATURE){ handle_scsi(cbw); } @@ -528,9 +980,9 @@ break; case SENDING_CSW: if(dir==USB_DIR_OUT) { - logf("OUT received in SENDING_CSW"); + /*logf("OUT received in SENDING_CSW");*/ } - //logf("csw sent, now go back to idle"); + /*logf("csw sent, now go back to idle");*/ state = WAITING_FOR_COMMAND; #if 0 if(cur_cmd.cur_cmd == SCSI_WRITE_10) @@ -546,14 +998,14 @@ break; case SENDING_RESULT: if(dir==USB_DIR_OUT) { - logf("OUT received in SENDING"); + /*logf("OUT received in SENDING");*/ } if(status==0) { - //logf("data sent, now send csw"); + /*logf("data sent, now send csw");*/ send_csw(UMS_STATUS_GOOD); } else { - logf("Transfer failed %X",status); + /*logf("Transfer failed %X",status);*/ send_csw(UMS_STATUS_FAIL); /* TODO fill in cur_sense_data */ cur_sense_data.sense_key=0; @@ -564,17 +1016,17 @@ break; case SENDING_FAILED_RESULT: if(dir==USB_DIR_OUT) { - logf("OUT received in SENDING"); + /*logf("OUT received in SENDING");*/ } send_csw(UMS_STATUS_FAIL); break; case SENDING_BLOCKS: if(dir==USB_DIR_OUT) { - logf("OUT received in SENDING"); + /*logf("OUT received in SENDING");*/ } if(status==0) { if(cur_cmd.count==0) { - //logf("data sent, now send csw"); + /*logf("data sent, now send csw");*/ send_csw(UMS_STATUS_GOOD); } else { @@ -582,7 +1034,7 @@ } } else { - logf("Transfer failed %X",status); + /*logf("Transfer failed %X",status);*/ send_csw(UMS_STATUS_FAIL); /* TODO fill in cur_sense_data */ cur_sense_data.sense_key=0; @@ -607,7 +1059,7 @@ #else *tb.max_lun = NUM_VOLUMES - 1; #endif - logf("ums: getmaxlun"); + /*logf("ums: getmaxlun");*/ usb_drv_send(EP_CONTROL, tb.max_lun, 1); usb_drv_recv(EP_CONTROL, NULL, 0); /* ack */ handled = true; @@ -615,7 +1067,7 @@ } case USB_BULK_RESET_REQUEST: - logf("ums: bulk reset"); + /*logf("ums: bulk reset");*/ state = WAITING_FOR_COMMAND; /* UMS BOT 3.1 says The device shall preserve the value of its bulk data toggle bits and endpoint STALL conditions despite @@ -714,7 +1166,7 @@ switch (cbw->command_block[0]) { case SCSI_TEST_UNIT_READY: - logf("scsi test_unit_ready %d",lun); + /*logf("scsi test_unit_ready %d",lun);*/ if(!usb_exclusive_storage()) { send_csw(UMS_STATUS_FAIL); cur_sense_data.sense_key=SENSE_NOT_READY; @@ -734,7 +1186,7 @@ break; case SCSI_REPORT_LUNS: { - logf("scsi report luns %d",lun); + /*logf("scsi report luns %d",lun);*/ int allocation_length=0; int i; allocation_length|=(cbw->command_block[6]<<24); @@ -758,11 +1210,45 @@ } case SCSI_INQUIRY: - logf("scsi inquiry %d",lun); - fill_inquiry(IF_MV(lun)); - length = MIN(length, cbw->command_block[4]); - send_command_result(tb.inquiry, - MIN(sizeof(struct inquiry_data), length)); + /*logf("scsi inquiry %d",lun);*/ + if(!(cbw->command_block[1] & 0x01)) + { + fill_inquiry(IF_MV(lun)); + length = MIN(length, cbw->command_block[4]); + send_command_result(tb.inquiry, + MIN(sizeof(struct inquiry_data), length)); + } + else + { + logf("cmdblck[2]=%x", cbw->command_block[2]); + if(cbw->command_block[2]==0xc0) + { + //itunes summary page + tb.transfer_buffer[0]=0; + tb.transfer_buffer[1]=0xc0; + tb.transfer_buffer[2]=0; + unsigned int i; + for(i=0;i*0xf8command_block[2]-0xc2; + tb.transfer_buffer[0]=0; + tb.transfer_buffer[1]=cbw->command_block[2]; + tb.transfer_buffer[2]=0; + unsigned int size=0xf8; + if((offset+1)*0xf8>sizeof(xmldata)) + size=sizeof(xmldata)-offset*0xf8; + memcpy(&tb.transfer_buffer[4],&xmldata[offset*0xf8],0xf8); + tb.transfer_buffer[3]=size; + send_command_result(tb.transfer_buffer,size+4); + } + } break; case SCSI_REQUEST_SENSE: { @@ -777,7 +1263,7 @@ tb.sense_data->FieldReplaceableUnitCode=0; tb.sense_data->SKSV=0; tb.sense_data->SenseKeySpecific=0; - logf("scsi request_sense %d",lun); + /*logf("scsi request_sense %d",lun);*/ send_command_result(tb.sense_data, sizeof(struct sense_data)); break; } @@ -792,7 +1278,7 @@ } /*unsigned char pc = (cbw->command_block[2] & 0xc0) >>6;*/ unsigned char page_code = cbw->command_block[2] & 0x3f; - logf("scsi mode_sense_10 %d %X",lun,page_code); + /*logf("scsi mode_sense_10 %d %X",lun,page_code);*/ switch(page_code) { case 0x3f: tb.ms_data_10->mode_data_length = @@ -846,7 +1332,7 @@ } /*unsigned char pc = (cbw->command_block[2] & 0xc0) >>6;*/ unsigned char page_code = cbw->command_block[2] & 0x3f; - logf("scsi mode_sense_6 %d %X",lun,page_code); + /*logf("scsi mode_sense_6 %d %X",lun,page_code);*/ switch(page_code) { case 0x3f: /* All supported pages. */ @@ -891,15 +1377,15 @@ } case SCSI_START_STOP_UNIT: - logf("scsi start_stop unit %d",lun); + /*logf("scsi start_stop unit %d",lun);*/ if((cbw->command_block[4] & 0xf0) == 0) /*load/eject bit is valid*/ { /* Process start and eject bits */ - logf("scsi load/eject"); + /*logf("scsi load/eject");*/ if((cbw->command_block[4] & 0x01) == 0) /* Don't start */ { if((cbw->command_block[4] & 0x02) != 0) /* eject */ { - logf("scsi eject"); + /*logf("scsi eject");*/ ejected[lun]=true; } } @@ -908,7 +1394,7 @@ break; case SCSI_ALLOW_MEDIUM_REMOVAL: - logf("scsi allow_medium_removal %d",lun); + /*logf("scsi allow_medium_removal %d",lun);*/ if((cbw->command_block[4] & 0x03) == 0) { locked[lun]=false; @@ -922,7 +1408,7 @@ send_csw(UMS_STATUS_GOOD); break; case SCSI_READ_FORMAT_CAPACITY: { - logf("scsi read_format_capacity %d",lun); + /*logf("scsi read_format_capacity %d",lun);*/ if(lun_present) { tb.format_capacity_data->following_length=htobe32(8); /* "block count" actually means "number of last block" */ @@ -969,7 +1455,7 @@ } case SCSI_READ_10: - logf("scsi read10 %d",lun); + /* logf("scsi read10 %d",lun); */ if(! lun_present) { send_command_failed_result(); cur_sense_data.sense_key=SENSE_NOT_READY; @@ -990,7 +1476,7 @@ cbw->command_block[8]); cur_cmd.orig_count = cur_cmd.count; - //logf("scsi read %d %d", cur_cmd.sector, cur_cmd.count); + /*logf("scsi read %d %d", cur_cmd.sector, cur_cmd.count);*/ if((cur_cmd.sector + cur_cmd.count) > block_count) { send_csw(UMS_STATUS_FAIL); @@ -1021,7 +1507,7 @@ break; case SCSI_WRITE_10: - logf("scsi write10 %d",lun); + /*logf("scsi write10 %d",lun);*/ if(! lun_present) { send_csw(UMS_STATUS_FAIL); cur_sense_data.sense_key=SENSE_NOT_READY; @@ -1058,7 +1544,7 @@ break; default: - logf("scsi unknown cmd %x",cbw->command_block[0x0]); + /*logf("scsi unknown cmd %x",cbw->command_block[0x0]);*/ send_csw(UMS_STATUS_FAIL); cur_sense_data.sense_key=SENSE_ILLEGAL_REQUEST; cur_sense_data.asc=ASC_INVALID_COMMAND; @@ -1101,7 +1587,7 @@ usb_drv_send_nonblocking(ep_in, tb.csw, sizeof(struct command_status_wrapper)); state = SENDING_CSW; - //logf("CSW: %X",status); + /*logf("CSW: %X",status);*/ if(status == UMS_STATUS_GOOD) { cur_sense_data.sense_key=0; Index: firmware/target/arm/ata-sd-pp.c =================================================================== --- firmware/target/arm/ata-sd-pp.c (revision 20324) +++ firmware/target/arm/ata-sd-pp.c (working copy) @@ -1392,16 +1392,16 @@ #endif info->sector_size=card_info[drive].block_size; info->num_sectors=card_info[drive].numblocks; - info->vendor="Rockbox"; + info->vendor="Apple"; if(drive==0) { - info->product="Internal Storage"; + info->product="iPod"; } else { - info->product="SD Card Slot"; + info->product="iPod"; } - info->revision="0.00"; + info->revision="1.62"; } #endif