esemi00

Dependencies:   mbed FatFileSystemCpp

Committer:
esemi00
Date:
Wed Jan 20 05:26:38 2021 +0000
Revision:
0:2369be4f42cd
esemi00

Who changed what in which revision?

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