dd

Dependencies:   C12832 mbed

Committer:
pfe
Date:
Wed Apr 08 08:27:55 2015 +0000
Revision:
0:caecb0d1e7d3
ddd

Who changed what in which revision?

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