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

Dependents:   SPIRAM_PRAMFS

Committer:
okini3939
Date:
Mon Nov 12 15:36:45 2012 +0000
Revision:
0:475e05403ad8
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:475e05403ad8 1 /*
okini3939 0:475e05403ad8 2 * Memory File System Library, for SPI PRAM NP8P128A13 (Micron)
okini3939 0:475e05403ad8 3 * Copyright (c) 2012 Hiroshi Suga
okini3939 0:475e05403ad8 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:475e05403ad8 5 */
okini3939 0:475e05403ad8 6
okini3939 0:475e05403ad8 7 #include "mbed.h"
okini3939 0:475e05403ad8 8 #include "PRAMFileSystem.h"
okini3939 0:475e05403ad8 9
okini3939 0:475e05403ad8 10 PRAMFileSystem::PRAMFileSystem (PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) :
okini3939 0:475e05403ad8 11 FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) {
okini3939 0:475e05403ad8 12 _cs = 1;
okini3939 0:475e05403ad8 13 }
okini3939 0:475e05403ad8 14
okini3939 0:475e05403ad8 15 int PRAMFileSystem::_init () {
okini3939 0:475e05403ad8 16 int i;
okini3939 0:475e05403ad8 17
okini3939 0:475e05403ad8 18 _spi.frequency(16000000);
okini3939 0:475e05403ad8 19 _cs = 1;
okini3939 0:475e05403ad8 20 wait_ms(10);
okini3939 0:475e05403ad8 21
okini3939 0:475e05403ad8 22 _cs = 0;
okini3939 0:475e05403ad8 23 _spi.write(CMD_RDID);
okini3939 0:475e05403ad8 24 i = _spi.write(0);
okini3939 0:475e05403ad8 25 i = (_spi.write(0) << 8) | _spi.write(0);
okini3939 0:475e05403ad8 26 _cs = 1;
okini3939 0:475e05403ad8 27 if (i == 0 || i == 0xffff) {
okini3939 0:475e05403ad8 28 return -1;
okini3939 0:475e05403ad8 29 }
okini3939 0:475e05403ad8 30
okini3939 0:475e05403ad8 31 return 0;
okini3939 0:475e05403ad8 32 }
okini3939 0:475e05403ad8 33
okini3939 0:475e05403ad8 34 int PRAMFileSystem::disk_initialize() {
okini3939 0:475e05403ad8 35 if (_init()) {
okini3939 0:475e05403ad8 36 return 1;
okini3939 0:475e05403ad8 37 }
okini3939 0:475e05403ad8 38 _sectors = 128 * 1024 * 1024 / 8 / 512;
okini3939 0:475e05403ad8 39 return 0;
okini3939 0:475e05403ad8 40 }
okini3939 0:475e05403ad8 41
okini3939 0:475e05403ad8 42 int PRAMFileSystem::disk_write(const char *buffer, int block_number) {
okini3939 0:475e05403ad8 43 int i, addr;
okini3939 0:475e05403ad8 44
okini3939 0:475e05403ad8 45 addr = block_number * 512;
okini3939 0:475e05403ad8 46 for (i = 0; i < 512; i += 64) {
okini3939 0:475e05403ad8 47 _write(addr + i, &buffer[i], 64);
okini3939 0:475e05403ad8 48 }
okini3939 0:475e05403ad8 49 return 0;
okini3939 0:475e05403ad8 50 }
okini3939 0:475e05403ad8 51
okini3939 0:475e05403ad8 52 int PRAMFileSystem::disk_read(char *buffer, int block_number) {
okini3939 0:475e05403ad8 53 int i, addr;
okini3939 0:475e05403ad8 54
okini3939 0:475e05403ad8 55 addr = block_number * 512;
okini3939 0:475e05403ad8 56 for (i = 0; i < 512; i += 64) {
okini3939 0:475e05403ad8 57 _read(addr + i, &buffer[i], 64);
okini3939 0:475e05403ad8 58 }
okini3939 0:475e05403ad8 59 return 0;
okini3939 0:475e05403ad8 60 }
okini3939 0:475e05403ad8 61
okini3939 0:475e05403ad8 62 int PRAMFileSystem::disk_status() { return 0; }
okini3939 0:475e05403ad8 63 int PRAMFileSystem::disk_sync() { return 0; }
okini3939 0:475e05403ad8 64 int PRAMFileSystem::disk_sectors() { return _sectors; }
okini3939 0:475e05403ad8 65
okini3939 0:475e05403ad8 66
okini3939 0:475e05403ad8 67 int PRAMFileSystem::_status () {
okini3939 0:475e05403ad8 68 int r;
okini3939 0:475e05403ad8 69
okini3939 0:475e05403ad8 70 _cs = 0;
okini3939 0:475e05403ad8 71 _spi.write(CMD_RDSR);
okini3939 0:475e05403ad8 72 r = _spi.write(0);
okini3939 0:475e05403ad8 73 _cs = 1;
okini3939 0:475e05403ad8 74 return r;
okini3939 0:475e05403ad8 75 }
okini3939 0:475e05403ad8 76
okini3939 0:475e05403ad8 77 int PRAMFileSystem::_write (int addr, const char *buf, int len) {
okini3939 0:475e05403ad8 78 int i;
okini3939 0:475e05403ad8 79
okini3939 0:475e05403ad8 80 while (_status() & 1) {
okini3939 0:475e05403ad8 81 // write in progress
okini3939 0:475e05403ad8 82 wait_us(1);
okini3939 0:475e05403ad8 83 }
okini3939 0:475e05403ad8 84
okini3939 0:475e05403ad8 85 _cs = 0;
okini3939 0:475e05403ad8 86 _spi.write(CMD_WREN);
okini3939 0:475e05403ad8 87 _cs = 1;
okini3939 0:475e05403ad8 88 wait_us(1);
okini3939 0:475e05403ad8 89
okini3939 0:475e05403ad8 90 _cs = 0;
okini3939 0:475e05403ad8 91 _spi.write(CMD_PP_BA);
okini3939 0:475e05403ad8 92 _spi.write((addr >> 16) & 0xff);
okini3939 0:475e05403ad8 93 _spi.write((addr >> 8) & 0xff);
okini3939 0:475e05403ad8 94 _spi.write(addr & 0xff);
okini3939 0:475e05403ad8 95
okini3939 0:475e05403ad8 96 len = len - (addr & 0x3f);
okini3939 0:475e05403ad8 97 for (i = 0; i < len; i ++) {
okini3939 0:475e05403ad8 98 _spi.write(buf[i]);
okini3939 0:475e05403ad8 99 }
okini3939 0:475e05403ad8 100 _cs = 1;
okini3939 0:475e05403ad8 101 return i;
okini3939 0:475e05403ad8 102 }
okini3939 0:475e05403ad8 103
okini3939 0:475e05403ad8 104 int PRAMFileSystem::_read (int addr, char *buf, int len) {
okini3939 0:475e05403ad8 105 int i;
okini3939 0:475e05403ad8 106
okini3939 0:475e05403ad8 107 while (_status() & 1) {
okini3939 0:475e05403ad8 108 // write in progress
okini3939 0:475e05403ad8 109 wait_us(1);
okini3939 0:475e05403ad8 110 }
okini3939 0:475e05403ad8 111
okini3939 0:475e05403ad8 112 _cs = 0;
okini3939 0:475e05403ad8 113 _spi.write(CMD_READ);
okini3939 0:475e05403ad8 114 _spi.write((addr >> 16) & 0xff);
okini3939 0:475e05403ad8 115 _spi.write((addr >> 8) & 0xff);
okini3939 0:475e05403ad8 116 _spi.write(addr & 0xff);
okini3939 0:475e05403ad8 117
okini3939 0:475e05403ad8 118 for (i = 0; i < len; i ++) {
okini3939 0:475e05403ad8 119 buf[i] = _spi.write(0);
okini3939 0:475e05403ad8 120 }
okini3939 0:475e05403ad8 121 _cs = 1;
okini3939 0:475e05403ad8 122 return i;
okini3939 0:475e05403ad8 123 }