summaryrefslogtreecommitdiff
path: root/src/ecosboard.c
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-10-27 10:17:36 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-10-27 10:17:36 +0000
commit3ddcbd6b5838a00198e8e775b9f513d00fe0700f (patch)
tree4206462ab2510350d5bacb33a94f36105ce740b5 /src/ecosboard.c
parentedfca66467b93c737f632f7233a01bf281b684e9 (diff)
downloadopenocd+libswd-3ddcbd6b5838a00198e8e775b9f513d00fe0700f.tar.gz
openocd+libswd-3ddcbd6b5838a00198e8e775b9f513d00fe0700f.tar.bz2
openocd+libswd-3ddcbd6b5838a00198e8e775b9f513d00fe0700f.tar.xz
openocd+libswd-3ddcbd6b5838a00198e8e775b9f513d00fe0700f.zip
added option to use ramdisk instead of flash jffs2
git-svn-id: svn://svn.berlios.de/openocd/trunk@1103 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/ecosboard.c')
-rw-r--r--src/ecosboard.c188
1 files changed, 184 insertions, 4 deletions
diff --git a/src/ecosboard.c b/src/ecosboard.c
index 86f3d8d1..47153490 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 <cyg/io/devtab.h>
+
//==========================================================================
// 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 );