Memory File System Library, for SPI PRAM NP8P128A13 (Micron) see: http://mbed.org/users/okini3939/notebook/extend-memory/

Dependents:   SPIRAM_PRAMFS

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PRAMFileSystem.cpp Source File

PRAMFileSystem.cpp

00001 /*
00002  * Memory File System Library, for SPI PRAM NP8P128A13 (Micron)
00003  * Copyright (c) 2012 Hiroshi Suga
00004  * Released under the MIT License: http://mbed.org/license/mit
00005  */
00006 
00007 #include "mbed.h"
00008 #include "PRAMFileSystem.h"
00009 
00010 PRAMFileSystem::PRAMFileSystem (PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) :
00011   FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) {
00012     _cs = 1;
00013 }
00014 
00015 int PRAMFileSystem::_init () {
00016     int i;
00017 
00018     _spi.frequency(16000000);
00019     _cs = 1;
00020     wait_ms(10);
00021 
00022     _cs = 0;
00023     _spi.write(CMD_RDID);
00024     i = _spi.write(0);
00025     i = (_spi.write(0) << 8) | _spi.write(0);
00026     _cs = 1;
00027     if (i == 0 || i == 0xffff) {
00028         return -1;
00029     }
00030  
00031     return 0;
00032 }
00033 
00034 int PRAMFileSystem::disk_initialize() {
00035     if (_init()) {
00036         return 1;
00037     }
00038     _sectors = 128 * 1024 * 1024 / 8 / 512;
00039     return 0;
00040 }
00041 
00042 int PRAMFileSystem::disk_write(const char *buffer, int block_number) {
00043     int i, addr;
00044     
00045     addr = block_number * 512;
00046     for (i = 0; i < 512; i += 64) {
00047         _write(addr + i, &buffer[i], 64);    
00048     }
00049     return 0;    
00050 }
00051 
00052 int PRAMFileSystem::disk_read(char *buffer, int block_number) {        
00053     int i, addr;
00054     
00055     addr = block_number * 512;
00056     for (i = 0; i < 512; i += 64) {
00057         _read(addr + i, &buffer[i], 64);    
00058     }
00059     return 0;
00060 }
00061 
00062 int PRAMFileSystem::disk_status() { return 0; }
00063 int PRAMFileSystem::disk_sync() { return 0; }
00064 int PRAMFileSystem::disk_sectors() { return _sectors; }
00065 
00066 
00067 int PRAMFileSystem::_status () {
00068     int r;
00069 
00070     _cs = 0;
00071     _spi.write(CMD_RDSR);
00072     r = _spi.write(0);
00073     _cs = 1;
00074     return r;
00075 }
00076 
00077 int PRAMFileSystem::_write (int addr, const char *buf, int len) {
00078     int i;
00079 
00080     while (_status() & 1) {
00081         // write in progress
00082         wait_us(1);
00083     }
00084 
00085     _cs = 0;
00086     _spi.write(CMD_WREN);
00087     _cs = 1;
00088     wait_us(1);
00089 
00090     _cs = 0;
00091     _spi.write(CMD_PP_BA);
00092     _spi.write((addr >> 16) & 0xff);
00093     _spi.write((addr >> 8) & 0xff);
00094     _spi.write(addr & 0xff);
00095 
00096     len = len - (addr & 0x3f);
00097     for (i = 0; i < len; i ++) {
00098         _spi.write(buf[i]);
00099     }
00100     _cs = 1;
00101     return i;
00102 }
00103 
00104 int PRAMFileSystem::_read (int addr, char *buf, int len) {
00105     int i;
00106 
00107     while (_status() & 1) {
00108         // write in progress
00109         wait_us(1);
00110     }
00111 
00112     _cs = 0;
00113     _spi.write(CMD_READ);
00114     _spi.write((addr >> 16) & 0xff);
00115     _spi.write((addr >> 8) & 0xff);
00116     _spi.write(addr & 0xff);
00117 
00118     for (i = 0; i < len; i ++) {
00119         buf[i] = _spi.write(0);
00120     }
00121     _cs = 1;
00122     return i;
00123 }