Testing

Dependencies:   mbed FatFileSystemCpp

Committer:
Richard_Xiong
Date:
Fri Apr 24 01:49:33 2020 +0000
Revision:
0:1855e9b8c2a2
USBTesting

Who changed what in which revision?

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