This program plays an internet radio audio stream like Shoutcast.

Dependencies:   EthernetNetIf mbed HTTPClient

Committer:
parik
Date:
Tue Mar 01 06:22:50 2011 +0000
Revision:
0:37da71b87d96

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
parik 0:37da71b87d96 1 /* USB Mass Storage device file system
parik 0:37da71b87d96 2 * Copyrigh (c) 2010, Igor Skochinsky
parik 0:37da71b87d96 3 * based on SDFileStorage
parik 0:37da71b87d96 4 * Copyright (c) 2008-2009, sford
parik 0:37da71b87d96 5 */
parik 0:37da71b87d96 6
parik 0:37da71b87d96 7 /* Introduction
parik 0:37da71b87d96 8 * ------------
parik 0:37da71b87d96 9 * TODO: write one
parik 0:37da71b87d96 10 * we're basically using NXP's USBHotLite sample code, just plugging in our own FAT library
parik 0:37da71b87d96 11 */
parik 0:37da71b87d96 12
parik 0:37da71b87d96 13 #include "MSCFileSystem.h"
parik 0:37da71b87d96 14 #include "usbhost_inc.h"
parik 0:37da71b87d96 15
parik 0:37da71b87d96 16 MSCFileSystem::MSCFileSystem(const char* name) :
parik 0:37da71b87d96 17 FATFileSystem(name)
parik 0:37da71b87d96 18 {
parik 0:37da71b87d96 19 }
parik 0:37da71b87d96 20
parik 0:37da71b87d96 21 void print_inquiry(USB_INT08U *inqReply)
parik 0:37da71b87d96 22 {
parik 0:37da71b87d96 23 // see USB Mass Storage Class – UFI Command Specification,
parik 0:37da71b87d96 24 // 4.2 INQUIRY Command
parik 0:37da71b87d96 25 printf("Inquiry reply:\n");
parik 0:37da71b87d96 26 uint8_t tmp = inqReply[0]&0x1F;
parik 0:37da71b87d96 27 printf("Peripheral device type: %02Xh\n", tmp);
parik 0:37da71b87d96 28 if ( tmp == 0 )
parik 0:37da71b87d96 29 printf("\t- Direct access (floppy)\n");
parik 0:37da71b87d96 30 else if ( tmp == 0x1F )
parik 0:37da71b87d96 31 printf("\t- none (no FDD connected)\n");
parik 0:37da71b87d96 32 else
parik 0:37da71b87d96 33 printf("\t- unknown type\n");
parik 0:37da71b87d96 34 tmp = inqReply[1] >> 7;
parik 0:37da71b87d96 35 printf("Removable Media Bit: %d\n", tmp);
parik 0:37da71b87d96 36 tmp = inqReply[2] & 3;
parik 0:37da71b87d96 37 printf("ANSI Version: %02Xh\n", tmp);
parik 0:37da71b87d96 38 if ( tmp != 0 )
parik 0:37da71b87d96 39 printf("\t- warning! must be 0\n");
parik 0:37da71b87d96 40 tmp = (inqReply[2]>>3) & 3;
parik 0:37da71b87d96 41 printf("ECMA Version: %02Xh\n", tmp);
parik 0:37da71b87d96 42 if ( tmp != 0 )
parik 0:37da71b87d96 43 printf("\t- warning! should be 0\n");
parik 0:37da71b87d96 44 tmp = inqReply[2]>>6;
parik 0:37da71b87d96 45 printf("ISO Version: %02Xh\n", tmp);
parik 0:37da71b87d96 46 if ( tmp != 0 )
parik 0:37da71b87d96 47 printf("\t- warning! should be 0\n");
parik 0:37da71b87d96 48 tmp = inqReply[3] & 0xF;
parik 0:37da71b87d96 49 printf("Response Data Format: %02Xh\n", tmp);
parik 0:37da71b87d96 50 if ( tmp != 1 )
parik 0:37da71b87d96 51 printf("\t- warning! should be 1\n");
parik 0:37da71b87d96 52 tmp = inqReply[4];
parik 0:37da71b87d96 53 printf("Additional length: %02Xh\n", tmp);
parik 0:37da71b87d96 54 if ( tmp != 0x1F )
parik 0:37da71b87d96 55 printf("\t- warning! should be 1Fh\n");
parik 0:37da71b87d96 56 printf("Vendor Information: '%.8s'\n", &inqReply[8]);
parik 0:37da71b87d96 57 printf("Product Identification: '%.16s'\n", &inqReply[16]);
parik 0:37da71b87d96 58 printf("Product Revision: '%.4s'\n", &inqReply[32]);
parik 0:37da71b87d96 59 }
parik 0:37da71b87d96 60
parik 0:37da71b87d96 61 int MSCFileSystem::initialise_msc()
parik 0:37da71b87d96 62 {
parik 0:37da71b87d96 63 USB_INT32S rc;
parik 0:37da71b87d96 64 USB_INT08U inquiryResult[INQUIRY_LENGTH];
parik 0:37da71b87d96 65
parik 0:37da71b87d96 66 //print_clock();
parik 0:37da71b87d96 67 Host_Init(); /* Initialize the host controller */
parik 0:37da71b87d96 68 rc = Host_EnumDev(); /* Enumerate the device connected */
parik 0:37da71b87d96 69 if (rc != OK)
parik 0:37da71b87d96 70 {
parik 0:37da71b87d96 71 fprintf(stderr, "Could not enumerate device: %d\n", rc);
parik 0:37da71b87d96 72 return rc;
parik 0:37da71b87d96 73 }
parik 0:37da71b87d96 74
parik 0:37da71b87d96 75
parik 0:37da71b87d96 76 /* Initialize the mass storage and scsi interfaces */
parik 0:37da71b87d96 77 rc = MS_Init( &_blkSize, &_numBlks, inquiryResult );
parik 0:37da71b87d96 78 if (rc != OK)
parik 0:37da71b87d96 79 {
parik 0:37da71b87d96 80 fprintf(stderr, "Could not initialize mass storage interface: %d\n", rc);
parik 0:37da71b87d96 81 return rc;
parik 0:37da71b87d96 82 }
parik 0:37da71b87d96 83 printf("Successfully initialized mass storage interface; %d blocks of size %d\n", _numBlks, _blkSize);
parik 0:37da71b87d96 84 print_inquiry(inquiryResult);
parik 0:37da71b87d96 85 // FATFileSystem supports only 512-byte blocks
parik 0:37da71b87d96 86 return _blkSize == 512 ? OK : 1;
parik 0:37da71b87d96 87 }
parik 0:37da71b87d96 88
parik 0:37da71b87d96 89 int MSCFileSystem::disk_initialize()
parik 0:37da71b87d96 90 {
parik 0:37da71b87d96 91 if ( initialise_msc() != OK )
parik 0:37da71b87d96 92 return 1;
parik 0:37da71b87d96 93
parik 0:37da71b87d96 94 return 0;
parik 0:37da71b87d96 95 }
parik 0:37da71b87d96 96
parik 0:37da71b87d96 97 int MSCFileSystem::disk_write(const char *buffer, int block_number)
parik 0:37da71b87d96 98 {
parik 0:37da71b87d96 99 if ( OK == MS_BulkSend(block_number, 1, (USB_INT08U *)buffer) )
parik 0:37da71b87d96 100 return 0;
parik 0:37da71b87d96 101 return 1;
parik 0:37da71b87d96 102 }
parik 0:37da71b87d96 103
parik 0:37da71b87d96 104 int MSCFileSystem::disk_read(char *buffer, int block_number)
parik 0:37da71b87d96 105 {
parik 0:37da71b87d96 106 if ( OK == MS_BulkRecv(block_number, 1, (USB_INT08U *)buffer) )
parik 0:37da71b87d96 107 return 0;
parik 0:37da71b87d96 108 return 1;
parik 0:37da71b87d96 109 }
parik 0:37da71b87d96 110
parik 0:37da71b87d96 111 int MSCFileSystem::disk_status() { return 0; }
parik 0:37da71b87d96 112 int MSCFileSystem::disk_sync() { return 0; }
parik 0:37da71b87d96 113 int MSCFileSystem::disk_sectors() { return _numBlks; }