Memory File System Library, for SPI PRAM NP8P128A13 (Micron) see: http://mbed.org/users/okini3939/notebook/extend-memory/
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 }
Generated on Fri Jul 15 2022 01:24:20 by 1.7.2