Fix screendump on iPod Nano 2G by increasing the usb thread stack size and reducing the stack usage of FAT and storage functions
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28356 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
0952848368
commit
01cdb6a21f
5 changed files with 33 additions and 47 deletions
|
@ -65,7 +65,8 @@ static int open_internal(const char* pathname, int flags, bool use_cache)
|
|||
DIR_UNCACHED* dir;
|
||||
struct dirent_uncached* entry;
|
||||
int fd;
|
||||
char pathnamecopy[MAX_PATH];
|
||||
int pathnamesize = strlen(pathname) + 1;
|
||||
char pathnamecopy[pathnamesize];
|
||||
char* name;
|
||||
struct filedesc* file = NULL;
|
||||
int rc;
|
||||
|
@ -133,7 +134,7 @@ static int open_internal(const char* pathname, int flags, bool use_cache)
|
|||
}
|
||||
#endif
|
||||
|
||||
strlcpy(pathnamecopy, pathname, sizeof(pathnamecopy));
|
||||
strlcpy(pathnamecopy, pathname, pathnamesize);
|
||||
|
||||
/* locate filename */
|
||||
name=strrchr(pathnamecopy+1,'/');
|
||||
|
|
|
@ -39,6 +39,20 @@
|
|||
#define LE16_CONST(x) (x)&0xff, ((x)>>8)&0xff
|
||||
#define LE32_CONST(x) (x)&0xff, ((x)>>8)&0xff, ((x)>>16)&0xff, ((x)>>24)&0xff
|
||||
|
||||
#if LCD_DEPTH <= 4
|
||||
#define BMP_BPP 4
|
||||
#define BMP_LINESIZE ((LCD_WIDTH/2 + 3) & ~3)
|
||||
#elif LCD_DEPTH <= 8
|
||||
#define BMP_BPP 8
|
||||
#define BMP_LINESIZE ((LCD_WIDTH + 3) & ~3)
|
||||
#elif LCD_DEPTH <= 16
|
||||
#define BMP_BPP 16
|
||||
#define BMP_LINESIZE ((LCD_WIDTH*2 + 3) & ~3)
|
||||
#else
|
||||
#define BMP_BPP 24
|
||||
#define BMP_LINESIZE ((LCD_WIDTH*3 + 3) & ~3)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BOOTLOADER
|
||||
|
||||
|
|
|
@ -49,20 +49,6 @@
|
|||
#endif /* LCD_DEPTH > 8 */
|
||||
#endif /* LCD_DEPTH != 16 */
|
||||
|
||||
#if LCD_DEPTH <= 4
|
||||
#define BMP_BPP 4
|
||||
#define BMP_LINESIZE ((LCD_WIDTH/2 + 3) & ~3)
|
||||
#elif LCD_DEPTH <= 8
|
||||
#define BMP_BPP 8
|
||||
#define BMP_LINESIZE ((LCD_WIDTH + 3) & ~3)
|
||||
#elif LCD_DEPTH <= 16
|
||||
#define BMP_BPP 16
|
||||
#define BMP_LINESIZE ((LCD_WIDTH*2 + 3) & ~3)
|
||||
#else
|
||||
#define BMP_BPP 24
|
||||
#define BMP_LINESIZE ((LCD_WIDTH*3 + 3) & ~3)
|
||||
#endif
|
||||
|
||||
#define BMP_HEADERSIZE (54 + 4 * BMP_NUMCOLORS)
|
||||
#define BMP_DATASIZE (BMP_LINESIZE * (LCD_HEIGHT+LCD_SPLIT_LINES))
|
||||
#define BMP_TOTALSIZE (BMP_HEADERSIZE + BMP_DATASIZE)
|
||||
|
@ -115,7 +101,7 @@ static void (*screen_dump_hook)(int fh) = NULL;
|
|||
void screen_dump(void)
|
||||
{
|
||||
int fd, y;
|
||||
char filename[MAX_PATH];
|
||||
char filename[32];
|
||||
|
||||
fb_data *src;
|
||||
#if LCD_DEPTH == 1
|
||||
|
|
|
@ -418,6 +418,13 @@ static uint16_t ftl_offsets_backup[0x200] STORAGE_ALIGN_ATTR;
|
|||
|
||||
static struct mutex ftl_mtx;
|
||||
|
||||
/* Pages per hyperblock (ftl_nand_type->pagesperblock * ftl_banks) */
|
||||
static uint32_t ppb;
|
||||
|
||||
/* Reserved hyperblocks (ftl_nand_type->blocks
|
||||
- ftl_nand_type->userblocks - 0x17) */
|
||||
static uint32_t syshyperblocks;
|
||||
|
||||
|
||||
|
||||
/* Finds a device info page for the specified bank and returns its number.
|
||||
|
@ -826,9 +833,6 @@ static uint32_t ftl_vfl_read(uint32_t vpage, void* buffer, void* sparebuffer,
|
|||
DEBUGF("FTL: VFL: Reading page %d\n", vpage);
|
||||
#endif
|
||||
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t syshyperblocks = ftl_nand_type->blocks
|
||||
- ftl_nand_type->userblocks - 0x17;
|
||||
uint32_t abspage = vpage + ppb * syshyperblocks;
|
||||
if (abspage >= ftl_nand_type->blocks * ppb || abspage < ppb)
|
||||
{
|
||||
|
@ -875,9 +879,6 @@ static uint32_t ftl_vfl_read_fast(uint32_t vpage, void* buffer, void* sparebuffe
|
|||
#endif
|
||||
|
||||
uint32_t i, rc = 0;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t syshyperblocks = ftl_nand_type->blocks
|
||||
- ftl_nand_type->userblocks - 0x17;
|
||||
uint32_t abspage = vpage + ppb * syshyperblocks;
|
||||
if (abspage + ftl_banks - 1 >= ftl_nand_type->blocks * ppb || abspage < ppb)
|
||||
{
|
||||
|
@ -951,9 +952,6 @@ static uint32_t ftl_vfl_write(uint32_t vpage, uint32_t count,
|
|||
DEBUGF("FTL: VFL: Writing page %d\n", vpage);
|
||||
#endif
|
||||
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t syshyperblocks = ftl_nand_type->blocks
|
||||
- ftl_nand_type->userblocks - 0x17;
|
||||
uint32_t abspage = vpage + ppb * syshyperblocks;
|
||||
if (abspage + count > ftl_nand_type->blocks * ppb || abspage < ppb)
|
||||
{
|
||||
|
@ -962,9 +960,9 @@ static uint32_t ftl_vfl_write(uint32_t vpage, uint32_t count,
|
|||
return 4;
|
||||
}
|
||||
|
||||
uint32_t bank[5];
|
||||
uint32_t block[5];
|
||||
uint32_t physpage[5];
|
||||
static uint32_t bank[5];
|
||||
static uint32_t block[5];
|
||||
static uint32_t physpage[5];
|
||||
|
||||
for (i = 0; i < count; i++, abspage++)
|
||||
{
|
||||
|
@ -1034,9 +1032,6 @@ static uint32_t ftl_vfl_open(void)
|
|||
uint8_t bbt[0x410];
|
||||
#endif
|
||||
|
||||
uint32_t syshyperblocks = ftl_nand_type->blocks
|
||||
- ftl_nand_type->userblocks - 0x18;
|
||||
|
||||
for (i = 0; i < ftl_banks; i++)
|
||||
#ifndef FTL_READONLY
|
||||
if (ftl_load_bbt(i, ftl_bbt[i]) == 0)
|
||||
|
@ -1117,7 +1112,6 @@ static uint32_t ftl_open(void)
|
|||
{
|
||||
uint32_t i;
|
||||
uint32_t ret;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
struct ftl_vfl_cxt_type* cxt = ftl_vfl_get_newest_cxt();
|
||||
|
||||
uint32_t ftlcxtblock = 0xffffffff;
|
||||
|
@ -1281,7 +1275,6 @@ static struct ftl_log_type* ftl_get_log_entry(uint32_t block)
|
|||
uint32_t ftl_read(uint32_t sector, uint32_t count, void* buffer)
|
||||
{
|
||||
uint32_t i, j;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t error = 0;
|
||||
|
||||
#ifdef FTL_TRACE
|
||||
|
@ -1513,7 +1506,6 @@ static uint32_t ftl_save_erasectr_page(uint32_t index)
|
|||
static uint32_t ftl_next_ctrl_pool_page(void)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
if (++ftl_cxt.ftlctrlpage % ppb != 0) return 0;
|
||||
for (i = 0; i < 3; i++)
|
||||
if ((ftl_cxt.ftlctrlblocks[i] + 1) * ppb == ftl_cxt.ftlctrlpage)
|
||||
|
@ -1552,7 +1544,6 @@ static uint32_t ftl_next_ctrl_pool_page(void)
|
|||
static uint32_t ftl_copy_page(uint32_t source, uint32_t destination,
|
||||
uint32_t lpn, uint32_t type)
|
||||
{
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t rc = ftl_vfl_read(source, ftl_copybuffer[0],
|
||||
&ftl_copyspare[0], 1, 1) & 0x11F;
|
||||
memset(&ftl_copyspare[0], 0xFF, 0x40);
|
||||
|
@ -1573,7 +1564,6 @@ static uint32_t ftl_copy_page(uint32_t source, uint32_t destination,
|
|||
static uint32_t ftl_copy_block(uint32_t source, uint32_t destination)
|
||||
{
|
||||
uint32_t i, j;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t error = 0;
|
||||
ftl_cxt.nextblockusn++;
|
||||
for (i = 0; i < ppb; i += FTL_COPYBUF_SIZE)
|
||||
|
@ -1632,7 +1622,6 @@ static void ftl_check_still_sequential(struct ftl_log_type* entry, uint32_t page
|
|||
static uint32_t ftl_compact_scattered(struct ftl_log_type* entry)
|
||||
{
|
||||
uint32_t i, j;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t error;
|
||||
struct ftl_log_type backup;
|
||||
if (entry->pagescurrent == 0)
|
||||
|
@ -1716,7 +1705,6 @@ static uint32_t ftl_commit_scattered(struct ftl_log_type* entry)
|
|||
static uint32_t ftl_commit_sequential(struct ftl_log_type* entry)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
|
||||
if (entry->issequential != 1
|
||||
|| entry->pagescurrent != entry->pagesused)
|
||||
|
@ -1762,7 +1750,6 @@ static uint32_t ftl_commit_sequential(struct ftl_log_type* entry)
|
|||
static uint32_t ftl_remove_scattered_block(struct ftl_log_type* entry)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t age = 0xFFFFFFFF, used = 0;
|
||||
if (entry == NULL)
|
||||
{
|
||||
|
@ -1855,7 +1842,6 @@ static struct ftl_log_type* ftl_allocate_log_entry(uint32_t block)
|
|||
static uint32_t ftl_commit_cxt(void)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
uint32_t mappages = (ftl_nand_type->userblocks + 0x3ff) >> 10;
|
||||
uint32_t ctrpages = (ftl_nand_type->userblocks + 23 + 0x3ff) >> 10;
|
||||
uint32_t endpage = ftl_cxt.ftlctrlpage + mappages + ctrpages + 1;
|
||||
|
@ -1894,7 +1880,7 @@ static uint32_t ftl_commit_cxt(void)
|
|||
|
||||
#ifndef FTL_READONLY
|
||||
/* Swaps the most and least worn block on the flash,
|
||||
to better distribute wear. It will refuse to do anything
|
||||
to better distribute wear. It will not do anything
|
||||
if the wear spread is lower than 5 erases. */
|
||||
static uint32_t ftl_swap_blocks(void)
|
||||
{
|
||||
|
@ -1940,7 +1926,6 @@ static uint32_t ftl_swap_blocks(void)
|
|||
uint32_t ftl_write(uint32_t sector, uint32_t count, const void* buffer)
|
||||
{
|
||||
uint32_t i, j, k;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
|
||||
#ifdef FTL_TRACE
|
||||
DEBUGF("FTL: Writing %d sectors starting at %d\n", count, sector);
|
||||
|
@ -2119,7 +2104,6 @@ uint32_t ftl_sync(void)
|
|||
{
|
||||
uint32_t i;
|
||||
uint32_t rc = 0;
|
||||
uint32_t ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
if (ftl_cxt.clean_flag == 1) return 0;
|
||||
|
||||
mutex_lock(&ftl_mtx);
|
||||
|
@ -2177,6 +2161,8 @@ uint32_t ftl_init(void)
|
|||
for (i = 0; i < 4; i++)
|
||||
if (nand_get_device_type(i) != 0) ftl_banks = i + 1;
|
||||
ftl_nand_type = nand_get_device_type(0);
|
||||
ppb = ftl_nand_type->pagesperblock * ftl_banks;
|
||||
syshyperblocks = ftl_nand_type->blocks - ftl_nand_type->userblocks - 0x17;
|
||||
foundsignature = 0;
|
||||
blockwiped = 1;
|
||||
for (i = 0; i < ftl_nand_type->pagesperblock; i++)
|
||||
|
|
|
@ -69,10 +69,9 @@ static int usb_state;
|
|||
static int usb_mmc_countdown = 0;
|
||||
#endif
|
||||
|
||||
/* FIXME: The extra 0x800 is consumed by fat_mount() when the fsinfo
|
||||
needs updating */
|
||||
/* Make sure there's enough stack space for screendump */
|
||||
#ifdef USB_FULL_INIT
|
||||
static long usb_stack[(DEFAULT_STACK_SIZE + 0x800)/sizeof(long)];
|
||||
static long usb_stack[(DEFAULT_STACK_SIZE + SECTOR_SIZE + BMP_LINESIZE)/sizeof(long)];
|
||||
static const char usb_thread_name[] = "usb";
|
||||
static unsigned int usb_thread_entry = 0;
|
||||
#ifndef USB_STATUS_BY_EVENT
|
||||
|
|
Loading…
Reference in a new issue