Does still not work properly

Dependencies:   mbed

Committer:
Markus_Paar
Date:
Thu Sep 15 05:40:44 2011 +0000
Revision:
0:319f1e8e3bdd
V2

Who changed what in which revision?

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