Robert Ceschini / Mbed 2 deprecated PSU-POWERLOGGER

Dependencies:   mbed

Fork of PSU-POWERLOGGER by Eli Hughes

Committer:
rjc19
Date:
Fri Sep 28 15:41:36 2012 +0000
Revision:
3:d55665050fcb
Parent:
0:d0c18e423b13
Working serial logger needs interface improvement

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emh203 0:d0c18e423b13 1 /*-----------------------------------------------------------------------*/
emh203 0:d0c18e423b13 2 /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */
emh203 0:d0c18e423b13 3 /*-----------------------------------------------------------------------*/
emh203 0:d0c18e423b13 4 /* This is a stub disk I/O module that acts as front end of the existing */
emh203 0:d0c18e423b13 5 /* disk I/O modules and attach it to FatFs module with common interface. */
emh203 0:d0c18e423b13 6 /*-----------------------------------------------------------------------*/
emh203 0:d0c18e423b13 7
emh203 0:d0c18e423b13 8 #include "diskio.h"
emh203 0:d0c18e423b13 9 #include "usbhost_inc.h"
emh203 0:d0c18e423b13 10 #include "mbed.h"
emh203 0:d0c18e423b13 11 #include "System.h"
emh203 0:d0c18e423b13 12
emh203 0:d0c18e423b13 13 uint32_t _numBlks = 0;
emh203 0:d0c18e423b13 14 uint32_t _blkSize = 512;
emh203 0:d0c18e423b13 15
emh203 0:d0c18e423b13 16 int initialise_msc();
emh203 0:d0c18e423b13 17 void print_inquiry(USB_INT08U *inqReply);
emh203 0:d0c18e423b13 18
emh203 0:d0c18e423b13 19 int disk_sync() { return 0; }
emh203 0:d0c18e423b13 20 int disk_sectors() { return _numBlks; }
emh203 0:d0c18e423b13 21
emh203 0:d0c18e423b13 22 DWORD get_fattime(void)
emh203 0:d0c18e423b13 23 {
emh203 0:d0c18e423b13 24 time_t CurrentTimeStamp;
emh203 0:d0c18e423b13 25 tm *CurrentLocalTime;
emh203 0:d0c18e423b13 26 DWORD FATFSTimeCode;
emh203 0:d0c18e423b13 27
emh203 0:d0c18e423b13 28 CurrentTimeStamp = time(NULL);
emh203 0:d0c18e423b13 29 CurrentLocalTime = localtime(&CurrentTimeStamp);
emh203 0:d0c18e423b13 30
emh203 0:d0c18e423b13 31 //Map the tm struct time into the FatFs time code
emh203 0:d0c18e423b13 32 FATFSTimeCode = ((CurrentLocalTime->tm_year-80)<<25) |
emh203 0:d0c18e423b13 33 ((CurrentLocalTime->tm_mon+1)<<21) |
emh203 0:d0c18e423b13 34 ((CurrentLocalTime->tm_mday)<<16) |
emh203 0:d0c18e423b13 35 ((CurrentLocalTime->tm_hour)<<11) |
emh203 0:d0c18e423b13 36 ((CurrentLocalTime->tm_min)<<5) |
emh203 0:d0c18e423b13 37 ((CurrentLocalTime->tm_sec));
emh203 0:d0c18e423b13 38
emh203 0:d0c18e423b13 39 return FATFSTimeCode;
emh203 0:d0c18e423b13 40 }
emh203 0:d0c18e423b13 41
emh203 0:d0c18e423b13 42 DSTATUS disk_status(BYTE Drive)
emh203 0:d0c18e423b13 43 {
emh203 0:d0c18e423b13 44 return 0;
emh203 0:d0c18e423b13 45 }
emh203 0:d0c18e423b13 46
emh203 0:d0c18e423b13 47
emh203 0:d0c18e423b13 48 DRESULT disk_ioctl (
emh203 0:d0c18e423b13 49 BYTE drv, /* Physical drive nmuber (0..) */
emh203 0:d0c18e423b13 50 BYTE ctrl, /* Control code */
emh203 0:d0c18e423b13 51 void *buff /* Buffer to send/receive control data */
emh203 0:d0c18e423b13 52 )
emh203 0:d0c18e423b13 53 {
emh203 0:d0c18e423b13 54 DRESULT res;
emh203 0:d0c18e423b13 55
emh203 0:d0c18e423b13 56 switch(ctrl)
emh203 0:d0c18e423b13 57 {
emh203 0:d0c18e423b13 58 case CTRL_SYNC:
emh203 0:d0c18e423b13 59 res = RES_OK;
emh203 0:d0c18e423b13 60 break;
emh203 0:d0c18e423b13 61
emh203 0:d0c18e423b13 62 case GET_SECTOR_SIZE:
emh203 0:d0c18e423b13 63 res = RES_OK;
emh203 0:d0c18e423b13 64 *(WORD *)buff = 512;
emh203 0:d0c18e423b13 65 break;
emh203 0:d0c18e423b13 66
emh203 0:d0c18e423b13 67 case GET_SECTOR_COUNT:
emh203 0:d0c18e423b13 68 res = RES_OK;
emh203 0:d0c18e423b13 69 *(DWORD *)buff = (WORD)disk_sectors();
emh203 0:d0c18e423b13 70 break;
emh203 0:d0c18e423b13 71
emh203 0:d0c18e423b13 72 case GET_BLOCK_SIZE:
emh203 0:d0c18e423b13 73 res = RES_OK;
emh203 0:d0c18e423b13 74 *(DWORD *)buff = 1;
emh203 0:d0c18e423b13 75 break;
emh203 0:d0c18e423b13 76
emh203 0:d0c18e423b13 77 default:
emh203 0:d0c18e423b13 78 res = RES_OK;
emh203 0:d0c18e423b13 79 break;
emh203 0:d0c18e423b13 80 }
emh203 0:d0c18e423b13 81 return res;
emh203 0:d0c18e423b13 82 }
emh203 0:d0c18e423b13 83
emh203 0:d0c18e423b13 84 DSTATUS disk_initialize(BYTE Drive) {
emh203 0:d0c18e423b13 85
emh203 0:d0c18e423b13 86 if ( initialise_msc() != OK )
emh203 0:d0c18e423b13 87 return 1;
emh203 0:d0c18e423b13 88 return 0;
emh203 0:d0c18e423b13 89 }
emh203 0:d0c18e423b13 90
emh203 0:d0c18e423b13 91 DRESULT disk_write(BYTE Drive,const BYTE * Buffer, DWORD SectorNumber, BYTE SectorCount)
emh203 0:d0c18e423b13 92 {
emh203 0:d0c18e423b13 93 if ( OK == MS_BulkSend(SectorNumber, SectorCount, (USB_INT08U *)Buffer) )
emh203 0:d0c18e423b13 94 return RES_OK;
emh203 0:d0c18e423b13 95 return RES_ERROR;
emh203 0:d0c18e423b13 96 }
emh203 0:d0c18e423b13 97
emh203 0:d0c18e423b13 98 DRESULT disk_read(BYTE Drive, BYTE * Buffer,DWORD SectorNumber, BYTE SectorCount)
emh203 0:d0c18e423b13 99 {
emh203 0:d0c18e423b13 100 if ( OK == MS_BulkRecv(SectorNumber, SectorCount, (USB_INT08U *)Buffer) )
emh203 0:d0c18e423b13 101 return RES_OK;
emh203 0:d0c18e423b13 102 return RES_ERROR;
emh203 0:d0c18e423b13 103 }
emh203 0:d0c18e423b13 104
emh203 0:d0c18e423b13 105
emh203 0:d0c18e423b13 106
emh203 0:d0c18e423b13 107
emh203 0:d0c18e423b13 108
emh203 0:d0c18e423b13 109 void print_inquiry(USB_INT08U *inqReply)
emh203 0:d0c18e423b13 110 {
emh203 0:d0c18e423b13 111 // see USB Mass Storage Class &#65533; UFI Command Specification,
emh203 0:d0c18e423b13 112 // 4.2 INQUIRY Command
emh203 0:d0c18e423b13 113 PrintfEnqueue(&PCBackDoorTx,"Inquiry reply:\n");
emh203 0:d0c18e423b13 114 uint8_t tmp = inqReply[0]&0x1F;
emh203 0:d0c18e423b13 115 PrintfEnqueue(&PCBackDoorTx,"Peripheral device type: %02Xh\n", tmp);
emh203 0:d0c18e423b13 116 if ( tmp == 0 )
emh203 0:d0c18e423b13 117 PrintfEnqueue(&PCBackDoorTx,"\t- Direct access (floppy)\n");
emh203 0:d0c18e423b13 118 else if ( tmp == 0x1F )
emh203 0:d0c18e423b13 119 PrintfEnqueue(&PCBackDoorTx,"\t- none (no FDD connected)\n");
emh203 0:d0c18e423b13 120 else
emh203 0:d0c18e423b13 121 PrintfEnqueue(&PCBackDoorTx,"\t- unknown type\n");
emh203 0:d0c18e423b13 122 tmp = inqReply[1] >> 7;
emh203 0:d0c18e423b13 123 PrintfEnqueue(&PCBackDoorTx,"Removable Media Bit: %d\n", tmp);
emh203 0:d0c18e423b13 124 tmp = inqReply[2] & 3;
emh203 0:d0c18e423b13 125 PrintfEnqueue(&PCBackDoorTx,"ANSI Version: %02Xh\n", tmp);
emh203 0:d0c18e423b13 126 if ( tmp != 0 )
emh203 0:d0c18e423b13 127 PrintfEnqueue(&PCBackDoorTx,"\t- warning! must be 0\n");
emh203 0:d0c18e423b13 128 tmp = (inqReply[2]>>3) & 3;
emh203 0:d0c18e423b13 129 PrintfEnqueue(&PCBackDoorTx,"ECMA Version: %02Xh\n", tmp);
emh203 0:d0c18e423b13 130 if ( tmp != 0 )
emh203 0:d0c18e423b13 131 PrintfEnqueue(&PCBackDoorTx,"\t- warning! should be 0\n");
emh203 0:d0c18e423b13 132 tmp = inqReply[2]>>6;
emh203 0:d0c18e423b13 133 PrintfEnqueue(&PCBackDoorTx,"ISO Version: %02Xh\n", tmp);
emh203 0:d0c18e423b13 134 if ( tmp != 0 )
emh203 0:d0c18e423b13 135 printf("\t- warning! should be 0\n");
emh203 0:d0c18e423b13 136 tmp = inqReply[3] & 0xF;
emh203 0:d0c18e423b13 137 PrintfEnqueue(&PCBackDoorTx,"Response Data Format: %02Xh\n", tmp);
emh203 0:d0c18e423b13 138 if ( tmp != 1 )
emh203 0:d0c18e423b13 139 PrintfEnqueue(&PCBackDoorTx,"\t- warning! should be 1\n");
emh203 0:d0c18e423b13 140 tmp = inqReply[4];
emh203 0:d0c18e423b13 141 PrintfEnqueue(&PCBackDoorTx,"Additional length: %02Xh\n", tmp);
emh203 0:d0c18e423b13 142 if ( tmp != 0x1F )
emh203 0:d0c18e423b13 143 PrintfEnqueue(&PCBackDoorTx,"\t- warning! should be 1Fh\n");
emh203 0:d0c18e423b13 144 PrintfEnqueue(&PCBackDoorTx,"Vendor Information: '%.8s'\n", &inqReply[8]);
emh203 0:d0c18e423b13 145 PrintfEnqueue(&PCBackDoorTx,"Product Identification: '%.16s'\n", &inqReply[16]);
emh203 0:d0c18e423b13 146 PrintfEnqueue(&PCBackDoorTx,"Product Revision: '%.4s'\n", &inqReply[32]);
emh203 0:d0c18e423b13 147 }
emh203 0:d0c18e423b13 148
emh203 0:d0c18e423b13 149
emh203 0:d0c18e423b13 150
emh203 0:d0c18e423b13 151 int initialise_msc()
emh203 0:d0c18e423b13 152 {
emh203 0:d0c18e423b13 153 USB_INT32S rc;
emh203 0:d0c18e423b13 154 USB_INT08U inquiryResult[INQUIRY_LENGTH];
emh203 0:d0c18e423b13 155
emh203 0:d0c18e423b13 156 //print_clock();
emh203 0:d0c18e423b13 157 Host_Init(); /* Initialize the host controller */
emh203 0:d0c18e423b13 158 rc = Host_EnumDev(); /* Enumerate the device connected */
emh203 0:d0c18e423b13 159 if (rc != OK)
emh203 0:d0c18e423b13 160 {
rjc19 3:d55665050fcb 161 //fprintf(stderr, "Could not enumerate device: %d\n", rc);
rjc19 3:d55665050fcb 162 PrintfEnqueue(&PCBackDoorTx,"Could not enumerate device: %d\n", rc);
emh203 0:d0c18e423b13 163 return rc;
emh203 0:d0c18e423b13 164 }
emh203 0:d0c18e423b13 165
emh203 0:d0c18e423b13 166
emh203 0:d0c18e423b13 167 /* Initialize the mass storage and scsi interfaces */
emh203 0:d0c18e423b13 168 rc = MS_Init( &_blkSize, &_numBlks, inquiryResult );
emh203 0:d0c18e423b13 169 if (rc != OK)
emh203 0:d0c18e423b13 170 {
rjc19 3:d55665050fcb 171 //fprintf(stderr, "Could not initialize mass storage interface: %d\n", rc);
rjc19 3:d55665050fcb 172 PrintfEnqueue(&PCBackDoorTx,"Could not initialize mass storage interface: %d\n", rc);
emh203 0:d0c18e423b13 173 return rc;
emh203 0:d0c18e423b13 174 }
rjc19 3:d55665050fcb 175 //printf("Successfully initialized mass storage interface; %d blocks of size %d\n", _numBlks, _blkSize);
rjc19 3:d55665050fcb 176 PrintfEnqueue(&PCBackDoorTx,"Successfully initialized mass storage interface; %d blocks of size %d\n", _numBlks, _blkSize);
rjc19 3:d55665050fcb 177 //print_inquiry(inquiryResult);
emh203 0:d0c18e423b13 178 // FATFileSystem supports only 512-byte blocks
emh203 0:d0c18e423b13 179 return _blkSize == 512 ? OK : 1;
emh203 0:d0c18e423b13 180 }
emh203 0:d0c18e423b13 181
emh203 0:d0c18e423b13 182
emh203 0:d0c18e423b13 183