Dual CANbus monitor and instrumentation cluster. Presently tuned for the Nissan Leaf EV.

Dependencies:   SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2_ILI9341 mbed

Fork of CANary_corrupt by Tick Tock

After adding the LPC1768 platform, import as a program and do not select the "update to latest revision" box

User Guide

Eagle Schematic and Board design

/media/uploads/TickTock/canaryr6.zip

/media/uploads/TickTock/canary_sch.jpg

/media/uploads/TickTock/canaryr6brd.jpg

For LCD Rev 1.01:

/media/uploads/TickTock/lcdsch.jpg

For VCD Rev 2.00:

/media/uploads/TickTock/lcdr2.jpg

Parts List

qtyinstancepart #packagesupplierDescription
1BAT3Vhttp://www.ebay.com/itm/10x-CR2032-SMD-Battery-Holder-for-CR2032-Battery-/180938057979?pt=LH_DefaultDomain_0&hash=item2a20bfa8fbLithium 2032 coin battery holder
4C1-C4ECST1DC106R6032Tantalium capacitor 10uF
3FC1-FC3ZF1-20-01-T-WThttp://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx20 conductor 1mm pitch flex cable connector (optional)
1FJ-20-R-08.00-4http://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx8\" 20 conductor 1mm pitch flex connector, end reversed (optional)
2H1-H4(DON'T populate H1-H4 headers - solder mbed directly)
1H5http://www.ebay.com/itm/221186042943?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26491x12 .1\" pitch header (optional)
1H62x6 .1\" pitch header (optional)
2IC1,IC2VP230LMDSOP8http://www.ebay.com/itm/130488665247?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649canbus transciever
1IC3LM1117-5VSOT2235V regulator
5JP*2 pin .1\" jumper header
1mbedLPC1768http://www.ebay.com/itm/200830573509?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649mbed uC
2Q1,Q22N2222SOT23General purpose NPN transistor
1R1R393M120639K resistor
1R2R103M120610K resistor
4R4-R6R102M12061K resistor
1R3R500M120650 Ohm resistor
2TR1-TR5ZJYS81R5-2PL51TG01http://www.digikey.com/product-detail/en/ZJYS81R5-2PL51T-G01/445-2223-1-ND/765232CM Choke
1Z11N5340BGC1702-15http://www.ebay.com/itm/150878122425?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26496V, 5W Zener Diode
1Z1DC-DC conveterhttp://www.ebay.com/itm/251142727849?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l264912V-7V, 3W DC-DC converter
1X1USBhttp://www.ebay.com/itm/New-Vertical-USB-2-0-A-pcb-connector-socket-USB-A-Type-/300553895292?pt=LH_DefaultDomain_0&hash=item45fa687d7cvertical USB connector
2LCD0,LCD1TFThttp://www.mikroe.com/add-on-boards/display/tft-proto/320x240 LCD with touch screen
1E0Enclosurehttp://www.shapeways.com/model/1077799/canary.html?li=user-profile&materialId=63d printed enclosure

Assembly

1) LCD Displays

I found ribbon cable is a nice way to organize the wires to the displays. There are two versions of the display and each must be wired differently. The original project used HW REV. 1.01. For that version, you'll need 12 conductors and I connected them in the following order:

1LED+
2LED-
3RST
4SDI
5WR/SCLK
6CS
7X+
8X-
9Y+
10Y-
11VDD
12GND

If, instead, you have HW REV 2.0, you will need 13 conductors with the following order:

1LED+
2LED-
3RST
4SDI
5RS (SCLK)
6WR (DC)
7CS
8X+
9X-
10Y+
11Y-
12VDD
13GND

First I connected all the GND connections (2 GND & IM0, IM1, IM3 for REV1.01 or 2 GND, RD, & IM0 for REV2.00). Do not connect the bottom GND until you have the ribbon cable connected. After making all the ribbon cable connections (connecting the GND of the ribbon cable to the bottom GND pad), solder the GND bar from the previous step to the back of the bottom GND connection. Finally, make a connection from the back side 3.3V pin to IM2 for REV1.01 or to IM1,IM2,&IM3 for REV2.00. Take a break and repeat for the second display.

Examples of REV1.01 boards:

/media/uploads/TickTock/lcdtop.jpg /media/uploads/TickTock/lcdbot.jpg

Examples of REV2.00:

/media/uploads/TickTock/rev2front.jpg /media/uploads/TickTock/rev2back.jpg

Once the two displays are complete combine all wires except CS0, CS1, X+, X-, Y+, and Y-. Connect X- of the left display to X+ of the right. Similarly connect Y- of the left display to Y+ of the right. Insulate any exposed wires.

2) PCB

Refer to the schematics to place all the components on the board. If you plan to install into the CANary 3D enclosure, DO NOT install the battery holder or the socket for the mbed and, instead, connect two wires to the VB and GND pads nearby. You will have to install the battery holder against the back wall to avoid interfering with the right-hand display and the mbed will have to be directly soldered. I have not found a socket with a low enough profile to fit in the space provided (depth of enclosure is limited by the space behind the center console). Also, I recommend keeping as much lead as possible on the Zener diode (bending it as shown to clear the back wall). Although it is operating well within parameters, the Zener gets quite hot during extended operation and the leads help dissipate the heat and keep it away from the PCB and other components.Update: Several Zeners have failed resulting in damage to some users boards so I recommend using a DC-DC converter instead to bring the 12V down to 7V.

/media/uploads/TickTock/pcbtop.jpg /media/uploads/TickTock/pcbbot.jpg

Once the PCB is populated, solder the LCDs to the PCB. CS0 connects to the right display and CS1 connects to the left. /media/uploads/TickTock/brddis.jpg

Update: The Zener diodes tended to fail after a few months so I am recommending removing them and replacing with a DC-DC converter. This will run cooler and waste less energy, too. To install, remove the left display panel to gain access to the Zener. From there, the Zener can be removed and it's pads used to connect to the DC-DC converter. I recommend setting the output voltage on the bench before installing since the trim pot is tricky to reach once installed. Set it to 7V. The input can be connected to the left pad previously occupied by the zener and the output can connect to the right. GND(-) can be connected to the bottom right pad on the 2x6 header below the flex cable connector. Make sure the GND wire lies flat so it doesn't interfere with the connection of the flex cable. /media/uploads/TickTock/dcdcinst2.jpg

Once soldered in place, the DC-DC converter can easily be mounted to the back wall with double sided tape above the battery holder. /media/uploads/TickTock/dcdcinst3.jpg

3) Testing

1)First step is to buzz out all connections from the LCDs to the pins in the main board
2)Next check the touch screen connections. On the main board, place an Ohm meter across X+ and X-. You should read 700 Ohms. Repeat for Y+ and Y-. Then test the resistance from X+ to Y+. With nothing touching the screens, it should read >100K Ohms and <1K when touching either screen.
3)When all connections are checked, solder in the mbed. Download and install the touch2 program http://mbed.org/users/TickTock/code/touch2/ to test the basic operation of the mbed and touch screens.
tips:
Touch screen is sensitive - excess flux on X+,X-,Y+,Y- connection on mbed can result in flakey operation
If touch is not working, double-check the LCD0_CS and LCD1_CS are not swapped. LCD0_CS must connect to the CS of the LCD that has X- & Y- connected to the mbed. LCD1_CS must connect to the CS of the LCD that has X+ & Y+ connected to the mbed.
4)Once touch2 works, it is time to connect to the OBD connector. I highly recommend double checking all connections from the OBD to the PCB with the cable in place before connecting to the Leaf. Buzz out all the pins in the OBS to make sure none are shorting to each other, Check that the 12V goes to the Zener (and nothing else) and the switched 12V to the resistor divider (and nothing else). Test the ground connection properly connects to ground and nothing else.
5)Once you are confident there are no shorts or wrong connections from the OBD connector, take a deep breath and plug it into your leaf. Touch2 program should come up and function. Unplug and install the latest CANary firmware. If you have the REV2.00 LCD boards, you will need to edit the precompile.h file in the TOUCH_TFTx2_w9341 library and set USE_ILI9341 to 1. Test all features before installing into the enclosure (gids, cellpair, menu system, logging) since installing and removing from the enclosure is a PITA.

/media/uploads/TickTock/pcbdone.jpg /media/uploads/TickTock/functioning.jpg

4) Enclosure

The 3D printer leaves a lot of powder behind - I used a strong spray of water to get it out of all the cracks. The enclosure comes with a rather rough finish. I recommend convincing yourself you like it, then simply lightly sand then paint before assembly. Sanding is very difficult - the nylon is very nicely fused and doesn't want to sand. I tried sandblasting and that didn't work either. I had some limited success with filler and then sanding, but only on the outside - it is too difficult to sand the face. /media/uploads/TickTock/enclosure.jpg

5) Final Assembly

Make sure you are well rested with lots of patience before attempting assembly. It is a puzzle figuring out how to get both displays and the PCB in place. Enclosure was too expensive for me to keep iterating to optimize for assembly. I ended up snipping the thin display posts shorter and using various tools to push the displays into place. Also, some USB connectors are taller than others. If you have one of the taller ones, you will have to deflect the back wall a bit while inserting the PCB (being careful not to bend the housing) to get it to it's opening in the back wall. Do use a screw in the provided post to secure the PCB as USB insertion will otherwise dislodge it.

I added an additional safety line which wraps around the center post to prevent the enclosure from becoming a projectile in the event of an accident. /media/uploads/TickTock/safety.jpg Installed: /media/uploads/TickTock/installed.jpg

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Sun Feb 03 18:16:53 2013 +0000
Parent:
0:1596b8644523
Child:
2:71b1999a8ea5
Commit message:
compiles

Changed in this revision

