hattori&ide

Dependencies:   mbed

Committer:
hattori_atsushi
Date:
Sun Dec 18 08:16:01 2022 +0000
Revision:
0:f77369cabd75
hattori

Who changed what in which revision?

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