From 01cdb6a21f0a7737bc51c4997d66bd152db694a8 Mon Sep 17 00:00:00 2001 From: Michael Sparmann Date: Mon, 25 Oct 2010 12:36:57 +0000 Subject: [PATCH] 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 --- firmware/common/file.c | 5 ++- firmware/export/screendump.h | 14 +++++++ firmware/screendump.c | 16 +------- .../arm/s5l8700/ipodnano2g/ftl-nano2g.c | 40 ++++++------------- firmware/usb.c | 5 +-- 5 files changed, 33 insertions(+), 47 deletions(-) diff --git a/firmware/common/file.c b/firmware/common/file.c index 53a1a35b31..da85846a34 100644 --- a/firmware/common/file.c +++ b/firmware/common/file.c @@ -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,'/'); diff --git a/firmware/export/screendump.h b/firmware/export/screendump.h index 87b32c6bee..9be1f5d3f2 100644 --- a/firmware/export/screendump.h +++ b/firmware/export/screendump.h @@ -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 diff --git a/firmware/screendump.c b/firmware/screendump.c index 1876df8ac0..cd9d6a5bd6 100644 --- a/firmware/screendump.c +++ b/firmware/screendump.c @@ -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 diff --git a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c index 0cada3162a..90217363cc 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/ftl-nano2g.c @@ -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++) diff --git a/firmware/usb.c b/firmware/usb.c index af16b7d4bd..a76eb66fef 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -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