DebounceIn.lib Show diff for this revision Revisions of this file
FATFileSysGg/FATDirHandle.h Show annotated file Show diff for this revision Revisions of this file
FATFileSysGg/FATFileHandle.h Show annotated file Show diff for this revision Revisions of this file
FATFileSysGg/FATFileSystem.h Show annotated file Show diff for this revision Revisions of this file
FATFileSysGg/LPC1768/FATFileSystem.ar Show annotated file Show diff for this revision Revisions of this file
FATFileSysGg/LPC2368/FATFileSystem.ar Show annotated file Show diff for this revision Revisions of this file
FATFileSysGg/diskio.h Show annotated file Show diff for this revision Revisions of this file
FATFileSysGg/ff.h Show annotated file Show diff for this revision Revisions of this file
FATFileSysGg/integer.h Show annotated file Show diff for this revision Revisions of this file
FatFileSystem/FATDirHandle.h Show diff for this revision Revisions of this file
FatFileSystem/FATFileHandle.h Show diff for this revision Revisions of this file
FatFileSystem/FATFileSystem.h Show diff for this revision Revisions of this file
FatFileSystem/LPC1768/FATFileSystem.ar Show diff for this revision Revisions of this file
FatFileSystem/LPC2368/FATFileSystem.ar Show diff for this revision Revisions of this file
FatFileSystem/diskio.h Show diff for this revision Revisions of this file
FatFileSystem/ff.h Show diff for this revision Revisions of this file
FatFileSystem/integer.h Show diff for this revision Revisions of this file
MSCFileSysGg/MSCFileSystem.cpp Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/MSCFileSystem.h Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/USBHostLite/usbhost_cpu.h Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/USBHostLite/usbhost_err.h Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/USBHostLite/usbhost_inc.h Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/USBHostLite/usbhost_lpc17xx.c Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/USBHostLite/usbhost_lpc17xx.h Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/USBHostLite/usbhost_ms.c Show annotated file Show diff for this revision Revisions of this file
MSCFileSysGg/USBHostLite/usbhost_ms.h Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.cpp Show diff for this revision Revisions of this file
SDFileSystem.h Show diff for this revision Revisions of this file
SPI_TFTx2.lib Show annotated file Show diff for this revision Revisions of this file
TFT_fonts.lib Show annotated file Show diff for this revision Revisions of this file
TOUCH_TFTx2.lib Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show diff for this revision Revisions of this file
Util/mbedUtils.cpp Show annotated file Show diff for this revision Revisions of this file
Util/mbedUtils.h Show annotated file Show diff for this revision Revisions of this file
Util/stringUtils.cpp Show annotated file Show diff for this revision Revisions of this file
Util/stringUtils.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/DebounceIn.lib	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-DebounceIn#427f15966f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FATFileSysGg/FATDirHandle.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,29 @@
+/* Copyright 2008 ARM Limited. All rights reserved. */
+
+#ifndef MBED_FATDIRHANDLE_H
+#define MBED_FATDIRHANDLE_H
+
+#include "DirHandle.h"
+#include "ff.h"
+
+namespace mbed {
+
+class FATDirHandle : public DirHandle {
+
+ public:
+    FATDirHandle(const FATFS_DIR &the_dir);
+    virtual int closedir();
+    virtual struct dirent *readdir();
+    virtual void rewinddir();
+    virtual off_t telldir();
+    virtual void seekdir(off_t location);
+
+ private:
+    FATFS_DIR dir;
+    struct dirent cur_entry;
+
+};
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FATFileSysGg/FATFileHandle.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,33 @@
+/* mbed Microcontroller Library - FATFileHandle
+ * Copyright (c) 2008, sford
+ */
+
+#ifndef MBED_FATFILEHANDLE_H
+#define MBED_FATFILEHANDLE_H
+
+#include "FileHandle.h"
+#include "ff.h"
+
+namespace mbed {
+
+class FATFileHandle : public FileHandle {
+public:
+
+    FATFileHandle(FIL fh);
+    virtual int close();
+    virtual ssize_t write(const void* buffer, size_t length);
+    virtual ssize_t read(void* buffer, size_t length);
+    virtual int isatty();
+    virtual off_t lseek(off_t position, int whence);
+    virtual int fsync();
+    virtual off_t flen();
+
+protected:
+
+    FIL _fh;
+
+};
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FATFileSysGg/FATFileSystem.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,61 @@
+/* mbed Microcontroller Library - FATFileSystem
+ * Copyright (c) 2008, sford
+ */
+
+/* Library: FATFileSystem.h
+ * A library of stuff to make a fat filesystem on top of a block device
+ */
+
+#ifndef MBED_FATFILESYSTEM_H
+#define MBED_FATFILESYSTEM_H
+
+#ifndef FFSDEBUG_ENABLED
+#define FFSDEBUG_ENABLED 0
+#endif
+
+#if FFSDEBUG_ENABLED
+#define FFSDEBUG(FMT, ...) printf(FMT, ##__VA_ARGS__)
+#else
+#define FFSDEBUG(FMT, ...)
+#endif
+
+#include "FileSystemLike.h"
+#include "FileHandle.h"
+#include "ff.h"
+#include "diskio.h"
+
+namespace mbed {
+/* Class: FATFileSystem
+ * The class itself
+ */
+class FATFileSystem : public FileSystemLike {
+public:
+
+    FATFileSystem(const char* n);
+    virtual ~FATFileSystem();
+    
+    /* Function: open
+       * open a file on the filesystem. never called directly
+       */
+    virtual FileHandle *open(const char* name, int flags);
+    virtual int remove(const char *filename);
+    virtual int format();
+        virtual DirHandle *opendir(const char *name);
+        virtual int mkdir(const char *name, mode_t mode);
+    
+    FATFS _fs;                                // Work area (file system object) for logical drive    
+    static FATFileSystem *_ffs[_DRIVES];    // FATFileSystem objects, as parallel to FatFs drives array
+    int _fsid;
+    
+    virtual int disk_initialize() { return 0; }
+    virtual int disk_status() { return 0; }
+    virtual int disk_read(char *buffer, int sector) = 0;
+    virtual int disk_write(const char *buffer, int sector) = 0;
+    virtual int disk_sync() { return 0; }
+    virtual int disk_sectors() = 0;
+     
+};
+    
+}
+
+#endif
Binary file FATFileSysGg/LPC1768/FATFileSystem.ar has changed
Binary file FATFileSysGg/LPC2368/FATFileSystem.ar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FATFileSysGg/diskio.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,76 @@
+/*-----------------------------------------------------------------------
+/  Low level disk interface modlue include file  R0.06   (C)ChaN, 2007
+/-----------------------------------------------------------------------*/
+
+#ifndef _DISKIO
+
+#define _READONLY    0    /* 1: Read-only mode */
+#define _USE_IOCTL    1
+
+#include "integer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Status of Disk Functions */
+typedef BYTE    DSTATUS;
+
+/* Results of Disk Functions */
+typedef enum {
+    RES_OK = 0,        /* 0: Successful */
+    RES_ERROR,        /* 1: R/W Error */
+    RES_WRPRT,        /* 2: Write Protected */
+    RES_NOTRDY,        /* 3: Not Ready */
+    RES_PARERR        /* 4: Invalid Parameter */
+} DRESULT;
+
+
+/*---------------------------------------*/
+/* Prototypes for disk control functions */
+
+DSTATUS disk_initialize (BYTE);
+DSTATUS disk_status (BYTE);
+DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);
+#if    _READONLY == 0
+DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);
+#endif
+DRESULT disk_ioctl (BYTE, BYTE, void*);
+void    disk_timerproc (void);
+
+#ifdef __cplusplus
+};
+#endif
+
+
+/* Disk Status Bits (DSTATUS) */
+
+#define STA_NOINIT        0x01    /* Drive not initialized */
+#define STA_NODISK        0x02    /* No medium in the drive */
+#define STA_PROTECT        0x04    /* Write protected */
+
+
+/* Command code for disk_ioctrl() */
+
+/* Generic command */
+#define CTRL_SYNC            0    /* Mandatory for read/write configuration */
+#define GET_SECTOR_COUNT    1    /* Mandatory for only f_mkfs() */
+#define GET_SECTOR_SIZE        2
+#define GET_BLOCK_SIZE        3    /* Mandatory for only f_mkfs() */
+#define CTRL_POWER            4
+#define CTRL_LOCK            5
+#define CTRL_EJECT            6
+/* MMC/SDC command */
+#define MMC_GET_TYPE        10
+#define MMC_GET_CSD            11
+#define MMC_GET_CID            12
+#define MMC_GET_OCR            13
+#define MMC_GET_SDSTAT        14
+/* ATA/CF command */
+#define ATA_GET_REV            20
+#define ATA_GET_MODEL        21
+#define ATA_GET_SN            22
+
+
+#define _DISKIO
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FATFileSysGg/ff.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,344 @@
+/*--------------------------------------------------------------------------/
+/  FatFs - FAT file system module include file  R0.06        (C)ChaN, 2008
+/---------------------------------------------------------------------------/
+/ FatFs module is an experimenal project to implement FAT file system to
+/ cheap microcontrollers. This is a free software and is opened for education,
+/ research and development under license policy of following trems.
+/
+/  Copyright (C) 2008, ChaN, all right reserved.
+/
+/ * The FatFs module is a free software and there is no warranty.
+/ * You can use, modify and/or redistribute it for personal, non-profit or
+/   commercial use without any restriction under your responsibility.
+/ * Redistributions of source code must retain the above copyright notice.
+/
+/---------------------------------------------------------------------------*/
+
+#ifndef _FATFS
+
+#define _MCU_ENDIAN        2
+/* The _MCU_ENDIAN defines which access method is used to the FAT structure.
+/  1: Enable word access.
+/  2: Disable word access and use byte-by-byte access instead.
+/  When the architectural byte order of the MCU is big-endian and/or address
+/  miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2.
+/  If it is not the case, it can also be set to 1 for good code efficiency. */
+
+#define _FS_READONLY    0
+/* Setting _FS_READONLY to 1 defines read only configuration. This removes
+/  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
+/  f_truncate and useless f_getfree. */
+
+#define _FS_MINIMIZE    0
+/* The _FS_MINIMIZE option defines minimization level to remove some functions.
+/  0: Full function.
+/  1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed.
+/  2: f_opendir and f_readdir are removed in addition to level 1.
+/  3: f_lseek is removed in addition to level 2. */
+
+#define    _USE_STRFUNC    0
+/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
+
+#define    _USE_MKFS    1
+/* When _USE_MKFS is set to 1 and _FS_READONLY is set to 0, f_mkfs function is
+/  enabled. */
+
+#define _DRIVES        4
+/* Number of logical drives to be used. This affects the size of internal table. */
+
+#define    _MULTI_PARTITION    0
+/* When _MULTI_PARTITION is set to 0, each logical drive is bound to same
+/  physical drive number and can mount only 1st primaly partition. When it is
+/  set to 1, each logical drive can mount a partition listed in Drives[]. */
+
+#define _USE_FSINFO    0
+/* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */
+
+#define    _USE_SJIS    1
+/* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise
+/  only US-ASCII(7bit) code can be accepted as file/directory name. */
+
+#define    _USE_NTFLAG    1
+/* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved.
+/  Note that the files are always accessed in case insensitive. */
+
+
+#include "integer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Definitions corresponds to multiple sector size (not tested) */
+#define    S_MAX_SIZ    512U            /* Do not change */
+#if S_MAX_SIZ > 512U
+#define    SS(fs)    ((fs)->s_size)
+#else
+#define    SS(fs)    512U
+#endif
+
+
+/* File system object structure */
+typedef struct _FATFS {
+    WORD    id;                /* File system mount ID */
+    WORD    n_rootdir;        /* Number of root directory entries */
+    DWORD    winsect;        /* Current sector appearing in the win[] */
+    DWORD    sects_fat;        /* Sectors per fat */
+    DWORD    max_clust;        /* Maximum cluster# + 1 */
+    DWORD    fatbase;        /* FAT start sector */
+    DWORD    dirbase;        /* Root directory start sector (cluster# for FAT32) */
+    DWORD    database;        /* Data start sector */
+#if !_FS_READONLY
+    DWORD    last_clust;        /* Last allocated cluster */
+    DWORD    free_clust;        /* Number of free clusters */
+#if _USE_FSINFO
+    DWORD    fsi_sector;        /* fsinfo sector */
+    BYTE    fsi_flag;        /* fsinfo dirty flag (1:must be written back) */
+    BYTE    pad2;
+#endif
+#endif
+    BYTE    fs_type;        /* FAT sub type */
+    BYTE    csize;            /* Number of sectors per cluster */
+#if S_MAX_SIZ > 512U
+    WORD    s_size;            /* Sector size */
+#endif
+    BYTE    n_fats;            /* Number of FAT copies */
+    BYTE    drive;            /* Physical drive number */
+    BYTE    winflag;        /* win[] dirty flag (1:must be written back) */
+    BYTE    pad1;
+    BYTE    win[S_MAX_SIZ];    /* Disk access window for Directory/FAT */
+} FATFS;
+
+
+/* Directory object structure */
+typedef struct _DIR {
+    WORD    id;            /* Owner file system mount ID */
+    WORD    index;        /* Current index */
+    FATFS*    fs;            /* Pointer to the owner file system object */
+    DWORD    sclust;        /* Start cluster */
+    DWORD    clust;        /* Current cluster */
+    DWORD    sect;        /* Current sector */
+} FATFS_DIR;
+
+
+/* File object structure */
+typedef struct _FIL {
+    WORD    id;                /* Owner file system mount ID */
+    BYTE    flag;            /* File status flags */
+    BYTE    csect;            /* Sector address in the cluster */
+    FATFS*    fs;                /* Pointer to the owner file system object */
+    DWORD    fptr;            /* File R/W pointer */
+    DWORD    fsize;            /* File size */
+    DWORD    org_clust;        /* File start cluster */
+    DWORD    curr_clust;        /* Current cluster */
+    DWORD    curr_sect;        /* Current sector */
+#if _FS_READONLY == 0
+    DWORD    dir_sect;        /* Sector containing the directory entry */
+    BYTE*    dir_ptr;        /* Ponter to the directory entry in the window */
+#endif
+    BYTE    buffer[S_MAX_SIZ];    /* File R/W buffer */
+} FIL;
+
+
+/* File status structure */
+typedef struct _FILINFO {
+    DWORD fsize;            /* Size */
+    WORD fdate;                /* Date */
+    WORD ftime;                /* Time */
+    BYTE fattrib;            /* Attribute */
+    char fname[8+1+3+1];    /* Name (8.3 format) */
+} FILINFO;
+
+
+
+/* Definitions corresponds to multi partition */
+
+#if _MULTI_PARTITION != 0    /* Multiple partition cfg */
+
+typedef struct _PARTITION {
+    BYTE pd;    /* Physical drive # (0-255) */
+    BYTE pt;    /* Partition # (0-3) */
+} PARTITION;
+extern
+const PARTITION Drives[];            /* Logical drive# to physical location conversion table */
+#define LD2PD(drv) (Drives[drv].pd)    /* Get physical drive# */
+#define LD2PT(drv) (Drives[drv].pt)    /* Get partition# */
+
+#else                        /* Single partition cfg */
+
+#define LD2PD(drv) (drv)        /* Physical drive# is equal to logical drive# */
+#define LD2PT(drv) 0            /* Always mounts the 1st partition */
+
+#endif
+
+
+/* File function return code (FRESULT) */
+
+typedef enum {
+    FR_OK = 0,            /* 0 */
+    FR_NOT_READY,        /* 1 */
+    FR_NO_FILE,            /* 2 */
+    FR_NO_PATH,            /* 3 */
+    FR_INVALID_NAME,    /* 4 */
+    FR_INVALID_DRIVE,    /* 5 */
+    FR_DENIED,            /* 6 */
+    FR_EXIST,            /* 7 */
+    FR_RW_ERROR,        /* 8 */
+    FR_WRITE_PROTECTED,    /* 9 */
+    FR_NOT_ENABLED,        /* 10 */
+    FR_NO_FILESYSTEM,    /* 11 */
+    FR_INVALID_OBJECT,    /* 12 */
+    FR_MKFS_ABORTED        /* 13 */
+} FRESULT;
+
+
+
+/*-----------------------------------------------------*/
+/* FatFs module application interface                  */
+
+FRESULT f_mount (BYTE, FATFS*);                        /* Mount/Unmount a logical drive */
+FRESULT f_open (FIL*, const char*, BYTE);            /* Open or create a file */
+FRESULT f_read (FIL*, void*, UINT, UINT*);            /* Read data from a file */
+FRESULT f_write (FIL*, const void*, UINT, UINT*);    /* Write data to a file */
+FRESULT f_lseek (FIL*, DWORD);                        /* Move file pointer of a file object */
+FRESULT f_close (FIL*);                                /* Close an open file object */
+FRESULT f_opendir (FATFS_DIR*, const char*);                /* Open an existing directory */
+FRESULT f_readdir (FATFS_DIR*, FILINFO*);                    /* Read a directory item */
+FRESULT f_stat (const char*, FILINFO*);                /* Get file status */
+FRESULT f_getfree (const char*, DWORD*, FATFS**);    /* Get number of free clusters on the drive */
+FRESULT f_truncate (FIL*);                            /* Truncate file */
+FRESULT f_sync (FIL*);                                /* Flush cached data of a writing file */
+FRESULT f_unlink (const char*);                        /* Delete an existing file or directory */
+FRESULT    f_mkdir (const char*);                        /* Create a new directory */
+FRESULT f_chmod (const char*, BYTE, BYTE);            /* Change file/dir attriburte */
+FRESULT f_utime (const char*, const FILINFO*);        /* Change file/dir timestamp */
+FRESULT f_rename (const char*, const char*);        /* Rename/Move a file or directory */
+FRESULT f_mkfs (BYTE, BYTE, WORD);                    /* Create a file system on the drive */
+#if _USE_STRFUNC
+#define feof(fp) ((fp)->fptr == (fp)->fsize)
+#define EOF -1
+int fputc (int, FIL*);                                /* Put a character to the file */
+int fputs (const char*, FIL*);                        /* Put a string to the file */
+int fprintf (FIL*, const char*, ...);                /* Put a formatted string to the file */
+char* fgets (char*, int, FIL*);                        /* Get a string from the file */
+#endif
+
+/* User defined function to give a current time to fatfs module */
+
+DWORD get_fattime (void);    /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */
+                            /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */
+
+
+
+/* File access control and file status flags (FIL.flag) */
+
+#define    FA_READ                0x01
+#define    FA_OPEN_EXISTING    0x00
+#if _FS_READONLY == 0
+#define    FA_WRITE            0x02
+#define    FA_CREATE_NEW        0x04
+#define    FA_CREATE_ALWAYS    0x08
+#define    FA_OPEN_ALWAYS        0x10
+#define FA__WRITTEN            0x20
+#define FA__DIRTY            0x40
+#endif
+#define FA__ERROR            0x80
+
+
+/* FAT sub type (FATFS.fs_type) */
+
+#define FS_FAT12    1
+#define FS_FAT16    2
+#define FS_FAT32    3
+
+
+/* File attribute bits for directory entry */
+
+#define    AM_RDO    0x01    /* Read only */
+#define    AM_HID    0x02    /* Hidden */
+#define    AM_SYS    0x04    /* System */
+#define    AM_VOL    0x08    /* Volume label */
+#define AM_LFN    0x0F    /* LFN entry */
+#define AM_DIR    0x10    /* Directory */
+#define AM_ARC    0x20    /* Archive */
+
+
+
+/* Offset of FAT structure members */
+
+#define BS_jmpBoot            0
+#define BS_OEMName            3
+#define BPB_BytsPerSec        11
+#define BPB_SecPerClus        13
+#define BPB_RsvdSecCnt        14
+#define BPB_NumFATs            16
+#define BPB_RootEntCnt        17
+#define BPB_TotSec16        19
+#define BPB_Media            21
+#define BPB_FATSz16            22
+#define BPB_SecPerTrk        24
+#define BPB_NumHeads        26
+#define BPB_HiddSec            28
+#define BPB_TotSec32        32
+#define BS_55AA                510
+
+#define BS_DrvNum            36
+#define BS_BootSig            38
+#define BS_VolID            39
+#define BS_VolLab            43
+#define BS_FilSysType        54
+
+#define BPB_FATSz32            36
+#define BPB_ExtFlags        40
+#define BPB_FSVer            42
+#define BPB_RootClus        44
+#define BPB_FSInfo            48
+#define BPB_BkBootSec        50
+#define BS_DrvNum32            64
+#define BS_BootSig32        66
+#define BS_VolID32            67
+#define BS_VolLab32            71
+#define BS_FilSysType32        82
+
+#define    FSI_LeadSig            0
+#define    FSI_StrucSig        484
+#define    FSI_Free_Count        488
+#define    FSI_Nxt_Free        492
+
+#define MBR_Table            446
+
+#define    DIR_Name            0
+#define    DIR_Attr            11
+#define    DIR_NTres            12
+#define    DIR_CrtTime            14
+#define    DIR_CrtDate            16
+#define    DIR_FstClusHI        20
+#define    DIR_WrtTime            22
+#define    DIR_WrtDate            24
+#define    DIR_FstClusLO        26
+#define    DIR_FileSize        28
+
+
+
+/* Multi-byte word access macros  */
+
+#if _MCU_ENDIAN == 1    /* Use word access */
+#define    LD_WORD(ptr)        (WORD)(*(WORD*)(BYTE*)(ptr))
+#define    LD_DWORD(ptr)        (DWORD)(*(DWORD*)(BYTE*)(ptr))
+#define    ST_WORD(ptr,val)    *(WORD*)(BYTE*)(ptr)=(WORD)(val)
+#define    ST_DWORD(ptr,val)    *(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
+#elif _MCU_ENDIAN == 2    /* Use byte-by-byte access */
+#define    LD_WORD(ptr)        (WORD)(((WORD)*(volatile BYTE*)((ptr)+1)<<8)|(WORD)*(volatile BYTE*)(ptr))
+#define    LD_DWORD(ptr)        (DWORD)(((DWORD)*(volatile BYTE*)((ptr)+3)<<24)|((DWORD)*(volatile BYTE*)((ptr)+2)<<16)|((WORD)*(volatile BYTE*)((ptr)+1)<<8)|*(volatile BYTE*)(ptr))
+#define    ST_WORD(ptr,val)    *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8)
+#define    ST_DWORD(ptr,val)    *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(volatile BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(volatile BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24)
+#else
+#error Do not forget to set _MCU_ENDIAN properly!
+#endif
+
+#ifdef __cplusplus
+};
+#endif
+
+#define _FATFS
+#endif /* _FATFS */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FATFileSysGg/integer.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,30 @@
+/*-------------------------------------------*/
+/* Integer type definitions for FatFs module */
+/*-------------------------------------------*/
+
+#ifndef _INTEGER
+
+/* These types must be 16-bit, 32-bit or larger integer */
+typedef int                INT;
+typedef unsigned int    UINT;
+
+/* These types must be 8-bit integer */
+typedef signed char        CHAR;
+typedef unsigned char    UCHAR;
+typedef unsigned char    BYTE;
+
+/* These types must be 16-bit integer */
+typedef short            SHORT;
+typedef unsigned short    USHORT;
+typedef unsigned short    WORD;
+
+/* These types must be 32-bit integer */
+typedef long            LONG;
+typedef unsigned long    ULONG;
+typedef unsigned long    DWORD;
+
+/* Boolean type */
+typedef enum { FALSE = 0, TRUE } BOOL;
+
+#define _INTEGER
+#endif
--- a/FatFileSystem/FATDirHandle.h	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/* Copyright 2008 ARM Limited. All rights reserved. */
-
-#ifndef MBED_FATDIRHANDLE_H
-#define MBED_FATDIRHANDLE_H
-
-#include "DirHandle.h"
-#include "ff.h"
-
-namespace mbed {
-
-class FATDirHandle : public DirHandle {
-
- public:
-    FATDirHandle(const FATFS_DIR &the_dir);
-    virtual int closedir();
-    virtual struct dirent *readdir();
-    virtual void rewinddir();
-    virtual off_t telldir();
-    virtual void seekdir(off_t location);
-
- private:
-    FATFS_DIR dir;
-    struct dirent cur_entry;
-
-};
-
-}
-
-#endif
--- a/FatFileSystem/FATFileHandle.h	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/* mbed Microcontroller Library - FATFileHandle
- * Copyright (c) 2008, sford
- */
-
-#ifndef MBED_FATFILEHANDLE_H
-#define MBED_FATFILEHANDLE_H
-
-#include "FileHandle.h"
-#include "ff.h"
-
-namespace mbed {
-
-class FATFileHandle : public FileHandle {
-public:
-
-    FATFileHandle(FIL fh);
-    virtual int close();
-    virtual ssize_t write(const void* buffer, size_t length);
-    virtual ssize_t read(void* buffer, size_t length);
-    virtual int isatty();
-    virtual off_t lseek(off_t position, int whence);
-    virtual int fsync();
-    virtual off_t flen();
-
-protected:
-
-    FIL _fh;
-
-};
-
-}
-
-#endif
--- a/FatFileSystem/FATFileSystem.h	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/* mbed Microcontroller Library - FATFileSystem
- * Copyright (c) 2008, sford
- */
-
-/* Library: FATFileSystem.h
- * A library of stuff to make a fat filesystem on top of a block device
- */
-
-#ifndef MBED_FATFILESYSTEM_H
-#define MBED_FATFILESYSTEM_H
-
-#ifndef FFSDEBUG_ENABLED
-#define FFSDEBUG_ENABLED 0
-#endif
-
-#if FFSDEBUG_ENABLED
-#define FFSDEBUG(FMT, ...) printf(FMT, ##__VA_ARGS__)
-#else
-#define FFSDEBUG(FMT, ...)
-#endif
-
-#include "FileSystemLike.h"
-#include "FileHandle.h"
-#include "ff.h"
-#include "diskio.h"
-
-namespace mbed {
-/* Class: FATFileSystem
- * The class itself
- */
-class FATFileSystem : public FileSystemLike {
-public:
-
-    FATFileSystem(const char* n);
-    virtual ~FATFileSystem();
-    
-    /* Function: open
-       * open a file on the filesystem. never called directly
-       */
-    virtual FileHandle *open(const char* name, int flags);
-    virtual int remove(const char *filename);
-    virtual int format();
-        virtual DirHandle *opendir(const char *name);
-        virtual int mkdir(const char *name, mode_t mode);
-    
-    FATFS _fs;                                // Work area (file system object) for logical drive    
-    static FATFileSystem *_ffs[_DRIVES];    // FATFileSystem objects, as parallel to FatFs drives array
-    int _fsid;
-    
-    virtual int disk_initialize() { return 0; }
-    virtual int disk_status() { return 0; }
-    virtual int disk_read(char *buffer, int sector) = 0;
-    virtual int disk_write(const char *buffer, int sector) = 0;
-    virtual int disk_sync() { return 0; }
-    virtual int disk_sectors() = 0;
-     
-};
-    
-}
-
-#endif
Binary file FatFileSystem/LPC1768/FATFileSystem.ar has changed
Binary file FatFileSystem/LPC2368/FATFileSystem.ar has changed
--- a/FatFileSystem/diskio.h	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*-----------------------------------------------------------------------
-/  Low level disk interface modlue include file  R0.06   (C)ChaN, 2007
-/-----------------------------------------------------------------------*/
-
-#ifndef _DISKIO
-
-#define _READONLY    0    /* 1: Read-only mode */
-#define _USE_IOCTL    1
-
-#include "integer.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Status of Disk Functions */
-typedef BYTE    DSTATUS;
-
-/* Results of Disk Functions */
-typedef enum {
-    RES_OK = 0,        /* 0: Successful */
-    RES_ERROR,        /* 1: R/W Error */
-    RES_WRPRT,        /* 2: Write Protected */
-    RES_NOTRDY,        /* 3: Not Ready */
-    RES_PARERR        /* 4: Invalid Parameter */
-} DRESULT;
-
-
-/*---------------------------------------*/
-/* Prototypes for disk control functions */
-
-DSTATUS disk_initialize (BYTE);
-DSTATUS disk_status (BYTE);
-DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);
-#if    _READONLY == 0
-DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);
-#endif
-DRESULT disk_ioctl (BYTE, BYTE, void*);
-void    disk_timerproc (void);
-
-#ifdef __cplusplus
-};
-#endif
-
-
-/* Disk Status Bits (DSTATUS) */
-
-#define STA_NOINIT        0x01    /* Drive not initialized */
-#define STA_NODISK        0x02    /* No medium in the drive */
-#define STA_PROTECT        0x04    /* Write protected */
-
-
-/* Command code for disk_ioctrl() */
-
-/* Generic command */
-#define CTRL_SYNC            0    /* Mandatory for read/write configuration */
-#define GET_SECTOR_COUNT    1    /* Mandatory for only f_mkfs() */
-#define GET_SECTOR_SIZE        2
-#define GET_BLOCK_SIZE        3    /* Mandatory for only f_mkfs() */
-#define CTRL_POWER            4
-#define CTRL_LOCK            5
-#define CTRL_EJECT            6
-/* MMC/SDC command */
-#define MMC_GET_TYPE        10
-#define MMC_GET_CSD            11
-#define MMC_GET_CID            12
-#define MMC_GET_OCR            13
-#define MMC_GET_SDSTAT        14
-/* ATA/CF command */
-#define ATA_GET_REV            20
-#define ATA_GET_MODEL        21
-#define ATA_GET_SN            22
-
-
-#define _DISKIO
-#endif
--- a/FatFileSystem/ff.h	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,344 +0,0 @@
-/*--------------------------------------------------------------------------/
-/  FatFs - FAT file system module include file  R0.06        (C)ChaN, 2008
-/---------------------------------------------------------------------------/
-/ FatFs module is an experimenal project to implement FAT file system to
-/ cheap microcontrollers. This is a free software and is opened for education,
-/ research and development under license policy of following trems.
-/
-/  Copyright (C) 2008, ChaN, all right reserved.
-/
-/ * The FatFs module is a free software and there is no warranty.
-/ * You can use, modify and/or redistribute it for personal, non-profit or
-/   commercial use without any restriction under your responsibility.
-/ * Redistributions of source code must retain the above copyright notice.
-/
-/---------------------------------------------------------------------------*/
-
-#ifndef _FATFS
-
-#define _MCU_ENDIAN        2
-/* The _MCU_ENDIAN defines which access method is used to the FAT structure.
-/  1: Enable word access.
-/  2: Disable word access and use byte-by-byte access instead.
-/  When the architectural byte order of the MCU is big-endian and/or address
-/  miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2.
-/  If it is not the case, it can also be set to 1 for good code efficiency. */
-
-#define _FS_READONLY    0
-/* Setting _FS_READONLY to 1 defines read only configuration. This removes
-/  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
-/  f_truncate and useless f_getfree. */
-
-#define _FS_MINIMIZE    0
-/* The _FS_MINIMIZE option defines minimization level to remove some functions.
-/  0: Full function.
-/  1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed.
-/  2: f_opendir and f_readdir are removed in addition to level 1.
-/  3: f_lseek is removed in addition to level 2. */
-
-#define    _USE_STRFUNC    0
-/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
-
-#define    _USE_MKFS    1
-/* When _USE_MKFS is set to 1 and _FS_READONLY is set to 0, f_mkfs function is
-/  enabled. */
-
-#define _DRIVES        4
-/* Number of logical drives to be used. This affects the size of internal table. */
-
-#define    _MULTI_PARTITION    0
-/* When _MULTI_PARTITION is set to 0, each logical drive is bound to same
-/  physical drive number and can mount only 1st primaly partition. When it is
-/  set to 1, each logical drive can mount a partition listed in Drives[]. */
-
-#define _USE_FSINFO    0
-/* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */
-
-#define    _USE_SJIS    1
-/* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise
-/  only US-ASCII(7bit) code can be accepted as file/directory name. */
-
-#define    _USE_NTFLAG    1
-/* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved.
-/  Note that the files are always accessed in case insensitive. */
-
-
-#include "integer.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Definitions corresponds to multiple sector size (not tested) */
-#define    S_MAX_SIZ    512U            /* Do not change */
-#if S_MAX_SIZ > 512U
-#define    SS(fs)    ((fs)->s_size)
-#else
-#define    SS(fs)    512U
-#endif
-
-
-/* File system object structure */
-typedef struct _FATFS {
-    WORD    id;                /* File system mount ID */
-    WORD    n_rootdir;        /* Number of root directory entries */
-    DWORD    winsect;        /* Current sector appearing in the win[] */
-    DWORD    sects_fat;        /* Sectors per fat */
-    DWORD    max_clust;        /* Maximum cluster# + 1 */
-    DWORD    fatbase;        /* FAT start sector */
-    DWORD    dirbase;        /* Root directory start sector (cluster# for FAT32) */
-    DWORD    database;        /* Data start sector */
-#if !_FS_READONLY
-    DWORD    last_clust;        /* Last allocated cluster */
-    DWORD    free_clust;        /* Number of free clusters */
-#if _USE_FSINFO
-    DWORD    fsi_sector;        /* fsinfo sector */
-    BYTE    fsi_flag;        /* fsinfo dirty flag (1:must be written back) */
-    BYTE    pad2;
-#endif
-#endif
-    BYTE    fs_type;        /* FAT sub type */
-    BYTE    csize;            /* Number of sectors per cluster */
-#if S_MAX_SIZ > 512U
-    WORD    s_size;            /* Sector size */
-#endif
-    BYTE    n_fats;            /* Number of FAT copies */
-    BYTE    drive;            /* Physical drive number */
-    BYTE    winflag;        /* win[] dirty flag (1:must be written back) */
-    BYTE    pad1;
-    BYTE    win[S_MAX_SIZ];    /* Disk access window for Directory/FAT */
-} FATFS;
-
-
-/* Directory object structure */
-typedef struct _DIR {
-    WORD    id;            /* Owner file system mount ID */
-    WORD    index;        /* Current index */
-    FATFS*    fs;            /* Pointer to the owner file system object */
-    DWORD    sclust;        /* Start cluster */
-    DWORD    clust;        /* Current cluster */
-    DWORD    sect;        /* Current sector */
-} FATFS_DIR;
-
-
-/* File object structure */
-typedef struct _FIL {
-    WORD    id;                /* Owner file system mount ID */
-    BYTE    flag;            /* File status flags */
-    BYTE    csect;            /* Sector address in the cluster */
-    FATFS*    fs;                /* Pointer to the owner file system object */
-    DWORD    fptr;            /* File R/W pointer */
-    DWORD    fsize;            /* File size */
-    DWORD    org_clust;        /* File start cluster */
-    DWORD    curr_clust;        /* Current cluster */
-    DWORD    curr_sect;        /* Current sector */
-#if _FS_READONLY == 0
-    DWORD    dir_sect;        /* Sector containing the directory entry */
-    BYTE*    dir_ptr;        /* Ponter to the directory entry in the window */
-#endif
-    BYTE    buffer[S_MAX_SIZ];    /* File R/W buffer */
-} FIL;
-
-
-/* File status structure */
-typedef struct _FILINFO {
-    DWORD fsize;            /* Size */
-    WORD fdate;                /* Date */
-    WORD ftime;                /* Time */
-    BYTE fattrib;            /* Attribute */
-    char fname[8+1+3+1];    /* Name (8.3 format) */
-} FILINFO;
-
-
-
-/* Definitions corresponds to multi partition */
-
-#if _MULTI_PARTITION != 0    /* Multiple partition cfg */
-
-typedef struct _PARTITION {
-    BYTE pd;    /* Physical drive # (0-255) */
-    BYTE pt;    /* Partition # (0-3) */
-} PARTITION;
-extern
-const PARTITION Drives[];            /* Logical drive# to physical location conversion table */
-#define LD2PD(drv) (Drives[drv].pd)    /* Get physical drive# */
-#define LD2PT(drv) (Drives[drv].pt)    /* Get partition# */
-
-#else                        /* Single partition cfg */
-
-#define LD2PD(drv) (drv)        /* Physical drive# is equal to logical drive# */
-#define LD2PT(drv) 0            /* Always mounts the 1st partition */
-
-#endif
-
-
-/* File function return code (FRESULT) */
-
-typedef enum {
-    FR_OK = 0,            /* 0 */
-    FR_NOT_READY,        /* 1 */
-    FR_NO_FILE,            /* 2 */
-    FR_NO_PATH,            /* 3 */
-    FR_INVALID_NAME,    /* 4 */
-    FR_INVALID_DRIVE,    /* 5 */
-    FR_DENIED,            /* 6 */
-    FR_EXIST,            /* 7 */
-    FR_RW_ERROR,        /* 8 */
-    FR_WRITE_PROTECTED,    /* 9 */
-    FR_NOT_ENABLED,        /* 10 */
-    FR_NO_FILESYSTEM,    /* 11 */
-    FR_INVALID_OBJECT,    /* 12 */
-    FR_MKFS_ABORTED        /* 13 */
-} FRESULT;
-
-
-
-/*-----------------------------------------------------*/
-/* FatFs module application interface                  */
-
-FRESULT f_mount (BYTE, FATFS*);                        /* Mount/Unmount a logical drive */
-FRESULT f_open (FIL*, const char*, BYTE);            /* Open or create a file */
-FRESULT f_read (FIL*, void*, UINT, UINT*);            /* Read data from a file */
-FRESULT f_write (FIL*, const void*, UINT, UINT*);    /* Write data to a file */
-FRESULT f_lseek (FIL*, DWORD);                        /* Move file pointer of a file object */
-FRESULT f_close (FIL*);                                /* Close an open file object */
-FRESULT f_opendir (FATFS_DIR*, const char*);                /* Open an existing directory */
-FRESULT f_readdir (FATFS_DIR*, FILINFO*);                    /* Read a directory item */
-FRESULT f_stat (const char*, FILINFO*);                /* Get file status */
-FRESULT f_getfree (const char*, DWORD*, FATFS**);    /* Get number of free clusters on the drive */
-FRESULT f_truncate (FIL*);                            /* Truncate file */
-FRESULT f_sync (FIL*);                                /* Flush cached data of a writing file */
-FRESULT f_unlink (const char*);                        /* Delete an existing file or directory */
-FRESULT    f_mkdir (const char*);                        /* Create a new directory */
-FRESULT f_chmod (const char*, BYTE, BYTE);            /* Change file/dir attriburte */
-FRESULT f_utime (const char*, const FILINFO*);        /* Change file/dir timestamp */
-FRESULT f_rename (const char*, const char*);        /* Rename/Move a file or directory */
-FRESULT f_mkfs (BYTE, BYTE, WORD);                    /* Create a file system on the drive */
-#if _USE_STRFUNC
-#define feof(fp) ((fp)->fptr == (fp)->fsize)
-#define EOF -1
-int fputc (int, FIL*);                                /* Put a character to the file */
-int fputs (const char*, FIL*);                        /* Put a string to the file */
-int fprintf (FIL*, const char*, ...);                /* Put a formatted string to the file */
-char* fgets (char*, int, FIL*);                        /* Get a string from the file */
-#endif
-
-/* User defined function to give a current time to fatfs module */
-
-DWORD get_fattime (void);    /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */
-                            /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */
-
-
-
-/* File access control and file status flags (FIL.flag) */
-
-#define    FA_READ                0x01
-#define    FA_OPEN_EXISTING    0x00
-#if _FS_READONLY == 0
-#define    FA_WRITE            0x02
-#define    FA_CREATE_NEW        0x04
-#define    FA_CREATE_ALWAYS    0x08
-#define    FA_OPEN_ALWAYS        0x10
-#define FA__WRITTEN            0x20
-#define FA__DIRTY            0x40
-#endif
-#define FA__ERROR            0x80
-
-
-/* FAT sub type (FATFS.fs_type) */
-
-#define FS_FAT12    1
-#define FS_FAT16    2
-#define FS_FAT32    3
-
-
-/* File attribute bits for directory entry */
-
-#define    AM_RDO    0x01    /* Read only */
-#define    AM_HID    0x02    /* Hidden */
-#define    AM_SYS    0x04    /* System */
-#define    AM_VOL    0x08    /* Volume label */
-#define AM_LFN    0x0F    /* LFN entry */
-#define AM_DIR    0x10    /* Directory */
-#define AM_ARC    0x20    /* Archive */
-
-
-
-/* Offset of FAT structure members */
-
-#define BS_jmpBoot            0
-#define BS_OEMName            3
-#define BPB_BytsPerSec        11
-#define BPB_SecPerClus        13
-#define BPB_RsvdSecCnt        14
-#define BPB_NumFATs            16
-#define BPB_RootEntCnt        17
-#define BPB_TotSec16        19
-#define BPB_Media            21
-#define BPB_FATSz16            22
-#define BPB_SecPerTrk        24
-#define BPB_NumHeads        26
-#define BPB_HiddSec            28
-#define BPB_TotSec32        32
-#define BS_55AA                510
-
-#define BS_DrvNum            36
-#define BS_BootSig            38
-#define BS_VolID            39
-#define BS_VolLab            43
-#define BS_FilSysType        54
-
-#define BPB_FATSz32            36
-#define BPB_ExtFlags        40
-#define BPB_FSVer            42
-#define BPB_RootClus        44
-#define BPB_FSInfo            48
-#define BPB_BkBootSec        50
-#define BS_DrvNum32            64
-#define BS_BootSig32        66
-#define BS_VolID32            67
-#define BS_VolLab32            71
-#define BS_FilSysType32        82
-
-#define    FSI_LeadSig            0
-#define    FSI_StrucSig        484
-#define    FSI_Free_Count        488
-#define    FSI_Nxt_Free        492
-
-#define MBR_Table            446
-
-#define    DIR_Name            0
-#define    DIR_Attr            11
-#define    DIR_NTres            12
-#define    DIR_CrtTime            14
-#define    DIR_CrtDate            16
-#define    DIR_FstClusHI        20
-#define    DIR_WrtTime            22
-#define    DIR_WrtDate            24
-#define    DIR_FstClusLO        26
-#define    DIR_FileSize        28
-
-
-
-/* Multi-byte word access macros  */
-
-#if _MCU_ENDIAN == 1    /* Use word access */
-#define    LD_WORD(ptr)        (WORD)(*(WORD*)(BYTE*)(ptr))
-#define    LD_DWORD(ptr)        (DWORD)(*(DWORD*)(BYTE*)(ptr))
-#define    ST_WORD(ptr,val)    *(WORD*)(BYTE*)(ptr)=(WORD)(val)
-#define    ST_DWORD(ptr,val)    *(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
-#elif _MCU_ENDIAN == 2    /* Use byte-by-byte access */
-#define    LD_WORD(ptr)        (WORD)(((WORD)*(volatile BYTE*)((ptr)+1)<<8)|(WORD)*(volatile BYTE*)(ptr))
-#define    LD_DWORD(ptr)        (DWORD)(((DWORD)*(volatile BYTE*)((ptr)+3)<<24)|((DWORD)*(volatile BYTE*)((ptr)+2)<<16)|((WORD)*(volatile BYTE*)((ptr)+1)<<8)|*(volatile BYTE*)(ptr))
-#define    ST_WORD(ptr,val)    *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8)
-#define    ST_DWORD(ptr,val)    *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(volatile BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(volatile BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24)
-#else
-#error Do not forget to set _MCU_ENDIAN properly!
-#endif
-
-#ifdef __cplusplus
-};
-#endif
-
-#define _FATFS
-#endif /* _FATFS */
--- a/FatFileSystem/integer.h	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*-------------------------------------------*/
-/* Integer type definitions for FatFs module */
-/*-------------------------------------------*/
-
-#ifndef _INTEGER
-
-/* These types must be 16-bit, 32-bit or larger integer */
-typedef int                INT;
-typedef unsigned int    UINT;
-
-/* These types must be 8-bit integer */
-typedef signed char        CHAR;
-typedef unsigned char    UCHAR;
-typedef unsigned char    BYTE;
-
-/* These types must be 16-bit integer */
-typedef short            SHORT;
-typedef unsigned short    USHORT;
-typedef unsigned short    WORD;
-
-/* These types must be 32-bit integer */
-typedef long            LONG;
-typedef unsigned long    ULONG;
-typedef unsigned long    DWORD;
-
-/* Boolean type */
-typedef enum { FALSE = 0, TRUE } BOOL;
-
-#define _INTEGER
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/MSCFileSystem.cpp	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,126 @@
+/* USB Mass Storage device file system
+ * Copyrigh (c) 2010, Igor Skochinsky
+ * based on SDFileStorage
+ * Copyright (c) 2008-2009, sford
+ */
+
+/* Introduction
+ * ------------
+ * TODO: write one
+ * we're basically using NXP's USBHotLite sample code, just plugging in our own FAT library
+ */
+
+#include "MSCFileSystem.h"
+#include "usbhost_inc.h"
+
+MSCFileSystem::MSCFileSystem(const char* name) :
+        FATFileSystem(name) {
+}
+
+void print_inquiry(USB_INT08U *inqReply) {
+    // see USB Mass Storage Class – UFI Command Specification,
+    // 4.2 INQUIRY Command
+    printf("Inquiry reply:\n");
+    
+    uint8_t tmp = inqReply[0]&0x1F;
+    printf("Peripheral device type: %02Xh\n", tmp);
+    if ( tmp == 0 )
+        printf("\t- Direct access (floppy)\n");
+    else if ( tmp == 0x1F )
+        printf("\t- none (no FDD connected)\n");
+    else
+        printf("\t- unknown type\n");
+        
+    tmp = inqReply[1] >> 7;
+    printf("Removable Media Bit: %d\n", tmp);
+    
+    tmp = inqReply[2] & 3;
+    printf("ANSI Version: %02Xh\n", tmp);
+    if ( tmp != 0 )
+        printf("\t- warning! must be 0\n");
+        
+    tmp = (inqReply[2]>>3) & 3;
+    printf("ECMA Version: %02Xh\n", tmp);
+    if ( tmp != 0 )
+        printf("\t- warning! should be 0\n");
+        
+    tmp = inqReply[2]>>6;
+    printf("ISO Version: %02Xh\n", tmp);
+    if ( tmp != 0 )
+        printf("\t- warning! should be 0\n");
+        
+    tmp = inqReply[3] & 0xF;
+    printf("Response Data Format: %02Xh\n", tmp);
+    if ( tmp != 1 )
+        printf("\t- warning! should be 1\n");
+        
+    tmp = inqReply[4];
+    printf("Additional length: %02Xh\n", tmp);
+    if ( tmp != 0x1F )
+        printf("\t- warning! should be 1Fh\n");
+        
+    //-----------
+    printf("Vendor Information: '%.8s'\n", &inqReply[8]);
+    printf("Product Identification: '%.16s'\n", &inqReply[16]);
+    printf("Product Revision: '%.4s'\n", &inqReply[32]);
+}
+
+int MSCFileSystem::initialise_msc() {
+    USB_INT32S  rc;
+    USB_INT08U  inquiryResult[INQUIRY_LENGTH];
+
+    //print_clock();
+    Host_Init();               /* Initialize the  host controller                                    */
+    rc = Host_EnumDev();       /* Enumerate the device connected                                            */
+    if (rc != OK) {
+        // ** GgMod **
+        //fprintf(stderr, "Could not enumerate device: %d\n", rc);
+        return rc;
+    }
+
+    /* Initialize the mass storage and scsi interfaces */
+    rc = MS_Init( &_blkSize, &_numBlks, inquiryResult );
+    if (rc != OK) {
+        // ** GgMod **
+        //fprintf(stderr, "Could not initialize mass storage interface: %d\n", rc);
+        return rc;
+    }
+
+    //-----------------
+    // ** GgMod **
+    // printf("Successfully initialized mass storage interface; %d blocks of size %d\n", _numBlks, _blkSize);
+    // print_inquiry(inquiryResult);
+
+    //-----------------
+    // FATFileSystem supports only 512-byte blocks
+    return _blkSize == 512 ? OK : 1;
+}
+
+int MSCFileSystem::disk_initialize() {
+    if ( initialise_msc() != OK )
+        return 1;
+
+    return 0;
+}
+
+int MSCFileSystem::disk_write(const char *buffer, int block_number) {
+    if ( OK == MS_BulkSend(block_number, 1, (USB_INT08U *)buffer) )
+        return 0;
+    return 1;
+}
+
+int MSCFileSystem::disk_read(char *buffer, int block_number) {
+    if ( OK == MS_BulkRecv(block_number, 1, (USB_INT08U *)buffer) )
+        return 0;
+    return 1;
+}
+
+int MSCFileSystem::disk_status() {
+    return 0;
+}
+int MSCFileSystem::disk_sync() {
+    return 0;
+}
+int MSCFileSystem::disk_sectors() {
+    return _numBlks;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/MSCFileSystem.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,49 @@
+/* USB Mass Storage device file system
+ * Copyrigh (c) 2010, Igor Skochinsky
+ * based on SDFileStorage
+ * Copyright (c) 2008-2009, sford
+ */
+ 
+#ifndef MSCFILESYSTEM_H
+#define MSCFILESYSTEM_H
+
+#include "mbed.h"
+#include "FATFileSystem.h"
+
+/* Class: MSCFileSystem
+ *  Access the filesystem on an attached USB mass storage device (e.g. a memory stick)
+ *
+ * Example:
+ * > MSCFileSystem msc("msc");
+ * > 
+ * > int main() {
+ * >     FILE *fp = fopen("/msc/myfile.txt", "w");
+ * >     fprintf(fp, "Hello World!\n");
+ * >     fclose(fp);
+ * > }
+ */
+class MSCFileSystem : public FATFileSystem {
+public:
+
+    /* Constructor: MSCFileSystem
+     *  Create the File System for accessing a USB mass storage device
+     *
+     * Parameters:
+     *  name - The name used to access the filesystem
+     */
+    MSCFileSystem(const char* name);
+    virtual int disk_initialize();
+    virtual int disk_write(const char *buffer, int block_number);
+    virtual int disk_read(char *buffer, int block_number);    
+    virtual int disk_status();
+    virtual int disk_sync();
+    virtual int disk_sectors();
+
+protected:
+
+    int initialise_msc();
+    uint32_t _numBlks;
+    uint32_t _blkSize;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/USBHostLite/usbhost_cpu.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,35 @@
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_cpu.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_CPU_H
+#define  USBHOST_CPU_H
+
+/*
+**************************************************************************************************************
+*                                           TYPE DEFINITIONS OF DATA TYPES
+**************************************************************************************************************
+*/
+
+typedef  unsigned int    USB_INT32U;
+typedef  signed   int    USB_INT32S;
+typedef  unsigned short  USB_INT16U;
+typedef  signed   short  USB_INT16S;
+typedef  unsigned char   USB_INT08U;
+typedef  signed   char   USB_INT08S;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/USBHostLite/usbhost_err.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,63 @@
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_err.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_ERR_H
+#define  USBHOST_ERR_H
+
+
+/*
+**************************************************************************************************************
+*                                        GENERAL DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  OK                        0
+#define  MATCH_FOUND               0
+
+/*
+**************************************************************************************************************
+*                                HOST CONTROLLER SPECIFIC ERROR CODES
+**************************************************************************************************************
+*/
+
+#define  ERR_TD_FAIL              -1
+
+/*
+**************************************************************************************************************
+*                                  MASS STORAGE SPECIFIC ERROR CODES
+**************************************************************************************************************
+*/
+
+#define  ERR_MS_CMD_FAILED       -10
+#define  ERR_BAD_CONFIGURATION   -11
+#define  ERR_NO_MS_INTERFACE     -12
+
+/*
+**************************************************************************************************************
+*                                      FAT SPECIFIC ERROR CODES
+**************************************************************************************************************
+*/
+
+#define  MATCH_NOT_FOUND         -20
+#define  ERR_FAT_NOT_SUPPORTED   -21
+#define  ERR_OPEN_LIMIT_REACHED  -22
+#define  ERR_INVALID_BOOT_SIG    -23
+#define  ERR_INVALID_BOOT_SEC    -24
+#define  ERR_ROOT_DIR_FULL       -25
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/USBHostLite/usbhost_inc.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,39 @@
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_inc.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_INC_H
+#define  USBHOST_INC_H
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_cpu.h"
+#include  "usbhost_err.h"
+#include  "usbhost_lpc17xx.h"
+#include  "usbhost_ms.h"
+#include  "mbed.h"
+
+
+#ifdef TARGET_LPC2368
+#error "There is no USB host on the LPC2368!"
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/USBHostLite/usbhost_lpc17xx.c	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,828 @@
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_lpc17xx.c
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+ 
+/*
+**************************************************************************************************************
+*                                            INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_lpc17xx.h"
+
+/*
+**************************************************************************************************************
+*                                              GLOBAL VARIABLES
+**************************************************************************************************************
+*/
+int gUSBConnected;
+
+volatile  USB_INT32U   HOST_RhscIntr = 0;         /* Root Hub Status Change interrupt                       */
+volatile  USB_INT32U   HOST_WdhIntr  = 0;         /* Semaphore to wait until the TD is submitted            */
+volatile  USB_INT08U   HOST_TDControlStatus = 0;
+volatile  HCED        *EDCtrl;                    /* Control endpoint descriptor structure                  */
+volatile  HCED        *EDBulkIn;                  /* BulkIn endpoint descriptor  structure                  */
+volatile  HCED        *EDBulkOut;                 /* BulkOut endpoint descriptor structure                  */
+volatile  HCTD        *TDHead;                    /* Head transfer descriptor structure                     */
+volatile  HCTD        *TDTail;                    /* Tail transfer descriptor structure                     */
+volatile  HCCA        *Hcca;                      /* Host Controller Communications Area structure          */ 
+          USB_INT16U  *TDBufNonVol;               /* Identical to TDBuffer just to reduce compiler warnings */
+volatile  USB_INT08U  *TDBuffer;                  /* Current Buffer Pointer of transfer descriptor          */
+
+// USB host structures
+// AHB SRAM block 1
+#define HOSTBASEADDR 0x2007C000
+// reserve memory for the linker
+static USB_INT08U HostBuf[0x200] __attribute__((at(HOSTBASEADDR)));
+/*
+**************************************************************************************************************
+*                                         DELAY IN MILLI SECONDS
+*
+* Description: This function provides a delay in milli seconds
+*
+* Arguments  : delay    The delay required
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_DelayMS (USB_INT32U  delay)
+{
+    volatile  USB_INT32U  i;
+
+
+    for (i = 0; i < delay; i++) {
+        Host_DelayUS(1000);
+    }
+}
+
+/*
+**************************************************************************************************************
+*                                         DELAY IN MICRO SECONDS
+*
+* Description: This function provides a delay in micro seconds
+*
+* Arguments  : delay    The delay required
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_DelayUS (USB_INT32U  delay)
+{
+    volatile  USB_INT32U  i;
+
+
+    for (i = 0; i < (4 * delay); i++) {    /* This logic was tested. It gives app. 1 micro sec delay        */
+        ;
+    }
+}
+
+// bits of the USB/OTG clock control register
+#define HOST_CLK_EN     (1<<0)
+#define DEV_CLK_EN      (1<<1)
+#define PORTSEL_CLK_EN  (1<<3)
+#define AHB_CLK_EN      (1<<4)
+
+// bits of the USB/OTG clock status register
+#define HOST_CLK_ON     (1<<0)
+#define DEV_CLK_ON      (1<<1)
+#define PORTSEL_CLK_ON  (1<<3)
+#define AHB_CLK_ON      (1<<4)
+
+// we need host clock, OTG/portsel clock and AHB clock
+#define CLOCK_MASK (HOST_CLK_EN | PORTSEL_CLK_EN | AHB_CLK_EN)
+
+/*
+**************************************************************************************************************
+*                                         INITIALIZE THE HOST CONTROLLER
+*
+* Description: This function initializes lpc17xx host controller
+*
+* Arguments  : None
+*
+* Returns    : 
+*
+**************************************************************************************************************
+*/
+void  Host_Init (void)
+{
+    PRINT_Log("In Host_Init\n");
+    
+    NVIC_DisableIRQ(USB_IRQn);                           /* Disable the USB interrupt source           */
+    
+    // turn on power for USB
+    LPC_SC->PCONP       |= (1UL<<31);
+    // Enable USB host clock, port selection and AHB clock
+    LPC_USB->USBClkCtrl |= CLOCK_MASK;
+    // Wait for clocks to become available
+    while ((LPC_USB->USBClkSt & CLOCK_MASK) != CLOCK_MASK)
+        ;
+    
+    // it seems the bits[0:1] mean the following
+    // 0: U1=device, U2=host
+    // 1: U1=host, U2=host
+    // 2: reserved
+    // 3: U1=host, U2=device
+    // NB: this register is only available if OTG clock (aka "port select") is enabled!!
+    // since we don't care about port 2, set just bit 0 to 1 (U1=host)
+    LPC_USB->OTGStCtrl |= 1;
+    
+    // now that we've configured the ports, we can turn off the portsel clock
+    LPC_USB->USBClkCtrl &= ~PORTSEL_CLK_EN;
+    
+    // power pins are not connected on mbed, so we can skip them
+    /* P1[18] = USB_UP_LED, 01 */
+    /* P1[19] = /USB_PPWR,     10 */
+    /* P1[22] = USB_PWRD, 10 */
+    /* P1[27] = /USB_OVRCR, 10 */
+    /*LPC_PINCON->PINSEL3 &= ~((3<<4) | (3<<6) | (3<<12) | (3<<22));  
+    LPC_PINCON->PINSEL3 |=  ((1<<4)|(2<<6) | (2<<12) | (2<<22));   // 0x00802080
+    */
+
+    // configure USB D+/D- pins
+    /* P0[29] = USB_D+, 01 */
+    /* P0[30] = USB_D-, 01 */
+    LPC_PINCON->PINSEL1 &= ~((3<<26) | (3<<28));  
+    LPC_PINCON->PINSEL1 |=  ((1<<26)|(1<<28));     // 0x14000000
+        
+    PRINT_Log("Initializing Host Stack\n");
+
+    Hcca       = (volatile  HCCA       *)(HostBuf+0x000);
+    TDHead     = (volatile  HCTD       *)(HostBuf+0x100);
+    TDTail     = (volatile  HCTD       *)(HostBuf+0x110);
+    EDCtrl     = (volatile  HCED       *)(HostBuf+0x120); 
+    EDBulkIn   = (volatile  HCED       *)(HostBuf+0x130);
+    EDBulkOut  = (volatile  HCED       *)(HostBuf+0x140);
+    TDBuffer   = (volatile  USB_INT08U *)(HostBuf+0x150);
+    
+    /* Initialize all the TDs, EDs and HCCA to 0  */
+    Host_EDInit(EDCtrl);
+    Host_EDInit(EDBulkIn);
+    Host_EDInit(EDBulkOut);
+    Host_TDInit(TDHead);
+    Host_TDInit(TDTail);
+    Host_HCCAInit(Hcca);
+    
+    Host_DelayMS(50);                                   /* Wait 50 ms before apply reset              */
+    LPC_USB->HcControl       = 0;                       /* HARDWARE RESET                             */
+    LPC_USB->HcControlHeadED = 0;                       /* Initialize Control list head to Zero       */
+    LPC_USB->HcBulkHeadED    = 0;                       /* Initialize Bulk list head to Zero          */
+    
+                                                        /* SOFTWARE RESET                             */
+    LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR;
+    LPC_USB->HcFmInterval    = DEFAULT_FMINTERVAL;      /* Write Fm Interval and Largest Data Packet Counter */
+
+                                                        /* Put HC in operational state                */
+    LPC_USB->HcControl  = (LPC_USB->HcControl & (~OR_CONTROL_HCFS)) | OR_CONTROL_HC_OPER;
+    LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC;            /* Set Global Power                           */
+    
+    LPC_USB->HcHCCA = (USB_INT32U)Hcca;
+    LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus;                   /* Clear Interrrupt Status                    */
+
+
+    LPC_USB->HcInterruptEnable  = OR_INTR_ENABLE_MIE |
+                         OR_INTR_ENABLE_WDH |
+                         OR_INTR_ENABLE_RHSC;
+
+    NVIC_SetPriority(USB_IRQn, 0);       /* highest priority */
+    /* Enable the USB Interrupt */
+    NVIC_EnableIRQ(USB_IRQn);
+    PRINT_Log("Host Initialized\n");
+}
+
+/*
+**************************************************************************************************************
+*                                         INTERRUPT SERVICE ROUTINE
+*
+* Description: This function services the interrupt caused by host controller
+*
+* Arguments  : None
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void USB_IRQHandler (void) __irq
+{
+    USB_INT32U   int_status;
+    USB_INT32U   ie_status;
+
+    int_status    = LPC_USB->HcInterruptStatus;                          /* Read Interrupt Status                */
+    ie_status     = LPC_USB->HcInterruptEnable;                          /* Read Interrupt enable status         */
+ 
+    if (!(int_status & ie_status)) {
+        return;
+    } else {
+
+        int_status = int_status & ie_status;
+        if (int_status & OR_INTR_STATUS_RHSC) {                 /* Root hub status change interrupt     */
+            if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) {
+                if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) {
+                    /*
+                     * When DRWE is on, Connect Status Change
+                     * means a remote wakeup event.
+                    */
+                    HOST_RhscIntr = 1;// JUST SOMETHING FOR A BREAKPOINT
+                }
+                else {
+                    /*
+                     * When DRWE is off, Connect Status Change
+                     * is NOT a remote wakeup event
+                    */
+                    if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
+                        if (!gUSBConnected) {
+                            HOST_TDControlStatus = 0;
+                            HOST_WdhIntr = 0;
+                            HOST_RhscIntr = 1;
+                            gUSBConnected = 1;
+                        }
+                        else
+                            PRINT_Log("Spurious status change (connected)?\n");
+                    } else {
+                        if (gUSBConnected) {
+                            LPC_USB->HcInterruptEnable = 0; // why do we get multiple disc. rupts???
+                            HOST_RhscIntr = 0;
+                            gUSBConnected = 0;
+                        }
+                        else
+                            PRINT_Log("Spurious status change (disconnected)?\n");
+                    }
+                }
+                LPC_USB->HcRhPortStatus1 = OR_RH_PORT_CSC;
+            }
+            if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRSC) {
+                LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC;
+            }
+        }
+        if (int_status & OR_INTR_STATUS_WDH) {                  /* Writeback Done Head interrupt        */
+            HOST_WdhIntr = 1;
+            HOST_TDControlStatus = (TDHead->Control >> 28) & 0xf;
+        }            
+        LPC_USB->HcInterruptStatus = int_status;                         /* Clear interrupt status register      */
+    }
+    return;
+}
+
+/*
+**************************************************************************************************************
+*                                     PROCESS TRANSFER DESCRIPTOR
+*
+* Description: This function processes the transfer descriptor
+*
+* Arguments  : ed            Endpoint descriptor that contains this transfer descriptor
+*              token         SETUP, IN, OUT
+*              buffer        Current Buffer Pointer of the transfer descriptor
+*              buffer_len    Length of the buffer
+*
+* Returns    : OK       if TD submission is successful
+*              ERROR    if TD submission fails
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  Host_ProcessTD (volatile  HCED       *ed,
+                            volatile  USB_INT32U  token,
+                            volatile  USB_INT08U *buffer,
+                                      USB_INT32U  buffer_len)
+{
+    volatile  USB_INT32U   td_toggle;
+
+
+    if (ed == EDCtrl) {
+        if (token == TD_SETUP) {
+            td_toggle = TD_TOGGLE_0;
+        } else {
+            td_toggle = TD_TOGGLE_1;
+        }
+    } else {
+        td_toggle = 0;
+    }
+    TDHead->Control = (TD_ROUNDING    |
+                      token           |
+                      TD_DELAY_INT(0) |                           
+                      td_toggle       |
+                      TD_CC);
+    TDTail->Control = 0;
+    TDHead->CurrBufPtr   = (USB_INT32U) buffer;
+    TDTail->CurrBufPtr   = 0;
+    TDHead->Next         = (USB_INT32U) TDTail;
+    TDTail->Next         = 0;
+    TDHead->BufEnd       = (USB_INT32U)(buffer + (buffer_len - 1));
+    TDTail->BufEnd       = 0;
+
+    ed->HeadTd  = (USB_INT32U)TDHead | ((ed->HeadTd) & 0x00000002);
+    ed->TailTd  = (USB_INT32U)TDTail;
+    ed->Next    = 0;
+
+    if (ed == EDCtrl) {
+        LPC_USB->HcControlHeadED = (USB_INT32U)ed;
+        LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_CLF;
+        LPC_USB->HcControl       = LPC_USB->HcControl       | OR_CONTROL_CLE;
+    } else {
+        LPC_USB->HcBulkHeadED    = (USB_INT32U)ed;
+        LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_BLF;
+        LPC_USB->HcControl       = LPC_USB->HcControl       | OR_CONTROL_BLE;
+    }    
+
+    Host_WDHWait();
+
+//    if (!(TDHead->Control & 0xF0000000)) {
+    if (!HOST_TDControlStatus) {
+        return (OK);
+    } else {      
+        return (ERR_TD_FAIL);
+    }
+}
+
+/*
+**************************************************************************************************************
+*                                       ENUMERATE THE DEVICE
+*
+* Description: This function is used to enumerate the device connected
+*
+* Arguments  : None
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  Host_EnumDev (void)
+{
+    USB_INT32S  rc;
+
+    PRINT_Log("Connect a Mass Storage device\n");
+    while (!HOST_RhscIntr)
+        __WFI();
+    Host_DelayMS(100);                             /* USB 2.0 spec says atleast 50ms delay beore port reset */
+    LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS; // Initiate port reset
+    while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS)
+        __WFI(); // Wait for port reset to complete...
+    LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; // ...and clear port reset signal
+    Host_DelayMS(200);                                                 /* Wait for 100 MS after port reset  */
+
+    EDCtrl->Control = 8 << 16;                                         /* Put max pkt size = 8              */
+                                                                       /* Read first 8 bytes of device desc */
+    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_DEVICE, 0, TDBuffer, 8);
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    EDCtrl->Control = TDBuffer[7] << 16;                               /* Get max pkt size of endpoint 0    */
+    rc = HOST_SET_ADDRESS(1);                                          /* Set the device address to 1       */
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    Host_DelayMS(2);
+    EDCtrl->Control = (EDCtrl->Control) | 1;                          /* Modify control pipe with address 1 */
+                                                                      /* Get the configuration descriptor   */
+    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, 9);
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+                                                                       /* Get the first configuration data  */
+    rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, ReadLE16U(&TDBuffer[2]));
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    rc = MS_ParseConfiguration();                                      /* Parse the configuration           */
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    rc = USBH_SET_CONFIGURATION(1);                                    /* Select device configuration 1     */
+    if (rc != OK) {
+        PRINT_Err(rc);
+    }
+    Host_DelayMS(100);                                               /* Some devices may require this delay */
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                        RECEIVE THE CONTROL INFORMATION
+*
+* Description: This function is used to receive the control information
+*
+* Arguments  : bm_request_type
+*              b_request
+*              w_value
+*              w_index
+*              w_length
+*              buffer
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+   
+USB_INT32S  Host_CtrlRecv (         USB_INT08U   bm_request_type,
+                                    USB_INT08U   b_request,
+                                    USB_INT16U   w_value,
+                                    USB_INT16U   w_index,
+                                    USB_INT16U   w_length,
+                          volatile  USB_INT08U  *buffer)
+{
+    USB_INT32S  rc;
+
+
+    Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
+    rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
+    if (rc == OK) {
+        if (w_length) {
+            rc = Host_ProcessTD(EDCtrl, TD_IN, TDBuffer, w_length);
+        }
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDCtrl, TD_OUT, NULL, 0);
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         SEND THE CONTROL INFORMATION
+*
+* Description: This function is used to send the control information
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  Host_CtrlSend (          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length,
+                           volatile  USB_INT08U  *buffer)
+{
+    USB_INT32S  rc;
+
+
+    Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
+
+    rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
+    if (rc == OK) {
+        if (w_length) {
+            rc = Host_ProcessTD(EDCtrl, TD_OUT, TDBuffer, w_length);
+        }
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDCtrl, TD_IN, NULL, 0);
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                          FILL SETUP PACKET
+*
+* Description: This function is used to fill the setup packet
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+void  Host_FillSetup (USB_INT08U   bm_request_type,
+                      USB_INT08U   b_request,
+                      USB_INT16U   w_value,
+                      USB_INT16U   w_index,
+                      USB_INT16U   w_length)
+{
+    int i;
+    for (i=0;i<w_length;i++)
+        TDBuffer[i] = 0;
+    
+    TDBuffer[0] = bm_request_type;
+    TDBuffer[1] = b_request;
+    WriteLE16U(&TDBuffer[2], w_value);
+    WriteLE16U(&TDBuffer[4], w_index);
+    WriteLE16U(&TDBuffer[6], w_length);
+}
+
+
+
+/*
+**************************************************************************************************************
+*                                         INITIALIZE THE TRANSFER DESCRIPTOR
+*
+* Description: This function initializes transfer descriptor
+*
+* Arguments  : Pointer to TD structure
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_TDInit (volatile  HCTD *td)
+{
+
+    td->Control    = 0;
+    td->CurrBufPtr = 0;
+    td->Next       = 0;
+    td->BufEnd     = 0;
+}
+
+/*
+**************************************************************************************************************
+*                                         INITIALIZE THE ENDPOINT DESCRIPTOR
+*
+* Description: This function initializes endpoint descriptor
+*
+* Arguments  : Pointer to ED strcuture
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_EDInit (volatile  HCED *ed)
+{
+
+    ed->Control = 0;
+    ed->TailTd  = 0;
+    ed->HeadTd  = 0;
+    ed->Next    = 0;
+}
+
+/*
+**************************************************************************************************************
+*                                 INITIALIZE HOST CONTROLLER COMMUNICATIONS AREA
+*
+* Description: This function initializes host controller communications area
+*
+* Arguments  : Pointer to HCCA
+*
+* Returns    : 
+*
+**************************************************************************************************************
+*/
+
+void  Host_HCCAInit (volatile  HCCA  *hcca)
+{
+    USB_INT32U  i;
+
+
+    for (i = 0; i < 32; i++) {
+
+        hcca->IntTable[i] = 0;
+        hcca->FrameNumber = 0;
+        hcca->DoneHead    = 0;
+    }
+
+}
+
+/*
+**************************************************************************************************************
+*                                         WAIT FOR WDH INTERRUPT
+*
+* Description: This function is infinite loop which breaks when ever a WDH interrupt rises
+*
+* Arguments  : None
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  Host_WDHWait (void)
+{
+  while (!HOST_WdhIntr) {
+    ;
+  }
+  HOST_WdhIntr = 0;
+}
+
+
+
+
+
+
+
+
+/*
+**************************************************************************************************************
+*                                         READ LE 32U
+*
+* Description: This function is used to read an unsigned integer from a character buffer in the platform
+*              containing little endian processor
+*
+* Arguments  : pmem    Pointer to the character buffer
+*
+* Returns    : val     Unsigned integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT32U  ReadLE32U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT32U val = *(USB_INT32U*)pmem;
+#ifdef __BIG_ENDIAN
+    return __REV(val);
+#else
+    return val;
+#endif    
+}
+
+/*
+**************************************************************************************************************
+*                                        WRITE LE 32U
+*
+* Description: This function is used to write an unsigned integer into a charecter buffer in the platform 
+*              containing little endian processor.
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Integer value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteLE32U (volatile  USB_INT08U  *pmem,
+                            USB_INT32U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT32U*)pmem = __REV(val);
+#else
+    *(USB_INT32U*)pmem = val;
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                          READ LE 16U
+*
+* Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
+*              containing little endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*
+* Returns    : val     Unsigned short integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT16U  ReadLE16U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT16U val = *(USB_INT16U*)pmem;
+#ifdef __BIG_ENDIAN
+    return __REV16(val);
+#else
+    return val;
+#endif    
+}
+
+/*
+**************************************************************************************************************
+*                                         WRITE LE 16U
+*
+* Description: This function is used to write an unsigned short integer into a charecter buffer in the
+*              platform containing little endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteLE16U (volatile  USB_INT08U  *pmem,
+                            USB_INT16U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
+#else
+    *(USB_INT16U*)pmem = val;
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                         READ BE 32U
+*
+* Description: This function is used to read an unsigned integer from a charecter buffer in the platform
+*              containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*
+* Returns    : val     Unsigned integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT32U  ReadBE32U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT32U val = *(USB_INT32U*)pmem;
+#ifdef __BIG_ENDIAN
+    return val;
+#else
+    return __REV(val);
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                         WRITE BE 32U
+*
+* Description: This function is used to write an unsigned integer into a charecter buffer in the platform
+*              containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteBE32U (volatile  USB_INT08U  *pmem,
+                            USB_INT32U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT32U*)pmem = val;
+#else
+    *(USB_INT32U*)pmem = __REV(val);
+#endif
+}
+
+/*
+**************************************************************************************************************
+*                                         READ BE 16U
+*
+* Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
+*              containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*
+* Returns    : val     Unsigned short integer
+*
+**************************************************************************************************************
+*/
+
+USB_INT16U  ReadBE16U (volatile  USB_INT08U  *pmem)
+{
+    USB_INT16U val = *(USB_INT16U*)pmem;
+#ifdef __BIG_ENDIAN
+    return val;
+#else
+    return __REV16(val);
+#endif    
+}
+
+/*
+**************************************************************************************************************
+*                                         WRITE BE 16U
+*
+* Description: This function is used to write an unsigned short integer into the charecter buffer in the
+*              platform containing big endian processor
+*
+* Arguments  : pmem    Pointer to the charecter buffer
+*              val     Value to be placed in the charecter buffer
+*
+* Returns    : None
+*
+**************************************************************************************************************
+*/
+
+void  WriteBE16U (volatile  USB_INT08U  *pmem,
+                            USB_INT16U   val)
+{
+#ifdef __BIG_ENDIAN
+    *(USB_INT16U*)pmem = val;
+#else
+    *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/USBHostLite/usbhost_lpc17xx.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,256 @@
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_lpc17xx.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef USBHOST_LPC17xx_H
+#define USBHOST_LPC17xx_H
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include    "usbhost_inc.h"
+
+/*
+**************************************************************************************************************
+*                                        PRINT CONFIGURATION
+**************************************************************************************************************
+*/
+
+// ** GgMod **
+//#define  PRINT_ENABLE         1
+#define  PRINT_ENABLE         0
+
+#if PRINT_ENABLE
+#define  PRINT_Log(...)       printf(__VA_ARGS__)
+#define  PRINT_Err(rc)        printf("ERROR: In %s at Line %u - rc = %d\n", __FUNCTION__, __LINE__, rc)
+
+#else 
+#define  PRINT_Log(...)       do {} while(0)
+#define  PRINT_Err(rc)        do {} while(0)
+
+#endif
+
+/*
+**************************************************************************************************************
+*                                        GENERAL DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  DESC_LENGTH(x)  x[0]
+#define  DESC_TYPE(x)    x[1]
+
+
+#define  HOST_GET_DESCRIPTOR(descType, descIndex, data, length)                      \
+         Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR,    \
+         (descType << 8)|(descIndex), 0, length, data)
+
+#define  HOST_SET_ADDRESS(new_addr)                                                  \
+         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_ADDRESS,       \
+         new_addr, 0, 0, NULL)
+
+#define  USBH_SET_CONFIGURATION(configNum)                                           \
+         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_CONFIGURATION, \
+         configNum, 0, 0, NULL)
+
+#define  USBH_SET_INTERFACE(ifNum, altNum)                                           \
+         Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, SET_INTERFACE,  \
+         altNum, ifNum, 0, NULL)
+
+/*
+**************************************************************************************************************
+*                                  OHCI OPERATIONAL REGISTER FIELD DEFINITIONS
+**************************************************************************************************************
+*/
+
+                                            /* ------------------ HcControl Register ---------------------  */
+#define  OR_CONTROL_CLE                 0x00000010
+#define  OR_CONTROL_BLE                 0x00000020
+#define  OR_CONTROL_HCFS                0x000000C0
+#define  OR_CONTROL_HC_OPER             0x00000080
+                                            /* ----------------- HcCommandStatus Register ----------------- */
+#define  OR_CMD_STATUS_HCR              0x00000001
+#define  OR_CMD_STATUS_CLF              0x00000002
+#define  OR_CMD_STATUS_BLF              0x00000004
+                                            /* --------------- HcInterruptStatus Register ----------------- */
+#define  OR_INTR_STATUS_WDH             0x00000002
+#define  OR_INTR_STATUS_RHSC            0x00000040
+                                            /* --------------- HcInterruptEnable Register ----------------- */
+#define  OR_INTR_ENABLE_WDH             0x00000002
+#define  OR_INTR_ENABLE_RHSC            0x00000040
+#define  OR_INTR_ENABLE_MIE             0x80000000
+                                            /* ---------------- HcRhDescriptorA Register ------------------ */
+#define  OR_RH_STATUS_LPSC              0x00010000
+#define  OR_RH_STATUS_DRWE              0x00008000
+                                            /* -------------- HcRhPortStatus[1:NDP] Register -------------- */
+#define  OR_RH_PORT_CCS                 0x00000001
+#define  OR_RH_PORT_PRS                 0x00000010
+#define  OR_RH_PORT_CSC                 0x00010000
+#define  OR_RH_PORT_PRSC                0x00100000
+
+
+/*
+**************************************************************************************************************
+*                                               FRAME INTERVAL
+**************************************************************************************************************
+*/
+
+#define  FI                     0x2EDF           /* 12000 bits per frame (-1)                               */
+#define  DEFAULT_FMINTERVAL     ((((6 * (FI - 210)) / 7) << 16) | FI)
+
+/*
+**************************************************************************************************************
+*                                       TRANSFER DESCRIPTOR CONTROL FIELDS
+**************************************************************************************************************
+*/
+
+#define  TD_ROUNDING        (USB_INT32U) (0x00040000)        /* Buffer Rounding                             */
+#define  TD_SETUP           (USB_INT32U)(0)                  /* Direction of Setup Packet                   */
+#define  TD_IN              (USB_INT32U)(0x00100000)         /* Direction In                                */
+#define  TD_OUT             (USB_INT32U)(0x00080000)         /* Direction Out                               */
+#define  TD_DELAY_INT(x)    (USB_INT32U)((x) << 21)          /* Delay Interrupt                             */
+#define  TD_TOGGLE_0        (USB_INT32U)(0x02000000)         /* Toggle 0                                    */
+#define  TD_TOGGLE_1        (USB_INT32U)(0x03000000)         /* Toggle 1                                    */
+#define  TD_CC              (USB_INT32U)(0xF0000000)         /* Completion Code                             */
+
+/*
+**************************************************************************************************************
+*                                       USB STANDARD REQUEST DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  USB_DESCRIPTOR_TYPE_DEVICE                     1
+#define  USB_DESCRIPTOR_TYPE_CONFIGURATION              2
+#define  USB_DESCRIPTOR_TYPE_INTERFACE                  4
+#define  USB_DESCRIPTOR_TYPE_ENDPOINT                   5
+                                                    /*  ----------- Control RequestType Fields  ----------- */
+#define  USB_DEVICE_TO_HOST         0x80
+#define  USB_HOST_TO_DEVICE         0x00
+#define  USB_REQUEST_TYPE_CLASS     0x20
+#define  USB_RECIPIENT_DEVICE       0x00
+#define  USB_RECIPIENT_INTERFACE    0x01
+                                                    /* -------------- USB Standard Requests  -------------- */
+#define  SET_ADDRESS                 5
+#define  GET_DESCRIPTOR              6
+#define  SET_CONFIGURATION           9
+#define  SET_INTERFACE              11
+
+/*
+**************************************************************************************************************
+*                                       TYPE DEFINITIONS
+**************************************************************************************************************
+*/
+
+typedef struct hcEd {                       /* ----------- HostController EndPoint Descriptor ------------- */
+    volatile  USB_INT32U  Control;              /* Endpoint descriptor control                              */
+    volatile  USB_INT32U  TailTd;               /* Physical address of tail in Transfer descriptor list     */
+    volatile  USB_INT32U  HeadTd;               /* Physcial address of head in Transfer descriptor list     */
+    volatile  USB_INT32U  Next;                 /* Physical address of next Endpoint descriptor             */
+} HCED;
+
+typedef struct hcTd {                       /* ------------ HostController Transfer Descriptor ------------ */
+    volatile  USB_INT32U  Control;              /* Transfer descriptor control                              */
+    volatile  USB_INT32U  CurrBufPtr;           /* Physical address of current buffer pointer               */
+    volatile  USB_INT32U  Next;                 /* Physical pointer to next Transfer Descriptor             */
+    volatile  USB_INT32U  BufEnd;               /* Physical address of end of buffer                        */
+} HCTD;
+
+typedef struct hcca {                       /* ----------- Host Controller Communication Area ------------  */
+    volatile  USB_INT32U  IntTable[32];         /* Interrupt Table                                          */
+    volatile  USB_INT32U  FrameNumber;          /* Frame Number                                             */
+    volatile  USB_INT32U  DoneHead;             /* Done Head                                                */
+    volatile  USB_INT08U  Reserved[116];        /* Reserved for future use                                  */
+    volatile  USB_INT08U  Unknown[4];           /* Unused                                                   */
+} HCCA;
+
+/*
+**************************************************************************************************************
+*                                     EXTERN DECLARATIONS
+**************************************************************************************************************
+*/
+
+extern  volatile  HCED        *EDBulkIn;        /* BulkIn endpoint descriptor  structure                    */
+extern  volatile  HCED        *EDBulkOut;       /* BulkOut endpoint descriptor structure                    */
+extern  volatile  HCTD        *TDHead;          /* Head transfer descriptor structure                       */
+extern  volatile  HCTD        *TDTail;          /* Tail transfer descriptor structure                       */
+extern  volatile  USB_INT08U  *TDBuffer;        /* Current Buffer Pointer of transfer descriptor            */
+
+/*
+**************************************************************************************************************
+*                                       FUNCTION PROTOTYPES
+**************************************************************************************************************
+*/
+
+void        Host_Init     (void);
+
+extern "C" void USB_IRQHandler(void)  __irq;
+
+USB_INT32S  Host_EnumDev  (void);
+
+USB_INT32S  Host_ProcessTD(volatile  HCED       *ed,
+                           volatile  USB_INT32U  token,
+                           volatile  USB_INT08U *buffer,
+                                     USB_INT32U  buffer_len);
+
+void        Host_DelayUS  (          USB_INT32U    delay);
+void        Host_DelayMS  (          USB_INT32U    delay);
+
+
+void        Host_TDInit   (volatile  HCTD *td);
+void        Host_EDInit   (volatile  HCED *ed);
+void        Host_HCCAInit (volatile  HCCA  *hcca);
+
+USB_INT32S  Host_CtrlRecv (          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length,
+                           volatile  USB_INT08U  *buffer);
+
+USB_INT32S  Host_CtrlSend (          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length,
+                           volatile  USB_INT08U  *buffer);
+
+void        Host_FillSetup(          USB_INT08U   bm_request_type,
+                                     USB_INT08U   b_request,
+                                     USB_INT16U   w_value,
+                                     USB_INT16U   w_index,
+                                     USB_INT16U   w_length);
+
+
+void        Host_WDHWait  (void);
+
+
+USB_INT32U  ReadLE32U     (volatile  USB_INT08U  *pmem);
+void        WriteLE32U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT32U   val);
+USB_INT16U  ReadLE16U     (volatile  USB_INT08U  *pmem);
+void        WriteLE16U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT16U   val);
+USB_INT32U  ReadBE32U     (volatile  USB_INT08U  *pmem);
+void        WriteBE32U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT32U   val);
+USB_INT16U  ReadBE16U     (volatile  USB_INT08U  *pmem);
+void        WriteBE16U    (volatile  USB_INT08U  *pmem,
+                                     USB_INT16U   val);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/USBHostLite/usbhost_ms.c	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,455 @@
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_ms.c
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_ms.h"
+
+/*
+**************************************************************************************************************
+*                                         GLOBAL VARIABLES
+**************************************************************************************************************
+*/
+
+USB_INT32U  MS_BlkSize;
+
+/*
+**************************************************************************************************************
+*                                      INITIALIZE MASS STORAGE INTERFACE
+*
+* Description: This function initializes the mass storage interface
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S MS_Init (USB_INT32U *blkSize, USB_INT32U *numBlks, USB_INT08U *inquiryResult)
+{
+    USB_INT08U  retry;
+    USB_INT32S  rc;
+
+    MS_GetMaxLUN();                                                    /* Get maximum logical unit number   */
+    retry  = 80;
+    while(retry) {
+        rc = MS_TestUnitReady();                                       /* Test whether the unit is ready    */
+        if (rc == OK) {
+            break;
+        }
+        MS_GetSenseInfo();                                             /* Get sense information             */
+        retry--;
+    }
+    if (rc != OK) {
+        PRINT_Err(rc);
+        return (rc);
+    }
+    rc = MS_ReadCapacity(numBlks, blkSize);                         /* Read capacity of the disk         */
+    MS_BlkSize = *blkSize;                        // Set global
+    rc = MS_Inquire (inquiryResult);
+    return (rc);
+}
+/*
+**************************************************************************************************************
+*                                         PARSE THE CONFIGURATION
+*
+* Description: This function is used to parse the configuration
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_ParseConfiguration (void)
+{
+    volatile  USB_INT08U  *desc_ptr;
+              USB_INT08U   ms_int_found;
+
+
+    desc_ptr     = TDBuffer;
+    ms_int_found = 0;
+
+    if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_CONFIGURATION) {    
+        return (ERR_BAD_CONFIGURATION);
+    }
+    desc_ptr += desc_ptr[0];
+
+    while (desc_ptr != TDBuffer + ReadLE16U(&TDBuffer[2])) {
+
+        switch (desc_ptr[1]) {
+
+            case USB_DESCRIPTOR_TYPE_INTERFACE:                       /* If it is an interface descriptor   */
+                 if (desc_ptr[5] == MASS_STORAGE_CLASS &&             /* check if the class is mass storage */
+                     desc_ptr[6] == MASS_STORAGE_SUBCLASS_SCSI &&     /* check if the subclass is SCSI      */
+                     desc_ptr[7] == MASS_STORAGE_PROTOCOL_BO) {       /* check if the protocol is Bulk only */
+                     ms_int_found = 1;
+                     desc_ptr    += desc_ptr[0];                      /* Move to next descriptor start      */
+                 }
+                 break;
+
+            case USB_DESCRIPTOR_TYPE_ENDPOINT:                        /* If it is an endpoint descriptor    */
+                 if ((desc_ptr[3] & 0x03) == 0x02) {                  /* If it is Bulk endpoint             */
+                     if (desc_ptr[2] & 0x80) {                        /* If it is In endpoint               */
+                         EDBulkIn->Control =  1                             |      /* USB address           */
+                                              ((desc_ptr[2] & 0x7F) << 7)   |      /* Endpoint address      */
+                                              (2 << 11)                     |      /* direction             */
+                                              (ReadLE16U(&desc_ptr[4]) << 16);     /* MaxPkt Size           */
+                         desc_ptr += desc_ptr[0];                     /* Move to next descriptor start      */
+                     } else {                                         /* If it is Out endpoint              */
+                         EDBulkOut->Control = 1                             |      /* USB address           */
+                                              ((desc_ptr[2] & 0x7F) << 7)   |      /* Endpoint address      */
+                                              (1 << 11)                     |      /* direction             */
+                                              (ReadLE16U(&desc_ptr[4]) << 16);     /* MaxPkt Size           */
+                         desc_ptr += desc_ptr[0];                     /* Move to next descriptor start      */
+                     }
+                 } else {                                             /* If it is not bulk end point        */
+                     desc_ptr += desc_ptr[0];                         /* Move to next descriptor start      */
+                 }
+                 break;
+
+            default:                                 /* If the descriptor is neither interface nor endpoint */
+                 desc_ptr += desc_ptr[0];                             /* Move to next descriptor start      */
+                 break;
+        }
+    }
+    if (ms_int_found) {
+        PRINT_Log("Mass Storage device connected\n");
+        return (OK);
+    } else {
+        PRINT_Log("Not a Mass Storage device\n");
+        return (ERR_NO_MS_INTERFACE);
+    }
+}
+
+/*
+**************************************************************************************************************
+*                                         GET MAXIMUM LOGICAL UNIT
+*
+* Description: This function returns the maximum logical unit from the device
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_GetMaxLUN (void)
+{
+    USB_INT32S  rc;
+
+
+    rc = Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE,
+                       MS_GET_MAX_LUN_REQ,
+                       0,
+                       0,
+                       1,
+                       TDBuffer);
+    return (rc); 
+}
+
+/*
+**************************************************************************************************************
+*                                          GET SENSE INFORMATION
+*
+* Description: This function is used to get sense information from the device
+*
+* Arguments  : None
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_GetSenseInfo (void)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_REQUEST_SENSE, 6);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 18);
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                           TEST UNIT READY
+*
+* Description: This function is used to test whether the unit is ready or not
+*
+* Arguments  : None
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_TestUnitReady (void)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_NONE, SCSI_CMD_TEST_UNIT_READY, 6);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+        if (rc == OK) {        
+            if (TDBuffer[12] != 0) {
+                rc = ERR_MS_CMD_FAILED;
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                            READ CAPACITY
+*
+* Description: This function is used to read the capacity of the mass storage device
+*
+* Arguments  : None
+*
+* Returns    : OK       if Success
+*              ERROR    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S MS_ReadCapacity (USB_INT32U *numBlks, USB_INT32U *blkSize)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_READ_CAPACITY, 10);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 8);
+        if (rc == OK) {
+            if (numBlks)
+                *numBlks = ReadBE32U(&TDBuffer[0]);
+            if (blkSize)
+                *blkSize = ReadBE32U(&TDBuffer[4]);
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+
+
+USB_INT32S MS_Inquire (USB_INT08U *response)
+{
+    USB_INT32S rc;
+    USB_INT32U i;
+
+    Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_INQUIRY, 6);
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, INQUIRY_LENGTH);
+        if (rc == OK) {
+            if (response) {
+                for ( i = 0; i < INQUIRY_LENGTH; i++ )
+                    *response++ = *TDBuffer++;
+#if 0
+                MemCpy (response, TDBuffer, INQUIRY_LENGTH);
+                StrNullTrailingSpace (response->vendorID, SCSI_INQUIRY_VENDORCHARS);
+                StrNullTrailingSpace (response->productID, SCSI_INQUIRY_PRODUCTCHARS);
+                StrNullTrailingSpace (response->productRev, SCSI_INQUIRY_REVCHARS);
+#endif
+            }
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {    // bCSWStatus byte
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         RECEIVE THE BULK DATA
+*
+* Description: This function is used to receive the bulk data
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+    
+USB_INT32S  MS_BulkRecv (          USB_INT32U   block_number,
+                                   USB_INT16U   num_blocks,
+                         volatile  USB_INT08U  *user_buffer)
+{
+    USB_INT32S  rc;
+    int i;
+    volatile USB_INT08U *c = user_buffer;
+    for (i=0;i<MS_BlkSize*num_blocks;i++)
+        *c++ = 0;
+
+
+    Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_IN, SCSI_CMD_READ_10, 10);
+
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkIn, TD_IN, user_buffer, MS_BlkSize * num_blocks);
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         SEND BULK DATA
+*
+* Description: This function is used to send the bulk data
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_BulkSend (          USB_INT32U   block_number,
+                                   USB_INT16U   num_blocks,
+                         volatile  USB_INT08U  *user_buffer)
+{
+    USB_INT32S  rc;
+
+
+    Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_OUT, SCSI_CMD_WRITE_10, 10);
+
+    rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
+    if (rc == OK) {
+        rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks);
+        if (rc == OK) {
+            rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
+            if (rc == OK) {
+                if (TDBuffer[12] != 0) {
+                    rc = ERR_MS_CMD_FAILED;
+                }
+            }
+        }
+    }
+    return (rc);
+}
+
+/*
+**************************************************************************************************************
+*                                         FILL MASS STORAGE COMMAND
+*
+* Description: This function is used to fill the mass storage command
+*
+* Arguments  : None
+*
+* Returns    : OK                      if Success
+*              ERR_INVALID_BOOTSIG    if Failed
+*
+**************************************************************************************************************
+*/
+
+void  Fill_MSCommand (USB_INT32U   block_number,
+                      USB_INT32U   block_size,
+                      USB_INT16U   num_blocks,
+                      MS_DATA_DIR  direction,
+                      USB_INT08U   scsi_cmd,
+                      USB_INT08U   scsi_cmd_len)
+{
+            USB_INT32U  data_len;
+    static  USB_INT32U  tag_cnt = 0;
+            USB_INT32U  cnt;
+
+
+    for (cnt = 0; cnt < CBW_SIZE; cnt++) {
+         TDBuffer[cnt] = 0;
+    }
+    switch(scsi_cmd) {
+
+        case SCSI_CMD_TEST_UNIT_READY:
+             data_len = 0;
+             break;
+        case SCSI_CMD_READ_CAPACITY:
+             data_len = 8;
+             break;
+        case SCSI_CMD_REQUEST_SENSE:
+             data_len = 18;
+             break;
+        case SCSI_CMD_INQUIRY:
+             data_len = 36;
+             break;
+        default:
+             data_len = block_size * num_blocks;
+             break;
+    }
+    WriteLE32U(TDBuffer, CBW_SIGNATURE);
+    WriteLE32U(&TDBuffer[4], tag_cnt);
+    WriteLE32U(&TDBuffer[8], data_len);
+    TDBuffer[12]     = (direction == MS_DATA_DIR_NONE) ? 0 : direction;
+    TDBuffer[14]     = scsi_cmd_len;                                   /* Length of the CBW                 */
+    TDBuffer[15]     = scsi_cmd;
+    if ((scsi_cmd     == SCSI_CMD_REQUEST_SENSE)
+     || (scsi_cmd     == SCSI_CMD_INQUIRY)) {
+        TDBuffer[19] = (USB_INT08U)data_len;
+    } else {
+        WriteBE32U(&TDBuffer[17], block_number);
+    }
+    WriteBE16U(&TDBuffer[22], num_blocks);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MSCFileSysGg/USBHostLite/usbhost_ms.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,101 @@
+/*
+**************************************************************************************************************
+*                                                 NXP USB Host Stack
+*
+*                                     (c) Copyright 2008, NXP SemiConductors
+*                                     (c) Copyright 2008, OnChip  Technologies LLC
+*                                                 All Rights Reserved
+*
+*                                                  www.nxp.com
+*                                               www.onchiptech.com
+*
+* File           : usbhost_ms.h
+* Programmer(s)  : Ravikanth.P
+* Version        :
+*
+**************************************************************************************************************
+*/
+
+#ifndef  USBHOST_MS_H
+#define  USBHOST_MS_H
+
+/*
+**************************************************************************************************************
+*                                       INCLUDE HEADER FILES
+**************************************************************************************************************
+*/
+
+#include  "usbhost_inc.h"
+
+/*
+**************************************************************************************************************
+*                               MASS STORAGE SPECIFIC DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define    MS_GET_MAX_LUN_REQ            0xFE
+#define    MASS_STORAGE_CLASS            0x08
+#define    MASS_STORAGE_SUBCLASS_SCSI    0x06
+#define    MASS_STORAGE_PROTOCOL_BO      0x50
+
+#define    INQUIRY_LENGTH                36
+/*
+**************************************************************************************************************
+*                                  SCSI SPECIFIC DEFINITIONS
+**************************************************************************************************************
+*/
+
+#define  CBW_SIGNATURE               0x43425355
+#define  CSW_SIGNATURE               0x53425355
+#define  CBW_SIZE                      31
+#define  CSW_SIZE                      13
+#define  CSW_CMD_PASSED              0x00
+#define  SCSI_CMD_REQUEST_SENSE      0x03
+#define  SCSI_CMD_TEST_UNIT_READY    0x00
+#define  SCSI_CMD_INQUIRY            0x12
+#define  SCSI_CMD_READ_10            0x28
+#define  SCSI_CMD_READ_CAPACITY      0x25
+#define  SCSI_CMD_WRITE_10           0x2A
+
+/*
+**************************************************************************************************************
+*                                       TYPE DEFINITIONS
+**************************************************************************************************************
+*/
+
+typedef enum  ms_data_dir {
+
+    MS_DATA_DIR_IN     = 0x80,
+    MS_DATA_DIR_OUT    = 0x00,
+    MS_DATA_DIR_NONE   = 0x01
+
+} MS_DATA_DIR;
+
+/*
+**************************************************************************************************************
+*                                     FUNCTION PROTOTYPES
+**************************************************************************************************************
+*/
+
+USB_INT32S  MS_BulkRecv          (          USB_INT32U    block_number,
+                                            USB_INT16U    num_blocks,
+                                  volatile  USB_INT08U   *user_buffer);
+
+USB_INT32S  MS_BulkSend          (          USB_INT32U    block_number,
+                                            USB_INT16U    num_blocks,
+                                  volatile  USB_INT08U   *user_buffer);
+USB_INT32S  MS_ParseConfiguration(void);
+USB_INT32S  MS_TestUnitReady     (void);
+USB_INT32S  MS_ReadCapacity (USB_INT32U *numBlks, USB_INT32U *blkSize);
+USB_INT32S  MS_GetMaxLUN         (void);
+USB_INT32S  MS_GetSenseInfo      (void);
+USB_INT32S  MS_Init (USB_INT32U *blkSize, USB_INT32U *numBlks, USB_INT08U *inquiryResult);
+USB_INT32S  MS_Inquire (USB_INT08U *response);
+
+void        Fill_MSCommand       (          USB_INT32U    block_number,
+                                            USB_INT32U    block_size,
+                                            USB_INT16U    num_blocks,
+                                            MS_DATA_DIR   direction,
+                                            USB_INT08U    scsi_cmd,
+                                            USB_INT08U    scsi_cmd_len);
+#endif
--- a/SDFileSystem.cpp	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,441 +0,0 @@
-/* mbed Microcontroller Library - SDFileSystem
- * Copyright (c) 2008-2009, sford
- */
- 
-// VERY DRAFT CODE! Needs serious rework/refactoring 
- 
-/* Introduction
- * ------------
- * SD and MMC cards support a number of interfaces, but common to them all
- * is one based on SPI. This is the one I'm implmenting because it means
- * it is much more portable even though not so performant, and we already 
- * have the mbed SPI Interface!
- *
- * The main reference I'm using is Chapter 7, "SPI Mode" of: 
- *  http://www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf
- *
- * SPI Startup
- * -----------
- * The SD card powers up in SD mode. The SPI interface mode is selected by
- * asserting CS low and sending the reset command (CMD0). The card will 
- * respond with a (R1) response.
- *
- * CMD8 is optionally sent to determine the voltage range supported, and 
- * indirectly determine whether it is a version 1.x SD/non-SD card or 
- * version 2.x. I'll just ignore this for now.
- *
- * ACMD41 is repeatedly issued to initialise the card, until "in idle"
- * (bit 0) of the R1 response goes to '0', indicating it is initialised.
- *
- * You should also indicate whether the host supports High Capicity cards,
- * and check whether the card is high capacity - i'll also ignore this
- *
- * SPI Protocol
- * ------------
- * The SD SPI protocol is based on transactions made up of 8-bit words, with
- * the host starting every bus transaction by asserting the CS signal low. The
- * card always responds to commands, data blocks and errors.
- * 
- * The protocol supports a CRC, but by default it is off (except for the 
- * first reset CMD0, where the CRC can just be pre-calculated, and CMD8)
- * I'll leave the CRC off I think! 
- * 
- * Standard capacity cards have variable data block sizes, whereas High 
- * Capacity cards fix the size of data block to 512 bytes. I'll therefore
- * just always use the Standard Capacity cards with a block size of 512 bytes.
- * This is set with CMD16.
- *
- * You can read and write single blocks (CMD17, CMD25) or multiple blocks 
- * (CMD18, CMD25). For simplicity, I'll just use single block accesses. When
- * the card gets a read command, it responds with a response token, and then 
- * a data token or an error.
- * 
- * SPI Command Format
- * ------------------
- * Commands are 6-bytes long, containing the command, 32-bit argument, and CRC.
- *
- * +---------------+------------+------------+-----------+----------+--------------+
- * | 01 | cmd[5:0] | arg[31:24] | arg[23:16] | arg[15:8] | arg[7:0] | crc[6:0] | 1 |
- * +---------------+------------+------------+-----------+----------+--------------+
- *
- * As I'm not using CRC, I can fix that byte to what is needed for CMD0 (0x95)
- *
- * All Application Specific commands shall be preceded with APP_CMD (CMD55).
- *
- * SPI Response Format
- * -------------------
- * The main response format (R1) is a status byte (normally zero). Key flags:
- *  idle - 1 if the card is in an idle state/initialising 
- *  cmd  - 1 if an illegal command code was detected
- *
- *    +-------------------------------------------------+
- * R1 | 0 | arg | addr | seq | crc | cmd | erase | idle |
- *    +-------------------------------------------------+
- *
- * R1b is the same, except it is followed by a busy signal (zeros) until
- * the first non-zero byte when it is ready again.
- *
- * Data Response Token
- * -------------------
- * Every data block written to the card is acknowledged by a byte 
- * response token
- *
- * +----------------------+
- * | xxx | 0 | status | 1 |
- * +----------------------+
- *              010 - OK!
- *              101 - CRC Error
- *              110 - Write Error
- *
- * Single Block Read and Write
- * ---------------------------
- *
- * Block transfers have a byte header, followed by the data, followed
- * by a 16-bit CRC. In our case, the data will always be 512 bytes.
- *  
- * +------+---------+---------+- -  - -+---------+-----------+----------+
- * | 0xFE | data[0] | data[1] |        | data[n] | crc[15:8] | crc[7:0] | 
- * +------+---------+---------+- -  - -+---------+-----------+----------+
- */
- 
-#include "SDFileSystem.h"
-
-#define SD_COMMAND_TIMEOUT 5000
-
-SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) :
-  FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) {
-      _cs = 1; 
-}
-
-#define R1_IDLE_STATE           (1 << 0)
-#define R1_ERASE_RESET          (1 << 1)
-#define R1_ILLEGAL_COMMAND      (1 << 2)
-#define R1_COM_CRC_ERROR        (1 << 3)
-#define R1_ERASE_SEQUENCE_ERROR (1 << 4)
-#define R1_ADDRESS_ERROR        (1 << 5)
-#define R1_PARAMETER_ERROR      (1 << 6)
-
-// Types
-//  - v1.x Standard Capacity
-//  - v2.x Standard Capacity
-//  - v2.x High Capacity
-//  - Not recognised as an SD Card
-
-#define SDCARD_FAIL 0
-#define SDCARD_V1   1
-#define SDCARD_V2   2
-#define SDCARD_V2HC 3
-
-int SDFileSystem::initialise_card() {
-    // Set to 100kHz for initialisation, and clock card with cs = 1
-    _spi.frequency(100000); 
-    _cs = 1;
-    for(int i=0; i<16; i++) {   
-        _spi.write(0xFF);
-    }
-
-    // send CMD0, should return with all zeros except IDLE STATE set (bit 0)
-    if(_cmd(0, 0) != R1_IDLE_STATE) { 
-        fprintf(stderr, "No disk, or could not put SD card in to SPI idle state\n");
-        return SDCARD_FAIL;
-    }
-
-    // send CMD8 to determine whther it is ver 2.x
-    int r = _cmd8();
-    if(r == R1_IDLE_STATE) {
-        return initialise_card_v2();
-    } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
-        return initialise_card_v1();
-    } else {
-        fprintf(stderr, "Not in idle state after sending CMD8 (not an SD card?)\n");
-        return SDCARD_FAIL;
-    }
-}
-
-int SDFileSystem::initialise_card_v1() {
-    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {
-        _cmd(55, 0); 
-        if(_cmd(41, 0) == 0) { 
-            return SDCARD_V1;
-        }
-    }
-
-    fprintf(stderr, "Timeout waiting for v1.x card\n");
-    return SDCARD_FAIL;
-}
-
-int SDFileSystem::initialise_card_v2() {
-    
-    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {
-        _cmd(55, 0); 
-        if(_cmd(41, 0) == 0) { 
-            _cmd58();
-            return SDCARD_V2;
-        }
-    }
-
-    fprintf(stderr, "Timeout waiting for v2.x card\n");
-    return SDCARD_FAIL;
-}
-
-int SDFileSystem::disk_initialize() {
-
-    int i = initialise_card();
-//    printf("init card = %d\n", i);
-//    printf("OK\n");
-
-    _sectors = _sd_sectors();
-
-    // Set block length to 512 (CMD16)
-    if(_cmd(16, 512) != 0) {
-        fprintf(stderr, "Set 512-byte block timed out\n");
-        return 1;
-    }
-        
-    _spi.frequency(1000000); // Set to 1MHz for data transfer
-    return 0;
-}
-
-int SDFileSystem::disk_write(const char *buffer, int block_number) {
-    // set write address for single block (CMD24)
-    if(_cmd(24, block_number * 512) != 0) {
-        return 1;
-    }
-
-    // send the data block
-    _write(buffer, 512);    
-    return 0;    
-}
-
-int SDFileSystem::disk_read(char *buffer, int block_number) {        
-    // set read address for single block (CMD17)
-    if(_cmd(17, block_number * 512) != 0) {
-        return 1;
-    }
-    
-    // receive the data
-    _read(buffer, 512);
-    return 0;
-}
-
-int SDFileSystem::disk_status() { return 0; }
-int SDFileSystem::disk_sync() { return 0; }
-int SDFileSystem::disk_sectors() { return _sectors; }
-
-// PRIVATE FUNCTIONS
-
-int SDFileSystem::_cmd(int cmd, int arg) {
-    _cs = 0; 
-
-    // send a command
-    _spi.write(0x40 | cmd);
-    _spi.write(arg >> 24);
-    _spi.write(arg >> 16);
-    _spi.write(arg >> 8);
-    _spi.write(arg >> 0);
-    _spi.write(0x95);
-
-    // wait for the repsonse (response[7] == 0)
-    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {
-        int response = _spi.write(0xFF);
-        if(!(response & 0x80)) {
-            _cs = 1;
-            _spi.write(0xFF);
-            return response;
-        }
-    }
-    _cs = 1;
-    _spi.write(0xFF);
-    return -1; // timeout
-}
-int SDFileSystem::_cmdx(int cmd, int arg) {
-    _cs = 0; 
-
-    // send a command
-    _spi.write(0x40 | cmd);
-    _spi.write(arg >> 24);
-    _spi.write(arg >> 16);
-    _spi.write(arg >> 8);
-    _spi.write(arg >> 0);
-    _spi.write(0x95);
-
-    // wait for the repsonse (response[7] == 0)
-    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {
-        int response = _spi.write(0xFF);
-        if(!(response & 0x80)) {
-            return response;
-        }
-    }
-    _cs = 1;
-    _spi.write(0xFF);
-    return -1; // timeout
-}
-
-
-int SDFileSystem::_cmd58() {
-    _cs = 0; 
-    int arg = 0;
-    
-    // send a command
-    _spi.write(0x40 | 58);
-    _spi.write(arg >> 24);
-    _spi.write(arg >> 16);
-    _spi.write(arg >> 8);
-    _spi.write(arg >> 0);
-    _spi.write(0x95);
-
-    // wait for the repsonse (response[7] == 0)
-    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {
-        int response = _spi.write(0xFF);
-        if(!(response & 0x80)) {
-            int ocr = _spi.write(0xFF) << 24;
-            ocr |= _spi.write(0xFF) << 16;
-            ocr |= _spi.write(0xFF) << 8;
-            ocr |= _spi.write(0xFF) << 0;
-//            printf("OCR = 0x%08X\n", ocr);
-            _cs = 1;
-            _spi.write(0xFF);
-            return response;
-        }
-    }
-    _cs = 1;
-    _spi.write(0xFF);
-    return -1; // timeout
-}
-
-int SDFileSystem::_cmd8() {
-    _cs = 0; 
-    
-    // send a command
-    _spi.write(0x40 | 8); // CMD8
-    _spi.write(0x00);     // reserved
-    _spi.write(0x00);     // reserved
-    _spi.write(0x01);     // 3.3v
-    _spi.write(0xAA);     // check pattern
-    _spi.write(0x87);     // crc
-
-    // wait for the repsonse (response[7] == 0)
-    for(int i=0; i<SD_COMMAND_TIMEOUT * 1000; i++) {
-        char response[5];
-        response[0] = _spi.write(0xFF);
-        if(!(response[0] & 0x80)) {
-                for(int j=1; j<5; j++) {
-                    response[i] = _spi.write(0xFF);
-                }
-                _cs = 1;
-                _spi.write(0xFF);
-                return response[0];
-        }
-    }
-    _cs = 1;
-    _spi.write(0xFF);
-    return -1; // timeout
-}
-
-int SDFileSystem::_read(char *buffer, int length) {
-    _cs = 0;
-
-    // read until start byte (0xFF)
-    while(_spi.write(0xFF) != 0xFE);
-
-    // read data
-    for(int i=0; i<length; i++) {
-        buffer[i] = _spi.write(0xFF);
-    }
-    _spi.write(0xFF); // checksum
-    _spi.write(0xFF);
-
-    _cs = 1;    
-    _spi.write(0xFF);
-    return 0;
-}
-
-int SDFileSystem::_write(const char *buffer, int length) {
-    _cs = 0;
-    
-    // indicate start of block
-    _spi.write(0xFE);
-    
-    // write the data
-    for(int i=0; i<length; i++) {
-        _spi.write(buffer[i]);
-    }
-    
-    // write the checksum
-    _spi.write(0xFF); 
-    _spi.write(0xFF);
-
-    // check the repsonse token
-    if((_spi.write(0xFF) & 0x1F) != 0x05) {
-        _cs = 1;
-        _spi.write(0xFF);        
-        return 1;
-    }
-
-    // wait for write to finish
-    while(_spi.write(0xFF) == 0);
-
-    _cs = 1; 
-    _spi.write(0xFF);
-    return 0;
-}
-
-static int ext_bits(char *data, int msb, int lsb) {
-    int bits = 0;
-    int size = 1 + msb - lsb; 
-    for(int i=0; i<size; i++) {
-        int position = lsb + i;
-        int byte = 15 - (position >> 3);
-        int bit = position & 0x7;
-        int value = (data[byte] >> bit) & 1;
-        bits |= value << i;
-    }
-    return bits;
-}
-
-int SDFileSystem::_sd_sectors() {
-
-    // CMD9, Response R2 (R1 byte + 16-byte block read)
-    if(_cmdx(9, 0) != 0) {
-        fprintf(stderr, "Didn't get a response from the disk\n");
-        return 0;
-    }
-    
-    char csd[16];    
-    if(_read(csd, 16) != 0) {
-        fprintf(stderr, "Couldn't read csd response from disk\n");
-        return 0;
-    }
-
-    // csd_structure : csd[127:126]
-    // c_size        : csd[73:62]
-    // c_size_mult   : csd[49:47]
-    // read_bl_len   : csd[83:80] - the *maximum* read block length
-
-    int csd_structure = ext_bits(csd, 127, 126);
-    int c_size = ext_bits(csd, 73, 62);
-    int c_size_mult = ext_bits(csd, 49, 47);
-    int read_bl_len = ext_bits(csd, 83, 80);
-
-//    printf("CSD_STRUCT = %d\n", csd_structure);
-    
-    if(csd_structure != 0) {
-        fprintf(stderr, "This disk tastes funny! I only know about type 0 CSD structures\n");
-        return 0;
-    }
-             
-    // memory capacity = BLOCKNR * BLOCK_LEN
-    // where
-    //  BLOCKNR = (C_SIZE+1) * MULT
-    //  MULT = 2^(C_SIZE_MULT+2) (C_SIZE_MULT < 8)
-    //  BLOCK_LEN = 2^READ_BL_LEN, (READ_BL_LEN < 12)         
-                            
-    int block_len = 1 << read_bl_len;
-    int mult = 1 << (c_size_mult + 2);
-    int blocknr = (c_size + 1) * mult;
-    int capacity = blocknr * block_len;
-        
-    int blocks = capacity / 512;
-        
-    return blocks;
-}
--- a/SDFileSystem.h	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/* mbed Microcontroller Library - SDFileSystem
- * Copyright (c) 2008-2009, sford
- */
- 
-// VERY DRAFT CODE!!! 
-
-#ifndef SDFILESYSTEM_H
-#define SDFILESYSTEM_H
-
-#include "mbed.h"
-#include "FATFileSystem.h"
-
-/* Class: SDFileSystem
- *  Access the filesystem on an SD Card using SPI
- *
- * Example:
- * > SDFileSystem sd(p5, p6, p7, p12, "sd");
- * > 
- * > int main() {
- * >     FILE *fp = fopen("/sd/myfile.txt", "w");
- * >     fprintf(fp, "Hello World!\n");
- * >     fclose(fp);
- * > }
- */
-class SDFileSystem : public FATFileSystem {
-public:
-
-    /* Constructor: SDFileSystem
-     *  Create the File System for accessing an SD Card using SPI
-     *
-     * Variables:
-     *  mosi - SPI mosi pin connected to SD Card
-     *  miso - SPI miso pin conencted to SD Card
-     *  sclk - SPI sclk pin connected to SD Card
-     *  cs   - DigitalOut pin used as SD Card chip select
-   *  name - The name used to access the filesystem
-     */
-    SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name);
-    virtual int disk_initialize();
-    virtual int disk_write(const char *buffer, int block_number);
-    virtual int disk_read(char *buffer, int block_number);    
-    virtual int disk_status();
-    virtual int disk_sync();
-    virtual int disk_sectors();
-
-protected:
-
-    int _cmd(int cmd, int arg);
-    int _cmdx(int cmd, int arg);
-    int _cmd8();
-    int _cmd58();
-    int initialise_card();
-    int initialise_card_v1();
-    int initialise_card_v2();
-    
-    
-    int _read(char *buffer, int length);
-    int _write(const char *buffer, int length);
-    int _sd_sectors();
-    int _sectors;
-    
-    SPI _spi;
-    DigitalOut _cs;     
-};
-
-#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_TFTx2.lib	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/TickTock/code/SPI_TFTx2/#a71243b666f9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TFT_fonts.lib	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/dreschpe/code/TFT_fonts/#419d21bfc20c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TOUCH_TFTx2.lib	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/TickTock/code/TOUCH_TFTx2/#3db7309b6146
--- a/TextLCD.lib	Mon Nov 19 04:44:11 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-TextLCD#27620595ebc5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Util/mbedUtils.cpp	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,16 @@
+
+#include "mbedUtils.h"
+
+#include "mbed.h"
+
+
+int getFreeMemory()
+{
+    // Return the difference between the heap pointer and stack pointer.
+    char stackVar = '\0';
+    char* stackPtr = &stackVar;
+    char* heapPtr = (char*)malloc(sizeof(char));
+    int memFree = stackPtr - heapPtr;
+    free(heapPtr);
+    return memFree;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Util/mbedUtils.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,31 @@
+/*
+Copyright (c) 2011 Robert Ellis (holistic [at] robellis [dot] org [dot] uk)
+ 
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#ifndef MBED_UTILS_H
+#define MBED_UTILS_H
+
+/**
+ * Get the amount of free RAM left on the mbed in bytes.
+ */
+int getFreeMemory();
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Util/stringUtils.cpp	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,44 @@
+
+
+#include "stringUtils.h"
+
+using namespace std;
+
+string trim(const string& src, const string& c)
+{
+    int p2 = src.find_last_not_of(c);
+    if (p2 == string::npos) 
+    {
+        return string();
+    }
+    
+    int p1 = src.find_first_not_of(c);
+    if (p1 == string::npos) 
+    {
+        p1 = 0;
+    }
+    
+    return src.substr(p1, (p2-p1)+1);
+}
+
+vector<string> tokenize(const string& str, const string& delimiters)
+{
+    vector<string> tokens;
+
+    // Skip delimiters at beginning.
+    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
+    // Find first "non-delimiter".
+    string::size_type pos     = str.find_first_of(delimiters, lastPos);
+
+    while (string::npos != pos || string::npos != lastPos)
+    {
+        // Found a token, add it to the vector.
+        tokens.push_back(str.substr(lastPos, pos - lastPos));
+        // Skip delimiters.  Note the "not_of"
+        lastPos = str.find_first_not_of(delimiters, pos);
+        // Find next "non-delimiter"
+        pos = str.find_first_of(delimiters, lastPos);
+    }
+    
+    return tokens;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Util/stringUtils.h	Sun Feb 03 18:16:53 2013 +0000
@@ -0,0 +1,40 @@
+/*
+Copyright (c) 2011 Robert Ellis (holistic [at] robellis [dot] org [dot] uk)
+ 
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+ 
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#ifndef STRING_UTILS_H
+#define STRING_UTILS_H
+
+#include <string>
+#include <vector>
+using namespace std;
+
+/**
+ * Trims whitespace characters from beginning and end of given string.
+ */
+string trim(const string& src, const string& c = " \r\n");
+
+/**
+ * Tokenize given string delimmted by given delimter into a vector of seprate strings.
+ */
+vector<string> tokenize(const string& str, const string& delimiters = " ");
+
+#endif
--- a/main.cpp	Mon Nov 19 04:44:11 2012 +0000
+++ b/main.cpp	Sun Feb 03 18:16:53 2013 +0000
@@ -1,157 +1,310 @@
 #include "mbed.h"
 #include "CAN.h"
-#include "TextLCD.h"
-#include "SDFileSystem.h"
-#include "DebounceIn.h"
 #include "log.h"
 #include "beep.h"
+#include "MSCFileSystem.h"
+#include "SPI_TFTx2.h"
+#include "Arial12x12.h"
+#include "Arial28x28.h"
+#include "TOUCH_TFTx2.h"
+#define upLine "\033[1A"
+
+//CANary.cpp
+
+//LEAF OBD
+//1:
+//2:
+//3:    AVCAN-L     White/Blue
+//4:
+//5:    VSS         Brown,White/Brown
+//6:    CARCAN-H    Green
+//7:
+//8:    12V-SW      Orange,White/Orange
+//9:
+//10:
+//11:   AVCAN-H     Blue
+//12:   EVCAN-L     White/Grey
+//13:   EVCAN-H     Grey
+//14:   CARCAN-L    White/Green
+//15:
+//16:   12V-AON     Red/Blue,Blue/Red
 
 //VP230
-//1:D   8:RS
-//2:GND 7:CANH
-//3:VCC 6:CANL
-//4:R   5:Vref
+//1:D   
+//2:GND 
+//3:VCC 
+//4:R   
+//5:Vref
+//6:CANL
+//7:CANH
+//8:RS
 
 //LPC1768
 //1:    VSS
-//2:        NC:VIN
+//2:        NC:VIN  (4.5-9V supply)
 //3:        NC:VB
 //4:        NC:nR
-//5:    SPI:MOSI   -->  6:SDRAM:DI
-//6:    SPI:MISO   -->  2:SDRAM:DO
-//7:    SPI:SCLK   -->  4:SDRAM:SCLK
-//8:    CS         -->  7:SDRAM:CS
-//9:    CAN1:TX    -->  1:CAN1:D
-//10:   CAN1:RX    -->  4:CAN1:R
-//11:   RS         -->  4:LCD:RS
-//12:   E          -->  6:LCD:E
-//13:   D4         -->  11:LCD:D4
-//14:   D5         -->  12:LCD:D5
-//15:   D6         -->  13:LCD:D6
-//16:   D7         -->  14:LCD:D7
-//17:   CD         -->  1:SDRAM:CD
-//18:       NC:Ain
-//19:   PB2
-//20:   PB1
+//5:    SPI:CS0
+//6:    SPI:CS1
+//7:    SPI:Reset
+//8:    CAN1:Sleep -->  8:CAN1:RS
+//9:    CAN1:RX    -->  4:CAN1:R
+//10:   CAN1:TX    -->  1:CAN1:D
+//11:   SPI:MOSI
+//12:   SPI:MISO
+//13:   SPI:SCLK
+//14:       NC:Ain
+//15:   MON12V     -->  4K to 12V, 1K to VSS  (To be implemented)
+//16:   TOUCH_X+
+//17:   TOUCH_X-
+//18:       NC:Aout
+//19:   TOUCH_Y+
+//20:   TOUCH_Y-
 //21:   Spkr+
-//22:       NC:pwm
+//22:   Spkr-           (optional complimentary output for more volume)
 //23:       NC:pwm
-//24:       NC:pwm
+//24:       LED
 //25:       NC:pwm
 //26:       NC:pwm
-//27:   CAN1:Sleep -->  8:CAN1:RS
+//27:       NC
 //28:   CAN2:Sleep -->  8:CAN2:RS
-//29:   CAN2:RX    -->  4:CAN2:R
-//30:   CAN2:TX    -->  1:CAN2:D
-//31:       NC:USB_D+
-//32:       NC:USB_D-
+//29:   CAN2:TX    -->  1:CAN2:D
+//30:   CAN2:RX    -->  4:CAN2:R
+//31:   USB_D+
+//32:   USB_D-
 //33:       NC:Eth_TD+
 //34:       NC:Eth_TD-
 //35:       NC:Eth_RD+
 //36:       NC:Eth_RD-
 //37:       NC:IF+
 //38:       NC:IF-
-//39:       NC:5Vout
+//39:       NC:5Vout (only available when connected as USB device)
 //40:   VCC3.3
 
+time_t seconds ;
 Beep buzzer(p21);
-DigitalIn  CD( p17 ); 
-DigitalIn  PB1( p20 ); 
-SDFileSystem sd(p5, p6, p7, p8, "sd"); // SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)
-TextLCD lcd(p11, p12, p13, p14, p15, p16); // rs, e, d0-d3 (RW to GND)
+
 Ticker ticker;
+Timer timer;
 DigitalOut led1(LED1);
 DigitalOut led2(LED2);
 DigitalOut led3(LED3);
 DigitalOut led4(LED4);
-CAN can1(p9, p10);      // CAN1 uses pins 9 and 10 (tx, rx)
-CAN can2(p30, p29);     // CAN2 uses pins 30 and 29 (tx, rx)
-bool LogCreated = false;
+CAN can1(p9, p10);      // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
+DigitalOut can1_SleepMode(p8);     // Use pin 8 to control the sleep mode of can1
+CAN can2(p30, p29);     // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
+DigitalOut can2_SleepMode(p28);     // Use pin 28 to control the sleep mode of can2
+bool logCreated = false;
 char logMsg[64];
 
 char counter = 0;
-//DigitalOut can1_SleepMode(p11);     // Use pin 11 to control the sleep mode of can1
-//DigitalOut can2_SleepMode(p28);     // Use pin 28 to control the sleep mode of can2
-Serial pc(USBTX, USBRX); // tx, rx   default settings (9600 8N1)
+
+TOUCH_TFTx2 tt(p16, p17, p19, p20, p11, p12, p13, p6, p7, p5, "TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs0, cs1, reset
+
+unsigned short getTimeStamp() {// from Gary's code
+
+    //-----------
+    // read ms from the timer
+    int msec = timer.read_ms() ;
+
+    // quickly, read Date and Time (to seconds) from the RTC
+    unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
+
+    //-----------
+    if ( msec > 999 ) msec = 999 ;
+    int isecs = secs % 60 ; // modulo 60 for 0-59 seconds from RTC
+
+    return ( ( isecs << 10 ) + msec ) ; // return the two byte time stamp
+}
+
+extern "C" void RTC_IRQHandler()
+{
+
+    timer.reset() ; // zero ms at the-seconds-tick
+
+}
+
+extern "C" void RTC_Init (void)
+{
+
+    // set up the RTC interrupts
+    LPC_RTC->ILR=0x00;
+
+    //LPC_RTC->CIIR=0x02; // interrupts each minute - verified
+    LPC_RTC->CIIR=0x01; // interrupts each second - verified
+
+    //LPC_RTC->CCR = 0x11;  // use for interrupts every minute ????
+    //LPC_RTC->CCR = 0x00;  // Stop the RTC (apparently)
+    LPC_RTC->CCR = 0x01;  // Start RTC (apparently use for interrupt every second)
+
+    // NVIC_SetPriority( RTC_IRQn, LOW_PR );
+    NVIC_EnableIRQ( RTC_IRQn );
+}
+
+void readLog ()
+{
+    FILE *rfile;
+    unsigned char c;
+    int i=0;
+    printf("printing file\n");
+    rfile = fopen(LOGFILE, "r");
+    if (rfile == NULL) {
+        printf("no file found\n");
+        }
+    while (!feof(rfile))
+        {
+        c=fgetc(rfile);
+        printf("%02x ",c);
+        if (++i>11)
+            {
+            printf("\n");
+            i=0;
+            }
+        }
+    fclose(rfile);
+}
+ 
+void logCan (CANMessage canRXmsg)
+{
+    FILE *file;
+
+    unsigned short ts;
+    
+    ts=getTimeStamp();
+
+    if (!logCreated) {
+        file = fopen(LOGFILE, "w");
+        logCreated = true;
+    }
+    else
+        file = fopen(LOGFILE, "a");
+
+    if (file == NULL) {
+        if (logCreated)
+            logCreated = false;
+        return;
+    }
+    else
+    {
+        fprintf(file,"%c%c%c%c%c%c%c%c%c%c%c%c",ts>>8,ts&0xff,canRXmsg.id&0xff,(canRXmsg.id>>8)+(canRXmsg.len<<4),canRXmsg.data[0],canRXmsg.data[1],canRXmsg.data[2],canRXmsg.data[3],canRXmsg.data[4],canRXmsg.data[5],canRXmsg.data[6],canRXmsg.data[7]);
+        fclose(file);
+    }
+}
 
 void Log (char *message)
 {
     FILE *file;
 
-    if (!LogCreated) {
+    if (!logCreated) {
         file = fopen(LOGFILE, "w");
-        LogCreated = true;
+        logCreated = true;
     }
     else
         file = fopen(LOGFILE, "a");
 
     if (file == NULL) {
-        if (LogCreated)
-            LogCreated = false;
+        if (logCreated)
+            logCreated = false;
         return;
     }
     else
     {
         fputs(message, file);
-        //fprintf(file, message);
         fclose(file);
     }
+}
 
-    if (file)
-        fclose(file);
+void send1() {
+    static char counter = 0; // use for fake data
+
+    can1.write(CANMessage(0x350, &counter, 1));
+    counter++;
+    // test sending 3 quickly
+    //can1.write(CANMessage(0x351, &counter, 1));
+    //can1.write(CANMessage(0x352, &counter, 1));
+
 }
 
 
-void send() {
-    if(can1.write(CANMessage(0x350, &counter, 1))) {
-        counter++;
-        pc.printf("Message %d sent\n", counter);
-        lcd.printf("sent: %d  \n", counter);
-        if(LogCreated) {
-            if((PB1==0)||(CD==0)){
-                LogCreated=false;
-                pc.printf("Stopping log\n", counter);
-            }else{
-                sprintf(logMsg, "sent: %d \n", counter);
-                Log(logMsg);
-                pc.printf("Message logged\n");
-                buzzer.beep(800,0.025);              }
-        }
-    } 
-    led1 = !led1;
-}
- 
 void recieve1() {
     static CANMessage msg1;
+    unsigned short msgTime;
+    
+    msgTime=getTimeStamp();
     can1.read(msg1);
-    pc.printf("Can1 Message received: %d\n", msg1.data[0]);
-    lcd.printf("Can1 rxd: %d\n", msg1.data[0]);
+    printf("%sCan1 Message received: %d %x\n", upLine, msg1.data[0], msgTime);
+    printf("Can1 rxd: %d\n", msg1.data[0]);
+    if(logCreated) {
+        logCan(msg1);
+    }
     led2 = !led2;
 }
 void recieve2() {
     static CANMessage msg2;
+    unsigned short msgTime;
+    
+    msgTime=getTimeStamp();
     can2.read(msg2);
-    pc.printf("Can2 Message received: %d\n", msg2.data[0]);
-    lcd.printf("Can2 rxd: %d\n", msg2.data[0]);
+    printf("%sCan2 Message received: %d %x\n", upLine, msg2.data[0],msgTime);
+    printf("Can2 rxd: %d\n", msg2.data[0]);
+    if(logCreated) {
+        logCan(msg2);
+    }
+
     led3 = !led3;
 }
 
 int main() {
-    pc.baud(115200);        // change serial interface to pc to 115200, 8N1
-    can1.frequency(100000);
-    can2.frequency(100000);
-    //can1_SleepMode = 0;         // Turn off Sleep Mode
-    //can2_SleepMode = 0;         // Turn off Sleep Mode
-    CD.mode(PullUp) ; //SDRAM Chip Detect
-    PB1.mode(PullUp) ; //Pushbutton 1
-    ticker.attach(&send, 1);
+    can1.frequency(1000000);
+    can2.frequency(1000000);
+    //can1_SleepMode = 0;         // Enable TX
+    //can2_SleepMode = 0;         // Enable TX
+    can1_SleepMode = 1;         // Turn on Monitor_only Mode
+    can2_SleepMode = 1;         // Turn on Monitor_only Mode
+    ticker.attach(&send1, 0.25);
     can1.attach(&recieve1);
     can2.attach(&recieve2);
-    if(CD == 1) {
-        pc.printf("Starting Can Log\n");
-        Log("Starting Can Log\n");
-        } 
-    else {
-        pc.printf("No SDRAM Inserted.\n");
+    unsigned int dsel = 1;   // select right display
+    tt.set_display(2);       // select both displays
+    tt.background(Black);    // set background to black
+    tt.foreground(White);    // set chars to white
+    tt.cls();                // clear the screen
+    tt.set_font((unsigned char*) Arial12x12);  // select the font
+    tt.set_orientation(1);
+    tt.set_display(dsel);     // select display
+
+    tt.calibrate();           // calibrate the touch
+    tt.locate(0,0);
+    tt.claim(stdout);        // send stdout to the TFT display
+
+    struct tm t; // pointer to a static tm structure
+
+    seconds = time(NULL);
+    t = *localtime(&seconds) ;
+
+    // is it a date before 2012 ?
+    if ((t.tm_year + 1900) < 2012 ) {
+        // before 2012, so the RTC probably lost power
+        // So, set a near-recent date in 2012
+
+        // enter people-values here
+        t.tm_year = 2012 ; // 28 May 2012
+        t.tm_mon = 6 ; // 1 to 12
+        t.tm_mday = 1;
+        t.tm_hour = 12; // 12:59:56 PM (after noon)
+        t.tm_min = 59;
+        t.tm_sec = 56;
+
+        // adjust for tm structure required values
+        t.tm_year = t.tm_year - 1900;
+        t.tm_mon = t.tm_mon - 1;
+
+        // set the RTC
+        set_time(mktime(&t));
+        seconds = time(NULL);
+
+        //    printf("Set RTC to:\n" );
+        //    strftime(sTemp, 32, "%a %m/%d/%Y %X", localtime(&seconds));
+        //    printf("%s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
     }
 }
\ No newline at end of file
--- a/mbed.bld	Mon Nov 19 04:44:11 2012 +0000
+++ b/mbed.bld	Sun Feb 03 18:16:53 2013 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/e2ed12d17f06
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912