From 3ddcbd6b5838a00198e8e775b9f513d00fe0700f Mon Sep 17 00:00:00 2001 From: oharboe Date: Mon, 27 Oct 2008 10:17:36 +0000 Subject: [PATCH] added option to use ramdisk instead of flash jffs2 git-svn-id: svn://svn.berlios.de/openocd/trunk@1103 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/ecosboard.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 184 insertions(+), 4 deletions(-) diff --git a/src/ecosboard.c b/src/ecosboard.c index 86f3d8d14..47153490b 100644 --- a/src/ecosboard.c +++ b/src/ecosboard.c @@ -840,12 +840,19 @@ static void copyfile(char *name2, char *name1) if( err < 0 ) SHOW_RESULT( close, err ); } -static void copydir(char *name) +static void copydir(char *name, char *destdir) { int err; DIR *dirp; - mkdir("/ram/cgi", 0777); + dirp = opendir(destdir); + if (dirp==NULL) + { + mkdir(destdir, 0777); + } else + { + err = closedir(dirp); + } dirp = opendir(name); if( dirp == NULL ) SHOW_RESULT( opendir, -1 ); @@ -884,9 +891,11 @@ static void copydir(char *name) char fullname2[PATH_MAX]; strcpy(fullname, name); + strcat(fullname, "/"); strcat(fullname, entry->d_name); - strcpy(fullname2, "/ram/cgi/"); + strcpy(fullname2, destdir); + strcat(fullname2, "/"); strcat(fullname2, entry->d_name); // diag_printf("from %s to %s\n", fullname, fullname2); copyfile(fullname, fullname2); @@ -1791,8 +1800,16 @@ int add_default_dirs(void) return ERROR_OK; } +static cyg_uint8 *ramblockdevice; +static const int ramblockdevice_size=4096*1024; int main(int argc, char *argv[]) { + /* ramblockdevice will be the same address every time. The deflate app uses a buffer 16mBytes out, so we + * need to allocate towards the end of the heap. */ + + ramblockdevice=(cyg_uint8 *)malloc(ramblockdevice_size); + memset(ramblockdevice, 0xff, ramblockdevice_size); + setHandler(CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION); setHandler(CYGNUM_HAL_VECTOR_ABORT_PREFETCH); setHandler(CYGNUM_HAL_VECTOR_ABORT_DATA); @@ -1849,12 +1866,53 @@ int main(int argc, char *argv[]) diag_printf("Zylin ZY1000. Copyright Zylin AS 2007-2008.\n"); diag_printf("%s\n", ZYLIN_OPENOCD_VERSION); - copydir("/rom/"); + copydir("/rom", "/ram/cgi"); err = mount("/dev/flash1", "/config", "jffs2"); if (err < 0) { diag_printf("unable to mount jffs\n"); + reboot(); + } + + /* are we using a ram disk instead of a flash disk? This is used + * for ZY1000 live demo... + * + * copy over flash disk to ram block device + */ + if (boolParam("ramdisk")) + { + diag_printf("Unmounting /config from flash and using ram instead\n"); + err=umount("/config"); + if (err < 0) + { + diag_printf("unable to unmount jffs\n"); + reboot(); + } + + err = mount("/dev/flash1", "/config2", "jffs2"); + if (err < 0) + { + diag_printf("unable to mount jffs\n"); + reboot(); + } + + err = mount("/dev/ram", "/config", "jffs2"); + if (err < 0) + { + diag_printf("unable to mount ram block device\n"); + reboot(); + } + +// copydir("/config2", "/config"); + copyfile("/config2/ip", "/config/ip"); + copydir("/config2/settings", "/config/settings"); + + umount("/config2"); + } else + { + /* we're not going to use a ram block disk */ + free(ramblockdevice); } @@ -2370,6 +2428,8 @@ logfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio); static int logfs_fo_fsync(struct CYG_FILE_TAG *fp, int mode); static int logfs_fo_close(struct CYG_FILE_TAG *fp); +#include + //========================================================================== // Filesystem table entries @@ -2473,3 +2533,123 @@ static int logfs_fo_close(struct CYG_FILE_TAG *fp) { return ENOERR; } + +static bool +ramiodev_init( struct cyg_devtab_entry *tab ) +{ + return true; +} + +static Cyg_ErrNo +ramiodev_bread( cyg_io_handle_t handle, void *buf, cyg_uint32 *len, + cyg_uint32 pos) +{ + if (*len+pos>ramblockdevice_size) + { + *len=ramblockdevice_size-pos; + } + memcpy(buf, ramblockdevice+pos, *len); + return ENOERR; +} + +static Cyg_ErrNo +ramiodev_bwrite( cyg_io_handle_t handle, const void *buf, cyg_uint32 *len, + cyg_uint32 pos ) +{ + if (((pos%4)!=0)||(((*len)%4)!=0)) + { + diag_printf("Unaligned write %d %d!", pos, *len); + } + + memcpy(ramblockdevice+pos, buf, *len); + return ENOERR; +} + +static Cyg_ErrNo +ramiodev_get_config( cyg_io_handle_t handle, + cyg_uint32 key, + void* buf, + cyg_uint32* len) +{ + switch (key) { + case CYG_IO_GET_CONFIG_FLASH_ERASE: + { + if ( *len != sizeof( cyg_io_flash_getconfig_erase_t ) ) + return -EINVAL; + { + cyg_io_flash_getconfig_erase_t *e = (cyg_io_flash_getconfig_erase_t *)buf; + char *startpos = ramblockdevice + e->offset; + + if (((e->offset%(64*1024))!=0)||((e->len%(64*1024))!=0)) + { + diag_printf("Erease is not aligned %d %d\n", e->offset, e->len); + } + + memset(startpos, 0xff, e->len); + + e->flasherr = 0; + } + return ENOERR; + } + case CYG_IO_GET_CONFIG_FLASH_DEVSIZE: + { + if ( *len != sizeof( cyg_io_flash_getconfig_devsize_t ) ) + return -EINVAL; + { + cyg_io_flash_getconfig_devsize_t *d = + (cyg_io_flash_getconfig_devsize_t *)buf; + + d->dev_size = ramblockdevice_size; + } + return ENOERR; + } + + case CYG_IO_GET_CONFIG_FLASH_BLOCKSIZE: + { + cyg_io_flash_getconfig_blocksize_t *b = + (cyg_io_flash_getconfig_blocksize_t *)buf; + if ( *len != sizeof( cyg_io_flash_getconfig_blocksize_t ) ) + return -EINVAL; + + // offset unused for now + b->block_size = 64*1024; + return ENOERR; + } + + default: + return -EINVAL; + } +} + +static Cyg_ErrNo +ramiodev_set_config( cyg_io_handle_t handle, + cyg_uint32 key, + const void* buf, + cyg_uint32* len) +{ + + switch (key) { + default: + return -EINVAL; + } +} // ramiodev_set_config() + +// get_config/set_config should be added later to provide the other flash +// operations possible, like erase etc. + +BLOCK_DEVIO_TABLE( cyg_io_ramdev1_ops, + &ramiodev_bwrite, + &ramiodev_bread, + 0, // no select + &ramiodev_get_config, + &ramiodev_set_config + ); + + +BLOCK_DEVTAB_ENTRY( cyg_io_ramdev1, + "/dev/ram", + 0, + &cyg_io_ramdev1_ops, + &ramiodev_init, + 0, // No lookup required + NULL );