Publish code

Dependencies:   FatFileSystem RPG TextLCD mbed wave_player

Committer:
YongChingTee
Date:
Wed Mar 06 00:21:35 2013 +0000
Revision:
1:ebb980d204ae
Parent:
0:ad48675db853
publish

Who changed what in which revision?

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