I messed up the merge, so pushing it over to another repo so I don't lose it. Will tidy up and remove later

Dependencies:   BufferedSerial FatFileSystemCpp mbed

Committer:
JamieB
Date:
Thu Dec 15 06:05:30 2022 +0000
Revision:
85:0cc5931bb9ef
Parent:
9:7214e3c3e5f8
Push to somewhere else due to merge issue

Who changed what in which revision?

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