posilani dat

Dependencies:   FatFileSystemCpp mbed PowerControl USBHostLite

Committer:
PavelKumpan
Date:
Tue May 23 18:42:14 2017 +0000
Revision:
26:5674b8978551
Parent:
15:baa2672a9b38
Recreated communication protocol.

Who changed what in which revision?

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