esemi00

Dependencies:   mbed FatFileSystemCpp

Committer:
esemi00
Date:
Wed Jan 20 05:26:12 2021 +0000
Revision:
0:cfcd0d010286
esemi00

Who changed what in which revision?

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