Memory File System Library, for SPI PRAM NP8P128A13 (Micron) see: http://mbed.org/users/okini3939/notebook/extend-memory/
PRAMFileSystem.cpp@0:475e05403ad8, 2012-11-12 (annotated)
- Committer:
- okini3939
- Date:
- Mon Nov 12 15:36:45 2012 +0000
- Revision:
- 0:475e05403ad8
1st build
Who changed what in which revision?
User | Revision | Line number | New 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 | } |