summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-11-03 20:52:27 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-11-03 20:52:27 +0000
commit214cd81f080436fddb1994ed712f1000e143dfd7 (patch)
tree98e8deb0db4160385c4b73291031e61c4bc0c516
parent65d9ca8a6f557847cf87ffe37e5b1ef48b1fa11b (diff)
downloadrockbox-214cd81f080436fddb1994ed712f1000e143dfd7.tar.gz
rockbox-214cd81f080436fddb1994ed712f1000e143dfd7.zip
Add ramdisk storage driver. It will be useful for developing multi-driver storage
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18993 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/SOURCES2
-rw-r--r--firmware/drivers/ramdisk.c102
-rw-r--r--firmware/export/config.h9
-rw-r--r--firmware/export/ramdisk.h53
-rw-r--r--firmware/export/storage.h31
-rw-r--r--firmware/usbstack/usb_core.c13
6 files changed, 206 insertions, 4 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 567fa1c579..f299d51a53 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -117,6 +117,8 @@ drivers/ata_flash.c
117target/arm/ata-nand-telechips.c 117target/arm/ata-nand-telechips.c
118#elif (CONFIG_STORAGE & STORAGE_ATA) 118#elif (CONFIG_STORAGE & STORAGE_ATA)
119drivers/ata.c 119drivers/ata.c
120#elif (CONFIG_STORAGE & STORAGE_RAMDISK)
121drivers/ramdisk.c
120#endif /* CONFIG_STORAGE */ 122#endif /* CONFIG_STORAGE */
121drivers/fat.c 123drivers/fat.c
122#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD) 124#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
diff --git a/firmware/drivers/ramdisk.c b/firmware/drivers/ramdisk.c
new file mode 100644
index 0000000000..da0a12f836
--- /dev/null
+++ b/firmware/drivers/ramdisk.c
@@ -0,0 +1,102 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: ramdisk.c 18965 2008-11-01 17:33:21Z gevaerts $
9 *
10 * Copyright (C) 2008 Frank Gevaerts
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include <stdbool.h>
23#include <string.h>
24
25#include "storage.h"
26
27#define SECTOR_SIZE 512
28#define NUM_SECTORS 16384
29
30extern unsigned char ramdisk[SECTOR_SIZE * NUM_SECTORS];
31
32long last_disk_activity = -1;
33
34int ramdisk_read_sectors(IF_MV2(int drive,)
35 unsigned long start,
36 int count,
37 void* buf)
38{
39 if(start+count>=NUM_SECTORS)
40 {
41 return -1;
42 }
43 memcpy(buf,&ramdisk[start*SECTOR_SIZE],count*SECTOR_SIZE);
44 return 0;
45}
46
47int ramdisk_write_sectors(IF_MV2(int drive,)
48 unsigned long start,
49 int count,
50 const void* buf)
51{
52 if(start+count>=NUM_SECTORS)
53 {
54 return -1;
55 }
56 memcpy(&ramdisk[start*SECTOR_SIZE],buf,count*SECTOR_SIZE);
57 return 0;
58}
59
60int ramdisk_init(void)
61{
62 return 0;
63}
64
65long ramdisk_last_disk_activity(void)
66{
67 return last_disk_activity;
68}
69
70void ramdisk_sleep(void)
71{
72}
73
74void ramdisk_spin(void)
75{
76}
77
78void ramdisk_sleepnow(void)
79{
80}
81
82void ramdisk_spindown(int seconds)
83{
84 (void)seconds;
85}
86#ifdef STORAGE_GET_INFO
87void ramdisk_get_info(struct storage_info *info)
88{
89 /* firmware version */
90 info->revision="0.00";
91
92 /* vendor field, need better name? */
93 info->vendor="Rockbox";
94 /* model field, need better name? */
95 info->product="Ramdisk";
96
97 /* blocks count */
98 info->num_sectors=NUM_SECTORS;
99 info->sector_size=SECTOR_SIZE;
100}
101#endif
102
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 1574d40040..914ac1ee9d 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -29,10 +29,11 @@
29/* symbolic names for multiple choice configurations: */ 29/* symbolic names for multiple choice configurations: */
30 30
31/* CONFIG_STORAGE (note these are combineable bit-flags) */ 31/* CONFIG_STORAGE (note these are combineable bit-flags) */
32#define STORAGE_ATA 0x01 32#define STORAGE_ATA 0x01
33#define STORAGE_MMC 0x02 33#define STORAGE_MMC 0x02
34#define STORAGE_SD 0x04 34#define STORAGE_SD 0x04
35#define STORAGE_NAND 0x08 35#define STORAGE_NAND 0x08
36#define STORAGE_RAMDISK 0x10
36 37
37/* CONFIG_TUNER (note these are combineable bit-flags) */ 38/* CONFIG_TUNER (note these are combineable bit-flags) */
38#define S1A0903X01 0x01 /* Samsung */ 39#define S1A0903X01 0x01 /* Samsung */
diff --git a/firmware/export/ramdisk.h b/firmware/export/ramdisk.h
new file mode 100644
index 0000000000..7fb8fb7cbc
--- /dev/null
+++ b/firmware/export/ramdisk.h
@@ -0,0 +1,53 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 by Alan Korr
11 * Copyright (C) 2008 by Frank Gevaerts
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
17 *
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
20 *
21 ****************************************************************************/
22#ifndef __RAMDISK_H__
23#define __RAMDISK_H__
24
25#include <stdbool.h>
26#include "mv.h" /* for HAVE_MULTIVOLUME or not */
27
28struct storage_info;
29
30void ramdisk_enable(bool on);
31void ramdisk_spindown(int seconds);
32void ramdisk_sleep(void);
33bool ramdisk_disk_is_active(void);
34int ramdisk_hard_reset(void);
35int ramdisk_soft_reset(void);
36int ramdisk_init(void);
37void ramdisk_close(void);
38int ramdisk_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf);
39int ramdisk_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf);
40void ramdisk_spin(void);
41void ramdisk_sleepnow(void);
42
43#if (CONFIG_LED == LED_REAL)
44void ramdisk_set_led_enabled(bool enabled);
45#endif
46
47#ifdef STORAGE_GET_INFO
48void ramdisk_get_info(IF_MV2(int drive,) struct storage_info *info);
49#endif
50
51long ramdisk_last_disk_activity(void);
52
53#endif
diff --git a/firmware/export/storage.h b/firmware/export/storage.h
index d4e69163b7..4040fe952f 100644
--- a/firmware/export/storage.h
+++ b/firmware/export/storage.h
@@ -38,6 +38,9 @@
38#if (CONFIG_STORAGE & STORAGE_NAND) 38#if (CONFIG_STORAGE & STORAGE_NAND)
39#include "nand.h" 39#include "nand.h"
40#endif 40#endif
41#if (CONFIG_STORAGE & STORAGE_RAMDISK)
42#include "ramdisk.h"
43#endif
41 44
42struct storage_info 45struct storage_info
43{ 46{
@@ -165,6 +168,34 @@ struct storage_info
165 #define storage_removable(drive) nand_removable(IF_MV(drive)) 168 #define storage_removable(drive) nand_removable(IF_MV(drive))
166 #define storage_present(drive) nand_present(IF_MV(drive)) 169 #define storage_present(drive) nand_present(IF_MV(drive))
167 #endif 170 #endif
171 #elif (CONFIG_STORAGE & STORAGE_RAMDISK)
172 #define storage_spindown ramdisk_spindown
173 #define storage_sleep ramdisk_sleep
174 #define storage_spin ramdisk_spin
175
176 #define storage_enable(on) (void)0
177 #define storage_sleepnow() ramdisk_sleepnow()
178 #define storage_disk_is_active() 0
179 #define storage_hard_reset() (void)0
180 #define storage_soft_reset() (void)0
181 #define storage_init() ramdisk_init()
182 #define storage_close() ramdisk_close()
183 #define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MV2(drive,) start, count, buf)
184 #define storage_write_sectors(drive, start, count, buf) ramdisk_write_sectors(IF_MV2(drive,) start, count, buf)
185 #define storage_last_disk_activity() ramdisk_last_disk_activity()
186 #define storage_spinup_time() 0
187 #define storage_get_identify() ramdisk_get_identify()
188
189 #if (CONFIG_LED == LED_REAL)
190 #define storage_set_led_enabled(enabled) ramdisk_set_led_enabled(enabled)
191 #endif
192 #ifdef STORAGE_GET_INFO
193 #define storage_get_info(drive, info) ramdisk_get_info(IF_MV2(drive,) info)
194 #endif
195 #ifdef HAVE_HOTSWAP
196 #define storage_removable(drive) ramdisk_removable(IF_MV(drive))
197 #define storage_present(drive) ramdisk_present(IF_MV(drive))
198 #endif
168 #else 199 #else
169 //#error No storage driver! 200 //#error No storage driver!
170 #endif 201 #endif
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index 7724049415..6003c8d197 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -300,6 +300,19 @@ static void set_serial_descriptor(void)
300 } 300 }
301 usb_string_iSerial.bLength=84; 301 usb_string_iSerial.bLength=84;
302} 302}
303#elif (CONFIG_STORAGE & STORAGE_RAMDISK)
304/* This "serial number" isn't unique, but it should never actually
305 appear in non-testing use */
306static void set_serial_descriptor(void)
307{
308 short* p = &usb_string_iSerial.wString[1];
309 int i;
310 for (i = 0; i < 16; i++) {
311 *p++ = hex[(2*i)&0xF];
312 *p++ = hex[(2*i+1)&0xF];
313 }
314 usb_string_iSerial.bLength=68;
315}
303#else 316#else
304#error No set_serial_descriptor() implementation for this target 317#error No set_serial_descriptor() implementation for this target
305#endif 318#endif