This library implements a USB Mass Storage device in the ethernet RAM bank
Dependents: Lab8_USB-MSD_RAM_HelloWorld_mbed
Fork of USBMSD_SD by
USBMSD_RAM.cpp@5:eebd06a7ddf0, 2014-03-26 (annotated)
- Committer:
- jakowisp
- Date:
- Wed Mar 26 07:45:40 2014 +0000
- Revision:
- 5:eebd06a7ddf0
Setup the library to use both AHBSRAM0 and AHBSRAM1.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jakowisp | 5:eebd06a7ddf0 | 1 | /** This library is based on the USBMSD_SD library. |
jakowisp | 5:eebd06a7ddf0 | 2 | * Modifications for using RAM were made by avnisha |
jakowisp | 5:eebd06a7ddf0 | 3 | * Only modifications doen by Dwayne Dilbeck were to remove the SD functions, and change the RAM location to the Ethernet RAM |
jakowisp | 5:eebd06a7ddf0 | 4 | */ |
jakowisp | 5:eebd06a7ddf0 | 5 | |
jakowisp | 5:eebd06a7ddf0 | 6 | |
jakowisp | 5:eebd06a7ddf0 | 7 | #include "USBMSD_RAM.h" |
jakowisp | 5:eebd06a7ddf0 | 8 | #include "mbed_debug.h" |
jakowisp | 5:eebd06a7ddf0 | 9 | |
jakowisp | 5:eebd06a7ddf0 | 10 | #define SD_COMMAND_TIMEOUT 5000 |
jakowisp | 5:eebd06a7ddf0 | 11 | #define SD_DBG 0 |
jakowisp | 5:eebd06a7ddf0 | 12 | #define BLOCKS 32 |
jakowisp | 5:eebd06a7ddf0 | 13 | #define FS BLOCKS*512 |
jakowisp | 5:eebd06a7ddf0 | 14 | |
jakowisp | 5:eebd06a7ddf0 | 15 | LocalFileSystem local("local"); |
jakowisp | 5:eebd06a7ddf0 | 16 | |
jakowisp | 5:eebd06a7ddf0 | 17 | char s0[FS] __attribute__((section("AHBSRAM1"))); |
jakowisp | 5:eebd06a7ddf0 | 18 | char s1[FS] __attribute__((section("AHBSRAM0"))); |
jakowisp | 5:eebd06a7ddf0 | 19 | int status = 1; |
jakowisp | 5:eebd06a7ddf0 | 20 | |
jakowisp | 5:eebd06a7ddf0 | 21 | USBMSD_RAM::USBMSD_RAM(PinName mosi, PinName miso, PinName sclk, PinName cs) : |
jakowisp | 5:eebd06a7ddf0 | 22 | _spi(mosi, miso, sclk), _cs(cs) { |
jakowisp | 5:eebd06a7ddf0 | 23 | _cs = 1; |
jakowisp | 5:eebd06a7ddf0 | 24 | |
jakowisp | 5:eebd06a7ddf0 | 25 | printf("cons\n"); |
jakowisp | 5:eebd06a7ddf0 | 26 | connect(); |
jakowisp | 5:eebd06a7ddf0 | 27 | } |
jakowisp | 5:eebd06a7ddf0 | 28 | |
jakowisp | 5:eebd06a7ddf0 | 29 | int USBMSD_RAM::disk_initialize() { |
jakowisp | 5:eebd06a7ddf0 | 30 | |
jakowisp | 5:eebd06a7ddf0 | 31 | printf("ini\n"); |
jakowisp | 5:eebd06a7ddf0 | 32 | status--; |
jakowisp | 5:eebd06a7ddf0 | 33 | return 0; |
jakowisp | 5:eebd06a7ddf0 | 34 | } |
jakowisp | 5:eebd06a7ddf0 | 35 | |
jakowisp | 5:eebd06a7ddf0 | 36 | int USBMSD_RAM::disk_write(const uint8_t *buffer, uint64_t block_number) { |
jakowisp | 5:eebd06a7ddf0 | 37 | |
jakowisp | 5:eebd06a7ddf0 | 38 | // |
jakowisp | 5:eebd06a7ddf0 | 39 | // find the correct block and write |
jakowisp | 5:eebd06a7ddf0 | 40 | // |
jakowisp | 5:eebd06a7ddf0 | 41 | int offset; |
jakowisp | 5:eebd06a7ddf0 | 42 | int i; |
jakowisp | 5:eebd06a7ddf0 | 43 | char *s; |
jakowisp | 5:eebd06a7ddf0 | 44 | |
jakowisp | 5:eebd06a7ddf0 | 45 | //printf("write\n"); |
jakowisp | 5:eebd06a7ddf0 | 46 | if (block_number > (BLOCKS -1)) return 1; |
jakowisp | 5:eebd06a7ddf0 | 47 | offset = 512 * block_number; |
jakowisp | 5:eebd06a7ddf0 | 48 | if (block_number < FS) |
jakowisp | 5:eebd06a7ddf0 | 49 | s=(char *)&s0; |
jakowisp | 5:eebd06a7ddf0 | 50 | else |
jakowisp | 5:eebd06a7ddf0 | 51 | s=(char *)&s1; |
jakowisp | 5:eebd06a7ddf0 | 52 | for (i = 0; i < 512; i++) { |
jakowisp | 5:eebd06a7ddf0 | 53 | s[offset + i] = buffer[i]; |
jakowisp | 5:eebd06a7ddf0 | 54 | } |
jakowisp | 5:eebd06a7ddf0 | 55 | return 0; |
jakowisp | 5:eebd06a7ddf0 | 56 | } |
jakowisp | 5:eebd06a7ddf0 | 57 | |
jakowisp | 5:eebd06a7ddf0 | 58 | int USBMSD_RAM::disk_read(uint8_t *buffer, uint64_t block_number) { |
jakowisp | 5:eebd06a7ddf0 | 59 | |
jakowisp | 5:eebd06a7ddf0 | 60 | int offset; |
jakowisp | 5:eebd06a7ddf0 | 61 | int i; |
jakowisp | 5:eebd06a7ddf0 | 62 | char *s; |
jakowisp | 5:eebd06a7ddf0 | 63 | |
jakowisp | 5:eebd06a7ddf0 | 64 | //printf("read\n"); |
jakowisp | 5:eebd06a7ddf0 | 65 | if (block_number > (BLOCKS -1)) return 1; |
jakowisp | 5:eebd06a7ddf0 | 66 | offset = 512 * block_number; |
jakowisp | 5:eebd06a7ddf0 | 67 | if (block_number < FS) |
jakowisp | 5:eebd06a7ddf0 | 68 | s=(char *)&s0; |
jakowisp | 5:eebd06a7ddf0 | 69 | else |
jakowisp | 5:eebd06a7ddf0 | 70 | s=(char *)&s1; |
jakowisp | 5:eebd06a7ddf0 | 71 | for (i = 0; i < 512; i++) { |
jakowisp | 5:eebd06a7ddf0 | 72 | buffer[i] = s[offset + i]; |
jakowisp | 5:eebd06a7ddf0 | 73 | } |
jakowisp | 5:eebd06a7ddf0 | 74 | return 0; |
jakowisp | 5:eebd06a7ddf0 | 75 | } |
jakowisp | 5:eebd06a7ddf0 | 76 | |
jakowisp | 5:eebd06a7ddf0 | 77 | int USBMSD_RAM::disk_status() { |
jakowisp | 5:eebd06a7ddf0 | 78 | printf("status\n"); |
jakowisp | 5:eebd06a7ddf0 | 79 | return status; |
jakowisp | 5:eebd06a7ddf0 | 80 | } |
jakowisp | 5:eebd06a7ddf0 | 81 | |
jakowisp | 5:eebd06a7ddf0 | 82 | |
jakowisp | 5:eebd06a7ddf0 | 83 | int USBMSD_RAM::disk_sync() { printf("sync\n"); return 0; } |
jakowisp | 5:eebd06a7ddf0 | 84 | uint64_t USBMSD_RAM::disk_size() { |
jakowisp | 5:eebd06a7ddf0 | 85 | printf("size\n"); |
jakowisp | 5:eebd06a7ddf0 | 86 | printf("Location s0 : %x\n", &s0); |
jakowisp | 5:eebd06a7ddf0 | 87 | printf("Location s1 : %x\n", &s1); |
jakowisp | 5:eebd06a7ddf0 | 88 | return 2*FS; |
jakowisp | 5:eebd06a7ddf0 | 89 | } |
jakowisp | 5:eebd06a7ddf0 | 90 | uint64_t USBMSD_RAM::disk_sectors() { printf("sectors\n"); return BLOCKS; } |