Patrik GONDA / Mbed 2 deprecated micromag3

Dependencies:   mbed

Committer:
shredder
Date:
Wed Jun 23 18:51:42 2010 +0000
Revision:
0:e79a950111c9

        

Who changed what in which revision?

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