1
0
Fork 0
forked from len0rd/rockbox

plugin_get_buffer() makes my plugin smaller, can get the sector buffer at runtime

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3895 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jörg Hohensohn 2003-07-27 22:06:58 +00:00
parent 066857e9b9
commit 9d3e5c6d1d

View file

@ -7,9 +7,10 @@
* \/ \/ \/ \/ \/
* $Id$
*
* Plugin for reprogramming only the second Rockbox image.
* Plugin for reprogramming only the second image in Flash ROM.
* !!! DON'T MESS WITH THIS CODE UNLESS YOU'RE ABSOLUTELY SHURE WHAT YOU DO !!!
*
* Copyright (C) 2003 Jörg Hohensohn [IDC]Dragon
* Copyright (C) 2003 Jörg Hohensohn aka [IDC]Dragon
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
@ -78,8 +79,7 @@ typedef struct
static struct plugin_api* rb; /* here is a global api struct pointer */
#define SEC_SIZE 4096 /* size of one flash sector */
static UINT8 sector[SEC_SIZE]; /* better not place this on the stack... */
static UINT8* sector; /* better not place this on the stack... */
/***************** Flash Functions *****************/
@ -120,8 +120,8 @@ bool ReadID(volatile UINT8* pBase, UINT8* pManufacturerID, UINT8* pDeviceID)
return false; /* fail */
}
/* eraze the sector which contains the given address */
bool ErazeSector(volatile UINT8* pAddr)
/* erase the sector which contains the given address */
bool EraseSector(volatile UINT8* pAddr)
{
volatile UINT8* pBase =
(UINT8*)((UINT32)pAddr & 0xFFF80000); /* round down to 512k align */
@ -130,19 +130,19 @@ bool ErazeSector(volatile UINT8* pAddr)
pBase[0x5555] = 0xAA; /* enter command mode */
pBase[0x2AAA] = 0x55;
pBase[0x5555] = 0x80; /* eraze command */
pBase[0x5555] = 0x80; /* erase command */
pBase[0x5555] = 0xAA; /* enter command mode */
pBase[0x2AAA] = 0x55;
*pAddr = 0x30; /* eraze the sector */
*pAddr = 0x30; /* erase the sector */
/* I counted 7 instructions for this loop -> min. 0.58 us per round
Plus memory waitstates it will be much more, gives margin */
while (*pAddr != 0xFF && --timeout); /* poll for erazed */
while (*pAddr != 0xFF && --timeout); /* poll for erased */
return (timeout != 0);
}
/* address must be in an erazed location */
/* address must be in an erased location */
inline bool ProgramByte(volatile UINT8* pAddr, UINT8 data)
{
unsigned timeout = 35; /* the timeout loop should be no less than 20us */
@ -241,7 +241,7 @@ tImageHeader* GetSecondImage(void)
if (pImage1->size != 0)
{
/* success, we have a second image */
/* success, we have a second image */
pos = (UINT32)pImage1 + sizeof(tImageHeader) + pImage1->size;
if (((pos + SECTORSIZE-1) & ~(SECTORSIZE-1)) != pos)
{ /* not sector-aligned */
@ -321,7 +321,7 @@ tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader)
if (Read32(ucl_header + 18) > pHeader->size) /* compare with uncompressed
size */
{ /* normal case */
{ /* normal case */
pHeader->flags = 0x00000001; /* flags for UCL compressed */
}
else
@ -333,9 +333,9 @@ tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader)
/* check if we can read the whole file */
do
{
read = rb->read(fd, sector, SEC_SIZE);
read = rb->read(fd, sector, SECTORSIZE);
fileread += read;
} while (read == SEC_SIZE);
} while (read == SECTORSIZE);
rb->close(fd);
@ -370,13 +370,13 @@ unsigned ProgramImageFile(char* filename, UINT8* pos,
*(tImageHeader*)sector = *pImageHeader; /* copy header into sector
buffer */
read = rb->read(fd, sector + sizeof(tImageHeader),
SEC_SIZE - sizeof(tImageHeader)); /* payload behind */
SECTORSIZE - sizeof(tImageHeader)); /* payload behind */
size -= read;
read += sizeof(tImageHeader); /* to be programmed, but not part of the
file */
do {
if (!ErazeSector(pos))
if (!EraseSector(pos))
{
/* nothing we can do, let the programming count the errors */
}
@ -389,8 +389,8 @@ unsigned ProgramImageFile(char* filename, UINT8* pos,
}
}
pos += SEC_SIZE;
read = rb->read(fd, sector, (size > SEC_SIZE) ? SEC_SIZE : size);
pos += SECTORSIZE;
read = rb->read(fd, sector, (size > SECTORSIZE) ? SECTORSIZE : size);
/* payload for next sector */
size -= read;
} while (read > 0);
@ -420,7 +420,7 @@ unsigned VerifyImageFile(char* filename, UINT8* pos,
*(tImageHeader*)sector = *pImageHeader; /* copy header into sector
buffer */
read = rb->read(fd, sector + sizeof(tImageHeader),
SEC_SIZE - sizeof(tImageHeader)); /* payload behind */
SECTORSIZE - sizeof(tImageHeader)); /* payload behind */
size -= read;
read += sizeof(tImageHeader); /* to be programmed, but not part of the
@ -436,8 +436,8 @@ unsigned VerifyImageFile(char* filename, UINT8* pos,
}
}
pos += SEC_SIZE;
read = rb->read(fd, sector, (size > SEC_SIZE) ? SEC_SIZE : size);
pos += SECTORSIZE;
read = rb->read(fd, sector, (size > SECTORSIZE) ? SECTORSIZE : size);
/* payload for next sector */
size -= read;
} while (read);
@ -481,10 +481,10 @@ void ShowFlashInfo(tFlashInfo* pInfo, tImageHeader* pImageHeader)
((UINT8*)pImageHeader - FB) / 1024);
rb->lcd_puts(0, 1, buf);
}
else
{
else
{
rb->lcd_puts(0, 1, "No image found!");
}
}
rb->lcd_update();
}
@ -500,9 +500,18 @@ void DoUserDialog(char* filename)
int rc; /* generic return code */
UINT32 space, aligned_size, true_size;
UINT8* pos;
int memleft;
rb->lcd_setfont(FONT_SYSFIXED);
/* "allocate" memory */
sector = rb->plugin_get_buffer(&memleft);
if (memleft < SECTORSIZE) /* need buffer for a flash sector */
{
rb->splash(HZ*3, 0, true, "Out of memory");
return; /* exit */
}
pos = (void*)GetSecondImage();
rc = GetFlashInfo(&FlashInfo);
@ -545,39 +554,39 @@ void DoUserDialog(char* filename)
case eOK:
rb->lcd_puts(0, 1, "File OK.");
break;
case eNotUCL:
case eNotUCL:
rb->lcd_puts(0, 1, "File not UCL ");
rb->lcd_puts(0, 2, "compressed.");
rb->lcd_puts(0, 3, "Use uclpack --2e");
rb->lcd_puts(0, 4, " --10 rockbox.bin");
break;
case eWrongAlgorithm:
case eWrongAlgorithm:
rb->lcd_puts(0, 1, "Wrong algorithm");
rb->lcd_puts(0, 2, "for compression.");
rb->lcd_puts(0, 3, "Use uclpack --2e");
rb->lcd_puts(0, 4, " --10 rockbox.bin");
break;
case eFileNotFound:
case eFileNotFound:
rb->lcd_puts(0, 1, "File not found:");
rb->lcd_puts_scroll(0, 2, filename);
break;
case eTooBig:
case eTooBig:
rb->lcd_puts(0, 1, "File too big,");
rb->lcd_puts(0, 2, "won't fit in chip.");
break;
case eTooSmall:
case eTooSmall:
rb->lcd_puts(0, 1, "File too small.");
rb->lcd_puts(0, 2, "Incomplete?");
break;
case eReadErr:
case eReadErr:
rb->lcd_puts(0, 1, "File read error.");
break;
case eMultiBlocks:
case eMultiBlocks:
rb->lcd_puts(0, 1, "File invalid.");
rb->lcd_puts(0, 2, "Blocksize");
rb->lcd_puts(0, 3, " too small?");
break;
default:
default:
rb->lcd_puts(0, 1, "Check failed.");
break;
}
@ -679,6 +688,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
return PLUGIN_OK;
}
#endif
#endif // #ifdef HAVE_LCD_BITMAP
#endif
#endif // #ifndef SIMULATOR