forked from len0rd/rockbox
Apply FS#9500. This adds a storage_*() abstraction to replace ata_*(). To do that, it also introduces sd_*, nand_*, and mmc_*.
This should be a good first step to allow multi-driver targets, like the Elio (ATA/SD), or the D2 (NAND/SD). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18960 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
646cac0bde
commit
2f8a0081c6
64 changed files with 541 additions and 554 deletions
|
@ -26,7 +26,7 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "buffering.h"
|
#include "buffering.h"
|
||||||
|
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
|
@ -832,7 +832,7 @@ static bool fill_buffer(void)
|
||||||
{
|
{
|
||||||
/* only spin the disk down if the filling wasn't interrupted by an
|
/* only spin the disk down if the filling wasn't interrupted by an
|
||||||
event arriving in the queue. */
|
event arriving in the queue. */
|
||||||
ata_sleep();
|
storage_sleep();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1408,7 +1408,7 @@ void buffering_thread(void)
|
||||||
* for simplicity until its done right */
|
* for simplicity until its done right */
|
||||||
#if MEM > 8
|
#if MEM > 8
|
||||||
/* If the disk is spinning, take advantage by filling the buffer */
|
/* If the disk is spinning, take advantage by filling the buffer */
|
||||||
else if (ata_disk_is_active() && queue_empty(&buffering_queue))
|
else if (storage_disk_is_active() && queue_empty(&buffering_queue))
|
||||||
{
|
{
|
||||||
if (num_handles > 0 && data_counters.useful <= high_watermark)
|
if (num_handles > 0 && data_counters.useful <= high_watermark)
|
||||||
send_event(BUFFER_EVENT_BUFFER_LOW, 0);
|
send_event(BUFFER_EVENT_BUFFER_LOW, 0);
|
||||||
|
|
|
@ -43,7 +43,7 @@
|
||||||
#include "buffering.h"
|
#include "buffering.h"
|
||||||
#include "mp3_playback.h"
|
#include "mp3_playback.h"
|
||||||
#include "backlight.h"
|
#include "backlight.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "talk.h"
|
#include "talk.h"
|
||||||
#include "mp3data.h"
|
#include "mp3data.h"
|
||||||
#include "powermgmt.h"
|
#include "powermgmt.h"
|
||||||
|
|
|
@ -59,13 +59,16 @@
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "rtc.h"
|
#include "rtc.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "mas.h"
|
#include "mas.h"
|
||||||
#include "eeprom_24cxx.h"
|
#include "eeprom_24cxx.h"
|
||||||
#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
|
#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
|
||||||
#include "hotswap.h"
|
#include "hotswap.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||||
|
#include "ata.h"
|
||||||
|
#endif
|
||||||
#if CONFIG_TUNER
|
#if CONFIG_TUNER
|
||||||
#include "tuner.h"
|
#include "tuner.h"
|
||||||
#include "radio.h"
|
#include "radio.h"
|
||||||
|
@ -1731,11 +1734,13 @@ static bool view_battery(void)
|
||||||
|
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
|
#if (CONFIG_STORAGE & STORAGE_MMC) || (CONFIG_STORAGE & STORAGE_SD)
|
||||||
|
|
||||||
#if (CONFIG_STORAGE & STORAGE_MMC)
|
#if (CONFIG_STORAGE & STORAGE_MMC)
|
||||||
#define CARDTYPE "MMC"
|
#define CARDTYPE "MMC"
|
||||||
#else
|
#elif (CONFIG_STORAGE & STORAGE_SD)
|
||||||
#define CARDTYPE "microSD"
|
#define CARDTYPE "microSD"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int disk_callback(int btn, struct gui_synclist *lists)
|
static int disk_callback(int btn, struct gui_synclist *lists)
|
||||||
{
|
{
|
||||||
tCardInfo *card;
|
tCardInfo *card;
|
||||||
|
@ -1826,7 +1831,7 @@ static int disk_callback(int btn, struct gui_synclist *lists)
|
||||||
}
|
}
|
||||||
return btn;
|
return btn;
|
||||||
}
|
}
|
||||||
#else /* !(CONFIG_STORAGE & STORAGE_MMC) && !(CONFIG_STORAGE & STORAGE_SD) */
|
#elif (CONFIG_STORAGE & STORAGE_ATA)
|
||||||
static int disk_callback(int btn, struct gui_synclist *lists)
|
static int disk_callback(int btn, struct gui_synclist *lists)
|
||||||
{
|
{
|
||||||
(void)lists;
|
(void)lists;
|
||||||
|
@ -1860,7 +1865,7 @@ static int disk_callback(int btn, struct gui_synclist *lists)
|
||||||
simplelist_addline(SIMPLELIST_ADD_LINE,
|
simplelist_addline(SIMPLELIST_ADD_LINE,
|
||||||
"Free: %ld MB", free / 1024);
|
"Free: %ld MB", free / 1024);
|
||||||
simplelist_addline(SIMPLELIST_ADD_LINE,
|
simplelist_addline(SIMPLELIST_ADD_LINE,
|
||||||
"Spinup time: %d ms", ata_spinup_time * (1000/HZ));
|
"Spinup time: %d ms", storage_spinup_time() * (1000/HZ));
|
||||||
i = identify_info[83] & (1<<3);
|
i = identify_info[83] & (1<<3);
|
||||||
simplelist_addline(SIMPLELIST_ADD_LINE,
|
simplelist_addline(SIMPLELIST_ADD_LINE,
|
||||||
"Power mgmt: %s", i ? "enabled" : "unsupported");
|
"Power mgmt: %s", i ? "enabled" : "unsupported");
|
||||||
|
@ -1945,7 +1950,29 @@ static int disk_callback(int btn, struct gui_synclist *lists)
|
||||||
"Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
|
"Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
|
||||||
return btn;
|
return btn;
|
||||||
}
|
}
|
||||||
|
#else /* No SD, MMC or ATA */
|
||||||
|
static int disk_callback(int btn, struct gui_synclist *lists)
|
||||||
|
{
|
||||||
|
(void)btn;
|
||||||
|
(void)lists;
|
||||||
|
struct storage_info info;
|
||||||
|
storage_get_info(IF_MV2(0,)&info);
|
||||||
|
simplelist_addline(SIMPLELIST_ADD_LINE, "Vendor: %s", info.vendor);
|
||||||
|
simplelist_addline(SIMPLELIST_ADD_LINE, "Model: %s", info.product);
|
||||||
|
simplelist_addline(SIMPLELIST_ADD_LINE, "Firmware: %s", info.revision);
|
||||||
|
simplelist_addline(SIMPLELIST_ADD_LINE,
|
||||||
|
"Size: %ld MB", info.num_sectors*(info.sector_size/512)/2024);
|
||||||
|
unsigned long free;
|
||||||
|
fat_size( IF_MV2(0,) NULL, &free );
|
||||||
|
simplelist_addline(SIMPLELIST_ADD_LINE,
|
||||||
|
"Free: %ld MB", free / 1024);
|
||||||
|
simplelist_addline(SIMPLELIST_ADD_LINE,
|
||||||
|
"Cluster size: %d bytes", fat_get_cluster_size(IF_MV(0)));
|
||||||
|
return btn;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||||
static bool dbg_identify_info(void)
|
static bool dbg_identify_info(void)
|
||||||
{
|
{
|
||||||
int fd = creat("/identify_info.bin");
|
int fd = creat("/identify_info.bin");
|
||||||
|
@ -1960,7 +1987,7 @@ static bool dbg_identify_info(void)
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#endif /* !(CONFIG_STORAGE & STORAGE_MMC) && !(CONFIG_STORAGE & STORAGE_SD) */
|
#endif
|
||||||
|
|
||||||
static bool dbg_disk_info(void)
|
static bool dbg_disk_info(void)
|
||||||
{
|
{
|
||||||
|
@ -2504,7 +2531,7 @@ static const struct the_menu_item menuitems[] = {
|
||||||
#endif
|
#endif
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
{ "View disk info", dbg_disk_info },
|
{ "View disk info", dbg_disk_info },
|
||||||
#if !(CONFIG_STORAGE & STORAGE_MMC) && !(CONFIG_STORAGE & STORAGE_SD)
|
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||||
{ "Dump ATA identify info", dbg_identify_info},
|
{ "Dump ATA identify info", dbg_identify_info},
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "screens.h"
|
#include "screens.h"
|
||||||
#include "playlist.h"
|
#include "playlist.h"
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
@ -184,7 +184,7 @@ long gui_wps_show(void)
|
||||||
if (wps_state.paused) {
|
if (wps_state.paused) {
|
||||||
settings_save();
|
settings_save();
|
||||||
#if !defined(HAVE_RTC_RAM) && !defined(HAVE_SW_POWEROFF)
|
#if !defined(HAVE_RTC_RAM) && !defined(HAVE_SW_POWEROFF)
|
||||||
call_ata_idle_notifys(true);
|
call_storage_idle_notifys(true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,7 @@ long gui_wps_show(void)
|
||||||
audio_pause();
|
audio_pause();
|
||||||
settings_save();
|
settings_save();
|
||||||
#if !defined(HAVE_RTC_RAM) && !defined(HAVE_SW_POWEROFF)
|
#if !defined(HAVE_RTC_RAM) && !defined(HAVE_SW_POWEROFF)
|
||||||
call_ata_idle_notifys(true); /* make sure resume info is saved */
|
call_storage_idle_notifys(true); /* make sure resume info is saved */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -701,7 +701,7 @@ long gui_wps_show(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( button )
|
if ( button )
|
||||||
ata_spin();
|
storage_spin();
|
||||||
}
|
}
|
||||||
return GO_TO_ROOT; /* unreachable - just to reduce compiler warnings */
|
return GO_TO_ROOT; /* unreachable - just to reduce compiler warnings */
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
|
@ -289,7 +289,7 @@ static void init(void)
|
||||||
#endif
|
#endif
|
||||||
/* Must be done before any code uses the multi-screen APi */
|
/* Must be done before any code uses the multi-screen APi */
|
||||||
gui_syncstatusbar_init(&statusbars);
|
gui_syncstatusbar_init(&statusbars);
|
||||||
ata_init();
|
storage_init();
|
||||||
settings_reset();
|
settings_reset();
|
||||||
settings_load(SETTINGS_ALL);
|
settings_load(SETTINGS_ALL);
|
||||||
gui_sync_wps_init();
|
gui_sync_wps_init();
|
||||||
|
@ -427,7 +427,7 @@ static void init(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "mp3_playback.h"
|
#include "mp3_playback.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "ata_idle_notify.h"
|
#include "ata_idle_notify.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
@ -621,7 +621,7 @@ bool settings_parseline(char* line, char** name, char** value)
|
||||||
static void system_flush(void)
|
static void system_flush(void)
|
||||||
{
|
{
|
||||||
tree_flush();
|
tree_flush();
|
||||||
call_ata_idle_notifys(true); /*doesnt work on usb and shutdown from ata thread */
|
call_storage_idle_notifys(true); /*doesnt work on usb and shutdown from ata thread */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void system_restore(void)
|
static void system_restore(void)
|
||||||
|
@ -635,7 +635,7 @@ static bool clean_shutdown(void (*callback)(void *), void *parameter)
|
||||||
(void)callback;
|
(void)callback;
|
||||||
(void)parameter;
|
(void)parameter;
|
||||||
bookmark_autobookmark();
|
bookmark_autobookmark();
|
||||||
call_ata_idle_notifys(true);
|
call_storage_idle_notifys(true);
|
||||||
exit(0);
|
exit(0);
|
||||||
#else
|
#else
|
||||||
long msg_id = -1;
|
long msg_id = -1;
|
||||||
|
|
10
apps/mpeg.c
10
apps/mpeg.c
|
@ -29,7 +29,7 @@
|
||||||
#include "metadata.h"
|
#include "metadata.h"
|
||||||
#include "mpeg.h"
|
#include "mpeg.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include <kernel.h>
|
#include <kernel.h>
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
|
@ -509,7 +509,7 @@ static void generate_postbuffer_events(void)
|
||||||
static void recalculate_watermark(int bitrate)
|
static void recalculate_watermark(int bitrate)
|
||||||
{
|
{
|
||||||
int bytes_per_sec;
|
int bytes_per_sec;
|
||||||
int time = ata_spinup_time;
|
int time = storage_spinup_time();
|
||||||
|
|
||||||
/* A bitrate of 0 probably means empty VBR header. We play safe
|
/* A bitrate of 0 probably means empty VBR header. We play safe
|
||||||
and set a high threshold */
|
and set a high threshold */
|
||||||
|
@ -1589,7 +1589,7 @@ static void mpeg_thread(void)
|
||||||
DEBUGF("0\n");
|
DEBUGF("0\n");
|
||||||
filling = false;
|
filling = false;
|
||||||
generate_postbuffer_events();
|
generate_postbuffer_events();
|
||||||
ata_sleep();
|
storage_sleep();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1947,7 +1947,7 @@ static void mpeg_thread(void)
|
||||||
rc = fsync(mpeg_file);
|
rc = fsync(mpeg_file);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
panicf("rec fls: %d", rc);
|
panicf("rec fls: %d", rc);
|
||||||
ata_sleep();
|
storage_sleep();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NEW_FILE:
|
case NEW_FILE:
|
||||||
|
@ -1957,7 +1957,7 @@ static void mpeg_thread(void)
|
||||||
panicf("rec cls: %d", rc);
|
panicf("rec cls: %d", rc);
|
||||||
mpeg_file = -1;
|
mpeg_file = -1;
|
||||||
update_header();
|
update_header();
|
||||||
ata_sleep();
|
storage_sleep();
|
||||||
|
|
||||||
/* copy new filename */
|
/* copy new filename */
|
||||||
strcpy(delayed_filename, recording_filename);
|
strcpy(delayed_filename, recording_filename);
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
#include "mp3_playback.h"
|
#include "mp3_playback.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "screens.h"
|
#include "screens.h"
|
||||||
#include "playlist.h"
|
#include "playlist.h"
|
||||||
#include "playback.h"
|
#include "playback.h"
|
||||||
|
|
|
@ -1266,7 +1266,7 @@ static void playlist_thread(void)
|
||||||
if (playlist->control_fd >= 0)
|
if (playlist->control_fd >= 0)
|
||||||
{
|
{
|
||||||
if (playlist->num_cached > 0)
|
if (playlist->num_cached > 0)
|
||||||
register_ata_idle_func(playlist_flush_callback);
|
register_storage_idle_func(playlist_flush_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dirty_pointers)
|
if (!dirty_pointers)
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "option_select.h"
|
#include "option_select.h"
|
||||||
#include "talk.h"
|
#include "talk.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
#include "storage.h"
|
||||||
|
|
||||||
#if CONFIG_CHARGING
|
#if CONFIG_CHARGING
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
@ -265,13 +266,13 @@ static const struct plugin_api rockbox_api = {
|
||||||
fdprintf,
|
fdprintf,
|
||||||
read_line,
|
read_line,
|
||||||
settings_parseline,
|
settings_parseline,
|
||||||
ata_sleep,
|
storage_sleep,
|
||||||
ata_spin,
|
storage_spin,
|
||||||
ata_spindown,
|
storage_spindown,
|
||||||
#if USING_ATA_CALLBACK
|
#if USING_STORAGE_CALLBACK
|
||||||
register_ata_idle_func,
|
register_storage_idle_func,
|
||||||
unregister_ata_idle_func,
|
unregister_storage_idle_func,
|
||||||
#endif /* USING_ATA_CALLBACK */
|
#endif /* USING_STORAGE_CALLBACK */
|
||||||
reload_directory,
|
reload_directory,
|
||||||
create_numbered_filename,
|
create_numbered_filename,
|
||||||
file_exists,
|
file_exists,
|
||||||
|
|
|
@ -379,13 +379,13 @@ struct plugin_api {
|
||||||
int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
|
int (*fdprintf)(int fd, const char *fmt, ...) ATTRIBUTE_PRINTF(2, 3);
|
||||||
int (*read_line)(int fd, char* buffer, int buffer_size);
|
int (*read_line)(int fd, char* buffer, int buffer_size);
|
||||||
bool (*settings_parseline)(char* line, char** name, char** value);
|
bool (*settings_parseline)(char* line, char** name, char** value);
|
||||||
void (*ata_sleep)(void);
|
void (*storage_sleep)(void);
|
||||||
void (*ata_spin)(void);
|
void (*storage_spin)(void);
|
||||||
void (*ata_spindown)(int seconds);
|
void (*storage_spindown)(int seconds);
|
||||||
#if USING_ATA_CALLBACK
|
#if USING_STORAGE_CALLBACK
|
||||||
void (*register_ata_idle_func)(ata_idle_notify function);
|
void (*register_storage_idle_func)(storage_idle_notify function);
|
||||||
void (*unregister_ata_idle_func)(ata_idle_notify function, bool run);
|
void (*unregister_storage_idle_func)(storage_idle_notify function, bool run);
|
||||||
#endif /* USING_ATA_CALLBACK */
|
#endif /* USING_STORAGE_CALLBACK */
|
||||||
void (*reload_directory)(void);
|
void (*reload_directory)(void);
|
||||||
char *(*create_numbered_filename)(char *buffer, const char *path,
|
char *(*create_numbered_filename)(char *buffer, const char *path,
|
||||||
const char *prefix, const char *suffix,
|
const char *prefix, const char *suffix,
|
||||||
|
|
|
@ -344,7 +344,7 @@ void thread(void)
|
||||||
bat[buf_idx].flags = charge_state();
|
bat[buf_idx].flags = charge_state();
|
||||||
#endif
|
#endif
|
||||||
buf_idx++;
|
buf_idx++;
|
||||||
rb->register_ata_idle_func(flush_buffer);
|
rb->register_storage_idle_func(flush_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* What to do when the measurement buffer is full:
|
/* What to do when the measurement buffer is full:
|
||||||
|
@ -386,7 +386,7 @@ void thread(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unregister flush callback and flush to disk */
|
/* unregister flush callback and flush to disk */
|
||||||
rb->unregister_ata_idle_func(flush_buffer, true);
|
rb->unregister_storage_idle_func(flush_buffer, true);
|
||||||
|
|
||||||
/* log end of bench and exit reason */
|
/* log end of bench and exit reason */
|
||||||
fd = rb->open(BATTERY_LOG, O_RDWR | O_CREAT | O_APPEND);
|
fd = rb->open(BATTERY_LOG, O_RDWR | O_CREAT | O_APPEND);
|
||||||
|
|
|
@ -173,7 +173,7 @@ void load_settings(void){
|
||||||
draw_message(display, MESSAGE_ERRLOAD, 1);
|
draw_message(display, MESSAGE_ERRLOAD, 1);
|
||||||
display->update();
|
display->update();
|
||||||
}
|
}
|
||||||
rb->ata_sleep();
|
rb->storage_sleep();
|
||||||
rb->sleep(HZ);
|
rb->sleep(HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -438,14 +438,14 @@ int show_menu(void) /* return 1 to quit */
|
||||||
#if !defined(SIMULATOR) && defined(HAVE_DISK_STORAGE)
|
#if !defined(SIMULATOR) && defined(HAVE_DISK_STORAGE)
|
||||||
/* change ata spindown time based on slideshow time setting */
|
/* change ata spindown time based on slideshow time setting */
|
||||||
immediate_ata_off = false;
|
immediate_ata_off = false;
|
||||||
rb->ata_spindown(rb->global_settings->disk_spindown);
|
rb->storage_spindown(rb->global_settings->disk_spindown);
|
||||||
|
|
||||||
if (slideshow_enabled)
|
if (slideshow_enabled)
|
||||||
{
|
{
|
||||||
if(jpeg_settings.ss_timeout < 10)
|
if(jpeg_settings.ss_timeout < 10)
|
||||||
{
|
{
|
||||||
/* slideshow times < 10s keep disk spinning */
|
/* slideshow times < 10s keep disk spinning */
|
||||||
rb->ata_spindown(0);
|
rb->storage_spindown(0);
|
||||||
}
|
}
|
||||||
else if (!rb->mp3_is_playing())
|
else if (!rb->mp3_is_playing())
|
||||||
{
|
{
|
||||||
|
@ -1057,7 +1057,7 @@ int load_and_show(char* filename)
|
||||||
else if(immediate_ata_off)
|
else if(immediate_ata_off)
|
||||||
{
|
{
|
||||||
/* running slideshow and time is long enough: power down disk */
|
/* running slideshow and time is long enough: power down disk */
|
||||||
rb->ata_sleep();
|
rb->storage_sleep();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1259,7 +1259,7 @@ enum plugin_status plugin_start(const struct plugin_api* api, const void* parame
|
||||||
|
|
||||||
#if !defined(SIMULATOR) && defined(HAVE_DISK_STORAGE)
|
#if !defined(SIMULATOR) && defined(HAVE_DISK_STORAGE)
|
||||||
/* set back ata spindown time in case we changed it */
|
/* set back ata spindown time in case we changed it */
|
||||||
rb->ata_spindown(rb->global_settings->disk_spindown);
|
rb->storage_spindown(rb->global_settings->disk_spindown);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Turn on backlight timeout (revert to settings) */
|
/* Turn on backlight timeout (revert to settings) */
|
||||||
|
|
|
@ -171,7 +171,7 @@ static inline void disk_buf_buffer(void)
|
||||||
if (!stream_get_window(&sw))
|
if (!stream_get_window(&sw))
|
||||||
{
|
{
|
||||||
disk_buf.state = TSTATE_DATA;
|
disk_buf.state = TSTATE_DATA;
|
||||||
rb->ata_sleep();
|
rb->storage_sleep();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ static inline void disk_buf_buffer(void)
|
||||||
/* Free space is less than one page */
|
/* Free space is less than one page */
|
||||||
disk_buf.state = TSTATE_DATA;
|
disk_buf.state = TSTATE_DATA;
|
||||||
disk_buf.low_wm = DISK_BUF_LOW_WATERMARK;
|
disk_buf.low_wm = DISK_BUF_LOW_WATERMARK;
|
||||||
rb->ata_sleep();
|
rb->storage_sleep();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,7 +208,7 @@ static inline void disk_buf_buffer(void)
|
||||||
{
|
{
|
||||||
/* Error or end of stream */
|
/* Error or end of stream */
|
||||||
disk_buf.state = TSTATE_EOS;
|
disk_buf.state = TSTATE_EOS;
|
||||||
rb->ata_sleep();
|
rb->storage_sleep();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,7 @@ static inline bool stream_can_seek(void)
|
||||||
static inline void stream_keep_disk_active(void)
|
static inline void stream_keep_disk_active(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DISK_STORAGE
|
#ifdef HAVE_DISK_STORAGE
|
||||||
rb->ata_spin();
|
rb->storage_spin();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -661,7 +661,7 @@ int PlayTick(int fd)
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
rb->ata_sleep(); /* no point in leaving the disk run til timeout */
|
rb->storage_sleep(); /* no point in leaving the disk run til timeout */
|
||||||
gPlay.bDiskSleep = true;
|
gPlay.bDiskSleep = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3598,7 +3598,7 @@ int play_file(char* filename)
|
||||||
if (free_space <= 0)
|
if (free_space <= 0)
|
||||||
{
|
{
|
||||||
filling = false;
|
filling = false;
|
||||||
rb->ata_sleep();
|
rb->storage_sleep();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include "logf.h"
|
#include "logf.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "general.h"
|
#include "general.h"
|
||||||
|
@ -162,7 +162,7 @@ static bool pcm_buffer_empty; /* all pcm chunks processed? */
|
||||||
static int low_watermark; /* Low watermark to stop flush */
|
static int low_watermark; /* Low watermark to stop flush */
|
||||||
static int high_watermark; /* max chunk limit for data flush */
|
static int high_watermark; /* max chunk limit for data flush */
|
||||||
static unsigned long spinup_time = 35*HZ/10; /* Fudged spinup time */
|
static unsigned long spinup_time = 35*HZ/10; /* Fudged spinup time */
|
||||||
static int last_ata_spinup_time = -1;/* previous spin time used */
|
static int last_storage_spinup_time = -1;/* previous spin time used */
|
||||||
#ifdef HAVE_PRIORITY_SCHEDULING
|
#ifdef HAVE_PRIORITY_SCHEDULING
|
||||||
static int flood_watermark; /* boost thread priority when here */
|
static int flood_watermark; /* boost thread priority when here */
|
||||||
#endif
|
#endif
|
||||||
|
@ -731,7 +731,7 @@ static void pcmrec_end_file(void)
|
||||||
*/
|
*/
|
||||||
static void pcmrec_refresh_watermarks(void)
|
static void pcmrec_refresh_watermarks(void)
|
||||||
{
|
{
|
||||||
logf("ata spinup: %d", ata_spinup_time);
|
logf("ata spinup: %d", storage_spinup_time());
|
||||||
|
|
||||||
/* set the low mark for when flushing stops if automatic */
|
/* set the low mark for when flushing stops if automatic */
|
||||||
low_watermark = (LOW_SECONDS*4*sample_rate + (enc_chunk_size-1))
|
low_watermark = (LOW_SECONDS*4*sample_rate + (enc_chunk_size-1))
|
||||||
|
@ -755,7 +755,7 @@ static void pcmrec_refresh_watermarks(void)
|
||||||
|
|
||||||
logf("flood at: %d", flood_watermark);
|
logf("flood at: %d", flood_watermark);
|
||||||
#endif
|
#endif
|
||||||
spinup_time = last_ata_spinup_time = ata_spinup_time;
|
spinup_time = last_storage_spinup_time = storage_spinup_time();
|
||||||
|
|
||||||
/* write at 8s + st remaining in enc_buffer - range 12s to
|
/* write at 8s + st remaining in enc_buffer - range 12s to
|
||||||
20s total - default to 3.5s spinup. */
|
20s total - default to 3.5s spinup. */
|
||||||
|
@ -816,7 +816,7 @@ static void pcmrec_flush(unsigned flush_num)
|
||||||
if (!is_recording)
|
if (!is_recording)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ata_spinup_time != last_ata_spinup_time)
|
if (storage_spinup_time() != last_storage_spinup_time)
|
||||||
pcmrec_refresh_watermarks();
|
pcmrec_refresh_watermarks();
|
||||||
|
|
||||||
/* enough available? no? then leave */
|
/* enough available? no? then leave */
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "scrollbar.h"
|
#include "scrollbar.h"
|
||||||
#include "gwps.h"
|
#include "gwps.h"
|
||||||
|
@ -1343,7 +1343,7 @@ int peak_meter_draw_get_btn(int action_context, int x[], int y[],
|
||||||
* is active, it must not draw too much CPU power or a buffer overrun can
|
* is active, it must not draw too much CPU power or a buffer overrun can
|
||||||
* happen when saving a recording. As a compromise, poll only once per tick
|
* happen when saving a recording. As a compromise, poll only once per tick
|
||||||
* when the disk is active, otherwise spin around as fast as possible. */
|
* when the disk is active, otherwise spin around as fast as possible. */
|
||||||
bool highperf = !ata_disk_is_active();
|
bool highperf = !storage_disk_is_active();
|
||||||
#endif
|
#endif
|
||||||
bool dopeek = true;
|
bool dopeek = true;
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@
|
||||||
#include "errno.h"
|
#include "errno.h"
|
||||||
#include "talk.h"
|
#include "talk.h"
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "splash.h"
|
#include "splash.h"
|
||||||
#include "screen_access.h"
|
#include "screen_access.h"
|
||||||
#include "action.h"
|
#include "action.h"
|
||||||
|
@ -298,7 +298,7 @@ static bool read_peak_levels(int *peak_l, int *peak_r, int *balance)
|
||||||
peak_valid_mem[peak_time % 3] = *peak_l;
|
peak_valid_mem[peak_time % 3] = *peak_l;
|
||||||
if (((peak_valid_mem[0] == peak_valid_mem[1]) &&
|
if (((peak_valid_mem[0] == peak_valid_mem[1]) &&
|
||||||
(peak_valid_mem[1] == peak_valid_mem[2])) &&
|
(peak_valid_mem[1] == peak_valid_mem[2])) &&
|
||||||
((*peak_l < 32767) || ata_disk_is_active()))
|
((*peak_l < 32767) || storage_disk_is_active()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (*peak_r > *peak_l)
|
if (*peak_r > *peak_l)
|
||||||
|
@ -1034,7 +1034,7 @@ bool recording_screen(bool no_source)
|
||||||
rec_status = RCSTAT_IN_RECSCREEN;
|
rec_status = RCSTAT_IN_RECSCREEN;
|
||||||
|
|
||||||
#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
|
#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
|
||||||
ata_set_led_enabled(false);
|
storage_set_led_enabled(false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_CODEC == SWCODEC
|
#if CONFIG_CODEC == SWCODEC
|
||||||
|
@ -1905,7 +1905,7 @@ rec_abort:
|
||||||
reload_directory();
|
reload_directory();
|
||||||
|
|
||||||
#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
|
#if (CONFIG_LED == LED_REAL) && !defined(SIMULATOR)
|
||||||
ata_set_led_enabled(true);
|
storage_set_led_enabled(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_TUNER
|
#if CONFIG_TUNER
|
||||||
|
|
|
@ -180,7 +180,7 @@ static void add_to_cache(unsigned long play_length)
|
||||||
logf("SCROBBLER: %s", scrobbler_entry.path);
|
logf("SCROBBLER: %s", scrobbler_entry.path);
|
||||||
} else {
|
} else {
|
||||||
cache_pos++;
|
cache_pos++;
|
||||||
register_ata_idle_func(scrobbler_flush_callback);
|
register_storage_idle_func(scrobbler_flush_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "rtc.h"
|
#include "rtc.h"
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include "ata_idle_notify.h"
|
#include "ata_idle_notify.h"
|
||||||
|
#include "storage.h"
|
||||||
#include "screens.h"
|
#include "screens.h"
|
||||||
#include "ctype.h"
|
#include "ctype.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
|
@ -582,11 +583,11 @@ void status_save(void)
|
||||||
{
|
{
|
||||||
update_runtime();
|
update_runtime();
|
||||||
#ifdef HAVE_RTC_RAM
|
#ifdef HAVE_RTC_RAM
|
||||||
/* this will be done in the ata_callback if
|
/* this will be done in the storage_callback if
|
||||||
target doesnt have rtc ram */
|
target doesnt have rtc ram */
|
||||||
write_nvram_data(nvram_buffer,NVRAM_BLOCK_SIZE);
|
write_nvram_data(nvram_buffer,NVRAM_BLOCK_SIZE);
|
||||||
#else
|
#else
|
||||||
register_ata_idle_func(flush_global_status_callback);
|
register_storage_idle_func(flush_global_status_callback);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,11 +595,11 @@ int settings_save(void)
|
||||||
{
|
{
|
||||||
update_runtime();
|
update_runtime();
|
||||||
#ifdef HAVE_RTC_RAM
|
#ifdef HAVE_RTC_RAM
|
||||||
/* this will be done in the ata_callback if
|
/* this will be done in the storage_callback if
|
||||||
target doesnt have rtc ram */
|
target doesnt have rtc ram */
|
||||||
write_nvram_data(nvram_buffer,NVRAM_BLOCK_SIZE);
|
write_nvram_data(nvram_buffer,NVRAM_BLOCK_SIZE);
|
||||||
#endif
|
#endif
|
||||||
register_ata_idle_func(flush_config_block_callback);
|
register_storage_idle_func(flush_config_block_callback);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,7 +769,7 @@ void settings_apply(bool read_disk)
|
||||||
buttonlight_set_timeout(global_settings.buttonlight_timeout);
|
buttonlight_set_timeout(global_settings.buttonlight_timeout);
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_DISK_STORAGE
|
#ifdef HAVE_DISK_STORAGE
|
||||||
ata_spindown(global_settings.disk_spindown);
|
storage_spindown(global_settings.disk_spindown);
|
||||||
#endif
|
#endif
|
||||||
#if (CONFIG_CODEC == MAS3507D) && !defined(SIMULATOR)
|
#if (CONFIG_CODEC == MAS3507D) && !defined(SIMULATOR)
|
||||||
dac_line_in(global_settings.line_in);
|
dac_line_in(global_settings.line_in);
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "lang.h"
|
#include "lang.h"
|
||||||
#include "talk.h"
|
#include "talk.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
|
@ -714,7 +714,7 @@ const struct settings_list settings[] = {
|
||||||
/* disk */
|
/* disk */
|
||||||
#ifdef HAVE_DISK_STORAGE
|
#ifdef HAVE_DISK_STORAGE
|
||||||
INT_SETTING(0, disk_spindown, LANG_SPINDOWN, 5, "disk spindown",
|
INT_SETTING(0, disk_spindown, LANG_SPINDOWN, 5, "disk spindown",
|
||||||
UNIT_SEC, 3, 254, 1, NULL, NULL, ata_spindown),
|
UNIT_SEC, 3, 254, 1, NULL, NULL, storage_spindown),
|
||||||
#endif /* HAVE_DISK_STORAGE */
|
#endif /* HAVE_DISK_STORAGE */
|
||||||
/* browser */
|
/* browser */
|
||||||
CHOICE_SETTING(0, dirfilter, LANG_FILTER, SHOW_SUPPORTED, "show files",
|
CHOICE_SETTING(0, dirfilter, LANG_FILTER, SHOW_SUPPORTED, "show files",
|
||||||
|
|
|
@ -3094,7 +3094,7 @@ static void run_command_queue(bool force)
|
||||||
if (force || command_queue_is_full())
|
if (force || command_queue_is_full())
|
||||||
command_queue_sync_callback();
|
command_queue_sync_callback();
|
||||||
else
|
else
|
||||||
register_ata_idle_func(command_queue_sync_callback);
|
register_storage_idle_func(command_queue_sync_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void queue_command(int cmd, long idx_id, int tag, long data)
|
static void queue_command(int cmd, long idx_id, int tag, long data)
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include "filetypes.h"
|
#include "filetypes.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "appevents.h"
|
#include "appevents.h"
|
||||||
|
#include "storage.h"
|
||||||
|
|
||||||
#define FILE_SEARCH_INSTRUCTIONS ROCKBOX_DIR "/tagnavi.config"
|
#define FILE_SEARCH_INSTRUCTIONS ROCKBOX_DIR "/tagnavi.config"
|
||||||
|
|
||||||
|
@ -1057,7 +1058,7 @@ static int retrieve_entries(struct tree_context *c, struct tagcache_search *tcs,
|
||||||
otherwise show it after the normal 1/2 second delay */
|
otherwise show it after the normal 1/2 second delay */
|
||||||
show_search_progress(
|
show_search_progress(
|
||||||
#ifdef HAVE_DISK_STORAGE
|
#ifdef HAVE_DISK_STORAGE
|
||||||
ata_disk_is_active()
|
storage_disk_is_active()
|
||||||
#else
|
#else
|
||||||
true
|
true
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "rolo.h"
|
#include "rolo.h"
|
||||||
#include "icons.h"
|
#include "icons.h"
|
||||||
#include "lang.h"
|
#include "lang.h"
|
||||||
|
@ -828,7 +828,7 @@ static int dirbrowse()
|
||||||
return GO_TO_WPS;
|
return GO_TO_WPS;
|
||||||
if (button)
|
if (button)
|
||||||
{
|
{
|
||||||
ata_spin();
|
storage_spin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "ata-target.h"
|
#include "ata-target.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -64,7 +64,7 @@ void main(void)
|
||||||
printf("Rockbox boot loader");
|
printf("Rockbox boot loader");
|
||||||
printf("Version %s", APPSVERSION);
|
printf("Version %s", APPSVERSION);
|
||||||
|
|
||||||
ret = ata_init();
|
ret = storage_init();
|
||||||
if(ret)
|
if(ret)
|
||||||
printf("ATA error: %d", ret);
|
printf("ATA error: %d", ret);
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
#include "powermgmt.h"
|
#include "powermgmt.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
@ -81,7 +81,7 @@ static bool pause_if_button_pressed(bool pre_usb)
|
||||||
sleep(HZ/5);
|
sleep(HZ/5);
|
||||||
|
|
||||||
/* If the disk powers off, the firmware will lock at startup */
|
/* If the disk powers off, the firmware will lock at startup */
|
||||||
ata_spin();
|
storage_spin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,7 +310,7 @@ static void __attribute__((noreturn)) handle_firmware_load(void)
|
||||||
|
|
||||||
/* Put drivers into a known state */
|
/* Put drivers into a known state */
|
||||||
button_close_device();
|
button_close_device();
|
||||||
ata_close();
|
storage_close();
|
||||||
system_prepare_fw_start();
|
system_prepare_fw_start();
|
||||||
|
|
||||||
if (rc == EOK)
|
if (rc == EOK)
|
||||||
|
@ -353,7 +353,7 @@ void main(void)
|
||||||
|
|
||||||
check_battery();
|
check_battery();
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
reset_screen();
|
reset_screen();
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -75,7 +75,7 @@ void main(void)
|
||||||
(LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg);
|
(LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg);
|
||||||
lcd_update();
|
lcd_update();
|
||||||
|
|
||||||
ata_enable(false);
|
storage_enable(false);
|
||||||
sleep(HZ/20);
|
sleep(HZ/20);
|
||||||
usb_enable(true);
|
usb_enable(true);
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ void main(void)
|
||||||
|
|
||||||
sleep(50); /* ATA seems to error without this pause */
|
sleep(50); /* ATA seems to error without this pause */
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
reset_screen();
|
reset_screen();
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include "lcd-remote.h"
|
#include "lcd-remote.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -87,10 +87,10 @@ void shutdown(void)
|
||||||
if (ide_powered())
|
if (ide_powered())
|
||||||
{
|
{
|
||||||
/* Make sure ATA has been initialized. */
|
/* Make sure ATA has been initialized. */
|
||||||
ata_init();
|
storage_init();
|
||||||
|
|
||||||
/* And put the disk into sleep immediately. */
|
/* And put the disk into sleep immediately. */
|
||||||
ata_sleepnow();
|
storage_sleepnow();
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(HZ*2);
|
sleep(HZ*2);
|
||||||
|
@ -192,7 +192,7 @@ void main(void)
|
||||||
|
|
||||||
check_battery();
|
check_battery();
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
printf("ATA error: %d", rc);
|
printf("ATA error: %d", rc);
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include "scroll_engine.h"
|
#include "scroll_engine.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -148,10 +148,10 @@ void shutdown(void)
|
||||||
if (ide_powered())
|
if (ide_powered())
|
||||||
{
|
{
|
||||||
/* Make sure ATA has been initialized. */
|
/* Make sure ATA has been initialized. */
|
||||||
ata_init();
|
storage_init();
|
||||||
|
|
||||||
/* And put the disk into sleep immediately. */
|
/* And put the disk into sleep immediately. */
|
||||||
ata_sleepnow();
|
storage_sleepnow();
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(HZ*2);
|
sleep(HZ*2);
|
||||||
|
@ -560,7 +560,7 @@ void main(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
ide_power_enable(true);
|
ide_power_enable(true);
|
||||||
ata_enable(false);
|
storage_enable(false);
|
||||||
sleep(HZ/20);
|
sleep(HZ/20);
|
||||||
usb_enable(true);
|
usb_enable(true);
|
||||||
cpu_idle_mode(true);
|
cpu_idle_mode(true);
|
||||||
|
@ -571,7 +571,7 @@ void main(void)
|
||||||
remote_line = 0;
|
remote_line = 0;
|
||||||
check_battery();
|
check_battery();
|
||||||
|
|
||||||
ata_spin(); /* Prevent the drive from spinning down */
|
storage_spin(); /* Prevent the drive from spinning down */
|
||||||
sleep(HZ);
|
sleep(HZ);
|
||||||
|
|
||||||
/* Backlight OFF */
|
/* Backlight OFF */
|
||||||
|
@ -585,7 +585,7 @@ void main(void)
|
||||||
lcd_update();
|
lcd_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
reset_screen();
|
reset_screen();
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include "scroll_engine.h"
|
#include "scroll_engine.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -93,10 +93,10 @@ void shutdown(void)
|
||||||
if (ide_powered())
|
if (ide_powered())
|
||||||
{
|
{
|
||||||
/* Make sure ATA has been initialized. */
|
/* Make sure ATA has been initialized. */
|
||||||
ata_init();
|
storage_init();
|
||||||
|
|
||||||
/* And put the disk into sleep immediately. */
|
/* And put the disk into sleep immediately. */
|
||||||
ata_sleepnow();
|
storage_sleepnow();
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(HZ*2);
|
sleep(HZ*2);
|
||||||
|
@ -317,7 +317,7 @@ void main(void)
|
||||||
lcd_remote_update();
|
lcd_remote_update();
|
||||||
|
|
||||||
ide_power_enable(true);
|
ide_power_enable(true);
|
||||||
ata_enable(false);
|
storage_enable(false);
|
||||||
sleep(HZ/20);
|
sleep(HZ/20);
|
||||||
usb_enable(true);
|
usb_enable(true);
|
||||||
cpu_idle_mode(true);
|
cpu_idle_mode(true);
|
||||||
|
@ -328,7 +328,7 @@ void main(void)
|
||||||
remote_line = 0;
|
remote_line = 0;
|
||||||
check_battery();
|
check_battery();
|
||||||
|
|
||||||
ata_spin(); /* Prevent the drive from spinning down */
|
storage_spin(); /* Prevent the drive from spinning down */
|
||||||
sleep(HZ);
|
sleep(HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,7 +339,7 @@ void main(void)
|
||||||
lcd_update();
|
lcd_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
reset_screen();
|
reset_screen();
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "crc32-mi4.h"
|
#include "crc32-mi4.h"
|
||||||
|
@ -185,14 +185,14 @@ void* main(void)
|
||||||
printf("");
|
printf("");
|
||||||
|
|
||||||
|
|
||||||
i=ata_init();
|
i=storage_init();
|
||||||
disk_init(IF_MV(0));
|
disk_init(IF_MV(0));
|
||||||
|
|
||||||
memset(zero,0,16*1024);
|
memset(zero,0,16*1024);
|
||||||
printf("Zeroing flash");
|
printf("Zeroing flash");
|
||||||
for(i=0;i<250816;i++)
|
for(i=0;i<250816;i++)
|
||||||
{
|
{
|
||||||
ata_write_sectors(IF_MV2(0,) i*32,32,zero);
|
storage_write_sectors(IF_MV2(0,) i*32,32,zero);
|
||||||
if(i%64 == 0)
|
if(i%64 == 0)
|
||||||
{
|
{
|
||||||
printf("%d kB left",(250816-i)/2);
|
printf("%d kB left",(250816-i)/2);
|
||||||
|
@ -200,13 +200,13 @@ void* main(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Writing MBR");
|
printf("Writing MBR");
|
||||||
ata_write_sectors(IF_MV2(0,) 0,1,mbr);
|
storage_write_sectors(IF_MV2(0,) 0,1,mbr);
|
||||||
printf("Writing FAT bootsector");
|
printf("Writing FAT bootsector");
|
||||||
ata_write_sectors(IF_MV2(0,) 1023,1,fat);
|
storage_write_sectors(IF_MV2(0,) 1023,1,fat);
|
||||||
printf("Writing more FAT");
|
printf("Writing more FAT");
|
||||||
ata_write_sectors(IF_MV2(0,) 1024,1,backupfat);
|
storage_write_sectors(IF_MV2(0,) 1024,1,backupfat);
|
||||||
printf("Writing more FAT");
|
printf("Writing more FAT");
|
||||||
ata_write_sectors(IF_MV2(0,) 1264,1,backupfat);
|
storage_write_sectors(IF_MV2(0,) 1264,1,backupfat);
|
||||||
if (button_hold())
|
if (button_hold())
|
||||||
printf("Release Hold and");
|
printf("Release Hold and");
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "crc32-mi4.h"
|
#include "crc32-mi4.h"
|
||||||
|
@ -250,14 +250,14 @@ void* main(void)
|
||||||
printf("");
|
printf("");
|
||||||
|
|
||||||
|
|
||||||
i=ata_init();
|
i=storage_init();
|
||||||
disk_init(IF_MV(0));
|
disk_init(IF_MV(0));
|
||||||
|
|
||||||
memset(zero,0,16*1024);
|
memset(zero,0,16*1024);
|
||||||
printf("Zeroing flash");
|
printf("Zeroing flash");
|
||||||
for(i=0;i<250816;i++)
|
for(i=0;i<250816;i++)
|
||||||
{
|
{
|
||||||
ata_write_sectors(IF_MV2(0,) i*32,32,zero);
|
storage_write_sectors(IF_MV2(0,) i*32,32,zero);
|
||||||
if(i%64 == 0)
|
if(i%64 == 0)
|
||||||
{
|
{
|
||||||
printf("%d kB left",(250816-i)/2);
|
printf("%d kB left",(250816-i)/2);
|
||||||
|
@ -265,15 +265,15 @@ void* main(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Writing MBR");
|
printf("Writing MBR");
|
||||||
ata_write_sectors(IF_MV2(0,) 0,1,mbr);
|
storage_write_sectors(IF_MV2(0,) 0,1,mbr);
|
||||||
printf("Writing FAT bootsector");
|
printf("Writing FAT bootsector");
|
||||||
ata_write_sectors(IF_MV2(0,) 1017,2,bootsector);
|
storage_write_sectors(IF_MV2(0,) 1017,2,bootsector);
|
||||||
printf("Writing more FAT");
|
printf("Writing more FAT");
|
||||||
ata_write_sectors(IF_MV2(0,) 1023,1,fat);
|
storage_write_sectors(IF_MV2(0,) 1023,1,fat);
|
||||||
printf("Writing more FAT");
|
printf("Writing more FAT");
|
||||||
ata_write_sectors(IF_MV2(0,) 1049,1,backupfat);
|
storage_write_sectors(IF_MV2(0,) 1049,1,backupfat);
|
||||||
printf("Writing more FAT");
|
printf("Writing more FAT");
|
||||||
ata_write_sectors(IF_MV2(0,) 4920,1,backupfat);
|
storage_write_sectors(IF_MV2(0,) 4920,1,backupfat);
|
||||||
if (button_hold())
|
if (button_hold())
|
||||||
printf("Release Hold and");
|
printf("Release Hold and");
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "crc32-mi4.h"
|
#include "crc32-mi4.h"
|
||||||
|
@ -120,7 +120,7 @@ void* main(void)
|
||||||
printf(MODEL_NAME);
|
printf(MODEL_NAME);
|
||||||
printf("");
|
printf("");
|
||||||
|
|
||||||
i=ata_init();
|
i=storage_init();
|
||||||
disk_init(IF_MV(0));
|
disk_init(IF_MV(0));
|
||||||
num_partitions = disk_mount_all();
|
num_partitions = disk_mount_all();
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ void* main(void)
|
||||||
printf("reading: %x", (START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK)*512);
|
printf("reading: %x", (START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK)*512);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ata_read_sectors(IF_MV2(0,)
|
storage_read_sectors(IF_MV2(0,)
|
||||||
pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
|
pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
|
||||||
1 , sector);
|
1 , sector);
|
||||||
crc32 = chksum_crc32 (sector, 512);
|
crc32 = chksum_crc32 (sector, 512);
|
||||||
|
@ -161,7 +161,7 @@ void* main(void)
|
||||||
/* E200R bootloader detected - patch it */
|
/* E200R bootloader detected - patch it */
|
||||||
memcpy(§or[HACK_OFFSET], changedBytes,
|
memcpy(§or[HACK_OFFSET], changedBytes,
|
||||||
sizeof(changedBytes)/sizeof(*changedBytes));
|
sizeof(changedBytes)/sizeof(*changedBytes));
|
||||||
ata_write_sectors(IF_MV2(0,)
|
storage_write_sectors(IF_MV2(0,)
|
||||||
pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
|
pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
|
||||||
1 , sector);
|
1 , sector);
|
||||||
printf("Firmware unlocked");
|
printf("Firmware unlocked");
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
|
@ -371,7 +371,7 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo,
|
||||||
unsigned long sum;
|
unsigned long sum;
|
||||||
|
|
||||||
/* Read header to find out how long the mi4 file is. */
|
/* Read header to find out how long the mi4 file is. */
|
||||||
ata_read_sectors(IF_MV2(0,) pinfo->start + PPMI_SECTOR_OFFSET,
|
storage_read_sectors(IF_MV2(0,) pinfo->start + PPMI_SECTOR_OFFSET,
|
||||||
PPMI_SECTORS, &ppmi_header);
|
PPMI_SECTORS, &ppmi_header);
|
||||||
|
|
||||||
/* The first four characters at 0x80000 (sector 1024) should be PPMI*/
|
/* The first four characters at 0x80000 (sector 1024) should be PPMI*/
|
||||||
|
@ -381,7 +381,7 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo,
|
||||||
printf("BL mi4 size: %x", ppmi_header.length);
|
printf("BL mi4 size: %x", ppmi_header.length);
|
||||||
|
|
||||||
/* Read mi4 header of the OF */
|
/* Read mi4 header of the OF */
|
||||||
ata_read_sectors(IF_MV2(0,) pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
|
storage_read_sectors(IF_MV2(0,) pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
|
||||||
+ (ppmi_header.length/512), MI4_HEADER_SECTORS, &mi4header);
|
+ (ppmi_header.length/512), MI4_HEADER_SECTORS, &mi4header);
|
||||||
|
|
||||||
/* We don't support encrypted mi4 files yet */
|
/* We don't support encrypted mi4 files yet */
|
||||||
|
@ -404,7 +404,7 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo,
|
||||||
printf("Binary type: %.4s", mi4header.type);
|
printf("Binary type: %.4s", mi4header.type);
|
||||||
|
|
||||||
/* Load firmware */
|
/* Load firmware */
|
||||||
ata_read_sectors(IF_MV2(0,) pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
|
storage_read_sectors(IF_MV2(0,) pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
|
||||||
+ (ppmi_header.length/512) + MI4_HEADER_SECTORS,
|
+ (ppmi_header.length/512) + MI4_HEADER_SECTORS,
|
||||||
(mi4header.mi4size-MI4_HEADER_SIZE)/512, buf);
|
(mi4header.mi4size-MI4_HEADER_SIZE)/512, buf);
|
||||||
|
|
||||||
|
@ -423,9 +423,9 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo,
|
||||||
|
|
||||||
printf("Disabling database rebuild");
|
printf("Disabling database rebuild");
|
||||||
|
|
||||||
ata_read_sectors(IF_MV2(0,) pinfo->start + 0x3c08, 1, block);
|
storage_read_sectors(IF_MV2(0,) pinfo->start + 0x3c08, 1, block);
|
||||||
block[0xe1] = 0;
|
block[0xe1] = 0;
|
||||||
ata_write_sectors(IF_MV2(0,) pinfo->start + 0x3c08, 1, block);
|
storage_write_sectors(IF_MV2(0,) pinfo->start + 0x3c08, 1, block);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
(void) disable_rebuild;
|
(void) disable_rebuild;
|
||||||
|
@ -505,7 +505,7 @@ void* main(void)
|
||||||
printf("Version: %s", version);
|
printf("Version: %s", version);
|
||||||
printf(MODEL_NAME);
|
printf(MODEL_NAME);
|
||||||
|
|
||||||
i=ata_init();
|
i=storage_init();
|
||||||
#if !(CONFIG_STORAGE & STORAGE_SD)
|
#if !(CONFIG_STORAGE & STORAGE_SD)
|
||||||
if (i==0) {
|
if (i==0) {
|
||||||
identify_info=ata_get_identify();
|
identify_info=ata_get_identify();
|
||||||
|
@ -601,7 +601,7 @@ void* main(void)
|
||||||
{
|
{
|
||||||
printf("dumping sector %d", i);
|
printf("dumping sector %d", i);
|
||||||
}
|
}
|
||||||
ata_read_sectors(IF_MV2(0,) pinfo->start + i, 1, sector);
|
storage_read_sectors(IF_MV2(0,) pinfo->start + i, 1, sector);
|
||||||
write(fd,sector,512);
|
write(fd,sector,512);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -229,13 +229,13 @@ void main(void)
|
||||||
lcd_update();
|
lcd_update();
|
||||||
|
|
||||||
ide_power_enable(true);
|
ide_power_enable(true);
|
||||||
ata_enable(false);
|
storage_enable(false);
|
||||||
sleep(HZ/20);
|
sleep(HZ/20);
|
||||||
usb_enable(true);
|
usb_enable(true);
|
||||||
|
|
||||||
while (usb_detect() == USB_INSERTED)
|
while (usb_detect() == USB_INSERTED)
|
||||||
{
|
{
|
||||||
ata_spin(); /* Prevent the drive from spinning down */
|
storage_spin(); /* Prevent the drive from spinning down */
|
||||||
sleep(HZ);
|
sleep(HZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ void main(void)
|
||||||
mrdebug();
|
mrdebug();
|
||||||
#endif
|
#endif
|
||||||
printf("ATA");
|
printf("ATA");
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
reset_screen();
|
reset_screen();
|
||||||
|
|
|
@ -54,7 +54,7 @@ int main(void)
|
||||||
|
|
||||||
backlight_init();
|
backlight_init();
|
||||||
|
|
||||||
ata_init();
|
storage_init();
|
||||||
|
|
||||||
int touch, btn;
|
int touch, btn;
|
||||||
char datetime[30];
|
char datetime[30];
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include "backlight-target.h"
|
#include "backlight-target.h"
|
||||||
#include "as3525-codec.h"
|
#include "as3525-codec.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
|
|
||||||
int show_logo(void);
|
int show_logo(void);
|
||||||
void main(void)
|
void main(void)
|
||||||
|
@ -54,7 +54,7 @@ void main(void)
|
||||||
}
|
}
|
||||||
printf("ID: %02X%02X%02X%02X%02X%02X%02X%02X", buf[7], buf[6], buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]);
|
printf("ID: %02X%02X%02X%02X%02X%02X%02X%02X", buf[7], buf[6], buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]);
|
||||||
|
|
||||||
ata_init();
|
storage_init();
|
||||||
|
|
||||||
#ifdef SANSA_CLIP
|
#ifdef SANSA_CLIP
|
||||||
/* Use hardware scrolling */
|
/* Use hardware scrolling */
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -206,7 +206,7 @@ void* main(void)
|
||||||
printf("Version %s", version);
|
printf("Version %s", version);
|
||||||
|
|
||||||
printf("ATA");
|
printf("ATA");
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
reset_screen();
|
reset_screen();
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -58,7 +58,7 @@ void* main(void)
|
||||||
printf("Hello World!");
|
printf("Hello World!");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
i=ata_init();
|
i=storage_init();
|
||||||
|
|
||||||
disk_init();
|
disk_init();
|
||||||
rc = disk_mount_all();
|
rc = disk_mount_all();
|
||||||
|
|
|
@ -108,6 +108,7 @@ drivers/serial.c
|
||||||
|
|
||||||
|
|
||||||
/* Storage */
|
/* Storage */
|
||||||
|
storage.c
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
#if (CONFIG_STORAGE & STORAGE_MMC)
|
#if (CONFIG_STORAGE & STORAGE_MMC)
|
||||||
drivers/ata_mmc.c
|
drivers/ata_mmc.c
|
||||||
|
|
|
@ -25,9 +25,9 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
void register_ata_idle_func(ata_idle_notify function)
|
void register_storage_idle_func(storage_idle_notify function)
|
||||||
{
|
{
|
||||||
#if USING_ATA_CALLBACK
|
#if USING_STORAGE_CALLBACK
|
||||||
add_event(DISK_EVENT_SPINUP, true, function);
|
add_event(DISK_EVENT_SPINUP, true, function);
|
||||||
#else
|
#else
|
||||||
function(); /* just call the function now */
|
function(); /* just call the function now */
|
||||||
|
@ -37,8 +37,8 @@ void register_ata_idle_func(ata_idle_notify function)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USING_ATA_CALLBACK
|
#if USING_STORAGE_CALLBACK
|
||||||
void unregister_ata_idle_func(ata_idle_notify func, bool run)
|
void unregister_storage_idle_func(storage_idle_notify func, bool run)
|
||||||
{
|
{
|
||||||
remove_event(DISK_EVENT_SPINUP, func);
|
remove_event(DISK_EVENT_SPINUP, func);
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ void unregister_ata_idle_func(ata_idle_notify func, bool run)
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool call_ata_idle_notifys(bool force)
|
bool call_storage_idle_notifys(bool force)
|
||||||
{
|
{
|
||||||
static int lock_until = 0;
|
static int lock_until = 0;
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#ifdef HAVE_HOTSWAP
|
#ifdef HAVE_HOTSWAP
|
||||||
|
@ -80,7 +80,7 @@ struct partinfo* disk_init(IF_MV_NONVOID(int drive))
|
||||||
struct partinfo* pinfo = part;
|
struct partinfo* pinfo = part;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ata_read_sectors(IF_MV2(drive,) 0,1, §or);
|
storage_read_sectors(IF_MV2(drive,) 0,1, §or);
|
||||||
/* check that the boot sector is initialized */
|
/* check that the boot sector is initialized */
|
||||||
if ( (sector[510] != 0x55) ||
|
if ( (sector[510] != 0x55) ||
|
||||||
(sector[511] != 0xaa)) {
|
(sector[511] != 0xaa)) {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "ata_idle_notify.h"
|
#include "ata_idle_notify.h"
|
||||||
#include "ata-target.h"
|
#include "ata-target.h"
|
||||||
|
#include "storage.h"
|
||||||
|
|
||||||
#define SECTOR_SIZE (512)
|
#define SECTOR_SIZE (512)
|
||||||
|
|
||||||
|
@ -148,7 +149,7 @@ static void ata_lock_unlock(struct ata_lock *l)
|
||||||
static struct mutex ata_mtx SHAREDBSS_ATTR;
|
static struct mutex ata_mtx SHAREDBSS_ATTR;
|
||||||
static int ata_device; /* device 0 (master) or 1 (slave) */
|
static int ata_device; /* device 0 (master) or 1 (slave) */
|
||||||
|
|
||||||
int ata_spinup_time = 0;
|
static int spinup_time = 0;
|
||||||
#if (CONFIG_LED == LED_REAL)
|
#if (CONFIG_LED == LED_REAL)
|
||||||
static bool ata_led_enabled = true;
|
static bool ata_led_enabled = true;
|
||||||
static bool ata_led_on = false;
|
static bool ata_led_on = false;
|
||||||
|
@ -166,7 +167,7 @@ static struct event_queue ata_queue;
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
|
|
||||||
static long last_user_activity = -1;
|
static long last_user_activity = -1;
|
||||||
long last_disk_activity = -1;
|
static long last_disk_activity = -1;
|
||||||
|
|
||||||
static unsigned long total_sectors;
|
static unsigned long total_sectors;
|
||||||
static int multisectors; /* number of supported multisectors */
|
static int multisectors; /* number of supported multisectors */
|
||||||
|
@ -407,7 +408,7 @@ int ata_read_sectors(IF_MV2(int drive,)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spinup) {
|
if (spinup) {
|
||||||
ata_spinup_time = current_tick - spinup_start;
|
spinup_time = current_tick - spinup_start;
|
||||||
spinup = false;
|
spinup = false;
|
||||||
sleeping = false;
|
sleeping = false;
|
||||||
poweroff = false;
|
poweroff = false;
|
||||||
|
@ -584,7 +585,7 @@ int ata_write_sectors(IF_MV2(int drive,)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spinup) {
|
if (spinup) {
|
||||||
ata_spinup_time = current_tick - spinup_start;
|
spinup_time = current_tick - spinup_start;
|
||||||
spinup = false;
|
spinup = false;
|
||||||
sleeping = false;
|
sleeping = false;
|
||||||
poweroff = false;
|
poweroff = false;
|
||||||
|
@ -873,7 +874,7 @@ void ata_sleepnow(void)
|
||||||
{
|
{
|
||||||
if (!spinup && !sleeping && !ata_mtx.locked && initialized)
|
if (!spinup && !sleeping && !ata_mtx.locked && initialized)
|
||||||
{
|
{
|
||||||
call_ata_idle_notifys(false);
|
call_storage_idle_notifys(false);
|
||||||
ata_perform_sleep();
|
ata_perform_sleep();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -908,7 +909,7 @@ static void ata_thread(void)
|
||||||
#ifdef ALLOW_USB_SPINDOWN
|
#ifdef ALLOW_USB_SPINDOWN
|
||||||
if(!usb_mode)
|
if(!usb_mode)
|
||||||
#endif
|
#endif
|
||||||
call_ata_idle_notifys(false);
|
call_storage_idle_notifys(false);
|
||||||
last_seen_mtx_unlock = 0;
|
last_seen_mtx_unlock = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -921,7 +922,7 @@ static void ata_thread(void)
|
||||||
#ifdef ALLOW_USB_SPINDOWN
|
#ifdef ALLOW_USB_SPINDOWN
|
||||||
if(!usb_mode)
|
if(!usb_mode)
|
||||||
#endif
|
#endif
|
||||||
call_ata_idle_notifys(true);
|
call_storage_idle_notifys(true);
|
||||||
ata_perform_sleep();
|
ata_perform_sleep();
|
||||||
last_sleep = current_tick;
|
last_sleep = current_tick;
|
||||||
}
|
}
|
||||||
|
@ -974,7 +975,7 @@ static void ata_thread(void)
|
||||||
#ifdef ALLOW_USB_SPINDOWN
|
#ifdef ALLOW_USB_SPINDOWN
|
||||||
if(!usb_mode)
|
if(!usb_mode)
|
||||||
#endif
|
#endif
|
||||||
call_ata_idle_notifys(false);
|
call_storage_idle_notifys(false);
|
||||||
last_disk_activity = current_tick - sleep_timeout + (HZ/2);
|
last_disk_activity = current_tick - sleep_timeout + (HZ/2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1391,3 +1392,43 @@ void ata_set_led_enabled(bool enabled)
|
||||||
led(false);
|
led(false);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
long ata_last_disk_activity(void)
|
||||||
|
{
|
||||||
|
return last_disk_activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ata_spinup_time(void)
|
||||||
|
{
|
||||||
|
return spinup_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ata_get_info(struct storage_info *info)
|
||||||
|
{
|
||||||
|
unsigned short *src,*dest;
|
||||||
|
static char vendor[8];
|
||||||
|
static char product[16];
|
||||||
|
static char revision[4];
|
||||||
|
int i;
|
||||||
|
info->sector_size = SECTOR_SIZE;
|
||||||
|
info->num_sectors= ((unsigned long)identify_info[61] << 16 | \
|
||||||
|
(unsigned long)identify_info[60]);
|
||||||
|
|
||||||
|
src = (unsigned short*)&identify_info[27];
|
||||||
|
dest = (unsigned short*)vendor;
|
||||||
|
for (i=0;i<4;i++)
|
||||||
|
dest[i] = htobe16(src[i]);
|
||||||
|
info->vendor=vendor;
|
||||||
|
|
||||||
|
src = (unsigned short*)&identify_info[31];
|
||||||
|
dest = (unsigned short*)product;
|
||||||
|
for (i=0;i<8;i++)
|
||||||
|
dest[i] = htobe16(src[i]);
|
||||||
|
info->product=product;
|
||||||
|
|
||||||
|
src = (unsigned short*)&identify_info[23];
|
||||||
|
dest = (unsigned short*)revision;
|
||||||
|
for (i=0;i<2;i++)
|
||||||
|
dest[i] = htobe16(src[i]);
|
||||||
|
info->revision=revision;
|
||||||
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -42,8 +42,6 @@
|
||||||
|
|
||||||
#define SECTOR_SIZE (512)
|
#define SECTOR_SIZE (512)
|
||||||
|
|
||||||
static unsigned short identify_info[SECTOR_SIZE];
|
|
||||||
int ata_spinup_time = 0;
|
|
||||||
long last_disk_activity = -1;
|
long last_disk_activity = -1;
|
||||||
|
|
||||||
#if CONFIG_FLASH == FLASH_IFP7XX
|
#if CONFIG_FLASH == FLASH_IFP7XX
|
||||||
|
@ -386,7 +384,7 @@ int flash_disk_read_sectors(unsigned long start,
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_read_sectors(IF_MV2(int drive,)
|
int nand_read_sectors(IF_MV2(int drive,)
|
||||||
unsigned long start,
|
unsigned long start,
|
||||||
int incount,
|
int incount,
|
||||||
void* inbuf)
|
void* inbuf)
|
||||||
|
@ -403,7 +401,7 @@ int ata_read_sectors(IF_MV2(int drive,)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_write_sectors(IF_MV2(int drive,)
|
int nand_write_sectors(IF_MV2(int drive,)
|
||||||
unsigned long start,
|
unsigned long start,
|
||||||
int count,
|
int count,
|
||||||
const void* buf)
|
const void* buf)
|
||||||
|
@ -414,60 +412,7 @@ int ata_write_sectors(IF_MV2(int drive,)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* schedule a single sector write, executed with the the next spinup
|
int nand_init(void)
|
||||||
(volume 0 only, used for config sector) */
|
|
||||||
extern void ata_delayed_write(unsigned long sector, const void* buf)
|
|
||||||
{
|
|
||||||
(void)sector;
|
|
||||||
(void)buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* write the delayed sector to volume 0 */
|
|
||||||
extern void ata_flush(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_spindown(int seconds)
|
|
||||||
{
|
|
||||||
(void)seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ata_disk_is_active(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_sleep(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_spin(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hardware reset protocol as specified in chapter 9.1, ATA spec draft v5 */
|
|
||||||
int ata_hard_reset(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ata_soft_reset(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_enable(bool on)
|
|
||||||
{
|
|
||||||
(void)on;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned short* ata_get_identify(void)
|
|
||||||
{
|
|
||||||
return identify_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ata_init(void)
|
|
||||||
{
|
{
|
||||||
int i, id, id2;
|
int i, id, id2;
|
||||||
|
|
||||||
|
@ -499,3 +444,29 @@ int ata_init(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long nand_last_disk_activity(void)
|
||||||
|
{
|
||||||
|
return last_disk_activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nand_get_info(struct storage_info *info)
|
||||||
|
{
|
||||||
|
unsigned long blocks;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* firmware version */
|
||||||
|
info->revision="0.00";
|
||||||
|
|
||||||
|
/* vendor field, need better name? */
|
||||||
|
info->vendor="Rockbox";
|
||||||
|
/* model field, need better name? */
|
||||||
|
info->product="TNFL";
|
||||||
|
|
||||||
|
/* blocks count */
|
||||||
|
info->num_sectors = 0;
|
||||||
|
info->sector_size=SECTOR_SIZE;
|
||||||
|
|
||||||
|
info->serial=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "ata.h"
|
#include "mmc.h"
|
||||||
#include "ata_mmc.h"
|
#include "ata_mmc.h"
|
||||||
#include "ata_idle_notify.h"
|
#include "ata_idle_notify.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
|
@ -36,6 +36,7 @@
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
#include "bitswap.h"
|
#include "bitswap.h"
|
||||||
#include "disk.h" /* for mount/unmount */
|
#include "disk.h" /* for mount/unmount */
|
||||||
|
#include "storage.h"
|
||||||
|
|
||||||
#define BLOCK_SIZE 512 /* fixed */
|
#define BLOCK_SIZE 512 /* fixed */
|
||||||
|
|
||||||
|
@ -84,8 +85,7 @@
|
||||||
#define DT_STOP_TRAN 0xfd
|
#define DT_STOP_TRAN 0xfd
|
||||||
|
|
||||||
/* for compatibility */
|
/* for compatibility */
|
||||||
int ata_spinup_time = 0;
|
static long last_disk_activity = -1;
|
||||||
long last_disk_activity = -1;
|
|
||||||
|
|
||||||
/* private variables */
|
/* private variables */
|
||||||
|
|
||||||
|
@ -601,7 +601,7 @@ static int send_block_send(unsigned char start_token, long timeout,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_read_sectors(IF_MV2(int drive,)
|
int mmc_read_sectors(IF_MV2(int drive,)
|
||||||
unsigned long start,
|
unsigned long start,
|
||||||
int incount,
|
int incount,
|
||||||
void* inbuf)
|
void* inbuf)
|
||||||
|
@ -687,7 +687,7 @@ int ata_read_sectors(IF_MV2(int drive,)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_write_sectors(IF_MV2(int drive,)
|
int mmc_write_sectors(IF_MV2(int drive,)
|
||||||
unsigned long start,
|
unsigned long start,
|
||||||
int count,
|
int count,
|
||||||
const void* buf)
|
const void* buf)
|
||||||
|
@ -755,25 +755,12 @@ int ata_write_sectors(IF_MV2(int drive,)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ata_spindown(int seconds)
|
bool mmc_disk_is_active(void)
|
||||||
{
|
|
||||||
(void)seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ata_disk_is_active(void)
|
|
||||||
{
|
{
|
||||||
/* this is correct unless early return from write gets implemented */
|
/* this is correct unless early return from write gets implemented */
|
||||||
return mmc_mutex.locked;
|
return mmc_mutex.locked;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ata_sleep(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_spin(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mmc_thread(void)
|
static void mmc_thread(void)
|
||||||
{
|
{
|
||||||
struct queue_event ev;
|
struct queue_event ev;
|
||||||
|
@ -810,7 +797,7 @@ static void mmc_thread(void)
|
||||||
{
|
{
|
||||||
if (!idle_notified)
|
if (!idle_notified)
|
||||||
{
|
{
|
||||||
call_ata_idle_notifys(false);
|
call_storage_idle_notifys(false);
|
||||||
idle_notified = true;
|
idle_notified = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -904,12 +891,7 @@ static void mmc_tick(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_soft_reset(void)
|
void mmc_enable(bool on)
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_enable(bool on)
|
|
||||||
{
|
{
|
||||||
PBCR1 &= ~0x0CF0; /* PB13, PB11 and PB10 become GPIO,
|
PBCR1 &= ~0x0CF0; /* PB13, PB11 and PB10 become GPIO,
|
||||||
* if not modified below */
|
* if not modified below */
|
||||||
|
@ -924,7 +906,7 @@ void ata_enable(bool on)
|
||||||
card_info[1].initialized = false;
|
card_info[1].initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_init(void)
|
int mmc_init(void)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
@ -970,9 +952,51 @@ int ata_init(void)
|
||||||
tick_add_task(mmc_tick);
|
tick_add_task(mmc_tick);
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
ata_enable(true);
|
mmc_enable(true);
|
||||||
|
|
||||||
mutex_unlock(&mmc_mutex);
|
mutex_unlock(&mmc_mutex);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long mmc_last_disk_activity(void)
|
||||||
|
{
|
||||||
|
return last_disk_activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mmc_get_info(IF_MV2(int drive,) struct storage_info *info)
|
||||||
|
{
|
||||||
|
#ifndef HAVE_MULTIVOLUME
|
||||||
|
const int drive=0;
|
||||||
|
#endif
|
||||||
|
info->sector_size=card_info[drive].blocksize;
|
||||||
|
info->num_sectors=card_info[drive].numblocks;
|
||||||
|
info->vendor="Rockbox";
|
||||||
|
if(drive==0)
|
||||||
|
{
|
||||||
|
info->product="Internal Storage";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
info->product="MMC Card Slot";
|
||||||
|
}
|
||||||
|
info->revision="0.00";
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_HOTSWAP
|
||||||
|
bool mmc_removable(IF_MV_NONVOID(int drive))
|
||||||
|
{
|
||||||
|
#ifndef HAVE_MULTIVOLUME
|
||||||
|
const int drive=0;
|
||||||
|
#endif
|
||||||
|
return (drive==1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mmc_present(IF_MV_NONVOID(int drive))
|
||||||
|
{
|
||||||
|
#ifndef HAVE_MULTIVOLUME
|
||||||
|
const int drive=0;
|
||||||
|
#endif
|
||||||
|
return (card_info[drive].initialized && card_info[drive].numblocks > 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
@ -300,7 +300,7 @@ int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Read the sector */
|
/* Read the sector */
|
||||||
rc = ata_read_sectors(IF_MV2(drive,) startsector,1,buf);
|
rc = storage_read_sectors(IF_MV2(drive,) startsector,1,buf);
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
DEBUGF( "fat_mount() - Couldn't read BPB (error code %d)\n", rc);
|
DEBUGF( "fat_mount() - Couldn't read BPB (error code %d)\n", rc);
|
||||||
|
@ -422,7 +422,7 @@ int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) long startsector)
|
||||||
#endif /* #ifdef HAVE_FAT16SUPPORT */
|
#endif /* #ifdef HAVE_FAT16SUPPORT */
|
||||||
{
|
{
|
||||||
/* Read the fsinfo sector */
|
/* Read the fsinfo sector */
|
||||||
rc = ata_read_sectors(IF_MV2(drive,)
|
rc = storage_read_sectors(IF_MV2(drive,)
|
||||||
startsector + fat_bpb->bpb_fsinfo, 1, buf);
|
startsector + fat_bpb->bpb_fsinfo, 1, buf);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
{
|
{
|
||||||
|
@ -597,7 +597,7 @@ static void flush_fat_sector(struct fat_cache_entry *fce,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write to the first FAT */
|
/* Write to the first FAT */
|
||||||
rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
|
rc = storage_write_sectors(IF_MV2(fce->fat_vol->drive,)
|
||||||
secnum, 1,
|
secnum, 1,
|
||||||
sectorbuf);
|
sectorbuf);
|
||||||
if(rc < 0)
|
if(rc < 0)
|
||||||
|
@ -618,7 +618,7 @@ static void flush_fat_sector(struct fat_cache_entry *fce,
|
||||||
#else
|
#else
|
||||||
secnum += fat_bpbs[0].fatsize;
|
secnum += fat_bpbs[0].fatsize;
|
||||||
#endif
|
#endif
|
||||||
rc = ata_write_sectors(IF_MV2(fce->fat_vol->drive,)
|
rc = storage_write_sectors(IF_MV2(fce->fat_vol->drive,)
|
||||||
secnum, 1, sectorbuf);
|
secnum, 1, sectorbuf);
|
||||||
if(rc < 0)
|
if(rc < 0)
|
||||||
{
|
{
|
||||||
|
@ -664,7 +664,7 @@ static void *cache_fat_sector(IF_MV2(struct bpb* fat_bpb,)
|
||||||
/* Load the sector if it is not cached */
|
/* Load the sector if it is not cached */
|
||||||
if(!fce->inuse)
|
if(!fce->inuse)
|
||||||
{
|
{
|
||||||
rc = ata_read_sectors(IF_MV2(fat_bpb->drive,)
|
rc = storage_read_sectors(IF_MV2(fat_bpb->drive,)
|
||||||
secnum + fat_bpb->startsector,1,
|
secnum + fat_bpb->startsector,1,
|
||||||
sectorbuf);
|
sectorbuf);
|
||||||
if(rc < 0)
|
if(rc < 0)
|
||||||
|
@ -923,7 +923,7 @@ static int update_fsinfo(IF_MV_NONVOID(struct bpb* fat_bpb))
|
||||||
#endif /* #ifdef HAVE_FAT16SUPPORT */
|
#endif /* #ifdef HAVE_FAT16SUPPORT */
|
||||||
|
|
||||||
/* update fsinfo */
|
/* update fsinfo */
|
||||||
rc = ata_read_sectors(IF_MV2(fat_bpb->drive,)
|
rc = storage_read_sectors(IF_MV2(fat_bpb->drive,)
|
||||||
fat_bpb->startsector + fat_bpb->bpb_fsinfo, 1,fsinfo);
|
fat_bpb->startsector + fat_bpb->bpb_fsinfo, 1,fsinfo);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
{
|
{
|
||||||
|
@ -936,7 +936,7 @@ static int update_fsinfo(IF_MV_NONVOID(struct bpb* fat_bpb))
|
||||||
intptr = (long*)&(fsinfo[FSINFO_NEXTFREE]);
|
intptr = (long*)&(fsinfo[FSINFO_NEXTFREE]);
|
||||||
*intptr = htole32(fat_bpb->fsinfo.nextfree);
|
*intptr = htole32(fat_bpb->fsinfo.nextfree);
|
||||||
|
|
||||||
rc = ata_write_sectors(IF_MV2(fat_bpb->drive,)
|
rc = storage_write_sectors(IF_MV2(fat_bpb->drive,)
|
||||||
fat_bpb->startsector + fat_bpb->bpb_fsinfo,1,fsinfo);
|
fat_bpb->startsector + fat_bpb->bpb_fsinfo,1,fsinfo);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
{
|
{
|
||||||
|
@ -2077,11 +2077,11 @@ static int transfer(IF_MV2(struct bpb* fat_bpb,)
|
||||||
if (start + count > fat_bpb->totalsectors)
|
if (start + count > fat_bpb->totalsectors)
|
||||||
panicf("Write %ld after data\n",
|
panicf("Write %ld after data\n",
|
||||||
start + count - fat_bpb->totalsectors);
|
start + count - fat_bpb->totalsectors);
|
||||||
rc = ata_write_sectors(IF_MV2(fat_bpb->drive,)
|
rc = storage_write_sectors(IF_MV2(fat_bpb->drive,)
|
||||||
start + fat_bpb->startsector, count, buf);
|
start + fat_bpb->startsector, count, buf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
rc = ata_read_sectors(IF_MV2(fat_bpb->drive,)
|
rc = storage_read_sectors(IF_MV2(fat_bpb->drive,)
|
||||||
start + fat_bpb->startsector, count, buf);
|
start + fat_bpb->startsector, count, buf);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
DEBUGF( "transfer() - Couldn't %s sector %lx"
|
DEBUGF( "transfer() - Couldn't %s sector %lx"
|
||||||
|
|
|
@ -23,43 +23,40 @@
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "config.h" /* for HAVE_MULTIVOLUME or not */
|
#include "config.h" /* for HAVE_MULTIVOLUME or not */
|
||||||
|
#include "mv.h" /* for IF_MV() and friends */
|
||||||
|
|
||||||
/* FixMe: These macros are a bit nasty and perhaps misplaced here.
|
struct storage_info;
|
||||||
We'll get rid of them once decided on how to proceed with multivolume. */
|
|
||||||
#ifdef HAVE_MULTIVOLUME
|
|
||||||
#define IF_MV(x) x /* optional volume/drive parameter */
|
|
||||||
#define IF_MV2(x,y) x,y /* same, for a list of arguments */
|
|
||||||
#define IF_MV_NONVOID(x) x /* for prototype with sole volume parameter */
|
|
||||||
#define NUM_VOLUMES 2
|
|
||||||
#else /* empty definitions if no multi-volume */
|
|
||||||
#define IF_MV(x)
|
|
||||||
#define IF_MV2(x,y)
|
|
||||||
#define IF_MV_NONVOID(x) void
|
|
||||||
#define NUM_VOLUMES 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void ata_enable(bool on);
|
void ata_enable(bool on);
|
||||||
extern void ata_spindown(int seconds);
|
void ata_spindown(int seconds);
|
||||||
extern void ata_sleep(void);
|
void ata_sleep(void);
|
||||||
extern void ata_sleepnow(void);
|
void ata_sleepnow(void);
|
||||||
/* NOTE: DO NOT use this to poll for disk activity.
|
/* NOTE: DO NOT use this to poll for disk activity.
|
||||||
If you are waiting for the disk to become active before
|
If you are waiting for the disk to become active before
|
||||||
doing something use ata_idle_notify.h
|
doing something use ata_idle_notify.h
|
||||||
*/
|
*/
|
||||||
extern bool ata_disk_is_active(void);
|
bool ata_disk_is_active(void);
|
||||||
extern int ata_hard_reset(void);
|
int ata_hard_reset(void);
|
||||||
extern int ata_soft_reset(void);
|
int ata_soft_reset(void);
|
||||||
extern int ata_init(void);
|
int ata_init(void);
|
||||||
extern void ata_close(void);
|
void ata_close(void);
|
||||||
extern int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf);
|
int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int count, void* buf);
|
||||||
extern int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf);
|
int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const void* buf);
|
||||||
extern void ata_spin(void);
|
void ata_spin(void);
|
||||||
#if (CONFIG_LED == LED_REAL)
|
#if (CONFIG_LED == LED_REAL)
|
||||||
extern void ata_set_led_enabled(bool enabled);
|
void ata_set_led_enabled(bool enabled);
|
||||||
|
#endif
|
||||||
|
unsigned short* ata_get_identify(void);
|
||||||
|
void ata_get_info(IF_MV2(int drive,) struct storage_info *info);
|
||||||
|
#ifdef HAVE_HOTSWAP
|
||||||
|
bool ata_removable(IF_MV_NONVOID(int drive));
|
||||||
|
bool ata_present(IF_MV_NONVOID(int drive));
|
||||||
#endif
|
#endif
|
||||||
extern unsigned short* ata_get_identify(void);
|
|
||||||
|
|
||||||
extern long last_disk_activity;
|
|
||||||
extern int ata_spinup_time; /* ticks */
|
|
||||||
|
long ata_last_disk_activity(void);
|
||||||
|
int ata_spinup_time(void); /* ticks */
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,15 +26,15 @@
|
||||||
#include "events.h"
|
#include "events.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
NOTE: ata_idle_notify usage notes..
|
NOTE: storage_idle_notify usage notes..
|
||||||
|
|
||||||
1) The callbacks are called in the ata thread, not main/your thread.
|
1) The callbacks are called in the ata thread, not main/your thread.
|
||||||
2) Asynchronous callbacks (like the buffer refill) should be avoided.
|
2) Asynchronous callbacks (like the buffer refill) should be avoided.
|
||||||
If you must use an async callback, remember to check ata_is_active() before
|
If you must use an async callback, remember to check storage_is_active() before
|
||||||
accessing the disk, and do not call any functions between that check and the
|
accessing the disk, and do not call any functions between that check and the
|
||||||
disk access which may cause a yield (lcd_update() does this!).
|
disk access which may cause a yield (lcd_update() does this!).
|
||||||
3) Do not call any yielding functions in the callback.
|
3) Do not call any yielding functions in the callback.
|
||||||
4) Do not call ata_sleep in the callbacks.
|
4) Do not call storage_sleep in the callbacks.
|
||||||
5) Don't Panic!
|
5) Don't Panic!
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@ -43,21 +43,21 @@ enum {
|
||||||
DISK_EVENT_SPINUP = (EVENT_CLASS_DISK|1),
|
DISK_EVENT_SPINUP = (EVENT_CLASS_DISK|1),
|
||||||
};
|
};
|
||||||
|
|
||||||
#define USING_ATA_CALLBACK !defined(SIMULATOR) \
|
#define USING_STORAGE_CALLBACK !defined(SIMULATOR) \
|
||||||
&& ! ((CONFIG_STORAGE & STORAGE_NAND) \
|
&& ! ((CONFIG_STORAGE & STORAGE_NAND) \
|
||||||
&& (CONFIG_NAND & NAND_IFP7XX)) \
|
&& (CONFIG_NAND & NAND_IFP7XX)) \
|
||||||
&& !defined(BOOTLOADER)
|
&& !defined(BOOTLOADER)
|
||||||
|
|
||||||
typedef bool (*ata_idle_notify)(void);
|
typedef bool (*storage_idle_notify)(void);
|
||||||
|
|
||||||
extern void register_ata_idle_func(ata_idle_notify function);
|
extern void register_storage_idle_func(storage_idle_notify function);
|
||||||
#if USING_ATA_CALLBACK
|
#if USING_STORAGE_CALLBACK
|
||||||
extern void unregister_ata_idle_func(ata_idle_notify function, bool run);
|
extern void unregister_storage_idle_func(storage_idle_notify function, bool run);
|
||||||
extern bool call_ata_idle_notifys(bool force);
|
extern bool call_storage_idle_notifys(bool force);
|
||||||
#else
|
#else
|
||||||
#define unregister_ata_idle_func(f,r)
|
#define unregister_storage_idle_func(f,r)
|
||||||
#define call_ata_idle_notifys(f)
|
#define call_storage_idle_notifys(f)
|
||||||
#define ata_idle_notify_init(s)
|
#define storage_idle_notify_init(s)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ATACALLBACK_H__ */
|
#endif /* __ATACALLBACK_H__ */
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#ifndef _DISK_H_
|
#ifndef _DISK_H_
|
||||||
#define _DISK_H_
|
#define _DISK_H_
|
||||||
|
|
||||||
#include "ata.h" /* for volume definitions */
|
#include "mv.h" /* for volume definitions */
|
||||||
|
|
||||||
struct partinfo {
|
struct partinfo {
|
||||||
unsigned long start; /* first sector (LBA) */
|
unsigned long start; /* first sector (LBA) */
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#define FAT_H
|
#define FAT_H
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "ata.h" /* for volume definitions */
|
#include "mv.h" /* for volume definitions */
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#define SECTOR_SIZE 512
|
#define SECTOR_SIZE 512
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
* $Id: ata.h 17847 2008-06-28 18:10:04Z bagder $
|
* $Id: $
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 by Alan Korr
|
* Copyright (C) 2002 by Alan Korr
|
||||||
*
|
*
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "sprintf.h"
|
#include "sprintf.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
@ -451,7 +451,7 @@ static void handle_auto_poweroff(void)
|
||||||
!sleeptimer_active)))
|
!sleeptimer_active)))
|
||||||
{
|
{
|
||||||
if(TIME_AFTER(current_tick, last_event_tick + timeout) &&
|
if(TIME_AFTER(current_tick, last_event_tick + timeout) &&
|
||||||
TIME_AFTER(current_tick, last_disk_activity + timeout))
|
TIME_AFTER(current_tick, storage_last_disk_activity() + timeout))
|
||||||
{
|
{
|
||||||
sys_poweroff();
|
sys_poweroff();
|
||||||
}
|
}
|
||||||
|
@ -579,7 +579,7 @@ int pid_i = 0; /* PID integral term */
|
||||||
|
|
||||||
static inline void charging_algorithm_small_step(void)
|
static inline void charging_algorithm_small_step(void)
|
||||||
{
|
{
|
||||||
if (ata_disk_is_active()) {
|
if (storage_disk_is_active()) {
|
||||||
/* flag hdd use for charging calculation */
|
/* flag hdd use for charging calculation */
|
||||||
disk_activity_last_cycle = true;
|
disk_activity_last_cycle = true;
|
||||||
}
|
}
|
||||||
|
@ -589,7 +589,7 @@ static inline void charging_algorithm_small_step(void)
|
||||||
* If we have a lot of pending writes or if the disk is spining,
|
* If we have a lot of pending writes or if the disk is spining,
|
||||||
* fsync the debug log file.
|
* fsync the debug log file.
|
||||||
*/
|
*/
|
||||||
if((wrcount > 10) || ((wrcount > 0) && ata_disk_is_active())) {
|
if((wrcount > 10) || ((wrcount > 0) && storage_disk_is_active())) {
|
||||||
fsync(fd);
|
fsync(fd);
|
||||||
wrcount = 0;
|
wrcount = 0;
|
||||||
}
|
}
|
||||||
|
@ -1014,7 +1014,7 @@ static void power_thread_sleep(int ticks)
|
||||||
* the disk is spinning unless we are in USB mode (the disk will most
|
* the disk is spinning unless we are in USB mode (the disk will most
|
||||||
* likely always be spinning in USB mode).
|
* likely always be spinning in USB mode).
|
||||||
*/
|
*/
|
||||||
if (!ata_disk_is_active() || usb_inserted()) {
|
if (!storage_disk_is_active() || usb_inserted()) {
|
||||||
avgbat += battery_adc_voltage() - (avgbat / BATT_AVE_SAMPLES);
|
avgbat += battery_adc_voltage() - (avgbat / BATT_AVE_SAMPLES);
|
||||||
/*
|
/*
|
||||||
* battery_millivolts is the millivolt-scaled filtered battery value.
|
* battery_millivolts is the millivolt-scaled filtered battery value.
|
||||||
|
@ -1152,10 +1152,10 @@ void shutdown_hw(void)
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
glyph_cache_save();
|
glyph_cache_save();
|
||||||
#endif
|
#endif
|
||||||
if(ata_disk_is_active())
|
if(storage_disk_is_active())
|
||||||
ata_spindown(1);
|
storage_spindown(1);
|
||||||
}
|
}
|
||||||
while(ata_disk_is_active())
|
while(storage_disk_is_active())
|
||||||
sleep(HZ/10);
|
sleep(HZ/10);
|
||||||
|
|
||||||
#if CONFIG_CODEC != SWCODEC
|
#if CONFIG_CODEC != SWCODEC
|
||||||
|
@ -1166,7 +1166,7 @@ void shutdown_hw(void)
|
||||||
|
|
||||||
/* If HD is still active we try to wait for spindown, otherwise the
|
/* If HD is still active we try to wait for spindown, otherwise the
|
||||||
shutdown_timeout in power_thread_sleep will force a power off */
|
shutdown_timeout in power_thread_sleep will force a power off */
|
||||||
while(ata_disk_is_active())
|
while(storage_disk_is_active())
|
||||||
sleep(HZ/10);
|
sleep(HZ/10);
|
||||||
#ifndef IAUDIO_X5
|
#ifndef IAUDIO_X5
|
||||||
lcd_set_contrast(0);
|
lcd_set_contrast(0);
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
* KIND, either express or implied.
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "ata.h"
|
#include "nand.h"
|
||||||
#include "ata-nand-target.h"
|
#include "ata-nand-target.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -31,6 +31,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
|
#include "storage.h"
|
||||||
#include <sprintf.h>
|
#include <sprintf.h>
|
||||||
|
|
||||||
#define SECTOR_SIZE 512
|
#define SECTOR_SIZE 512
|
||||||
|
@ -43,9 +44,6 @@ int ata_spinup_time = 0;
|
||||||
|
|
||||||
long last_disk_activity = -1;
|
long last_disk_activity = -1;
|
||||||
|
|
||||||
/* as we aren't actually ata manually fill some fields */
|
|
||||||
static unsigned short ata_identify[SECTOR_SIZE/2];
|
|
||||||
|
|
||||||
/** static, private data **/
|
/** static, private data **/
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
|
|
||||||
|
@ -662,7 +660,7 @@ static void read_write_cache_segment(int bank, int phys_segment)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
|
int nand_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
|
||||||
void* inbuf)
|
void* inbuf)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
|
@ -702,7 +700,7 @@ int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
|
int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
|
||||||
const void* outbuf)
|
const void* outbuf)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
|
@ -716,83 +714,21 @@ int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ata_spindown(int seconds)
|
void nand_get_info(struct storage_info *info)
|
||||||
{
|
{
|
||||||
/* null */
|
|
||||||
(void)seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ata_disk_is_active(void)
|
|
||||||
{
|
|
||||||
/* null */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_sleep(void)
|
|
||||||
{
|
|
||||||
/* null */
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_spin(void)
|
|
||||||
{
|
|
||||||
/* null */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hardware reset protocol as specified in chapter 9.1, ATA spec draft v5 */
|
|
||||||
int ata_hard_reset(void)
|
|
||||||
{
|
|
||||||
/* null */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ata_soft_reset(void)
|
|
||||||
{
|
|
||||||
/* null */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_enable(bool on)
|
|
||||||
{
|
|
||||||
/* null - flash controller is enabled/disabled as needed. */
|
|
||||||
(void)on;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fill_identify(void)
|
|
||||||
{
|
|
||||||
char buf[80];
|
|
||||||
unsigned short *wbuf = (unsigned short *) buf;
|
|
||||||
unsigned long blocks;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
memset(ata_identify, 0, sizeof(ata_identify));
|
|
||||||
|
|
||||||
/* firmware version */
|
/* firmware version */
|
||||||
memset(buf, ' ', 8);
|
info->revision="0.00";
|
||||||
memcpy(buf, "0.00", 4);
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
info->vendor="Rockbox";
|
||||||
ata_identify[23 + i] = betoh16(wbuf[i]);
|
info->product="Internal Storage";
|
||||||
|
|
||||||
/* model field, need better name? */
|
|
||||||
memset(buf, ' ', 80);
|
|
||||||
memcpy(buf, "TNFL", 4);
|
|
||||||
|
|
||||||
for (i = 0; i < 40; i++)
|
|
||||||
ata_identify[27 + i] = betoh16(wbuf[i]);
|
|
||||||
|
|
||||||
/* blocks count */
|
/* blocks count */
|
||||||
blocks = (pages_per_block * blocks_per_bank / SECTOR_SIZE)
|
info->num_sectors = (pages_per_block * blocks_per_bank / SECTOR_SIZE)
|
||||||
* page_size * total_banks;
|
* page_size * total_banks;
|
||||||
ata_identify[60] = blocks & 0xffff;
|
info->sector_size=SECTOR_SIZE;
|
||||||
ata_identify[61] = blocks >> 16;
|
|
||||||
|
|
||||||
/* TODO: discover where is s/n in TNFL */
|
|
||||||
for (i = 10; i < 20; i++) {
|
|
||||||
ata_identify[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_init(void)
|
int nand_init(void)
|
||||||
{
|
{
|
||||||
int i, bank, phys_segment;
|
int i, bank, phys_segment;
|
||||||
unsigned char spare_buf[16];
|
unsigned char spare_buf[16];
|
||||||
|
@ -909,13 +845,12 @@ int ata_init(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fill_identify();
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned short* ata_get_identify(void)
|
long nand_last_disk_activity(void)
|
||||||
{
|
{
|
||||||
return ata_identify;
|
return last_disk_activity;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
#include "sd.h"
|
||||||
|
#include "storage.h"
|
||||||
|
|
||||||
#define BLOCK_SIZE 512
|
#define BLOCK_SIZE 512
|
||||||
#define SECTOR_SIZE 512
|
#define SECTOR_SIZE 512
|
||||||
|
@ -128,15 +130,13 @@
|
||||||
|
|
||||||
/** global, exported variables **/
|
/** global, exported variables **/
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
#define NUM_VOLUMES 2
|
#define NUM_DRIVES 2
|
||||||
#else
|
#else
|
||||||
#define NUM_VOLUMES 1
|
#define NUM_DRIVES 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* for compatibility */
|
/* for compatibility */
|
||||||
int ata_spinup_time = 0;
|
static long last_disk_activity = -1;
|
||||||
|
|
||||||
long last_disk_activity = -1;
|
|
||||||
|
|
||||||
/** static, private data **/
|
/** static, private data **/
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
|
@ -153,7 +153,7 @@ struct sd_card_status
|
||||||
int retry_max;
|
int retry_max;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sd_card_status sd_status[NUM_VOLUMES] =
|
static struct sd_card_status sd_status[NUM_DRIVES] =
|
||||||
{
|
{
|
||||||
{ 0, 1 },
|
{ 0, 1 },
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
|
@ -786,12 +786,12 @@ static void sd_select_device(int card_no)
|
||||||
|
|
||||||
/* API Functions */
|
/* API Functions */
|
||||||
|
|
||||||
static void ata_led(bool onoff)
|
static void sd_led(bool onoff)
|
||||||
{
|
{
|
||||||
led(onoff);
|
led(onoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
|
int sd_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
|
||||||
void* inbuf)
|
void* inbuf)
|
||||||
{
|
{
|
||||||
#ifndef HAVE_MULTIVOLUME
|
#ifndef HAVE_MULTIVOLUME
|
||||||
|
@ -805,14 +805,14 @@ int ata_read_sectors(IF_MV2(int drive,) unsigned long start, int incount,
|
||||||
|
|
||||||
mutex_lock(&sd_mtx);
|
mutex_lock(&sd_mtx);
|
||||||
|
|
||||||
ata_led(true);
|
sd_led(true);
|
||||||
|
|
||||||
ata_read_retry:
|
sd_read_retry:
|
||||||
if (drive != 0 && !card_detect_target())
|
if (drive != 0 && !card_detect_target())
|
||||||
{
|
{
|
||||||
/* no external sd-card inserted */
|
/* no external sd-card inserted */
|
||||||
ret = -EC_NOCARD;
|
ret = -EC_NOCARD;
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
sd_select_device(drive);
|
sd_select_device(drive);
|
||||||
|
@ -820,7 +820,7 @@ ata_read_retry:
|
||||||
if (currcard->initialized < 0)
|
if (currcard->initialized < 0)
|
||||||
{
|
{
|
||||||
ret = currcard->initialized;
|
ret = currcard->initialized;
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_disk_activity = current_tick;
|
last_disk_activity = current_tick;
|
||||||
|
@ -834,7 +834,7 @@ ata_read_retry:
|
||||||
{
|
{
|
||||||
ret = sd_select_bank(bank);
|
ret = sd_select_bank(bank);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
start -= bank * BLOCKS_PER_BANK;
|
start -= bank * BLOCKS_PER_BANK;
|
||||||
|
@ -842,7 +842,7 @@ ata_read_retry:
|
||||||
|
|
||||||
ret = sd_wait_for_state(TRAN, EC_TRAN_READ_ENTRY);
|
ret = sd_wait_for_state(TRAN, EC_TRAN_READ_ENTRY);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
|
|
||||||
BLOCK_COUNT_REG = incount;
|
BLOCK_COUNT_REG = incount;
|
||||||
|
|
||||||
|
@ -858,7 +858,7 @@ ata_read_retry:
|
||||||
ret = sd_command(READ_MULTIPLE_BLOCK, start * BLOCK_SIZE, NULL, 0x1c25);
|
ret = sd_command(READ_MULTIPLE_BLOCK, start * BLOCK_SIZE, NULL, 0x1c25);
|
||||||
}
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
|
|
||||||
/* TODO: Don't assume BLOCK_SIZE == SECTOR_SIZE */
|
/* TODO: Don't assume BLOCK_SIZE == SECTOR_SIZE */
|
||||||
|
|
||||||
|
@ -874,38 +874,38 @@ ata_read_retry:
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = -EC_FIFO_READ_FULL;
|
ret = -EC_FIFO_READ_FULL;
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_disk_activity = current_tick;
|
last_disk_activity = current_tick;
|
||||||
|
|
||||||
ret = sd_command(STOP_TRANSMISSION, 0, NULL, 1);
|
ret = sd_command(STOP_TRANSMISSION, 0, NULL, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
|
|
||||||
ret = sd_wait_for_state(TRAN, EC_TRAN_READ_EXIT);
|
ret = sd_wait_for_state(TRAN, EC_TRAN_READ_EXIT);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_read_error;
|
goto sd_read_error;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
ata_led(false);
|
sd_led(false);
|
||||||
mutex_unlock(&sd_mtx);
|
mutex_unlock(&sd_mtx);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ata_read_error:
|
sd_read_error:
|
||||||
if (sd_status[drive].retry < sd_status[drive].retry_max
|
if (sd_status[drive].retry < sd_status[drive].retry_max
|
||||||
&& ret != -EC_NOCARD)
|
&& ret != -EC_NOCARD)
|
||||||
{
|
{
|
||||||
sd_status[drive].retry++;
|
sd_status[drive].retry++;
|
||||||
currcard->initialized = 0;
|
currcard->initialized = 0;
|
||||||
goto ata_read_retry;
|
goto sd_read_retry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
|
int sd_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
|
||||||
const void* outbuf)
|
const void* outbuf)
|
||||||
{
|
{
|
||||||
/* Write support is not finished yet */
|
/* Write support is not finished yet */
|
||||||
|
@ -920,14 +920,14 @@ int ata_write_sectors(IF_MV2(int drive,) unsigned long start, int count,
|
||||||
|
|
||||||
mutex_lock(&sd_mtx);
|
mutex_lock(&sd_mtx);
|
||||||
|
|
||||||
ata_led(true);
|
sd_led(true);
|
||||||
|
|
||||||
ata_write_retry:
|
sd_write_retry:
|
||||||
if (drive != 0 && !card_detect_target())
|
if (drive != 0 && !card_detect_target())
|
||||||
{
|
{
|
||||||
/* no external sd-card inserted */
|
/* no external sd-card inserted */
|
||||||
ret = -EC_NOCARD;
|
ret = -EC_NOCARD;
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
sd_select_device(drive);
|
sd_select_device(drive);
|
||||||
|
@ -935,7 +935,7 @@ ata_write_retry:
|
||||||
if (currcard->initialized < 0)
|
if (currcard->initialized < 0)
|
||||||
{
|
{
|
||||||
ret = currcard->initialized;
|
ret = currcard->initialized;
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only switch banks with non-SDHC cards */
|
/* Only switch banks with non-SDHC cards */
|
||||||
|
@ -947,7 +947,7 @@ ata_write_retry:
|
||||||
{
|
{
|
||||||
ret = sd_select_bank(bank);
|
ret = sd_select_bank(bank);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
start -= bank * BLOCKS_PER_BANK;
|
start -= bank * BLOCKS_PER_BANK;
|
||||||
|
@ -957,7 +957,7 @@ ata_write_retry:
|
||||||
|
|
||||||
ret = sd_wait_for_state(TRAN, EC_TRAN_WRITE_ENTRY);
|
ret = sd_wait_for_state(TRAN, EC_TRAN_WRITE_ENTRY);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
|
|
||||||
BLOCK_COUNT_REG = count;
|
BLOCK_COUNT_REG = count;
|
||||||
|
|
||||||
|
@ -973,7 +973,7 @@ ata_write_retry:
|
||||||
ret = sd_command(WRITE_MULTIPLE_BLOCK, start*BLOCK_SIZE, NULL, 0x1c2d);
|
ret = sd_command(WRITE_MULTIPLE_BLOCK, start*BLOCK_SIZE, NULL, 0x1c2d);
|
||||||
}
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
|
|
||||||
buf_end = outbuf + count * currcard->block_size - 2*FIFO_LEN;
|
buf_end = outbuf + count * currcard->block_size - 2*FIFO_LEN;
|
||||||
|
|
||||||
|
@ -996,7 +996,7 @@ ata_write_retry:
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = -EC_FIFO_WR_EMPTY;
|
ret = -EC_FIFO_WR_EMPTY;
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_disk_activity = current_tick;
|
last_disk_activity = current_tick;
|
||||||
|
@ -1004,31 +1004,31 @@ ata_write_retry:
|
||||||
if (!sd_poll_status(DATA_DONE, 0x80000))
|
if (!sd_poll_status(DATA_DONE, 0x80000))
|
||||||
{
|
{
|
||||||
ret = -EC_FIFO_WR_DONE;
|
ret = -EC_FIFO_WR_DONE;
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sd_command(STOP_TRANSMISSION, 0, NULL, 1);
|
ret = sd_command(STOP_TRANSMISSION, 0, NULL, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
|
|
||||||
ret = sd_wait_for_state(TRAN, EC_TRAN_WRITE_EXIT);
|
ret = sd_wait_for_state(TRAN, EC_TRAN_WRITE_EXIT);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ata_write_error;
|
goto sd_write_error;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
ata_led(false);
|
sd_led(false);
|
||||||
mutex_unlock(&sd_mtx);
|
mutex_unlock(&sd_mtx);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ata_write_error:
|
sd_write_error:
|
||||||
if (sd_status[drive].retry < sd_status[drive].retry_max
|
if (sd_status[drive].retry < sd_status[drive].retry_max
|
||||||
&& ret != -EC_NOCARD)
|
&& ret != -EC_NOCARD)
|
||||||
{
|
{
|
||||||
sd_status[drive].retry++;
|
sd_status[drive].retry++;
|
||||||
currcard->initialized = 0;
|
currcard->initialized = 0;
|
||||||
goto ata_write_retry;
|
goto sd_write_retry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1088,7 +1088,7 @@ static void sd_thread(void)
|
||||||
|
|
||||||
if (!idle_notified)
|
if (!idle_notified)
|
||||||
{
|
{
|
||||||
call_ata_idle_notifys(false);
|
call_storage_idle_notifys(false);
|
||||||
idle_notified = true;
|
idle_notified = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1106,37 +1106,7 @@ static void sd_thread(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sd_enable(bool on)
|
||||||
void ata_spindown(int seconds)
|
|
||||||
{
|
|
||||||
(void)seconds;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ata_disk_is_active(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_sleep(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_spin(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hardware reset protocol as specified in chapter 9.1, ATA spec draft v5 */
|
|
||||||
int ata_hard_reset(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ata_soft_reset(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ata_enable(bool on)
|
|
||||||
{
|
{
|
||||||
if(on)
|
if(on)
|
||||||
{
|
{
|
||||||
|
@ -1170,7 +1140,7 @@ void card_enable_monitoring_target(bool on)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ata_init(void)
|
int sd_init(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -1179,7 +1149,7 @@ int ata_init(void)
|
||||||
|
|
||||||
mutex_lock(&sd_mtx);
|
mutex_lock(&sd_mtx);
|
||||||
|
|
||||||
ata_led(false);
|
sd_led(false);
|
||||||
|
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
{
|
{
|
||||||
|
@ -1324,3 +1294,46 @@ void microsd_int(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif /* HAVE_HOTSWAP */
|
#endif /* HAVE_HOTSWAP */
|
||||||
|
|
||||||
|
long sd_last_disk_activity(void)
|
||||||
|
{
|
||||||
|
return last_disk_activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sd_get_info(IF_MV2(int drive,) struct storage_info *info)
|
||||||
|
{
|
||||||
|
#ifndef HAVE_MULTIVOLUME
|
||||||
|
const int drive=0;
|
||||||
|
#endif
|
||||||
|
info->sector_size=card_info[drive].block_size;
|
||||||
|
info->num_sectors=card_info[drive].numblocks;
|
||||||
|
info->vendor="Rockbox";
|
||||||
|
if(drive==0)
|
||||||
|
{
|
||||||
|
info->product="Internal Storage";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
info->product="SD Card Slot";
|
||||||
|
}
|
||||||
|
info->revision="0.00";
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_HOTSWAP
|
||||||
|
bool sd_removable(IF_MV_NONVOID(int drive))
|
||||||
|
{
|
||||||
|
#ifndef HAVE_MULTIVOLUME
|
||||||
|
const int drive=0;
|
||||||
|
#endif
|
||||||
|
return (drive==1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sd_present(IF_MV_NONVOID(int drive))
|
||||||
|
{
|
||||||
|
#ifndef HAVE_MULTIVOLUME
|
||||||
|
const int drive=0;
|
||||||
|
#endif
|
||||||
|
return (card_info[drive].initialized && card_info[drive].numblocks > 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
@ -86,7 +86,7 @@ static struct event_queue usb_queue;
|
||||||
static int last_usb_status;
|
static int last_usb_status;
|
||||||
static bool usb_monitor_enabled;
|
static bool usb_monitor_enabled;
|
||||||
#ifdef HAVE_USBSTACK
|
#ifdef HAVE_USBSTACK
|
||||||
static bool exclusive_ata_access;
|
static bool exclusive_storage_access;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -105,9 +105,9 @@ static void usb_slave_mode(bool on)
|
||||||
if(on)
|
if(on)
|
||||||
{
|
{
|
||||||
DEBUGF("Entering USB slave mode\n");
|
DEBUGF("Entering USB slave mode\n");
|
||||||
ata_soft_reset();
|
storage_soft_reset();
|
||||||
ata_init();
|
storage_init();
|
||||||
ata_enable(false);
|
storage_enable(false);
|
||||||
usb_enable(true);
|
usb_enable(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -119,9 +119,9 @@ static void usb_slave_mode(bool on)
|
||||||
|
|
||||||
usb_enable(false);
|
usb_enable(false);
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
panicf("ata: %d",rc);
|
panicf("storage: %d",rc);
|
||||||
|
|
||||||
rc = disk_mount_all();
|
rc = disk_mount_all();
|
||||||
if (rc <= 0) /* no partition */
|
if (rc <= 0) /* no partition */
|
||||||
|
@ -134,7 +134,7 @@ static void usb_slave_mode(bool on)
|
||||||
static void try_reboot(void)
|
static void try_reboot(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DISK_STORAGE
|
#ifdef HAVE_DISK_STORAGE
|
||||||
ata_sleepnow(); /* Immediately spindown the disk. */
|
storage_sleepnow(); /* Immediately spindown the disk. */
|
||||||
sleep(HZ*2);
|
sleep(HZ*2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -262,7 +262,7 @@ static void usb_thread(void)
|
||||||
#ifdef HAVE_PRIORITY_SCHEDULING
|
#ifdef HAVE_PRIORITY_SCHEDULING
|
||||||
thread_set_priority(usb_thread_entry,PRIORITY_REALTIME);
|
thread_set_priority(usb_thread_entry,PRIORITY_REALTIME);
|
||||||
#endif
|
#endif
|
||||||
exclusive_ata_access = true;
|
exclusive_storage_access = true;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
usb_slave_mode(true);
|
usb_slave_mode(true);
|
||||||
|
@ -310,12 +310,12 @@ static void usb_thread(void)
|
||||||
|
|
||||||
usb_state = USB_EXTRACTED;
|
usb_state = USB_EXTRACTED;
|
||||||
#ifdef HAVE_USBSTACK
|
#ifdef HAVE_USBSTACK
|
||||||
if(exclusive_ata_access)
|
if(exclusive_storage_access)
|
||||||
{
|
{
|
||||||
int rc = disk_mount_all();
|
int rc = disk_mount_all();
|
||||||
if (rc <= 0) /* no partition */
|
if (rc <= 0) /* no partition */
|
||||||
panicf("mount: %d",rc);
|
panicf("mount: %d",rc);
|
||||||
exclusive_ata_access = false;
|
exclusive_storage_access = false;
|
||||||
#endif
|
#endif
|
||||||
/* Tell all threads that we are back in business */
|
/* Tell all threads that we are back in business */
|
||||||
num_acks_to_expect =
|
num_acks_to_expect =
|
||||||
|
@ -455,7 +455,7 @@ void usb_init(void)
|
||||||
{
|
{
|
||||||
usb_state = USB_EXTRACTED;
|
usb_state = USB_EXTRACTED;
|
||||||
#ifdef HAVE_USBSTACK
|
#ifdef HAVE_USBSTACK
|
||||||
exclusive_ata_access = false;
|
exclusive_storage_access = false;
|
||||||
#endif
|
#endif
|
||||||
usb_monitor_enabled = false;
|
usb_monitor_enabled = false;
|
||||||
countdown = -1;
|
countdown = -1;
|
||||||
|
@ -561,7 +561,7 @@ void usb_request_exclusive_ata(void)
|
||||||
* currently the best one. We want to get rid of having to boost the cpu
|
* currently the best one. We want to get rid of having to boost the cpu
|
||||||
* for usb anyway */
|
* for usb anyway */
|
||||||
trigger_cpu_boost();
|
trigger_cpu_boost();
|
||||||
if(!exclusive_ata_access) {
|
if(!exclusive_storage_access) {
|
||||||
queue_post(&usb_queue, USB_REQUEST_DISK, 0);
|
queue_post(&usb_queue, USB_REQUEST_DISK, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -569,15 +569,15 @@ void usb_request_exclusive_ata(void)
|
||||||
void usb_release_exclusive_ata(void)
|
void usb_release_exclusive_ata(void)
|
||||||
{
|
{
|
||||||
cancel_cpu_boost();
|
cancel_cpu_boost();
|
||||||
if(exclusive_ata_access) {
|
if(exclusive_storage_access) {
|
||||||
queue_post(&usb_queue, USB_RELEASE_DISK, 0);
|
queue_post(&usb_queue, USB_RELEASE_DISK, 0);
|
||||||
exclusive_ata_access = false;
|
exclusive_storage_access = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool usb_exclusive_ata(void)
|
bool usb_exclusive_ata(void)
|
||||||
{
|
{
|
||||||
return exclusive_ata_access;
|
return exclusive_storage_access;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
#include "as3514.h"
|
#include "as3514.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(HAVE_AS3514) && !defined(IPOD_ARCH)
|
#if !defined(HAVE_AS3514) && !defined(IPOD_ARCH) && (CONFIG_STORAGE & STORAGE_ATA)
|
||||||
#include "ata.h"
|
#include "ata.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -281,7 +281,7 @@ static void set_serial_descriptor(void)
|
||||||
}
|
}
|
||||||
usb_string_iSerial.bLength=68;
|
usb_string_iSerial.bLength=68;
|
||||||
}
|
}
|
||||||
#else
|
#elif (CONFIG_STORAGE & STORAGE_ATA)
|
||||||
/* If we don't know the device serial number, use the one
|
/* If we don't know the device serial number, use the one
|
||||||
* from the disk */
|
* from the disk */
|
||||||
static void set_serial_descriptor(void)
|
static void set_serial_descriptor(void)
|
||||||
|
@ -300,6 +300,8 @@ static void set_serial_descriptor(void)
|
||||||
}
|
}
|
||||||
usb_string_iSerial.bLength=84;
|
usb_string_iSerial.bLength=84;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
#error No set_serial_descriptor() implementation for this target
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void usb_core_init(void)
|
void usb_core_init(void)
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include "usb_drv.h"
|
#include "usb_drv.h"
|
||||||
//#define LOGF_ENABLE
|
//#define LOGF_ENABLE
|
||||||
#include "logf.h"
|
#include "logf.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "hotswap.h"
|
#include "hotswap.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
/* Needed to get at the audio buffer */
|
/* Needed to get at the audio buffer */
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
/* The SD card driver on Sansa c200 and e200 can cause write corruption,
|
/* The SD card driver on Sansa c200 and e200 can cause write corruption,
|
||||||
* often triggered by simultaneous USB activity. This can be largely avoided
|
* often triggered by simultaneous USB activity. This can be largely avoided
|
||||||
* by not overlapping ata_write_sector() with USB transfers. This does reduce
|
* by not overlapping storage_write_sector() with USB transfers. This does reduce
|
||||||
* write performance, so we only do it for the affected DAPs
|
* write performance, so we only do it for the affected DAPs
|
||||||
*/
|
*/
|
||||||
#if (CONFIG_STORAGE & STORAGE_SD)
|
#if (CONFIG_STORAGE & STORAGE_SD)
|
||||||
|
@ -147,10 +147,8 @@ struct inquiry_data {
|
||||||
struct report_lun_data {
|
struct report_lun_data {
|
||||||
unsigned int lun_list_length;
|
unsigned int lun_list_length;
|
||||||
unsigned int reserved1;
|
unsigned int reserved1;
|
||||||
unsigned char lun0[8];
|
// TODO this should be cleaned up with the VOLUMES vs DRIVES mess
|
||||||
#ifdef HAVE_HOTSWAP
|
unsigned char luns[NUM_VOLUMES][8];
|
||||||
unsigned char lun1[8];
|
|
||||||
#endif
|
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
struct sense_data {
|
struct sense_data {
|
||||||
|
@ -263,7 +261,7 @@ static void send_command_result(void *data,int size);
|
||||||
static void send_command_failed_result(void);
|
static void send_command_failed_result(void);
|
||||||
static void send_block_data(void *data,int size);
|
static void send_block_data(void *data,int size);
|
||||||
static void receive_block_data(void *data,int size);
|
static void receive_block_data(void *data,int size);
|
||||||
static void identify2inquiry(int lun);
|
static void fill_inquiry(IF_MV_NONVOID(int lun));
|
||||||
static void send_and_read_next(void);
|
static void send_and_read_next(void);
|
||||||
static bool ejected[NUM_VOLUMES];
|
static bool ejected[NUM_VOLUMES];
|
||||||
|
|
||||||
|
@ -289,7 +287,7 @@ static bool check_disk_present(IF_MV_NONVOID(int volume))
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
unsigned char sector[512];
|
unsigned char sector[512];
|
||||||
return ata_read_sectors(IF_MV2(volume,)0,1,sector) == 0;
|
return storage_read_sectors(IF_MV2(volume,)0,1,sector) == 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,7 +458,7 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length)
|
||||||
cur_cmd.data[cur_cmd.data_select],
|
cur_cmd.data[cur_cmd.data_select],
|
||||||
MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
|
MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
|
||||||
#else
|
#else
|
||||||
int result = ata_write_sectors(IF_MV2(cur_cmd.lun,)
|
int result = storage_write_sectors(IF_MV2(cur_cmd.lun,)
|
||||||
cur_cmd.sector,
|
cur_cmd.sector,
|
||||||
MIN(BUFFER_SIZE/SECTOR_SIZE,
|
MIN(BUFFER_SIZE/SECTOR_SIZE,
|
||||||
cur_cmd.count),
|
cur_cmd.count),
|
||||||
|
@ -639,7 +637,7 @@ static void send_and_read_next(void)
|
||||||
ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE,
|
ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE,
|
||||||
MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
|
MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
|
||||||
#else
|
#else
|
||||||
cur_cmd.last_result = ata_read_sectors(IF_MV2(cur_cmd.lun,)
|
cur_cmd.last_result = storage_read_sectors(IF_MV2(cur_cmd.lun,)
|
||||||
cur_cmd.sector,
|
cur_cmd.sector,
|
||||||
MIN(BUFFER_SIZE/SECTOR_SIZE,
|
MIN(BUFFER_SIZE/SECTOR_SIZE,
|
||||||
cur_cmd.count),
|
cur_cmd.count),
|
||||||
|
@ -654,6 +652,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
|
||||||
/* USB Mass Storage assumes LBA capability.
|
/* USB Mass Storage assumes LBA capability.
|
||||||
TODO: support 48-bit LBA */
|
TODO: support 48-bit LBA */
|
||||||
|
|
||||||
|
struct storage_info info;
|
||||||
unsigned int length = cbw->data_transfer_length;
|
unsigned int length = cbw->data_transfer_length;
|
||||||
unsigned int block_size = 0;
|
unsigned int block_size = 0;
|
||||||
unsigned int block_count = 0;
|
unsigned int block_count = 0;
|
||||||
|
@ -664,25 +663,20 @@ static void handle_scsi(struct command_block_wrapper* cbw)
|
||||||
unsigned char lun = cbw->lun;
|
unsigned char lun = cbw->lun;
|
||||||
#endif
|
#endif
|
||||||
unsigned int block_size_mult = 1;
|
unsigned int block_size_mult = 1;
|
||||||
|
storage_get_info(IF_MV2(lun,)&info);
|
||||||
#ifdef USB_USE_RAMDISK
|
#ifdef USB_USE_RAMDISK
|
||||||
block_size = SECTOR_SIZE;
|
block_size = SECTOR_SIZE;
|
||||||
block_count = RAMDISK_SIZE;
|
block_count = RAMDISK_SIZE;
|
||||||
#else
|
#else
|
||||||
#if (CONFIG_STORAGE & STORAGE_SD) || defined(HAVE_HOTSWAP)
|
block_size=info.sector_size;
|
||||||
tCardInfo* cinfo = card_get_info(lun);
|
block_count=info.num_sectors;
|
||||||
if(cinfo->initialized && cinfo->numblocks > 0) {
|
#endif
|
||||||
block_size = cinfo->blocksize;
|
|
||||||
block_count = cinfo->numblocks;
|
#ifdef HAVE_HOTSWAP
|
||||||
}
|
if(storage_removable(IF_MV(lun)) && !storage_present(IF_MV(lun))) {
|
||||||
else {
|
|
||||||
ejected[lun] = true;
|
ejected[lun] = true;
|
||||||
try_release_ata();
|
try_release_ata();
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
unsigned short* identify = ata_get_identify();
|
|
||||||
block_size = SECTOR_SIZE;
|
|
||||||
block_count = (identify[61] << 16 | identify[60]);
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(ejected[lun])
|
if(ejected[lun])
|
||||||
|
@ -719,19 +713,22 @@ static void handle_scsi(struct command_block_wrapper* cbw)
|
||||||
case SCSI_REPORT_LUNS: {
|
case SCSI_REPORT_LUNS: {
|
||||||
logf("scsi inquiry %d",lun);
|
logf("scsi inquiry %d",lun);
|
||||||
int allocation_length=0;
|
int allocation_length=0;
|
||||||
|
int i;
|
||||||
allocation_length|=(cbw->command_block[6]<<24);
|
allocation_length|=(cbw->command_block[6]<<24);
|
||||||
allocation_length|=(cbw->command_block[7]<<16);
|
allocation_length|=(cbw->command_block[7]<<16);
|
||||||
allocation_length|=(cbw->command_block[8]<<8);
|
allocation_length|=(cbw->command_block[8]<<8);
|
||||||
allocation_length|=(cbw->command_block[9]);
|
allocation_length|=(cbw->command_block[9]);
|
||||||
memset(tb.lun_data,0,sizeof(struct report_lun_data));
|
memset(tb.lun_data,0,sizeof(struct report_lun_data));
|
||||||
|
tb.lun_data->lun_list_length=htobe32(8*NUM_VOLUMES);
|
||||||
|
for(i=0;i<NUM_VOLUMES;i++)
|
||||||
|
{
|
||||||
#ifdef HAVE_HOTSWAP
|
#ifdef HAVE_HOTSWAP
|
||||||
tb.lun_data->lun_list_length=htobe32(16);
|
if(storage_removable(IF_MV(i)))
|
||||||
tb.lun_data->lun1[1]=1;
|
tb.lun_data->luns[i][1]=1;
|
||||||
#else
|
else
|
||||||
tb.lun_data->lun_list_length=htobe32(8);
|
|
||||||
#endif
|
#endif
|
||||||
tb.lun_data->lun0[1]=0;
|
tb.lun_data->luns[i][1]=0;
|
||||||
|
}
|
||||||
send_command_result(tb.lun_data,
|
send_command_result(tb.lun_data,
|
||||||
MIN(sizeof(struct report_lun_data), length));
|
MIN(sizeof(struct report_lun_data), length));
|
||||||
break;
|
break;
|
||||||
|
@ -739,7 +736,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
|
||||||
|
|
||||||
case SCSI_INQUIRY:
|
case SCSI_INQUIRY:
|
||||||
logf("scsi inquiry %d",lun);
|
logf("scsi inquiry %d",lun);
|
||||||
identify2inquiry(lun);
|
fill_inquiry(IF_MV(lun));
|
||||||
length = MIN(length, cbw->command_block[4]);
|
length = MIN(length, cbw->command_block[4]);
|
||||||
send_command_result(tb.inquiry,
|
send_command_result(tb.inquiry,
|
||||||
MIN(sizeof(struct inquiry_data), length));
|
MIN(sizeof(struct inquiry_data), length));
|
||||||
|
@ -975,7 +972,7 @@ static void handle_scsi(struct command_block_wrapper* cbw)
|
||||||
ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE,
|
ramdisk_buffer + cur_cmd.sector*SECTOR_SIZE,
|
||||||
MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
|
MIN(BUFFER_SIZE/SECTOR_SIZE, cur_cmd.count)*SECTOR_SIZE);
|
||||||
#else
|
#else
|
||||||
cur_cmd.last_result = ata_read_sectors(IF_MV2(cur_cmd.lun,)
|
cur_cmd.last_result = storage_read_sectors(IF_MV2(cur_cmd.lun,)
|
||||||
cur_cmd.sector,
|
cur_cmd.sector,
|
||||||
MIN(BUFFER_SIZE/SECTOR_SIZE,
|
MIN(BUFFER_SIZE/SECTOR_SIZE,
|
||||||
cur_cmd.count),
|
cur_cmd.count),
|
||||||
|
@ -1072,46 +1069,30 @@ static void send_csw(int status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* convert ATA IDENTIFY to SCSI INQUIRY */
|
static void copy_padded(char *dest, char *src, int len)
|
||||||
static void identify2inquiry(int lun)
|
|
||||||
{
|
{
|
||||||
#ifdef HAVE_FLASH_STORAGE
|
int i=0;
|
||||||
if(lun==0) {
|
while(src[i]!=0 && i<len)
|
||||||
memcpy(&tb.inquiry->VendorId,"Rockbox ",8);
|
{
|
||||||
memcpy(&tb.inquiry->ProductId,"Internal Storage",16);
|
dest[i]=src[i];
|
||||||
memcpy(&tb.inquiry->ProductRevisionLevel,"0.00",4);
|
i++;
|
||||||
}
|
}
|
||||||
else {
|
while(i<len)
|
||||||
memcpy(&tb.inquiry->VendorId,"Rockbox ",8);
|
{
|
||||||
memcpy(&tb.inquiry->ProductId,"SD Card Slot ",16);
|
dest[i]=' ';
|
||||||
memcpy(&tb.inquiry->ProductRevisionLevel,"0.00",4);
|
i++;
|
||||||
}
|
}
|
||||||
#else
|
}
|
||||||
unsigned int i;
|
|
||||||
unsigned short* dest;
|
|
||||||
unsigned short* src;
|
|
||||||
unsigned short* identify = ata_get_identify();
|
|
||||||
(void)lun;
|
|
||||||
memset(tb.inquiry, 0, sizeof(struct inquiry_data));
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (identify[82] & 4)
|
|
||||||
tb.inquiry->DeviceTypeModifier = DEVICE_REMOVABLE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ATA only has a 'model' field, so we copy the
|
/* build SCSI INQUIRY */
|
||||||
first 8 bytes to 'vendor' and the rest to 'product' (they are
|
static void fill_inquiry(IF_MV_NONVOID(int lun))
|
||||||
consecutive in the inquiry struct) */
|
{
|
||||||
src = (unsigned short*)&identify[27];
|
memset(tb.inquiry, 0, sizeof(struct inquiry_data));
|
||||||
dest = (unsigned short*)&tb.inquiry->VendorId;
|
struct storage_info info;
|
||||||
for (i=0;i<12;i++)
|
storage_get_info(IF_MV2(lun,)&info);
|
||||||
dest[i] = htobe16(src[i]);
|
copy_padded(tb.inquiry->VendorId,info.vendor,sizeof(tb.inquiry->VendorId));
|
||||||
|
copy_padded(tb.inquiry->ProductId,info.product,sizeof(tb.inquiry->ProductId));
|
||||||
src = (unsigned short*)&identify[23];
|
copy_padded(tb.inquiry->ProductRevisionLevel,info.revision,sizeof(tb.inquiry->ProductRevisionLevel));
|
||||||
dest = (unsigned short*)&tb.inquiry->ProductRevisionLevel;
|
|
||||||
for (i=0;i<2;i++)
|
|
||||||
dest[i] = htobe16(src[i]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
tb.inquiry->DeviceType = DIRECT_ACCESS_DEVICE;
|
tb.inquiry->DeviceType = DIRECT_ACCESS_DEVICE;
|
||||||
tb.inquiry->AdditionalLength = 0x1f;
|
tb.inquiry->AdditionalLength = 0x1f;
|
||||||
|
@ -1119,14 +1100,6 @@ static void identify2inquiry(int lun)
|
||||||
tb.inquiry->Versions = 4; /* SPC-2 */
|
tb.inquiry->Versions = 4; /* SPC-2 */
|
||||||
tb.inquiry->Format = 2; /* SPC-2/3 inquiry format */
|
tb.inquiry->Format = 2; /* SPC-2/3 inquiry format */
|
||||||
|
|
||||||
#if 0
|
|
||||||
#ifdef HAVE_HOTSWAP
|
|
||||||
if(lun>0)
|
|
||||||
tb.inquiry->DeviceTypeModifier = DEVICE_REMOVABLE;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
/* Mac OSX 10.5 doesn't like this driver if DEVICE_REMOVABLE is not set.
|
|
||||||
TODO : this can probably be solved by providing caching mode page */
|
|
||||||
#ifdef TOSHIBA_GIGABEAT_S
|
#ifdef TOSHIBA_GIGABEAT_S
|
||||||
tb.inquiry->DeviceTypeModifier = 0;
|
tb.inquiry->DeviceTypeModifier = 0;
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "ata.h"
|
#include "storage.h"
|
||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "adc.h"
|
#include "adc.h"
|
||||||
|
@ -168,7 +168,7 @@ void main(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rc = ata_init();
|
rc = storage_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
@ -179,7 +179,7 @@ void main(void)
|
||||||
lcd_update();
|
lcd_update();
|
||||||
while(!(button_get(true) & BUTTON_REL));
|
while(!(button_get(true) & BUTTON_REL));
|
||||||
#endif
|
#endif
|
||||||
panicf("ata: %d", rc);
|
panicf("storage: %d", rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_start_monitoring();
|
usb_start_monitoring();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue